aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--stand/common/bootstrap.h3
-rw-r--r--stand/common/interp.c1
-rw-r--r--stand/common/interp_forth.c13
-rw-r--r--stand/common/interp_lua.c23
-rw-r--r--stand/common/interp_simple.c5
5 files changed, 40 insertions, 5 deletions
diff --git a/stand/common/bootstrap.h b/stand/common/bootstrap.h
index b7d6e538f9be..79ce0b023b7a 100644
--- a/stand/common/bootstrap.h
+++ b/stand/common/bootstrap.h
@@ -54,7 +54,8 @@ bool interp_has_builtin_cmd(const char *cmd);
/* Called by interp.c for interp_*.c embedded interpreters */
int interp_include(const char *); /* Execute commands from filename */
-void interp_init(void); /* Initialize interpreater */
+void interp_preinit(void); /* Initialize interpreater execution engine */
+void interp_init(void); /* Initialize interpreater and run main script */
int interp_run(const char *); /* Run a single command */
/* interp_backslash.c */
diff --git a/stand/common/interp.c b/stand/common/interp.c
index c6ac01ea099b..5d20822e037d 100644
--- a/stand/common/interp.c
+++ b/stand/common/interp.c
@@ -60,6 +60,7 @@ interact(void)
* we need to switch interpreters.
*/
interp_identifier = bootprog_interp;
+ interp_preinit();
interp_init();
printf("\n");
diff --git a/stand/common/interp_forth.c b/stand/common/interp_forth.c
index 854addb22d5c..388a20e319b3 100644
--- a/stand/common/interp_forth.c
+++ b/stand/common/interp_forth.c
@@ -337,12 +337,21 @@ bf_run(const char *line)
return (result);
}
+static bool preinit_run = false;
+
void
-interp_init(void)
+interp_preinit(void)
{
-
+ if (preinit_run)
+ return;
setenv("script.lang", "forth", 1);
bf_init();
+ preinit_run = true;
+}
+
+void
+interp_init(void)
+{
/* Read our default configuration. */
interp_include("/boot/loader.rc");
}
diff --git a/stand/common/interp_lua.c b/stand/common/interp_lua.c
index aa759aa99ec1..2a61bb9d04af 100644
--- a/stand/common/interp_lua.c
+++ b/stand/common/interp_lua.c
@@ -96,17 +96,21 @@ static const luaL_Reg loadedlibs[] = {
{NULL, NULL}
};
+static bool preinit_done = false;
+
void
-interp_init(void)
+interp_preinit(void)
{
lua_State *luap;
struct interp_lua_softc *softc = &lua_softc;
- const char *filename;
const luaL_Reg *lib;
lua_init_md_t **fnpp;
TSENTER();
+ if (preinit_done)
+ return;
+
setenv("script.lang", "lua", 1);
LDBG("creating context");
@@ -126,6 +130,21 @@ interp_init(void)
LUA_FOREACH_SET(fnpp)
(*fnpp)(luap);
+ preinit_done = true;
+
+ TSEXIT();
+}
+
+void
+interp_init(void)
+{
+ lua_State *luap;
+ struct interp_lua_softc *softc = &lua_softc;
+ const char *filename;
+
+ TSENTER();
+
+ luap = softc->luap;
filename = getenv("loader_lua");
if (filename == NULL)
filename = LOADER_LUA;
diff --git a/stand/common/interp_simple.c b/stand/common/interp_simple.c
index d675da0aa61e..437739a3bcc4 100644
--- a/stand/common/interp_simple.c
+++ b/stand/common/interp_simple.c
@@ -35,6 +35,11 @@
INTERP_DEFINE("simp");
void
+interp_preinit(void)
+{
+}
+
+void
interp_init(void)
{