diff options
author | Tom Willemse | 2022-08-14 16:11:39 -0700 |
---|---|---|
committer | Tom Willemse | 2022-08-14 16:11:39 -0700 |
commit | cb42c811218b30ff9ff1a194b18fe3d85ea68a50 (patch) | |
tree | 5d0b5d6388ab6cdda9323fddf96d49364a0dd8f8 /clox/src/vm.c | |
parent | 7871383a400f0a37dbd8459755aa9f98e2742f7a (diff) | |
download | crafting-interpreters-cb42c811218b30ff9ff1a194b18fe3d85ea68a50.tar.gz crafting-interpreters-cb42c811218b30ff9ff1a194b18fe3d85ea68a50.zip |
Chapter 28.4
Diffstat (limited to 'clox/src/vm.c')
-rw-r--r-- | clox/src/vm.c | 11 |
1 files changed, 11 insertions, 0 deletions
diff --git a/clox/src/vm.c b/clox/src/vm.c index 6b15a3a..d248609 100644 --- a/clox/src/vm.c +++ b/clox/src/vm.c @@ -65,12 +65,16 @@ void initVM() { initTable(&vm.globals); initTable(&vm.strings); + vm.initString = NULL; + vm.initString = copyString("init", 4); + defineNative("clock", clockNative); } void freeVM() { freeTable(&vm.globals); freeTable(&vm.strings); + vm.initString = NULL; freeObjects(); } @@ -116,6 +120,13 @@ static bool callValue(Value callee, int argCount) { case OBJ_CLASS: { ObjClass *klass = AS_CLASS(callee); vm.stackTop[-argCount - 1] = OBJ_VAL(newInstance(klass)); + Value initializer; + if (tableGet(&klass->methods, vm.initString, &initializer)) { + return call(AS_CLOSURE(initializer), argCount); + } else if (argCount != 0) { + runtimeError("Expected 0 arguments but got %d.", argCount); + return false; + } return true; } case OBJ_CLOSURE: |