aboutsummaryrefslogtreecommitdiff
path: root/src/start.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/start.c')
-rw-r--r--src/start.c45
1 files changed, 45 insertions, 0 deletions
diff --git a/src/start.c b/src/start.c
new file mode 100644
index 0000000..453c62b
--- /dev/null
+++ b/src/start.c
@@ -0,0 +1,45 @@
+/*
+ * nanowasm, a tiny WebAssembly/Wasm interpreter
+ * Copyright (C) 2023-2024 Xavier Del Campo Romero
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at https://mozilla.org/MPL/2.0/.
+ */
+
+#include <nanowasm/nw.h>
+#include <nanowasm/types.h>
+#include <nw/interp.h>
+#include <nw/log.h>
+#include <nw/routines.h>
+
+static enum nw_state push(struct nw_interp *const i)
+{
+ const struct nw_i_sm_exp *const e = &i->sm.export;
+
+ if (e->kind != NW_KIND_FUNCTION)
+ {
+ static const char exc[] = "unexpected import kind";
+
+ i->exception = exc;
+ LOG("%s: %s: %d\n", __func__, exc, e->kind);
+ return NW_FATAL;
+ }
+
+ nwp_call(i, e->index);
+ return NW_AGAIN;
+}
+
+int nw_start(const struct nw_inst_cfg *const icfg, struct nw_inst *const i)
+{
+ *i = (const struct nw_inst){0};
+
+ if (nwp_interp_start(&icfg->interp_cfg, NULL, &i->interp))
+ {
+ LOG("%s: nwp_interp_start failed\n", __func__);
+ return -1;
+ }
+
+ nwp_find_export(&i->interp, "_start", push);
+ return 0;
+}