summaryrefslogtreecommitdiff
path: root/uscript/vm.c
diff options
context:
space:
mode:
Diffstat (limited to 'uscript/vm.c')
-rw-r--r--uscript/vm.c19
1 files changed, 19 insertions, 0 deletions
diff --git a/uscript/vm.c b/uscript/vm.c
index 7c2d85e..363912a 100644
--- a/uscript/vm.c
+++ b/uscript/vm.c
@@ -12,6 +12,7 @@ struct vm vm;
void init_vm(void)
{
vm.objs = da_create(struct us_val, 128);
+ vm.gstack = da_create(struct global, 128);
vm.cf = vm.cf_stack;
vm.stacktop = vm.stack;
}
@@ -23,6 +24,8 @@ void deinit_vm(void)
}
da_clear(vm.objs); // not needed, but makes me feel better :)
da_free(vm.objs);
+
+ da_free(vm.gstack);
}
static
@@ -154,6 +157,12 @@ void us_exec(struct us_func *func)
case BC_SET_LOCAL:
vm.cf->stackbot[read_byte()] = vm_peek();
break;
+ case BC_GET_GLOBAL:
+ vm_push(vm.gstack[read_short(func->proto, &i)].val);
+ break;
+ case BC_SET_GLOBAL:
+ vm.gstack[read_short(func->proto, &i)].val = vm_peek();
+ break;
case BC_GET_UPVAL:
vm_push(*func->upvals[read_byte()]->loc);
break;
@@ -366,3 +375,13 @@ void us_exec(struct us_func *func)
}
}
}
+
+int declare_global(struct us_str *name)
+{
+ int idx = da_len(vm.gstack);
+ struct global global;
+ global.name = name;
+ global.val = create_zilch();
+ da_append(struct global, &vm.gstack, global);
+ return idx;
+}