diff options
author | Tom Willemse | 2022-08-14 23:44:26 -0700 |
---|---|---|
committer | Tom Willemse | 2022-08-14 23:44:26 -0700 |
commit | 69a9a95483ca23ee1a42554a9675a30a9d94cc30 (patch) | |
tree | 50ae1504f3371f6a6df17338dd5658b4d1aa579a /clox/src/vm.c | |
parent | 1bba129074b812a354eccfdd9cc69b233789dc6c (diff) | |
download | crafting-interpreters-69a9a95483ca23ee1a42554a9675a30a9d94cc30.tar.gz crafting-interpreters-69a9a95483ca23ee1a42554a9675a30a9d94cc30.zip |
Chapter 29.3
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); |