From: Keith J. <bu...@us...> - 2002-08-23 15:22:46
|
Update of /cvsroot/cup-language/cup/src/vm In directory usw-pr-cvs1:/tmp/cvs-serv29748/vm Modified Files: debug.c execute.c scopes.c values.c vm.c vm.h Log Message: Lot of work being done Index: debug.c =================================================================== RCS file: /cvsroot/cup-language/cup/src/vm/debug.c,v retrieving revision 1.10 retrieving revision 1.11 diff -C2 -r1.10 -r1.11 *** debug.c 22 Aug 2002 18:57:25 -0000 1.10 --- debug.c 23 Aug 2002 15:22:40 -0000 1.11 *************** *** 183,187 **** pc++; while (vm->binary[pc] != '\0') ! printf("%c", vm->binary[pc++]); printf("\"\n"); break; --- 183,201 ---- pc++; while (vm->binary[pc] != '\0') ! { ! switch (vm->binary[pc]) ! { ! case '\\': ! printf("\\\\"); ! break; ! case '\n': ! printf("\\n"); ! break; ! default: ! printf("%c", vm->binary[pc]); ! break; ! } ! pc++; ! } printf("\"\n"); break; Index: execute.c =================================================================== RCS file: /cvsroot/cup-language/cup/src/vm/execute.c,v retrieving revision 1.12 retrieving revision 1.13 diff -C2 -r1.12 -r1.13 *** execute.c 22 Aug 2002 18:57:25 -0000 1.12 --- execute.c 23 Aug 2002 15:22:40 -0000 1.13 *************** *** 10,13 **** --- 10,15 ---- void cupvm_POP(CUPVM *); void cupvm_SET(CUPVM *); + void cupvm_ARG(CUPVM *, unsigned long); + void cupvm_VAR(CUPVM *, unsigned long); void cupvm_execute(CUPVM *vm) *************** *** 34,41 **** break; case CUPOP_VAR: vm->pc = vm->pc + sizeof(unsigned long) + 1; break; case CUPOP_ARG: ! cupvm_POP(vm); // TEMPORARY vm->pc = vm->pc + sizeof(unsigned long) + 1; break; --- 36,50 ---- break; case CUPOP_VAR: + memcpy(&ul, &(vm->codeptr[vm->pc + 1]), sizeof(unsigned long)); + cupvm_VAR(vm, ul); + if (vm->traceback) + return; vm->pc = vm->pc + sizeof(unsigned long) + 1; break; case CUPOP_ARG: ! memcpy(&ul, &(vm->codeptr[vm->pc + 1]), sizeof(unsigned long)); ! cupvm_ARG(vm, ul); ! if (vm->traceback) ! return; vm->pc = vm->pc + sizeof(unsigned long) + 1; break; *************** *** 101,104 **** --- 110,156 ---- } + // increment references by 1, since we are creating a value + void cupvm_VAR(CUPVM *vm, unsigned long addr) + { + CUPVALUE *val; + + if (vm->dataptr[addr] != CUPDATA_VARIABLE) + { + cupvm_tb(vm, "cupvm_VAR()", "data pointed to is not a token"); + return; + } + + val = cupvm_value_new(); + val->type = CUPTYPE_INTEGER; + val->data.val_integer = 0; + val->references++; + + if (!cupvm_scope_declvar(vm, val, &(vm->dataptr[addr + 1]))) + cupvm_tb(vm, "cupvm_VAR()", "unable to declare argument (most likely duplicate names)"); + } + + // Since we pop from stack, and add to scope, our references count is + // unchanged. It's just ref'd in a diff place now + void cupvm_ARG(CUPVM *vm, unsigned long addr) + { + CUPVALUE *val; + + val = cupvm_value_pop(vm); + if (!val) + { + cupvm_tb(vm, "cupvm_ARG()", "unable to pop value"); + return; + } + + if (vm->dataptr[addr] != CUPDATA_VARIABLE) + { + cupvm_tb(vm, "cupvm_ARG()", "data pointed to is not a token"); + return; + } + + if (!cupvm_scope_declvar(vm, val, &(vm->dataptr[addr + 1]))) + cupvm_tb(vm, "cupvm_ARG()", "unable to declare argument (most likely duplicate names)"); + } + void cupvm_PUSHSCOPE(CUPVM *vm) { *************** *** 112,116 **** void cupvm_POPSCOPE(CUPVM *vm) { - CUPVALUE *val; CUPSCOPE *scope; --- 164,167 ---- *************** *** 122,135 **** } - if (scope->vars) - { - while ((val = (CUPVALUE *) list_item_pop_back(scope->vars))) - cupvm_value_free(val); - list_free(scope->vars); - } - cupvm_scope_free(scope); } void cupvm_PUSH(CUPVM *vm, unsigned long addr) { --- 173,180 ---- } cupvm_scope_free(scope); } + // increment references, we are adding to the stack void cupvm_PUSH(CUPVM *vm, unsigned long addr) { *************** *** 149,155 **** memcpy(&(val->data.val_float), &(vm->dataptr[addr + 1]), sizeof(long double)); ! if (!cupvm_value_push(vm, val)) ! cupvm_tb(vm, "cupvm_PUSH()", "failed to push value"); ! return; case CUPDATA_INTEGER: val = cupvm_value_new(); --- 194,198 ---- memcpy(&(val->data.val_float), &(vm->dataptr[addr + 1]), sizeof(long double)); ! break; case CUPDATA_INTEGER: val = cupvm_value_new(); *************** *** 157,182 **** memcpy(&(val->data.val_integer), &(vm->dataptr[addr + 1]), sizeof(long int)); ! if (!cupvm_value_push(vm, val)) ! cupvm_tb(vm, "cupvm_PUSH()", "failed to push value"); ! return; case CUPDATA_STRING: val = cupvm_value_new(); val->type = CUPTYPE_STRING; val->data.val_string = dstrdup(&(vm->dataptr[addr + 1]), TYPE_CUPVM); ! if (!cupvm_value_push(vm, val)) ! cupvm_tb(vm, "cupvm_PUSH()", "failed to push value"); ! return; case CUPDATA_VARIABLE: // TEMPORARY. Need scoping/variable code ! val = cupvm_scope_findtoken(vm, &(vm->dataptr[addr + 1])); if (!val) cupvm_tb(vm, "cupvm_PUSH()", "could not find variable in scope"); ! return; default: cupvm_tb(vm, "cupvm_PUSH()", "unknown data at address"); return; } } void cupvm_POP(CUPVM *vm) { --- 200,229 ---- memcpy(&(val->data.val_integer), &(vm->dataptr[addr + 1]), sizeof(long int)); ! break; case CUPDATA_STRING: val = cupvm_value_new(); val->type = CUPTYPE_STRING; val->data.val_string = dstrdup(&(vm->dataptr[addr + 1]), TYPE_CUPVM); ! break; case CUPDATA_VARIABLE: // TEMPORARY. Need scoping/variable code ! val = cupvm_scope_findvar(vm, &(vm->dataptr[addr + 1])); if (!val) + { cupvm_tb(vm, "cupvm_PUSH()", "could not find variable in scope"); ! return; ! } ! break; default: cupvm_tb(vm, "cupvm_PUSH()", "unknown data at address"); return; } + + val->references++; + if (!cupvm_value_push(vm, val)) + cupvm_tb(vm, "cupvm_PUSH()", "failed to push value"); } + // decrement references, popping from the stack. if refs == 0, free value void cupvm_POP(CUPVM *vm) { *************** *** 184,191 **** val = cupvm_value_pop(vm); if (!val) cupvm_tb(vm, "cupvm_POP()", "failed to pop data"); else ! cupvm_value_free(val); } --- 231,242 ---- val = cupvm_value_pop(vm); + val->references--; if (!val) cupvm_tb(vm, "cupvm_POP()", "failed to pop data"); else ! { ! if (!val->references) ! cupvm_value_free(val); ! } } *************** *** 198,204 **** val = cupvm_value_pop(vm); if (!val) cupvm_tb(vm, "cupvm_POP()", "failed to pop data"); else ! cupvm_value_free(val); } --- 249,259 ---- val = cupvm_value_pop(vm); + val->references--; if (!val) cupvm_tb(vm, "cupvm_POP()", "failed to pop data"); else ! { ! if (!val->references) ! cupvm_value_free(val); ! } } Index: scopes.c =================================================================== RCS file: /cvsroot/cup-language/cup/src/vm/scopes.c,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -r1.1 -r1.2 *** scopes.c 22 Aug 2002 18:57:25 -0000 1.1 --- scopes.c 23 Aug 2002 15:22:40 -0000 1.2 *************** *** 7,23 **** "@(#) $Id$"; ! CUPVALUE *cupvm_scope_findtoken(CUPVM *vm, const char *tok) { CUPSCOPE *scope; ! CUPVALUE *val; ! unsigned long depth = 0; ! unsigned long idx = 0; while ((scope = list_item_from_back(vm->scopes, depth))) { ! while ((val = list_item_from_front(scope->vars, idx))) { ! if (strcmp(val->name, tok) == 0) ! return val; idx++; } --- 7,53 ---- "@(#) $Id$"; ! bool cupvm_scope_declvar(CUPVM *vm, CUPVALUE *var, char *name) { CUPSCOPE *scope; ! CUPSCOPEVAR *scopevar; ! unsigned long idx; + scope = list_item_from_back(vm->scopes, 0); + + if (!scope->vars) + scope->vars = list_new(); + + idx = 0; + while ((scopevar = list_item_from_front(scope->vars, idx))) + { + if (strcmp(scopevar->name, name) == 0) + return FALSE; + idx++; + } + + scopevar = dmalloc(sizeof(CUPSCOPEVAR), TYPE_CUPVM); + scopevar->name = dstrdup(name, TYPE_CUPVM); + scopevar->val = var; + + list_item_push_back(scope->vars, scopevar); + + return TRUE; + } + + CUPVALUE *cupvm_scope_findvar(CUPVM *vm, const char *name) + { + CUPSCOPE *scope; + CUPSCOPEVAR *scopevar; + unsigned long depth; + unsigned long idx; + + depth = 0; while ((scope = list_item_from_back(vm->scopes, depth))) { ! idx = 0; ! while ((scopevar = list_item_from_front(scope->vars, idx))) { ! if (strcmp(scopevar->name, name) == 0) ! return scopevar->val; idx++; } *************** *** 39,42 **** --- 69,88 ---- void cupvm_scope_free(CUPSCOPE *scope) { + CUPSCOPEVAR *scopevar; + + if (scope->vars) + { + while ((scopevar = list_item_pop_back(scope->vars))) + { + scopevar->val->references--; + if (!scopevar->val->references) + cupvm_value_free(scopevar->val); + dfree(scopevar->name); + dfree(scopevar); + } + + list_free(scope->vars); + } + dfree(scope); } Index: values.c =================================================================== RCS file: /cvsroot/cup-language/cup/src/vm/values.c,v retrieving revision 1.8 retrieving revision 1.9 diff -C2 -r1.8 -r1.9 *** values.c 2 Aug 2002 15:50:44 -0000 1.8 --- values.c 23 Aug 2002 15:22:40 -0000 1.9 *************** *** 12,15 **** --- 12,17 ---- val = dmalloc(sizeof(CUPVALUE), TYPE_CUPVM); + val->type = CUPTYPE_NONE; + val->references = 0; return val; } Index: vm.c =================================================================== RCS file: /cvsroot/cup-language/cup/src/vm/vm.c,v retrieving revision 1.17 retrieving revision 1.18 diff -C2 -r1.17 -r1.18 *** vm.c 22 Aug 2002 18:57:25 -0000 1.17 --- vm.c 23 Aug 2002 15:22:40 -0000 1.18 *************** *** 59,64 **** { cupvm_execute(vm); ! cupvm_POPSCOPE(vm); } if (vm->stack) --- 59,73 ---- { cupvm_execute(vm); ! if (!vm->traceback) ! cupvm_POPSCOPE(vm); } + + if (vm->scopes) + { + while (list_length(vm->scopes)) + cupvm_scope_free(list_item_pop_back(vm->scopes)); + list_free(vm->scopes); + } + if (vm->stack) Index: vm.h =================================================================== RCS file: /cvsroot/cup-language/cup/src/vm/vm.h,v retrieving revision 1.7 retrieving revision 1.8 diff -C2 -r1.7 -r1.8 *** vm.h 22 Aug 2002 18:57:25 -0000 1.7 --- vm.h 23 Aug 2002 15:22:40 -0000 1.8 *************** *** 5,8 **** --- 5,9 ---- enum { + CUPTYPE_NONE = 0, CUPTYPE_FLOAT, CUPTYPE_INTEGER, *************** *** 16,19 **** --- 17,27 ---- }; + typedef struct cupscopevar CUPSCOPEVAR; + struct cupscopevar + { + CUPVALUE *val; + char *name; + }; + void cupvm_tb(CUPVM *, const char *, const char *); void cupvm_debug(CUPVM *); *************** *** 29,33 **** bool cupvm_scope_push(CUPVM *, CUPSCOPE *); CUPSCOPE *cupvm_scope_pop(CUPVM *); ! CUPVALUE *cupvm_scope_findtoken(CUPVM *, const char *); void cupvm_PUSHSCOPE(CUPVM *); void cupvm_POPSCOPE(CUPVM *); --- 37,42 ---- bool cupvm_scope_push(CUPVM *, CUPSCOPE *); CUPSCOPE *cupvm_scope_pop(CUPVM *); ! CUPVALUE *cupvm_scope_findvar(CUPVM *, const char *); ! bool cupvm_scope_declvar(CUPVM *, CUPVALUE *, char *); void cupvm_PUSHSCOPE(CUPVM *); void cupvm_POPSCOPE(CUPVM *); |