From f25b015e5b668028c34974bbb22faa4105c26690 Mon Sep 17 00:00:00 2001 From: Xavier Del Campo Romero Date: Sun, 26 Nov 2023 22:43:30 +0100 Subject: First commit --- src/op/call/CMakeLists.txt | 11 +++++++ src/op/call/call.c | 79 +++++++++++++++++++++++++++++++++++++++++++++ src/op/call/call_indirect.c | 49 ++++++++++++++++++++++++++++ 3 files changed, 139 insertions(+) create mode 100644 src/op/call/CMakeLists.txt create mode 100644 src/op/call/call.c create mode 100644 src/op/call/call_indirect.c (limited to 'src/op/call') diff --git a/src/op/call/CMakeLists.txt b/src/op/call/CMakeLists.txt new file mode 100644 index 0000000..527f35d --- /dev/null +++ b/src/op/call/CMakeLists.txt @@ -0,0 +1,11 @@ +# 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/. + +target_sources(${PROJECT_NAME} PRIVATE + call.c + call_indirect.c +) diff --git a/src/op/call/call.c b/src/op/call/call.c new file mode 100644 index 0000000..19355ca --- /dev/null +++ b/src/op/call/call.c @@ -0,0 +1,79 @@ +/* + * 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(f, fn.start, &fr)) + { + LOG("%s: section_code_push failed\n", __func__); + return -1; + } + else if (interp_push(i, &fr)) + { + LOG("%s: interp_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); +} diff --git a/src/op/call/call_indirect.c b/src/op/call/call_indirect.c new file mode 100644 index 0000000..bae8a57 --- /dev/null +++ b/src/op/call/call_indirect.c @@ -0,0 +1,49 @@ +/* + * 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 + +static int op(struct nw_interp *const i, FILE *const f) +{ + varuint32 type_index; + varuint1 reserved; + + if (varuint32_read(f, &type_index)) + { + LOG("%s: varuint32_read failed\n", __func__); + return 1; + } + else if (varuint1_read(f, &reserved)) + { + LOG("%s: varuint1_read failed\n", __func__); + return 1; + } + else if (reserved) + { + LOG("%s: unexpected non-zero reserved value %u\n", + __func__, (unsigned)reserved); + return 1; + } + + return 0; +} + +int op_call_indirect(struct nw_interp *const i) +{ + return op(i, i->f); +} + +int check_call_indirect(FILE *const f) +{ + return op(NULL, f); +} -- cgit v1.2.3