From 9c414b5da5c4fa6aa3154224d4bbc2471d9731b2 Mon Sep 17 00:00:00 2001 From: Bob Nystrom Date: Wed, 25 Mar 2015 20:20:26 -0700 Subject: [PATCH] Get Meta working with foreign methods. --- builtin/meta.wren | 4 +++- src/vm/wren_io.c | 2 +- src/vm/wren_meta.c | 17 +++++++++++++++-- src/vm/wren_meta.h | 4 ++++ src/vm/wren_vm.c | 26 +++++++++++++++++--------- 5 files changed, 40 insertions(+), 13 deletions(-) diff --git a/builtin/meta.wren b/builtin/meta.wren index 3db22bbf..800999f4 100644 --- a/builtin/meta.wren +++ b/builtin/meta.wren @@ -1 +1,3 @@ -class Meta {} +class Meta { + foreign static eval(source) +} diff --git a/src/vm/wren_io.c b/src/vm/wren_io.c index 7c363f69..ff079f02 100644 --- a/src/vm/wren_io.c +++ b/src/vm/wren_io.c @@ -148,7 +148,7 @@ void wrenLoadIOLibrary(WrenVM* vm) WrenForeignMethodFn wrenBindIOForeignMethod(WrenVM* vm, const char* className, const char* signature) { - ASSERT(strcmp(className, "IO") == 0, "Should only have IO class."); + if (strcmp(className, "IO") != 0) return NULL; if (strcmp(signature, "writeString_(_)") == 0) return ioWriteString; if (strcmp(signature, "clock") == 0) return ioClock; diff --git a/src/vm/wren_meta.c b/src/vm/wren_meta.c index c49dea8d..da340d6a 100644 --- a/src/vm/wren_meta.c +++ b/src/vm/wren_meta.c @@ -2,9 +2,13 @@ #if WREN_USE_LIB_META +#include + // This string literal is generated automatically from meta.wren. Do not edit. static const char* libSource = -"class Meta {}\n"; +"class Meta {\n" +" foreign static eval(source)\n" +"}\n"; void metaEval(WrenVM* vm) { @@ -16,7 +20,16 @@ void metaEval(WrenVM* vm) void wrenLoadMetaLibrary(WrenVM* vm) { wrenInterpret(vm, "", libSource); - wrenDefineStaticMethod(vm, "Meta", "eval(_)", metaEval); +} + +WrenForeignMethodFn wrenBindMetaForeignMethod(WrenVM* vm, + const char* className, + const char* signature) +{ + if (strcmp(className, "Meta") != 0) return NULL; + + if (strcmp(signature, "eval(_)") == 0) return metaEval; + return NULL; } #endif diff --git a/src/vm/wren_meta.h b/src/vm/wren_meta.h index 10d56700..104a99b3 100644 --- a/src/vm/wren_meta.h +++ b/src/vm/wren_meta.h @@ -9,6 +9,10 @@ void wrenLoadMetaLibrary(WrenVM* vm); +WrenForeignMethodFn wrenBindMetaForeignMethod(WrenVM* vm, + const char* className, + const char* signature); + #endif #endif diff --git a/src/vm/wren_vm.c b/src/vm/wren_vm.c index 6ee770dc..1c21686d 100644 --- a/src/vm/wren_vm.c +++ b/src/vm/wren_vm.c @@ -60,15 +60,15 @@ WrenVM* wrenNewVM(WrenConfiguration* configuration) vm->heapScalePercent = 100 + configuration->heapGrowthPercent; } - ObjString* name = AS_STRING(CONST_STRING(vm, "main")); + ObjString* name = AS_STRING(CONST_STRING(vm, "core")); wrenPushRoot(vm, (Obj*)name); - // Implicitly create a "main" module for the REPL or entry script. - ObjModule* mainModule = wrenNewModule(vm, name); - wrenPushRoot(vm, (Obj*)mainModule); + // Implicitly create a "core" module for the built in libraries. + ObjModule* coreModule = wrenNewModule(vm, name); + wrenPushRoot(vm, (Obj*)coreModule); vm->modules = wrenNewMap(vm); - wrenMapSet(vm, vm->modules, NULL_VAL, OBJ_VAL(mainModule)); + wrenMapSet(vm, vm->modules, NULL_VAL, OBJ_VAL(coreModule)); wrenPopRoot(vm); // mainModule. wrenPopRoot(vm); // name. @@ -295,10 +295,18 @@ static WrenForeignMethodFn findForeignMethod(WrenVM* vm, } // Otherwise, try the built-in libraries. - #if WREN_USE_LIB_IO - fn = wrenBindIOForeignMethod(vm, className, signature); - if (fn != NULL) return fn; - #endif + if (strcmp(moduleName, "core") == 0) + { + #if WREN_USE_LIB_IO + fn = wrenBindIOForeignMethod(vm, className, signature); + if (fn != NULL) return fn; + #endif + + #if WREN_USE_LIB_META + fn = wrenBindMetaForeignMethod(vm, className, signature); + if (fn != NULL) return fn; + #endif + } // TODO: Report a runtime error on failure to find it. return NULL;