aboutsummaryrefslogtreecommitdiffstats
path: root/clox/src/vm.c
diff options
context:
space:
mode:
Diffstat (limited to 'clox/src/vm.c')
-rw-r--r--clox/src/vm.c32
1 files changed, 32 insertions, 0 deletions
diff --git a/clox/src/vm.c b/clox/src/vm.c
index c1f0b90..1d82dd1 100644
--- a/clox/src/vm.c
+++ b/clox/src/vm.c
@@ -282,6 +282,38 @@ static InterpretResult run() {
*frame->closure->upvalues[slot]->location = peek(0);
break;
}
+ case OP_GET_PROPERTY: {
+ if (!IS_INSTANCE(peek(0))) {
+ runtimeError("Only instances have properties.");
+ return INTERPRET_RUNTIME_ERROR;
+ }
+
+ ObjInstance *instance = AS_INSTANCE(peek(0));
+ ObjString *name = READ_STRING();
+
+ Value value;
+ if (tableGet(&instance->fields, name, &value)) {
+ pop(); /* Instance */
+ push(value);
+ break;
+ }
+
+ runtimeError("Undefined property '%s'.", name->chars);
+ return INTERPRET_RUNTIME_ERROR;
+ }
+ case OP_SET_PROPERTY: {
+ if (!IS_INSTANCE(peek(1))) {
+ runtimeError("Only instances have fields.");
+ return INTERPRET_RUNTIME_ERROR;
+ }
+
+ ObjInstance *instance = AS_INSTANCE(peek(1));
+ tableSet(&instance->fields, READ_STRING(), peek(0));
+ Value value = pop();
+ pop();
+ push(value);
+ break;
+ }
case OP_EQUAL: {
Value b = pop();
Value a = pop();