diff options
Diffstat (limited to 'clox/src/vm.c')
-rw-r--r-- | clox/src/vm.c | 32 |
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(); |