diff options
Diffstat (limited to 'clox/src/vm.c')
-rw-r--r-- | clox/src/vm.c | 19 |
1 files changed, 19 insertions, 0 deletions
diff --git a/clox/src/vm.c b/clox/src/vm.c index 8a6847e..47c9f29 100644 --- a/clox/src/vm.c +++ b/clox/src/vm.c @@ -379,6 +379,15 @@ static InterpretResult run() { push(value); break; } + case OP_GET_SUPER: { + ObjString *name = READ_STRING(); + ObjClass *superclass = AS_CLASS(pop()); + + if (!bindMethod(superclass, name)) { + return INTERPRET_RUNTIME_ERROR; + } + break; + } case OP_EQUAL: { Value b = pop(); Value a = pop(); @@ -460,6 +469,16 @@ static InterpretResult run() { frame = &vm.frames[vm.frameCount - 1]; break; } + case OP_SUPER_INVOKE: { + ObjString *method = READ_STRING(); + int argCount = READ_BYTE(); + ObjClass *superclass = AS_CLASS(pop()); + if (!invokeFromClass(superclass, method, argCount)) { + return INTERPRET_RUNTIME_ERROR; + } + frame = &vm.frames[vm.frameCount - 1]; + break; + } case OP_CLOSURE: { ObjFunction *function = AS_FUNCTION(READ_CONSTANT()); ObjClosure *closure = newClosure(function); |