/* * 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 #include #include static int call(struct nw_interp *const i, const varuint32 function_index) { FILE *const f = i->f; const struct nw_mod *const m = i->cfg.m; struct nw_frame fr = {0}; struct search_fn fn; /* TODO: treat import functions. */ if (search_fn(function_index, m, f, &fn)) { LOG("%s: search_fn failed\n", __func__); return -1; } else if (section_type_push(f, m, fn.index, &fr)) { LOG("%s: section_type_push failed\n", __func__); return -1; } else if (section_code_push(i, fn.start)) { LOG("%s: section_code_push failed\n", __func__); return -1; } return 0; } static int op(struct nw_interp *const i, FILE *const f) { varuint32 function_index; if (varuint32_read(f, &function_index)) { LOG("%s: varuint32_read failed\n", __func__); return -1; } else if (i && call(i, function_index)) { LOG("%s: call failed\n", __func__); return -1; } return 0; } int op_call(struct nw_interp *const i) { return op(i, i->f); } int check_call(FILE *const f) { return op(NULL, f); }