mirror of
https://github.com/bytecodealliance/wasm-micro-runtime.git
synced 2025-05-07 12:16:24 +00:00

Before adding the new bindings: 1. Moved wasm-c-api in a subfolder wasmcapi in the package. 2. Adapted the tests to be able to run in this new structure. New: 1. Added the WAMR API in another folder wamrapi in the same level as wasm-c-api. 2. Created an OOP proposal. 3. Added an example using this proposal.
94 lines
2.5 KiB
Python
94 lines
2.5 KiB
Python
# -*- coding: utf-8 -*-
|
|
#!/usr/bin/env python3
|
|
#
|
|
# Copyright (C) 2019 Intel Corporation. All rights reserved.
|
|
# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
#
|
|
import ctypes
|
|
import wamr.wasmcapi.ffi as ffi
|
|
|
|
WAMS_BINARY_CONTENT = (
|
|
b"\x00asm\x01\x00\x00\x00\x01\x84\x80\x80\x80\x00\x01`\x00\x00\x02\x8a\x80"
|
|
b"\x80\x80\x00\x01\x00\x05hello\x00\x00\x03\x82\x80\x80\x80\x00\x01\x00"
|
|
b"\x07\x87\x80\x80\x80\x00\x01\x03run\x00\x01\n\x8a\x80\x80\x80\x00\x01"
|
|
b"\x84\x80\x80\x80\x00\x00\x10\x00\x0b"
|
|
)
|
|
|
|
|
|
@ffi.wasm_func_cb_decl
|
|
def hello_callback(args, results):
|
|
print("Calling back...")
|
|
print("> Hello World!")
|
|
|
|
|
|
def main():
|
|
print("Initializing...")
|
|
engine = ffi.wasm_engine_new()
|
|
store = ffi.wasm_store_new(engine)
|
|
|
|
print("Loading binary...")
|
|
|
|
# for convenience, use binary content instead of open file
|
|
# with open("./hello.wasm", "rb") as f:
|
|
# wasm = f.read()
|
|
wasm = WAMS_BINARY_CONTENT
|
|
binary = ffi.wasm_byte_vec_t()
|
|
ffi.wasm_byte_vec_new_uninitialized(binary, len(wasm))
|
|
# underlying buffer is not writable
|
|
binary.data = (ctypes.c_ubyte * len(wasm)).from_buffer_copy(wasm)
|
|
|
|
print("Compiling module...")
|
|
module = ffi.wasm_module_new(store, binary)
|
|
if not module:
|
|
raise RuntimeError("Compiling module failed")
|
|
|
|
binary.data = None
|
|
ffi.wasm_byte_vec_delete(binary)
|
|
|
|
print("Creating callback...")
|
|
hello_type = ffi.wasm_functype_new_0_0()
|
|
hello_func = ffi.wasm_func_new(
|
|
store,
|
|
hello_type,
|
|
hello_callback,
|
|
)
|
|
|
|
ffi.wasm_functype_delete(hello_type)
|
|
|
|
print("Instantiating module...")
|
|
|
|
imports = ffi.wasm_extern_vec_t()
|
|
ffi.wasm_extern_vec_new((imports), 1, ffi.wasm_func_as_extern(hello_func))
|
|
instance = ffi.wasm_instance_new(store, module, imports, None)
|
|
|
|
ffi.wasm_func_delete(hello_func)
|
|
|
|
print("Extracting export...")
|
|
exports = ffi.wasm_extern_vec_t()
|
|
ffi.wasm_instance_exports(instance, exports)
|
|
|
|
run_func = ffi.wasm_extern_as_func(exports.data[0])
|
|
if not run_func:
|
|
raise RuntimeError("can not extract exported function")
|
|
|
|
ffi.wasm_instance_delete(instance)
|
|
ffi.wasm_module_delete(module)
|
|
|
|
print("Calling export...")
|
|
args = ffi.wasm_val_vec_t()
|
|
results = ffi.wasm_val_vec_t()
|
|
|
|
ffi.wasm_val_vec_new_empty(args)
|
|
ffi.wasm_val_vec_new_empty(results)
|
|
ffi.wasm_func_call(run_func, args, results)
|
|
|
|
print("Shutting down...")
|
|
ffi.wasm_store_delete(store)
|
|
ffi.wasm_engine_delete(engine)
|
|
|
|
print("Done.")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|