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.c19
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);