From f22472a64488535650c5fe31e3bd67dcbb2e1cac Mon Sep 17 00:00:00 2001 From: Calvin Rose Date: Sat, 23 Jan 2021 16:52:26 -0600 Subject: [PATCH] Begin work on allowing small binaries. --- jpm | 13 +++++++++---- meson.build | 2 +- src/core/corelib.c | 37 +++++++++++++++++++++---------------- src/core/thread.c | 3 +++ src/include/janet.h | 1 + src/mainclient/shell.c | 14 +++++++++----- 6 files changed, 44 insertions(+), 26 deletions(-) diff --git a/jpm b/jpm index 52e2e4d8..93bf2038 100755 --- a/jpm +++ b/jpm @@ -663,7 +663,6 @@ int main(int argc, const char **argv) { } /* Create enviornment */ - temptab = janet_table(0); temptab = env; janet_table_put(temptab, janet_ckeywordv("args"), janet_wrap_array(args)); janet_gcroot(janet_wrap_table(temptab)); @@ -674,6 +673,14 @@ int main(int argc, const char **argv) { /* Run everything */ JanetFiber *fiber = janet_fiber(jfunc, 64, argc, argc ? args->data : NULL); fiber->env = temptab; +#ifdef JANET_EV + janet_gcroot(janet_wrap_fiber(fiber)); + janet_schedule(fiber, janet_wrap_nil()); + janet_loop(); + int status = janet_fiber_status(fiber); + janet_deinit(); + return status; +#else Janet out; JanetSignal result = janet_continue(fiber, janet_wrap_nil(), &out); if (result != JANET_SIGNAL_OK && result != JANET_SIGNAL_EVENT) { @@ -681,11 +688,9 @@ int main(int argc, const char **argv) { janet_deinit(); return result; } -#ifdef JANET_NET - janet_loop(); -#endif janet_deinit(); return 0; +#endif } ```)) diff --git a/meson.build b/meson.build index fc8fa7de..c9beebcf 100644 --- a/meson.build +++ b/meson.build @@ -20,7 +20,7 @@ project('janet', 'c', default_options : ['c_std=c99', 'b_lundef=false', 'default_library=both'], - version : '1.14.2') + version : '1.14.3') # Global settings janet_path = join_paths(get_option('prefix'), get_option('libdir'), 'janet') diff --git a/src/core/corelib.c b/src/core/corelib.c index 78986696..7ee0f008 100644 --- a/src/core/corelib.c +++ b/src/core/corelib.c @@ -1221,22 +1221,7 @@ JanetTable *janet_core_env(JanetTable *replacements) { return janet_vm_core_env; } - /* Load core cfunctions (and some built in janet assembly functions) */ - JanetTable *dict = janet_table(512); - janet_load_libs(dict); - - /* Add replacements */ - if (replacements != NULL) { - for (int32_t i = 0; i < replacements->capacity; i++) { - JanetKV kv = replacements->data[i]; - if (!janet_checktype(kv.key, JANET_NIL)) { - janet_table_put(dict, kv.key, kv.value); - if (janet_checktype(kv.value, JANET_CFUNCTION)) { - janet_table_put(janet_vm_registry, kv.value, kv.key); - } - } - } - } + JanetTable *dict = janet_core_lookup_table(replacements); /* Unmarshal bytecode */ Janet marsh_out = janet_unmarshal( @@ -1270,3 +1255,23 @@ JanetTable *janet_core_env(JanetTable *replacements) { } #endif + +JanetTable *janet_core_lookup_table(JanetTable *replacements) { + JanetTable *dict = janet_table(512); + janet_load_libs(dict); + + /* Add replacements */ + if (replacements != NULL) { + for (int32_t i = 0; i < replacements->capacity; i++) { + JanetKV kv = replacements->data[i]; + if (!janet_checktype(kv.key, JANET_NIL)) { + janet_table_put(dict, kv.key, kv.value); + if (janet_checktype(kv.value, JANET_CFUNCTION)) { + janet_table_put(janet_vm_registry, kv.value, kv.key); + } + } + } + } + + return dict; +} diff --git a/src/core/thread.c b/src/core/thread.c index 1394547d..88b56f7a 100644 --- a/src/core/thread.c +++ b/src/core/thread.c @@ -84,6 +84,9 @@ static JANET_THREAD_LOCAL JanetTable *janet_vm_thread_decode = NULL; static JanetTable *janet_thread_get_decode(void) { if (janet_vm_thread_decode == NULL) { janet_vm_thread_decode = janet_get_core_table("load-image-dict"); + if (NULL == janet_vm_thread_decode) { + janet_vm_thread_decode = janet_table(0); + } janet_gcroot(janet_wrap_table(janet_vm_thread_decode)); } return janet_vm_thread_decode; diff --git a/src/include/janet.h b/src/include/janet.h index 21e1f013..eb59746c 100644 --- a/src/include/janet.h +++ b/src/include/janet.h @@ -1406,6 +1406,7 @@ JANET_API JanetCompileResult janet_compile(Janet source, JanetTable *env, JanetS /* Get the default environment for janet */ JANET_API JanetTable *janet_core_env(JanetTable *replacements); +JANET_API JanetTable *janet_core_lookup_table(JanetTable *replacements); JANET_API int janet_dobytes(JanetTable *env, const uint8_t *bytes, int32_t len, const char *sourcePath, Janet *out); JANET_API int janet_dostring(JanetTable *env, const char *str, const char *sourcePath, Janet *out); diff --git a/src/mainclient/shell.c b/src/mainclient/shell.c index 174a324f..b75572a5 100644 --- a/src/mainclient/shell.c +++ b/src/mainclient/shell.c @@ -1042,19 +1042,23 @@ int main(int argc, char **argv) { janet_table_put(env, janet_ckeywordv("executable"), janet_cstringv(argv[0])); /* Run startup script */ - Janet mainfun, out; + Janet mainfun; janet_resolve(env, janet_csymbol("cli-main"), &mainfun); Janet mainargs[1] = { janet_wrap_array(args) }; JanetFiber *fiber = janet_fiber(janet_unwrap_function(mainfun), 64, 1, mainargs); fiber->env = env; + +#ifdef JANET_EV + janet_gcroot(janet_wrap_fiber(fiber)); + janet_schedule(fiber, janet_wrap_nil()); + janet_loop(); + status = janet_fiber_status(fiber); +#else + Janet out; status = janet_continue(fiber, janet_wrap_nil(), &out); if (status != JANET_SIGNAL_OK && status != JANET_SIGNAL_EVENT) { janet_stacktrace(fiber, out); } - -#ifdef JANET_EV - status = JANET_SIGNAL_OK; - janet_loop(); #endif /* Deinitialize vm */