From a65380a2b0a885118fd96ff68bf6db59e9698e77 Mon Sep 17 00:00:00 2001 From: Ryan Patterson Date: Sat, 6 Jul 2024 21:36:45 +0600 Subject: [PATCH] WASM support Add wasm support --- README.md | 18 ++++ pyproject.toml | 1 + setup.py | 28 ++--- tests/test_wasm.py | 36 +++++++ tests/wasm/tree-sitter-javascript.wasm | Bin 0 -> 645615 bytes tree_sitter/__init__.py | 5 +- tree_sitter/binding/language.c | 127 +++++++++++++++++++++++ tree_sitter/binding/module.c | 35 +++++++ tree_sitter/binding/parser.c | 20 ++++ tree_sitter/binding/types.h | 5 + tree_sitter/binding/wasmtime.c | 104 +++++++++++++++++++ tree_sitter/binding/wasmtime_symbols.txt | 53 ++++++++++ 12 files changed, 419 insertions(+), 13 deletions(-) create mode 100644 tests/test_wasm.py create mode 100644 tests/wasm/tree-sitter-javascript.wasm create mode 100644 tree_sitter/binding/wasmtime.c create mode 100644 tree_sitter/binding/wasmtime_symbols.txt diff --git a/README.md b/README.md index 54077d77..a48fef49 100644 --- a/README.md +++ b/README.md @@ -15,6 +15,8 @@ The package has no library dependencies and provides pre-compiled wheels for all ```sh pip install tree-sitter +# For wasm support +pip install tree-sitter[wasm] ``` ## Usage @@ -39,6 +41,22 @@ from tree_sitter import Language, Parser PY_LANGUAGE = Language(tspython.language()) ``` +#### Wasm support + +If you enable the `wasm` extra, then tree-sitter will be able to use wasmtime to load languages compiled to wasm and parse with them. Example: + +```python +from pathlib import Path +from wasmtime import Engine +from tree_sitter import Language, Parser + +engine = Engine() +wasm_bytes = Path("my_language.wasm").read_bytes() +MY_LANGUAGE = Language.from_wasm("my_language", engine, wasm_bytes) +``` + +Languages loaded this way work identically to native-binary languages. + ### Basic parsing Create a `Parser` and configure it to use a language: diff --git a/pyproject.toml b/pyproject.toml index 8ba4cc9c..4fa0928b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -38,6 +38,7 @@ tests = [ "tree-sitter-python>=0.23.0", "tree-sitter-rust>=0.23.0", ] +wasm = ["wasmtime>=25"] [tool.ruff] target-version = "py39" diff --git a/setup.py b/setup.py index f6876d9c..a0c131f5 100644 --- a/setup.py +++ b/setup.py @@ -23,29 +23,33 @@ "tree_sitter/binding/range.c", "tree_sitter/binding/tree.c", "tree_sitter/binding/tree_cursor.c", + "tree_sitter/binding/wasmtime.c", "tree_sitter/binding/module.c", ], include_dirs=[ "tree_sitter/binding", "tree_sitter/core/lib/include", "tree_sitter/core/lib/src", + "tree_sitter/core/lib/src/wasm", ], define_macros=[ ("PY_SSIZE_T_CLEAN", None), ("TREE_SITTER_HIDE_SYMBOLS", None), + ("TREE_SITTER_FEATURE_WASM", None), ], - undef_macros=[ - "TREE_SITTER_FEATURE_WASM", - ], - extra_compile_args=[ - "-std=c11", - "-fvisibility=hidden", - "-Wno-cast-function-type", - "-Werror=implicit-function-declaration", - ] if system() != "Windows" else [ - "/std:c11", - "/wd4244", - ], + extra_compile_args=( + [ + "-std=c11", + "-fvisibility=hidden", + "-Wno-cast-function-type", + "-Werror=implicit-function-declaration", + ] + if system() != "Windows" + else [ + "/std:c11", + "/wd4244", + ] + ), ) ], ) diff --git a/tests/test_wasm.py b/tests/test_wasm.py new file mode 100644 index 00000000..d6571c0d --- /dev/null +++ b/tests/test_wasm.py @@ -0,0 +1,36 @@ +import importlib.resources +from unittest import TestCase + +from tree_sitter import Language, Parser, Tree + +try: + import wasmtime + + class TestWasm(TestCase): + @classmethod + def setUpClass(cls): + javascript_wasm = ( + importlib.resources.files("tests") + .joinpath("wasm/tree-sitter-javascript.wasm") + .read_bytes() + ) + engine = wasmtime.Engine() + cls.javascript = Language.from_wasm("javascript", engine, javascript_wasm) + + def test_parser(self): + parser = Parser(self.javascript) + self.assertIsInstance(parser.parse(b"test"), Tree) + + def test_language_is_wasm(self): + self.assertEqual(self.javascript.is_wasm, True) + +except ImportError: + + class TestWasmDisabled(TestCase): + def test_parser(self): + def runtest(): + Language.from_wasm("javascript", None, b"") + + self.assertRaisesRegex( + RuntimeError, "wasmtime module is not loaded", runtest + ) diff --git a/tests/wasm/tree-sitter-javascript.wasm b/tests/wasm/tree-sitter-javascript.wasm new file mode 100644 index 0000000000000000000000000000000000000000..dfff4727f25f5c5781c4d30d12f8eff310e5604e GIT binary patch literal 645615 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 != NULL) { + wasm_engine_delete(self->wasm_engine); + } ts_language_delete(self->language); Py_TYPE(self)->tp_free(self); } +// ctypes.cast(managed_pointer.ptr(), ctypes.c_void_p).value +static void *get_managed_pointer(PyObject *cast, PyObject *c_void_p, PyObject *managed_pointer) { + void *ptr = NULL; + PyObject *ptr_method = NULL; + PyObject *ptr_result = NULL; + PyObject *cast_result = NULL; + PyObject *value_attr = NULL; + + // Call .ptr() method on the managed pointer + ptr_method = PyObject_GetAttrString(managed_pointer, "ptr"); + if (ptr_method == NULL) { + goto cleanup; + } + ptr_result = PyObject_CallObject(ptr_method, NULL); + if (ptr_result == NULL) { + goto cleanup; + } + + // Call cast function + cast_result = PyObject_CallFunctionObjArgs(cast, ptr_result, c_void_p, NULL); + if (cast_result == NULL) { + goto cleanup; + } + + // Get the 'value' attribute from the cast result + value_attr = PyObject_GetAttrString(cast_result, "value"); + if (value_attr == NULL) { + goto cleanup; + } + + // Convert the value attribute to a C void pointer + ptr = PyLong_AsVoidPtr(value_attr); + +cleanup: + Py_XDECREF(value_attr); + Py_XDECREF(cast_result); + Py_XDECREF(ptr_result); + Py_XDECREF(ptr_method); + + if (PyErr_Occurred()) { + return NULL; + } + + return ptr; +} + +PyObject *language_from_wasm(PyTypeObject *cls, PyObject *args) { + ModuleState *state = (ModuleState *)PyType_GetModuleState(cls); + TSWasmError error; + TSWasmStore *wasm_store = NULL; + TSLanguage *language = NULL; + Language *self = NULL; + char *name; + PyObject *py_engine = NULL; + char *wasm; + Py_ssize_t wasm_length; + if (state->wasmtime_engine_type == NULL) { + PyErr_SetString(PyExc_RuntimeError, "wasmtime module is not loaded"); + return NULL; + } + if (!PyArg_ParseTuple(args, "sO!y#:from_wasm", &name, state->wasmtime_engine_type, &py_engine, &wasm, &wasm_length)) { + return NULL; + } + + TSWasmEngine *engine = (TSWasmEngine *)get_managed_pointer(state->ctypes_cast, state->c_void_p, py_engine); + if (engine == NULL) { + goto fail; + } + engine = wasmtime_engine_clone(engine); + if (engine == NULL) { + goto fail; + } + + wasm_store = ts_wasm_store_new(engine, &error); + if (wasm_store == NULL) { + PyErr_Format(PyExc_RuntimeError, "Failed to create TSWasmStore: %s", error.message); + goto fail; + } + + language = (TSLanguage *)ts_wasm_store_load_language(wasm_store, name, wasm, wasm_length, &error); + if (language == NULL) { + PyErr_Format(PyExc_RuntimeError, "Failed to load language: %s", error.message); + goto fail; + } + + self = (Language *)cls->tp_alloc(cls, 0); + if (self == NULL) { + goto fail; + } + + self->language = language; + self->wasm_engine = engine; + self->version = ts_language_version(self->language); +#if HAS_LANGUAGE_NAMES + self->name = ts_language_name(self->language); +#endif + return (PyObject *)self; + +fail: + if (engine != NULL) { + wasm_engine_delete(engine); + } + ts_language_delete(language); + return NULL; +} + PyObject *language_repr(Language *self) { #if HAS_LANGUAGE_NAMES if (self->name == NULL) { @@ -82,6 +194,10 @@ PyObject *language_get_field_count(Language *self, void *Py_UNUSED(payload)) { return PyLong_FromUnsignedLong(ts_language_field_count(self->language)); } +PyObject *language_is_wasm(Language *self, void *Py_UNUSED(payload)) { + return PyBool_FromLong(ts_language_is_wasm(self->language)); +} + PyObject *language_node_kind_for_id(Language *self, PyObject *args) { TSSymbol symbol; if (!PyArg_ParseTuple(args, "H:node_kind_for_id", &symbol)) { @@ -190,6 +306,9 @@ PyObject *language_query(Language *self, PyObject *args) { return PyObject_CallFunction((PyObject *)state->query_type, "Os#", self, source, length); } +PyDoc_STRVAR(language_from_wasm_doc, + "from_wasm(self, name, engine, wasm, /)\n--\n\n" + "Load a language compiled as wasm."); PyDoc_STRVAR(language_node_kind_for_id_doc, "node_kind_for_id(self, id, /)\n--\n\n" "Get the name of the node kind for the given numerical id."); @@ -220,6 +339,12 @@ PyDoc_STRVAR( "Create a new :class:`Query` from a string containing one or more S-expression patterns."); static PyMethodDef language_methods[] = { + { + .ml_name = "from_wasm", + .ml_meth = (PyCFunction)language_from_wasm, + .ml_flags = METH_CLASS | METH_VARARGS, + .ml_doc = language_from_wasm_doc, + }, { .ml_name = "node_kind_for_id", .ml_meth = (PyCFunction)language_node_kind_for_id, @@ -291,6 +416,8 @@ static PyGetSetDef language_accessors[] = { PyDoc_STR("The number of valid states in this language."), NULL}, {"field_count", (getter)language_get_field_count, NULL, PyDoc_STR("The number of distinct field names in this language."), NULL}, + {"is_wasm", (getter)language_is_wasm, NULL, + PyDoc_STR("Check if the language came from a wasm module."), NULL}, {NULL}, }; diff --git a/tree_sitter/binding/module.c b/tree_sitter/binding/module.c index 8f7026f4..22d730dd 100644 --- a/tree_sitter/binding/module.c +++ b/tree_sitter/binding/module.c @@ -1,3 +1,4 @@ +#include #include "types.h" extern PyType_Spec language_type_spec; @@ -15,6 +16,8 @@ extern PyType_Spec range_type_spec; extern PyType_Spec tree_cursor_type_spec; extern PyType_Spec tree_type_spec; +void tsp_load_wasmtime_symbols(); + // TODO(0.24): drop Python 3.9 support #if PY_MINOR_VERSION > 9 #define AddObjectRef PyModule_AddObjectRef @@ -62,6 +65,9 @@ static void module_free(void *self) { Py_XDECREF(state->tree_type); Py_XDECREF(state->query_error); Py_XDECREF(state->re_compile); + Py_XDECREF(state->wasmtime_engine_type); + Py_XDECREF(state->ctypes_cast); + Py_XDECREF(state->c_void_p); } static struct PyModuleDef module_definition = { @@ -147,6 +153,35 @@ PyMODINIT_FUNC PyInit__binding(void) { if (namedtuple == NULL) { goto cleanup; } + + PyObject *wasmtime_engine = import_attribute("wasmtime", "Engine"); + if (wasmtime_engine == NULL) { + // No worries, disable functionality. + PyErr_Clear(); + } else { + // Ensure wasmtime_engine is a PyTypeObject + if (!PyType_Check(wasmtime_engine)) { + PyErr_SetString(PyExc_TypeError, "wasmtime.Engine is not a type"); + goto cleanup; + } + state->wasmtime_engine_type = (PyTypeObject *)wasmtime_engine; + + tsp_load_wasmtime_symbols(); + if (PyErr_Occurred()) { + goto cleanup; + } + + state->ctypes_cast = import_attribute("ctypes", "cast"); + if (state->ctypes_cast == NULL) { + goto cleanup; + } + + state->c_void_p = import_attribute("ctypes", "c_void_p"); + if (state->c_void_p == NULL) { + goto cleanup; + } + } + PyObject *point_args = Py_BuildValue("s[ss]", "Point", "row", "column"); PyObject *point_kwargs = PyDict_New(); PyDict_SetItemString(point_kwargs, "module", PyUnicode_FromString("tree_sitter")); diff --git a/tree_sitter/binding/parser.c b/tree_sitter/binding/parser.c index 5cf42394..4c061b0b 100644 --- a/tree_sitter/binding/parser.c +++ b/tree_sitter/binding/parser.c @@ -1,3 +1,4 @@ +#include #include "types.h" #define SET_ATTRIBUTE_ERROR(name) \ @@ -278,6 +279,7 @@ PyObject *parser_get_language(Parser *self, void *Py_UNUSED(payload)) { } int parser_set_language(Parser *self, PyObject *arg, void *Py_UNUSED(payload)) { + ModuleState *state = GET_MODULE_STATE(self); if (arg == NULL || arg == Py_None) { self->language = NULL; return 0; @@ -299,6 +301,24 @@ int parser_set_language(Parser *self, PyObject *arg, void *Py_UNUSED(payload)) { return -1; } + if (state->wasmtime_engine_type != NULL && ts_language_is_wasm(language->language)) { + TSWasmEngine *engine = language->wasm_engine; + if (engine == NULL) { + PyErr_Format(PyExc_RuntimeError, "Language has no WASM engine"); + return -1; + } + // Allocate a new wasm store and assign it before loading this wasm language. + // It would be possible to reuse the existing store if it belonged to the same + // engine, but tree-sitter does not expose an API to verify that. + TSWasmError error; + TSWasmStore *store = ts_wasm_store_new(engine, &error); + if (store == NULL) { + PyErr_Format(PyExc_RuntimeError, "Failed to create TSWasmStore: %s", error.message); + return -1; + } + ts_parser_set_wasm_store(self->parser, store); + } + if (!ts_parser_set_language(self->parser, language->language)) { PyErr_SetString(PyExc_RuntimeError, "Failed to set the parser language"); return -1; diff --git a/tree_sitter/binding/types.h b/tree_sitter/binding/types.h index 4d73eadf..5eeb6657 100644 --- a/tree_sitter/binding/types.h +++ b/tree_sitter/binding/types.h @@ -30,6 +30,7 @@ typedef struct { typedef struct { PyObject_HEAD TSLanguage *language; + TSWasmEngine *wasm_engine; uint32_t version; #if HAS_LANGUAGE_NAMES const char *name; @@ -40,6 +41,7 @@ typedef struct { PyObject_HEAD TSParser *parser; PyObject *language; + int has_wasm_store; } Parser; typedef struct { @@ -113,6 +115,9 @@ typedef struct { TSTreeCursor default_cursor; PyObject *re_compile; PyObject *query_error; + PyTypeObject *wasmtime_engine_type; + PyObject *ctypes_cast; + PyObject *c_void_p; PyTypeObject *language_type; PyTypeObject *lookahead_iterator_type; PyTypeObject *lookahead_names_iterator_type; diff --git a/tree_sitter/binding/wasmtime.c b/tree_sitter/binding/wasmtime.c new file mode 100644 index 00000000..6d00f5da --- /dev/null +++ b/tree_sitter/binding/wasmtime.c @@ -0,0 +1,104 @@ +#include +#include +#include "types.h" + +#define own // Marker used by wasm declarations + +typedef int (*func_ptr)(); + +static func_ptr get_dll_func(PyObject *dll, PyObject *cast, PyObject *c_void_p, const char *name) { + func_ptr result = NULL; + PyObject *py_func = NULL, *cast_result = NULL, *value_attr = NULL; + + // Get the function attribute from the dll object + py_func = PyObject_GetAttrString(dll, name); + if (py_func == NULL) { + PyErr_Format(PyExc_AttributeError, "%s", name); + goto cleanup; + } + + // Call cast(py_func, c_void_p) + cast_result = PyObject_CallFunctionObjArgs(cast, py_func, c_void_p, NULL); + if (cast_result == NULL) { + PyErr_SetString(PyExc_AttributeError, "Failed cast to c_void_p"); + goto cleanup; + } + + // Get the 'value' attribute from the cast result + value_attr = PyObject_GetAttrString(cast_result, "value"); + if (value_attr == NULL) { + PyErr_SetString(PyExc_AttributeError, "c_void_p has no value"); + goto cleanup; + } + + // Convert the value attribute to a C pointer + result = (func_ptr)PyLong_AsVoidPtr(value_attr); + +cleanup: + Py_XDECREF(py_func); + Py_XDECREF(cast_result); + Py_XDECREF(value_attr); + return result; +} + +int wasmtime_available = 0; + +// Declare placeholders for functions +#define WASMTIME_TRAMPOLINE(type, return, name, args, call) \ + static type (*real_##name) args = NULL; \ + type name args { return (*real_##name) call; } +#include "wasmtime_symbols.txt" +#undef WASMTIME_TRAMPOLINE + +/// Loads wasmtime as an optional dependency. +void tsp_load_wasmtime_symbols() { + PyObject *ctypes = NULL, *cast = NULL, *c_void_p = NULL, *wasmtime = NULL, *_ffi = NULL, *dll = NULL; + ctypes = PyImport_ImportModule("ctypes"); + if (ctypes == NULL) { + PyErr_SetString(PyExc_RuntimeError, "ctypes module is missing"); + goto cleanup; + } + cast = PyObject_GetAttrString(ctypes, "cast"); + if (cast == NULL) { + PyErr_SetString(PyExc_AttributeError, "ctypes module has no cast"); + goto cleanup; + } + c_void_p = PyObject_GetAttrString(ctypes, "c_void_p"); + if (c_void_p == NULL) { + PyErr_SetString(PyExc_AttributeError, "ctypes module has no c_void_p"); + goto cleanup; + } + wasmtime = PyImport_ImportModule("wasmtime"); + if (wasmtime == NULL) { + goto cleanup; + } + _ffi = PyObject_GetAttrString(wasmtime, "_ffi"); + if (_ffi == NULL) { + PyErr_SetString(PyExc_AttributeError, "wasmtime module has no _ffi"); + goto cleanup; + } + dll = PyObject_GetAttrString(_ffi, "dll"); + if (dll == NULL) { + PyErr_SetString(PyExc_AttributeError, "wasmtime._ffi module has no dll"); + goto cleanup; + } + +#define WASMTIME_TRAMPOLINE(type, return, name, args, call) do { \ + real_##name = (type (*) args) get_dll_func(dll, cast, c_void_p, #name); \ + if (real_##name == NULL) { \ + goto cleanup; \ + } \ + } while (false); +#include "wasmtime_symbols.txt" +#undef WASMTIME_TRAMPOLINE + + wasmtime_available = 1; + +cleanup: + Py_XDECREF(dll); + Py_XDECREF(_ffi); + Py_XDECREF(wasmtime); + Py_XDECREF(c_void_p); + Py_XDECREF(cast); + Py_XDECREF(ctypes); +} diff --git a/tree_sitter/binding/wasmtime_symbols.txt b/tree_sitter/binding/wasmtime_symbols.txt new file mode 100644 index 00000000..ccafce25 --- /dev/null +++ b/tree_sitter/binding/wasmtime_symbols.txt @@ -0,0 +1,53 @@ +WASMTIME_TRAMPOLINE(void,, wasm_byte_vec_delete, (wasm_byte_vec_t *a), (a)) +WASMTIME_TRAMPOLINE(void,, wasm_engine_delete, (own wasm_engine_t *a), (a)) +WASMTIME_TRAMPOLINE(wasm_engine_t *, return, wasm_engine_new, (void), ()) +WASMTIME_TRAMPOLINE(const wasm_name_t*, return, wasm_exporttype_name, (const wasm_exporttype_t* a), (a)) +WASMTIME_TRAMPOLINE(void,, wasm_exporttype_vec_delete, (own wasm_exporttype_vec_t *a), (a)) +WASMTIME_TRAMPOLINE(const wasm_memorytype_t*, return, wasm_externtype_as_memorytype_const, (const wasm_externtype_t* a), (a)) +WASMTIME_TRAMPOLINE(void,, wasm_functype_delete, (own wasm_functype_t *a), (a)) +WASMTIME_TRAMPOLINE(wasm_functype_t*, return, wasm_functype_new, (wasm_valtype_vec_t* a, wasm_valtype_vec_t* b), (a, b)) +WASMTIME_TRAMPOLINE(void,, wasm_globaltype_delete, (own wasm_globaltype_t *a), (a)) +WASMTIME_TRAMPOLINE(wasm_globaltype_t*, return, wasm_globaltype_new, (wasm_valtype_t* a, wasm_mutability_t b), (a, b)) +WASMTIME_TRAMPOLINE(const wasm_name_t*, return, wasm_importtype_name, (const wasm_importtype_t* a), (a)) +WASMTIME_TRAMPOLINE(const wasm_externtype_t*, return, wasm_importtype_type, (const wasm_importtype_t* a), (a)) +WASMTIME_TRAMPOLINE(void,, wasm_importtype_vec_delete, (own wasm_importtype_vec_t *a), (a)) +WASMTIME_TRAMPOLINE(void,, wasm_memorytype_delete, (own wasm_memorytype_t *a), (a)) +WASMTIME_TRAMPOLINE(wasm_memorytype_t*, return, wasm_memorytype_new, (const wasm_limits_t* a), (a)) +WASMTIME_TRAMPOLINE(void,, wasm_tabletype_delete, (own wasm_tabletype_t *a), (a)) +WASMTIME_TRAMPOLINE(wasm_tabletype_t*, return, wasm_tabletype_new, (wasm_valtype_t* a, const wasm_limits_t* b), (a, b)) +WASMTIME_TRAMPOLINE(void,, wasm_trap_delete, (own wasm_trap_t *a), (a)) +WASMTIME_TRAMPOLINE(void,, wasm_trap_message, (const wasm_trap_t* a, own wasm_message_t* out), (a, out)) +WASMTIME_TRAMPOLINE(wasm_valtype_t*, return, wasm_valtype_new, (wasm_valkind_t a), (a)) +WASMTIME_TRAMPOLINE(void,, wasm_valtype_vec_new, (wasm_valtype_vec_t* out, size_t size, wasm_valtype_t* const data[]), (out, size, data)) +WASMTIME_TRAMPOLINE(void,, wasm_valtype_vec_new_empty, (wasm_valtype_vec_t* out), (out)) +WASMTIME_TRAMPOLINE(wasmtime_context_t*, return, wasmtime_caller_context, (wasmtime_caller_t* caller), (caller)) +WASMTIME_TRAMPOLINE(wasm_engine_t*, return, wasmtime_engine_clone, (wasm_engine_t* engine), (engine)) +WASMTIME_TRAMPOLINE(void,, wasmtime_error_delete, (wasmtime_error_t* error), (error)) +WASMTIME_TRAMPOLINE(void,, wasmtime_error_message, (const wasmtime_error_t* error, wasm_name_t* message), (error, message)) +WASMTIME_TRAMPOLINE(wasmtime_error_t*, return, wasmtime_func_call, (wasmtime_context_t* store, const wasmtime_func_t* func, const wasmtime_val_t* args, size_t nargs, wasmtime_val_t* results, size_t nresults, wasm_trap_t** trap), (store, func, args, nargs, results, nresults, trap)) +WASMTIME_TRAMPOLINE(wasmtime_error_t*, return, wasmtime_func_call_unchecked, (wasmtime_context_t* store, const wasmtime_func_t* func, wasmtime_val_raw_t* args_and_results, size_t args_and_results_len, wasm_trap_t** trap), (store, func, args_and_results, args_and_results_len, trap)) +WASMTIME_TRAMPOLINE(void,, wasmtime_func_new_unchecked, (wasmtime_context_t* store, const wasm_functype_t* type, wasmtime_func_unchecked_callback_t callback, void* env, void (*finalizer)(void*), wasmtime_func_t* ret), (store, type, callback, env, finalizer, ret)) +WASMTIME_TRAMPOLINE(wasmtime_error_t*, return, wasmtime_global_new, (wasmtime_context_t* store, const wasm_globaltype_t* type, const wasmtime_val_t* val, wasmtime_global_t* ret), (store, type, val, ret)) +WASMTIME_TRAMPOLINE(bool, return, wasmtime_instance_export_nth, (wasmtime_context_t* store, const wasmtime_instance_t* instance, size_t index, char** name, size_t* name_len, wasmtime_extern_t* item), (store, instance, index, name, name_len, item)) +WASMTIME_TRAMPOLINE(wasmtime_error_t*, return, wasmtime_instance_new, (wasmtime_context_t* store, const wasmtime_module_t* module, const wasmtime_extern_t* imports, size_t nimports, wasmtime_instance_t* instance, wasm_trap_t** trap), (store, module, imports, nimports, instance, trap)) +WASMTIME_TRAMPOLINE(uint8_t*, return, wasmtime_memory_data, (const wasmtime_context_t* store, const wasmtime_memory_t* memory), (store, memory)) +WASMTIME_TRAMPOLINE(size_t, return, wasmtime_memory_data_size, (const wasmtime_context_t* store, const wasmtime_memory_t* memory), (store, memory)) +WASMTIME_TRAMPOLINE(wasmtime_error_t*, return, wasmtime_memory_grow, (wasmtime_context_t* store, const wasmtime_memory_t* memory, uint64_t delta, uint64_t* prev_size), (store, memory, delta, prev_size)) +WASMTIME_TRAMPOLINE(wasmtime_error_t*, return, wasmtime_memory_new, (wasmtime_context_t* store, const wasm_memorytype_t* ty, wasmtime_memory_t* ret), (store, ty, ret)) +WASMTIME_TRAMPOLINE(uint64_t, return, wasmtime_memorytype_minimum, (const wasm_memorytype_t* ty), (ty)) +WASMTIME_TRAMPOLINE(void,, wasmtime_module_delete, (wasmtime_module_t* module), (module)) +WASMTIME_TRAMPOLINE(void,, wasmtime_module_exports, (const wasmtime_module_t* module, wasm_exporttype_vec_t* out), (module, out)) +WASMTIME_TRAMPOLINE(void,, wasmtime_module_imports, (const wasmtime_module_t* module, wasm_importtype_vec_t* out), (module, out)) +WASMTIME_TRAMPOLINE(wasmtime_error_t*, return, wasmtime_module_new, (wasm_engine_t* engine, const uint8_t* wasm, size_t wasm_len, wasmtime_module_t** ret), (engine, wasm, wasm_len, ret)) +WASMTIME_TRAMPOLINE(wasmtime_context_t*, return, wasmtime_store_context, (wasmtime_store_t* store), (store)) +WASMTIME_TRAMPOLINE(void,, wasmtime_store_delete, (wasmtime_store_t* store), (store)) +WASMTIME_TRAMPOLINE(wasmtime_store_t*, return, wasmtime_store_new, (wasm_engine_t* engine, void* data, void (*finalizer)(void*)), (engine, data, finalizer)) +WASMTIME_TRAMPOLINE(bool, return, wasmtime_table_get, (wasmtime_context_t* +store, const wasmtime_table_t* table, uint64_t index, wasmtime_val_t* val), (store, table, index, val)) +WASMTIME_TRAMPOLINE(wasmtime_error_t*, return, wasmtime_table_grow, +(wasmtime_context_t* store, const wasmtime_table_t* table, uint64_t delta, +const wasmtime_val_t* init, uint64_t* prev_size), (store, table, delta, init, prev_size)) +WASMTIME_TRAMPOLINE(wasmtime_error_t*, return, wasmtime_table_new, (wasmtime_context_t* store, const wasm_tabletype_t* ty, const wasmtime_val_t* init, wasmtime_table_t* table), (store, ty, init, table)) +WASMTIME_TRAMPOLINE(wasmtime_error_t*, return, wasmtime_table_set, +(wasmtime_context_t* store, const wasmtime_table_t* table, uint64_t index, const wasmtime_val_t* value), (store, table, index, value)) +WASMTIME_TRAMPOLINE(wasm_trap_t*, return, wasmtime_trap_new, (const char* msg, size_t msg_len), (msg, msg_len))