/* * 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 #include #include #include #include #include #include #include int nw_start(const struct nw_inst_cfg *const icfg, struct nw_inst *const i) { int ret = -1; const struct nw_mod *const m = icfg->interp.m; const struct nw_mod_cfg *const mcfg = &m->cfg; FILE *const f = fopen(mcfg->path, "rb"); struct search_fn fn; struct nw_frame fr = {0}; *i = (const struct nw_inst){0}; if (!f) { LOG("%s: fopen(3) %s: %s\n", __func__, mcfg->path, strerror(errno)); goto end; } else if (m->sections.start) { /* TODO. */ } else if (interp_start(&icfg->interp, f, &i->interp)) { LOG("%s: interp_start failed\n", __func__); goto end; } else if (search_exported_fn("_start", m, f, &fn)) { LOG("%s: search_exported_fn failed\n", __func__); goto end; } else if (section_global_push(f, m, &i->interp)) { LOG("%s: section_global_push failed\n", __func__); goto end; } else if (section_type_push(f, m, fn.index, &fr)) { LOG("%s: section_type_push failed\n", __func__); goto end; } else if (fseek(f, fn.start, SEEK_SET)) { LOG("%s: fseek(3): %s\n", __func__, strerror(errno)); return -1; } else if (section_code_push(f, &fr)) { LOG("%s: section_code_push failed\n", __func__); goto end; } #if 0 else if (interp_push(&i->interp, &fr)) { LOG("%s: interp_push failed\n", __func__); goto end; } #endif ret = 0; end: if (ret && f && fclose(f)) { LOG("%s: fclose(3) %s: %s\n", __func__, mcfg->path, strerror(errno)); ret = -1; } return ret; }