我尝试调用未知的WebAssembly的函数«或者更好地说,我尝试模拟它们»并且如果函数具有返回值以获得其返回值。
我无法得到以下代码我无法获得导出,但无法获取任何需要它的参数信息。
instance.exports();
这就是为什么我写了一个解析器来找出WebAssembly-File的函数及其参数。在我获得这些信息之后,我试图调用导出函数并出现以下错误:
导入对象字段'env'不是Object。
其标题:
(import "env" "DYNAMICTOP_PTR" (global $env.DYNAMICTOP_PTR i32))
(import "env" "STACKTOP" (global $env.STACKTOP i32))
(import "env" "STACK_MAX" (global $env.STACK_MAX i32))
(import "env" "abort" (func $env.abort (type $t1)))
(import "env" "enlargeMemory" (func $env.enlargeMemory (type $t2)))
(import "env" "getTotalMemory" (func $env.getTotalMemory (type $t2)))
(import "env" "abortOnCannotGrowMemory" (func $env.abortOnCannotGrowMemory (type $t2)))
(import "env" "_gmtime" (func $env._gmtime (type $t3)))
(import "env" "___setErrNo" (func $env.___setErrNo (type $t1)))
(import "env" "_emscripten_memcpy_big" (func $env._emscripten_memcpy_big (type $t4)))
(import "env" "___syscall20" (func $env.___syscall20 (type $t5)))
(import "env" "_ftime" (func $env._ftime (type $t3)))
(import "env" "memory" (memory $env.memory 256 256))
(import "env" "table" (table $env.table 8 8 anyfunc))
(import "env" "memoryBase" (global $env.memoryBase i32))
(import "env" "tableBase" (global $env.tableBase i32))
原因很明显:因为我没有定义任何导入对象。我有以下想法来解决这个问题:
我定义了importObject,使其满足最低要求。我找到了一些导入的代码:
table: new WebAssembly.Table({ initial: 0, maximum: 0, element: 'anyfunc' }),
tableBase: 0,
memory: memory,
memoryBase: 1024,
STACKTOP: 0,
STACK_MAX: memory.buffer.byteLength,
但是有太多不同的进口。我找不到一个列表,它给出了所有导入类型及其定义。这就是为什么我想创建自己的表来解决这个问题。你能给我一些信息或帮我制作这张桌子吗?
答案 0 :(得分:2)
我找不到一个列表,它列出了所有导入类型及其定义
你找不到这样一个清单的原因是因为它不存在!
WebAssembly模块可以导入或导出函数(以及表,内存和全局变量)。您选择导入或导出的内容完全取决于您,并取决于您尝试使用WebAssembly模块实现的目标。只添加两个数字的简单模块可能会导出一个add
函数。
从您的代码示例中,您看起来正在使用Emscripten,它在WebAssembly模块周围添加了许多基础架构/框架代码。由于此代码通常不被视为其API的一部分,因此您可能需要深入研究代码以确定导入对象的外观:
https://github.com/kripken/emscripten/blob/78b44ed55cc4d0b4d79f62df9e80ae6f29a5345b/src/preamble.js