diff --git a/builtin/meta.wren b/builtin/meta.wren new file mode 100644 index 00000000..3db22bbf --- /dev/null +++ b/builtin/meta.wren @@ -0,0 +1 @@ +class Meta {} diff --git a/script/test.py b/script/test.py index 33b63888..83ed7764 100755 --- a/script/test.py +++ b/script/test.py @@ -243,7 +243,7 @@ def run_test(path): print('') -for dir in ['core', 'io', 'language', 'limit']: +for dir in ['core', 'io', 'language', 'limit', 'meta']: walk(join(WREN_DIR, 'test', dir), run_test) print_line() diff --git a/src/vm/wren_common.h b/src/vm/wren_common.h index 5d310748..380a5893 100644 --- a/src/vm/wren_common.h +++ b/src/vm/wren_common.h @@ -51,6 +51,13 @@ #define WREN_USE_LIB_IO 1 #endif +// If true, loads the "Meta" class in the standard library. +// +// Defaults to on. +#ifndef WREN_USE_LIB_META +#define WREN_USE_LIB_META 1 +#endif + // These flags are useful for debugging and hacking on Wren itself. They are not // intended to be used for production code. They default to off. diff --git a/src/vm/wren_meta.c b/src/vm/wren_meta.c new file mode 100644 index 00000000..4d65553d --- /dev/null +++ b/src/vm/wren_meta.c @@ -0,0 +1,21 @@ +#include "wren_meta.h" + +#if WREN_USE_LIB_META + +// This string literal is generated automatically from meta.wren. Do not edit. +static const char* libSource = +"class Meta {}\n"; + +void metaEval(WrenVM* vm) +{ + const char* source = wrenGetArgumentString(vm, 1); + wrenInterpret(vm, "Meta", source); +} + +void wrenLoadMetaLibrary(WrenVM* vm) +{ + wrenInterpret(vm, "", libSource); + wrenDefineStaticMethod(vm, "Meta", "eval(_)", metaEval); +} + +#endif diff --git a/src/vm/wren_meta.h b/src/vm/wren_meta.h new file mode 100644 index 00000000..10d56700 --- /dev/null +++ b/src/vm/wren_meta.h @@ -0,0 +1,14 @@ +#ifndef wren_meta_h +#define wren_meta_h + +#include "wren.h" +#include "wren_common.h" + +// This module defines the Meta class and its associated methods. +#if WREN_USE_LIB_META + +void wrenLoadMetaLibrary(WrenVM* vm); + +#endif + +#endif diff --git a/src/vm/wren_vm.c b/src/vm/wren_vm.c index 7f7068f5..86d610ae 100644 --- a/src/vm/wren_vm.c +++ b/src/vm/wren_vm.c @@ -14,6 +14,10 @@ #include "wren_io.h" #endif +#if WREN_USE_LIB_META + #include "wren_meta.h" +#endif + #if WREN_DEBUG_TRACE_MEMORY || WREN_DEBUG_TRACE_GC #include #endif @@ -68,6 +72,9 @@ WrenVM* wrenNewVM(WrenConfiguration* configuration) #if WREN_USE_LIB_IO wrenLoadIOLibrary(vm); #endif + #if WREN_USE_LIB_META + wrenLoadMetaLibrary(vm); + #endif return vm; } diff --git a/test/meta/eval_existing_scoped_variable.wren b/test/meta/eval_existing_scoped_variable.wren new file mode 100644 index 00000000..90c44873 --- /dev/null +++ b/test/meta/eval_existing_scoped_variable.wren @@ -0,0 +1,5 @@ +var y + +Meta.eval("y = 2") + +IO.print(y) // expect: 2 \ No newline at end of file