X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Usermode%2FLibraries%2Flibspiderscript.so_src%2Fbytecode_gen.c;h=b089b9aec38e37aad713d4dbbaab774d53b30282;hb=edf4c879ac931092da63389e186f06f08e324680;hp=8ae7f32a94865f793b67d341aac5c42efd270441;hpb=1e45480331132c75898cbdd761ddd1fa48739e54;p=tpg%2Facess2.git diff --git a/Usermode/Libraries/libspiderscript.so_src/bytecode_gen.c b/Usermode/Libraries/libspiderscript.so_src/bytecode_gen.c index 8ae7f32a..b089b9ae 100644 --- a/Usermode/Libraries/libspiderscript.so_src/bytecode_gen.c +++ b/Usermode/Libraries/libspiderscript.so_src/bytecode_gen.c @@ -11,86 +11,47 @@ #include #include "bytecode_gen.h" #include +#include "bytecode.h" // === IMPORTS === // === STRUCTURES === -typedef struct sBC_Op tBC_Op; - -struct sBC_Op -{ - tBC_Op *Next; - int Operation; - int bUseInteger; - union { - struct { - const char *String; - int Integer; - } StringInt; - - uint64_t Integer; - double Real; - } Content; -}; - -struct sBC_Function -{ - const char *Name; - - int LabelCount; - int LabelSpace; - tBC_Op **Labels; - - int MaxVariableCount; - // NOTE: These fields are invalid after compilation - int VariableCount; - int VariableSpace; - const char **VariableNames; // Only type needs to be stored - int CurContextDepth; // Used to get the real var count - - int OperationCount; - tBC_Op *Operations; - tBC_Op *OperationsEnd; - - int ArgumentCount; - struct { - char *Name; - int Type; - } Arguments[]; -}; // === PROTOTYPES === -tBC_Op *Bytecode_int_AllocateOp(int Operation); +tBC_Op *Bytecode_int_AllocateOp(int Operation, int ExtraBytes); + int Bytecode_int_AddVariable(tBC_Function *Handle, const char *Name); // === GLOBALS === // === CODE === -tBC_Op *Bytecode_int_AllocateOp(int Operation) +tBC_Op *Bytecode_int_AllocateOp(int Operation, int ExtraBytes) { tBC_Op *ret; - ret = malloc(sizeof(tBC_Op)); + ret = malloc(sizeof(tBC_Op) + ExtraBytes); if(!ret) return NULL; ret->Next = NULL; ret->Operation = Operation; ret->bUseInteger = 0; + ret->bUseString = (ExtraBytes > 0); return ret; } -tBC_Function *Bytecode_CreateFunction(const char *Name, int ArgCount, char **ArgNames, int *ArgTypes) +tBC_Function *Bytecode_CreateFunction(tScript_Function *Fcn) { tBC_Function *ret; int i; - ret = malloc(sizeof(tBC_Function) + ArgCount*sizeof(ret->Arguments[0])); + ret = malloc(sizeof(tBC_Function)); if(!ret) return NULL; - ret->Name = Name; ret->LabelSpace = ret->LabelCount = 0; ret->Labels = NULL; - + + ret->MaxVariableCount = 0; + ret->CurContextDepth = 0; ret->VariableCount = ret->VariableSpace = 0; ret->VariableNames = NULL; @@ -98,11 +59,9 @@ tBC_Function *Bytecode_CreateFunction(const char *Name, int ArgCount, char **Arg ret->Operations = NULL; ret->OperationsEnd = (void*)&ret->Operations; - ret->ArgumentCount = ArgCount; - for( i = 0; i < ArgCount; i ++ ) + for( i = 0; i < Fcn->ArgumentCount; i ++ ) { - ret->Arguments[i].Name = strdup(ArgNames[i]); - ret->Arguments[i].Type = ArgTypes[i]; + Bytecode_int_AddVariable(ret, Fcn->Arguments[i].Name); } return ret; @@ -111,11 +70,6 @@ tBC_Function *Bytecode_CreateFunction(const char *Name, int ArgCount, char **Arg void Bytecode_DeleteFunction(tBC_Function *Fcn) { tBC_Op *op; - int i; - for( i = 0; i < Fcn->ArgumentCount; i ++ ) - { - free(Fcn->Arguments[i].Name); - } for( op = Fcn->Operations; op; ) { tBC_Op *nextop = op->Next; @@ -244,7 +198,7 @@ int Bytecode_int_Serialize(const tBC_Function *Function, void *Output, int *Labe break; // Everthing else just gets handled nicely default: - if( op->Content.StringInt.String ) + if( op->bUseString ) _put_string(op->Content.StringInt.String, strlen(op->Content.StringInt.String)); if( op->bUseInteger ) _put_dword(op->Content.StringInt.Integer); @@ -316,13 +270,13 @@ void Bytecode_int_AppendOp(tBC_Function *Fcn, tBC_Op *Op) Fcn->OperationsEnd = Op; } -void Bytecode_int_AddVariable(tBC_Function *Handle, const char *Name) +int Bytecode_int_AddVariable(tBC_Function *Handle, const char *Name) { if(Handle->VariableCount == Handle->VariableSpace) { void *tmp; Handle->VariableSpace += 10; tmp = realloc(Handle->VariableNames, Handle->VariableSpace * sizeof(Handle->VariableNames[0])); - if(!tmp) return ; // TODO: Error + if(!tmp) return -1; // TODO: Error Handle->VariableNames = tmp; } Handle->VariableNames[Handle->VariableCount] = Name; @@ -330,81 +284,97 @@ void Bytecode_int_AddVariable(tBC_Function *Handle, const char *Name) // Get max count (used when executing to get the frame size) if(Handle->VariableCount - Handle->CurContextDepth >= Handle->MaxVariableCount) Handle->MaxVariableCount = Handle->VariableCount - Handle->CurContextDepth; +// printf("_AddVariable: %s given %i\n", Name, Handle->VariableCount - Handle->CurContextDepth - 1); + return Handle->VariableCount - Handle->CurContextDepth - 1; } int Bytecode_int_GetVarIndex(tBC_Function *Handle, const char *Name) { - int i; + int i, context_depth = Handle->CurContextDepth; // Get the start of this context for( i = Handle->VariableCount; i --; ) { - if( Handle->VariableNames[i] == NULL ) break; - } - // Check for duplicate allocation - for( ; i < Handle->VariableCount; i ++ ) - { + if( !Handle->VariableNames[i] ) { + context_depth --; + continue ; + } if( strcmp(Name, Handle->VariableNames[i]) == 0 ) - return i; + return i - context_depth; } return -1; } #define DEF_BC_NONE(_op) { \ - tBC_Op *op = Bytecode_int_AllocateOp(_op); \ + tBC_Op *op = Bytecode_int_AllocateOp(_op, 0); \ op->Content.Integer = 0; \ op->bUseInteger = 0; \ Bytecode_int_AppendOp(Handle, op);\ } +#define DEF_BC_INT(_op, _int) {\ + tBC_Op *op = Bytecode_int_AllocateOp(_op, 0);\ + op->Content.StringInt.Integer = _int;\ + op->bUseInteger = 1;\ + op->bUseString = 0;\ + Bytecode_int_AppendOp(Handle, op);\ +} + #define DEF_BC_STRINT(_op, _str, _int) { \ - tBC_Op *op = Bytecode_int_AllocateOp(_op);\ + tBC_Op *op = Bytecode_int_AllocateOp(_op, strlen(_str));\ op->Content.StringInt.Integer = _int;\ - op->Content.StringInt.String = _str;\ + strcpy(op->Content.StringInt.String, _str);\ op->bUseInteger = 1;\ + op->bUseString = 1;\ Bytecode_int_AppendOp(Handle, op);\ } #define DEF_BC_STR(_op, _str) {\ - tBC_Op *op = Bytecode_int_AllocateOp(_op);\ - op->Content.StringInt.String = _str;\ + tBC_Op *op = Bytecode_int_AllocateOp(_op, strlen(_str));\ + strcpy(op->Content.StringInt.String, _str);\ op->bUseInteger = 0;\ Bytecode_int_AppendOp(Handle, op);\ } // --- Flow Control void Bytecode_AppendJump(tBC_Function *Handle, int Label) - DEF_BC_STRINT(BC_OP_JUMP, NULL, Label) + DEF_BC_INT(BC_OP_JUMP, Label) void Bytecode_AppendCondJump(tBC_Function *Handle, int Label) - DEF_BC_STRINT(BC_OP_JUMPIF, NULL, Label) + DEF_BC_INT(BC_OP_JUMPIF, Label) +void Bytecode_AppendCondJumpNot(tBC_Function *Handle, int Label) + DEF_BC_INT(BC_OP_JUMPIFNOT, Label) void Bytecode_AppendReturn(tBC_Function *Handle) DEF_BC_NONE(BC_OP_RETURN); // --- Variables void Bytecode_AppendLoadVar(tBC_Function *Handle, const char *Name) - DEF_BC_STRINT(BC_OP_LOADVAR, NULL, Bytecode_int_GetVarIndex(Handle, Name)) + DEF_BC_INT(BC_OP_LOADVAR, Bytecode_int_GetVarIndex(Handle, Name)) // DEF_BC_STR(BC_OP_LOADVAR, Name) void Bytecode_AppendSaveVar(tBC_Function *Handle, const char *Name) // (Obj->)?var = - DEF_BC_STRINT(BC_OP_SAVEVAR, NULL, Bytecode_int_GetVarIndex(Handle, Name)) + DEF_BC_INT(BC_OP_SAVEVAR, Bytecode_int_GetVarIndex(Handle, Name)) // DEF_BC_STR(BC_OP_SAVEVAR, Name) // --- Constants void Bytecode_AppendConstInt(tBC_Function *Handle, uint64_t Value) { - tBC_Op *op = Bytecode_int_AllocateOp(BC_OP_LOADINT); + tBC_Op *op = Bytecode_int_AllocateOp(BC_OP_LOADINT, 0); op->Content.Integer = Value; Bytecode_int_AppendOp(Handle, op); } void Bytecode_AppendConstReal(tBC_Function *Handle, double Value) { - tBC_Op *op = Bytecode_int_AllocateOp(BC_OP_LOADREAL); + tBC_Op *op = Bytecode_int_AllocateOp(BC_OP_LOADREAL, 0); op->Content.Real = Value; Bytecode_int_AppendOp(Handle, op); } void Bytecode_AppendConstString(tBC_Function *Handle, const void *Data, size_t Length) - DEF_BC_STRINT(BC_OP_LOADSTR, Data, Length) +{ + tBC_Op *op = Bytecode_int_AllocateOp(BC_OP_LOADSTR, Length+1); + op->Content.StringInt.Integer = Length; + memcpy(op->Content.StringInt.String, Data, Length); + op->Content.StringInt.String[Length] = 0; + Bytecode_int_AppendOp(Handle, op); +} // --- Indexing / Scoping -void Bytecode_AppendSubNamespace(tBC_Function *Handle, const char *Name) - DEF_BC_STR(BC_OP_SCOPE, Name) void Bytecode_AppendElement(tBC_Function *Handle, const char *Name) DEF_BC_STR(BC_OP_ELEMENT, Name) void Bytecode_AppendIndex(tBC_Function *Handle) @@ -422,7 +392,11 @@ void Bytecode_AppendBinOp(tBC_Function *Handle, int Operation) void Bytecode_AppendUniOp(tBC_Function *Handle, int Operation) DEF_BC_NONE(Operation) void Bytecode_AppendCast(tBC_Function *Handle, int Type) - DEF_BC_STRINT(BC_OP_CAST, NULL, Type) + DEF_BC_INT(BC_OP_CAST, Type) +void Bytecode_AppendDuplicate(tBC_Function *Handle) + DEF_BC_NONE(BC_OP_DUPSTACK); +void Bytecode_AppendDelete(tBC_Function *Handle) + DEF_BC_NONE(BC_OP_DELSTACK); // Does some bookeeping to allocate variable slots at compile time void Bytecode_AppendEnterContext(tBC_Function *Handle) @@ -440,20 +414,31 @@ void Bytecode_AppendLeaveContext(tBC_Function *Handle) if( Handle->VariableNames[i] == NULL ) break; } Handle->CurContextDepth --; + Handle->VariableCount = i; - DEF_BC_NONE(BC_OP_LEAVECONTEXT) + DEF_BC_NONE(BC_OP_LEAVECONTEXT); } //void Bytecode_AppendImportNamespace(tBC_Function *Handle, const char *Name); // DEF_BC_STRINT(BC_OP_IMPORTNS, Name, 0) void Bytecode_AppendDefineVar(tBC_Function *Handle, const char *Name, int Type) { + int i; #if 1 - // Check for duplicates - if( Bytecode_int_GetVarIndex(Handle, Name) ) - return ; // TODO: Error + // Get the start of this context + for( i = Handle->VariableCount; i --; ) + { + if( Handle->VariableNames[i] == NULL ) break; + } + // Check for duplicate allocation + for( i ++; i < Handle->VariableCount; i ++ ) + { + if( strcmp(Name, Handle->VariableNames[i]) == 0 ) + return ; + } #endif - Bytecode_int_AddVariable(Handle, Name); - - DEF_BC_STRINT(BC_OP_DEFINEVAR, Name, Type) + i = Bytecode_int_AddVariable(Handle, Name); +// printf("Variable %s given slot %i\n", Name, i); + + DEF_BC_STRINT(BC_OP_DEFINEVAR, Name, (Type&0xFFFF) | (i << 16)) }