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.c11
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: