|
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 *);
|