diff --git a/src/core/capi.c b/src/core/capi.c index 6a99b85f..ce681b49 100644 --- a/src/core/capi.c +++ b/src/core/capi.c @@ -325,7 +325,10 @@ JanetRange janet_getslice(int32_t argc, const Janet *argv) { } Janet janet_dyn(const char *name) { - if (!janet_vm_fiber) return janet_wrap_nil(); + if (!janet_vm_fiber) { + if (!janet_vm_top_dyns) return janet_wrap_nil(); + return janet_table_get(janet_vm_top_dyns, janet_ckeywordv(name)); + } if (janet_vm_fiber->env) { return janet_table_get(janet_vm_fiber->env, janet_ckeywordv(name)); } else { @@ -334,11 +337,15 @@ Janet janet_dyn(const char *name) { } void janet_setdyn(const char *name, Janet value) { - if (!janet_vm_fiber) return; - if (!janet_vm_fiber->env) { - janet_vm_fiber->env = janet_table(1); + if (!janet_vm_fiber) { + if (!janet_vm_top_dyns) janet_vm_top_dyns = janet_table(10); + janet_table_put(janet_vm_top_dyns, janet_ckeywordv(name), value); + } else { + if (!janet_vm_fiber->env) { + janet_vm_fiber->env = janet_table(1); + } + janet_table_put(janet_vm_fiber->env, janet_ckeywordv(name), value); } - janet_table_put(janet_vm_fiber->env, janet_ckeywordv(name), value); } uint64_t janet_getflags(const Janet *argv, int32_t n, const char *flags) { diff --git a/src/core/state.h b/src/core/state.h index 43bf8200..7ead6368 100644 --- a/src/core/state.h +++ b/src/core/state.h @@ -34,6 +34,9 @@ typedef struct JanetScratch JanetScratch; +/* Top level dynamic bindings */ +extern JANET_THREAD_LOCAL JanetTable *janet_vm_top_dyns; + /* Cache the core environment */ extern JANET_THREAD_LOCAL JanetTable *janet_vm_core_env; diff --git a/src/core/vm.c b/src/core/vm.c index 07cc3e07..1eb372cb 100644 --- a/src/core/vm.c +++ b/src/core/vm.c @@ -33,6 +33,7 @@ #include /* VM state */ +JANET_THREAD_LOCAL JanetTable *janet_vm_top_dyns; JANET_THREAD_LOCAL JanetTable *janet_vm_core_env; JANET_THREAD_LOCAL JanetTable *janet_vm_registry; JANET_THREAD_LOCAL JanetTable *janet_vm_abstract_registry; @@ -1419,6 +1420,8 @@ int janet_init(void) { janet_vm_traversal_top = NULL; /* Core env */ janet_vm_core_env = NULL; + /* Dynamic bindings */ + janet_vm_top_dyns = NULL; /* Seed RNG */ janet_rng_seed(janet_default_rng(), 0); /* Fibers */ @@ -1443,6 +1446,7 @@ void janet_deinit(void) { janet_vm_registry = NULL; janet_vm_abstract_registry = NULL; janet_vm_core_env = NULL; + janet_vm_top_dyns = NULL; free(janet_vm_traversal_base); janet_vm_fiber = NULL; janet_vm_root_fiber = NULL;