mirror of
https://github.com/dart-lang/sdk
synced 2024-09-15 21:30:17 +00:00
[wasm] Basic WASI support.
Enabling WASI when building an instance sets up the default WASI imports, and can optionally capture stdout/stderr. I'd like to set up something similar for stdin, but Wasmer doesn't support that yet. I also improved error handling in WasmRuntime by adding Wasmer's last error to the thrown exceptions where appropriate. Bug: https://github.com/dart-lang/sdk/issues/37882 Change-Id: I2d8546e878bcb43c7093490eac085aa62d318e96 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/167904 Reviewed-by: Ryan Macnak <rmacnak@google.com> Commit-Queue: Liam Appelbe <liama@google.com>
This commit is contained in:
parent
043bebcd02
commit
e2840ed07a
|
@ -114,6 +114,7 @@ class WasmInstanceBuilder {
|
|||
late List<WasmImportDescriptor> _importDescs;
|
||||
Map<String, int> _importIndex;
|
||||
late Pointer<Pointer<WasmerExtern>> _imports;
|
||||
Pointer<WasmerWasiEnv> _wasiEnv = nullptr;
|
||||
|
||||
WasmInstanceBuilder(this._module) : _importIndex = {} {
|
||||
_importDescs = WasmRuntime().importDescriptors(_module._module);
|
||||
|
@ -174,6 +175,21 @@ class WasmInstanceBuilder {
|
|||
return this;
|
||||
}
|
||||
|
||||
/// Enable WASI and add the default WASI imports.
|
||||
WasmInstanceBuilder enableWasi(
|
||||
{bool captureStdout = false, bool captureStderr = false}) {
|
||||
if (_wasiEnv != nullptr) {
|
||||
throw Exception("WASI is already enabled.");
|
||||
}
|
||||
var runtime = WasmRuntime();
|
||||
var config = runtime.newWasiConfig();
|
||||
if (captureStdout) runtime.captureWasiStdout(config);
|
||||
if (captureStderr) runtime.captureWasiStderr(config);
|
||||
_wasiEnv = runtime.newWasiEnv(config);
|
||||
runtime.getWasiImports(_module._store, _module._module, _wasiEnv, _imports);
|
||||
return this;
|
||||
}
|
||||
|
||||
/// Build the module instance.
|
||||
WasmInstance build() {
|
||||
for (var i = 0; i < _importDescs.length; ++i) {
|
||||
|
@ -181,7 +197,7 @@ class WasmInstanceBuilder {
|
|||
throw Exception("Missing import: ${_importDescs[i]}");
|
||||
}
|
||||
}
|
||||
return WasmInstance(_module, _imports);
|
||||
return WasmInstance(_module, _imports, _wasiEnv);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -190,9 +206,13 @@ class WasmInstance {
|
|||
WasmModule _module;
|
||||
Pointer<WasmerInstance> _instance;
|
||||
Pointer<WasmerMemory>? _exportedMemory;
|
||||
Pointer<WasmerWasiEnv> _wasiEnv;
|
||||
Stream<List<int>>? _stdout;
|
||||
Stream<List<int>>? _stderr;
|
||||
Map<String, WasmFunction> _functions = {};
|
||||
|
||||
WasmInstance(this._module, Pointer<Pointer<WasmerExtern>> imports)
|
||||
WasmInstance(
|
||||
this._module, Pointer<Pointer<WasmerExtern>> imports, this._wasiEnv)
|
||||
: _instance = WasmRuntime()
|
||||
.instantiate(_module._store, _module._module, imports) {
|
||||
var runtime = WasmRuntime();
|
||||
|
@ -210,7 +230,11 @@ class WasmInstance {
|
|||
name, f, runtime.getArgTypes(ft), runtime.getReturnType(ft));
|
||||
} else if (kind == WasmerExternKindMemory) {
|
||||
// WASM currently allows only one memory per module.
|
||||
_exportedMemory = runtime.externToMemory(e);
|
||||
var mem = runtime.externToMemory(e);
|
||||
_exportedMemory = mem;
|
||||
if (_wasiEnv != nullptr) {
|
||||
runtime.wasiEnvSetMemory(_wasiEnv as Pointer<WasmerWasiEnv>, mem);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -228,6 +252,24 @@ class WasmInstance {
|
|||
}
|
||||
return WasmMemory._fromExport(_exportedMemory as Pointer<WasmerMemory>);
|
||||
}
|
||||
|
||||
/// Returns a stream that reads from stdout. To use this, you must enable WASI
|
||||
/// when instantiating the module, and set captureStdout to true.
|
||||
Stream<List<int>> get stdout {
|
||||
if (_wasiEnv == nullptr) {
|
||||
throw Exception("Can't capture stdout without WASI enabled.");
|
||||
}
|
||||
return _stdout ??= WasmRuntime().getWasiStdoutStream(_wasiEnv);
|
||||
}
|
||||
|
||||
/// Returns a stream that reads from stderr. To use this, you must enable WASI
|
||||
/// when instantiating the module, and set captureStderr to true.
|
||||
Stream<List<int>> get stderr {
|
||||
if (_wasiEnv == nullptr) {
|
||||
throw Exception("Can't capture stderr without WASI enabled.");
|
||||
}
|
||||
return _stderr ??= WasmRuntime().getWasiStderrStream(_wasiEnv);
|
||||
}
|
||||
}
|
||||
|
||||
/// WasmMemory contains the memory of a WasmInstance.
|
||||
|
|
|
@ -6,6 +6,7 @@
|
|||
// To regenerate the file, use the following command
|
||||
// "generate_ffi_boilerplate.py".
|
||||
|
||||
import 'dart:async';
|
||||
import 'dart:convert';
|
||||
import 'dart:ffi';
|
||||
import 'dart:io';
|
||||
|
@ -58,6 +59,15 @@ class WasmRuntime {
|
|||
|
||||
DynamicLibrary _lib;
|
||||
late Pointer<WasmerEngine> _engine;
|
||||
late WasmerWasiConfigInheritStderrFn _wasi_config_inherit_stderr;
|
||||
late WasmerWasiConfigInheritStdoutFn _wasi_config_inherit_stdout;
|
||||
late WasmerWasiConfigNewFn _wasi_config_new;
|
||||
late WasmerWasiEnvDeleteFn _wasi_env_delete;
|
||||
late WasmerWasiEnvNewFn _wasi_env_new;
|
||||
late WasmerWasiEnvReadStderrFn _wasi_env_read_stderr;
|
||||
late WasmerWasiEnvReadStdoutFn _wasi_env_read_stdout;
|
||||
late WasmerWasiEnvSetMemoryFn _wasi_env_set_memory;
|
||||
late WasmerWasiGetImportsFn _wasi_get_imports;
|
||||
late WasmerByteVecDeleteFn _byte_vec_delete;
|
||||
late WasmerByteVecNewFn _byte_vec_new;
|
||||
late WasmerByteVecNewEmptyFn _byte_vec_new_empty;
|
||||
|
@ -120,11 +130,11 @@ class WasmRuntime {
|
|||
late WasmerValtypeVecNewFn _valtype_vec_new;
|
||||
late WasmerValtypeVecNewEmptyFn _valtype_vec_new_empty;
|
||||
late WasmerValtypeVecNewUninitializedFn _valtype_vec_new_uninitialized;
|
||||
late WasmerWasmerLastErrorLengthFn _wasmer_last_error_length;
|
||||
late WasmerWasmerLastErrorMessageFn _wasmer_last_error_message;
|
||||
|
||||
factory WasmRuntime() {
|
||||
WasmRuntime inst = _inst ?? WasmRuntime._init();
|
||||
_inst = inst;
|
||||
return inst;
|
||||
return _inst ??= WasmRuntime._init();
|
||||
}
|
||||
|
||||
static String _getLibName() {
|
||||
|
@ -165,6 +175,29 @@ class WasmRuntime {
|
|||
|
||||
WasmRuntime._init()
|
||||
: _lib = DynamicLibrary.open(path.join(_getLibDir(), _getLibName())) {
|
||||
_wasi_config_inherit_stderr = _lib.lookupFunction<
|
||||
NativeWasmerWasiConfigInheritStderrFn,
|
||||
WasmerWasiConfigInheritStderrFn>('wasi_config_inherit_stderr');
|
||||
_wasi_config_inherit_stdout = _lib.lookupFunction<
|
||||
NativeWasmerWasiConfigInheritStdoutFn,
|
||||
WasmerWasiConfigInheritStdoutFn>('wasi_config_inherit_stdout');
|
||||
_wasi_config_new =
|
||||
_lib.lookupFunction<NativeWasmerWasiConfigNewFn, WasmerWasiConfigNewFn>(
|
||||
'wasi_config_new');
|
||||
_wasi_env_delete =
|
||||
_lib.lookupFunction<NativeWasmerWasiEnvDeleteFn, WasmerWasiEnvDeleteFn>(
|
||||
'wasi_env_delete');
|
||||
_wasi_env_new =
|
||||
_lib.lookupFunction<NativeWasmerWasiEnvNewFn, WasmerWasiEnvNewFn>(
|
||||
'wasi_env_new');
|
||||
_wasi_env_read_stderr = _lib.lookupFunction<NativeWasmerWasiEnvReadStderrFn,
|
||||
WasmerWasiEnvReadStderrFn>('wasi_env_read_stderr');
|
||||
_wasi_env_read_stdout = _lib.lookupFunction<NativeWasmerWasiEnvReadStdoutFn,
|
||||
WasmerWasiEnvReadStdoutFn>('wasi_env_read_stdout');
|
||||
_wasi_env_set_memory = _lib.lookupFunction<NativeWasmerWasiEnvSetMemoryFn,
|
||||
WasmerWasiEnvSetMemoryFn>('wasi_env_set_memory');
|
||||
_wasi_get_imports = _lib.lookupFunction<NativeWasmerWasiGetImportsFn,
|
||||
WasmerWasiGetImportsFn>('wasi_get_imports');
|
||||
_byte_vec_delete =
|
||||
_lib.lookupFunction<NativeWasmerByteVecDeleteFn, WasmerByteVecDeleteFn>(
|
||||
'wasm_byte_vec_delete');
|
||||
|
@ -329,6 +362,12 @@ class WasmRuntime {
|
|||
NativeWasmerValtypeVecNewUninitializedFn,
|
||||
WasmerValtypeVecNewUninitializedFn>(
|
||||
'wasm_valtype_vec_new_uninitialized');
|
||||
_wasmer_last_error_length = _lib.lookupFunction<
|
||||
NativeWasmerWasmerLastErrorLengthFn,
|
||||
WasmerWasmerLastErrorLengthFn>('wasmer_last_error_length');
|
||||
_wasmer_last_error_message = _lib.lookupFunction<
|
||||
NativeWasmerWasmerLastErrorMessageFn,
|
||||
WasmerWasmerLastErrorMessageFn>('wasmer_last_error_message');
|
||||
|
||||
_engine = _engine_new();
|
||||
}
|
||||
|
@ -351,11 +390,7 @@ class WasmRuntime {
|
|||
free(dataPtr);
|
||||
free(dataVec);
|
||||
|
||||
if (modulePtr == nullptr) {
|
||||
throw Exception("Wasm module compile failed");
|
||||
}
|
||||
|
||||
return modulePtr;
|
||||
return _checkNotEqual(modulePtr, nullptr, "Wasm module compile failed.");
|
||||
}
|
||||
|
||||
List<WasmExportDescriptor> exportDescriptors(Pointer<WasmerModule> module) {
|
||||
|
@ -399,12 +434,8 @@ class WasmRuntime {
|
|||
|
||||
Pointer<WasmerInstance> instantiate(Pointer<WasmerStore> store,
|
||||
Pointer<WasmerModule> module, Pointer<Pointer<WasmerExtern>> imports) {
|
||||
var instancePtr = _instance_new(store, module, imports, nullptr);
|
||||
if (instancePtr == nullptr) {
|
||||
throw Exception("Wasm module instantiation failed");
|
||||
}
|
||||
|
||||
return instancePtr;
|
||||
return _checkNotEqual(_instance_new(store, module, imports, nullptr),
|
||||
nullptr, "Wasm module instantiation failed.");
|
||||
}
|
||||
|
||||
Pointer<WasmerExternVec> exports(Pointer<WasmerInstance> instancePtr) {
|
||||
|
@ -464,19 +495,13 @@ class WasmRuntime {
|
|||
limPtr.ref.max = maxPages ?? wasm_limits_max_default;
|
||||
var memType = _memorytype_new(limPtr);
|
||||
free(limPtr);
|
||||
Pointer<WasmerMemory> memPtr = _memory_new(store, memType);
|
||||
|
||||
if (memPtr == nullptr) {
|
||||
throw Exception("Failed to create memory");
|
||||
}
|
||||
return memPtr;
|
||||
return _checkNotEqual(
|
||||
_memory_new(store, memType), nullptr, "Failed to create memory.");
|
||||
}
|
||||
|
||||
void growMemory(Pointer<WasmerMemory> memory, int deltaPages) {
|
||||
var result = _memory_grow(memory, deltaPages);
|
||||
if (result == 0) {
|
||||
throw Exception("Failed to grow memory");
|
||||
}
|
||||
_checkNotEqual(
|
||||
_memory_grow(memory, deltaPages), 0, "Failed to grow memory.");
|
||||
}
|
||||
|
||||
int memoryLength(Pointer<WasmerMemory> memory) {
|
||||
|
@ -497,9 +522,89 @@ class WasmRuntime {
|
|||
store, funcType, func.cast(), env.cast(), finalizer.cast());
|
||||
}
|
||||
|
||||
Pointer<WasmerWasiConfig> newWasiConfig() {
|
||||
var name = allocate<Uint8>();
|
||||
name[0] = 0;
|
||||
var config = _wasi_config_new(name);
|
||||
free(name);
|
||||
return _checkNotEqual(config, nullptr, "Failed to create WASI config.");
|
||||
}
|
||||
|
||||
void captureWasiStdout(Pointer<WasmerWasiConfig> config) {
|
||||
_wasi_config_inherit_stdout(config);
|
||||
}
|
||||
|
||||
void captureWasiStderr(Pointer<WasmerWasiConfig> config) {
|
||||
_wasi_config_inherit_stderr(config);
|
||||
}
|
||||
|
||||
Pointer<WasmerWasiEnv> newWasiEnv(Pointer<WasmerWasiConfig> config) {
|
||||
return _checkNotEqual(
|
||||
_wasi_env_new(config), nullptr, "Failed to create WASI environment.");
|
||||
}
|
||||
|
||||
void wasiEnvSetMemory(
|
||||
Pointer<WasmerWasiEnv> env, Pointer<WasmerMemory> memory) {
|
||||
_wasi_env_set_memory(env, memory);
|
||||
}
|
||||
|
||||
void getWasiImports(Pointer<WasmerStore> store, Pointer<WasmerModule> mod,
|
||||
Pointer<WasmerWasiEnv> env, Pointer<Pointer<WasmerExtern>> imports) {
|
||||
_checkNotEqual(_wasi_get_imports(store, mod, env, imports), 0,
|
||||
"Failed to fill WASI imports.");
|
||||
}
|
||||
|
||||
Stream<List<int>> getWasiStdoutStream(Pointer<WasmerWasiEnv> env) {
|
||||
return Stream.fromIterable(_WasiStreamIterable(env, _wasi_env_read_stdout));
|
||||
}
|
||||
|
||||
Stream<List<int>> getWasiStderrStream(Pointer<WasmerWasiEnv> env) {
|
||||
return Stream.fromIterable(_WasiStreamIterable(env, _wasi_env_read_stderr));
|
||||
}
|
||||
|
||||
String _getLastError() {
|
||||
var length = _wasmer_last_error_length();
|
||||
var buf = allocate<Uint8>(count: length);
|
||||
_wasmer_last_error_message(buf, length);
|
||||
String message = utf8.decode(buf.asTypedList(length));
|
||||
free(buf);
|
||||
return message;
|
||||
}
|
||||
|
||||
T _checkNotEqual<T>(T x, T y, String errorMessage) {
|
||||
if (x == y) {
|
||||
throw Exception("$errorMessage\n${_getLastError()}");
|
||||
}
|
||||
return x;
|
||||
}
|
||||
|
||||
static String getSignatureString(
|
||||
String name, List<int> argTypes, int returnType) {
|
||||
return "${wasmerValKindName(returnType)} $name" +
|
||||
"(${argTypes.map(wasmerValKindName).join(", ")})";
|
||||
}
|
||||
}
|
||||
|
||||
class _WasiStreamIterator implements Iterator<List<int>> {
|
||||
static final int _bufferLength = 1024;
|
||||
Pointer<WasmerWasiEnv> _env;
|
||||
Function _reader;
|
||||
Pointer<Uint8> _buf = allocate<Uint8>(count: _bufferLength);
|
||||
int _length = 0;
|
||||
_WasiStreamIterator(this._env, this._reader) {}
|
||||
|
||||
bool moveNext() {
|
||||
_length = _reader(_env, _buf, _bufferLength);
|
||||
return true;
|
||||
}
|
||||
|
||||
List<int> get current => _buf.asTypedList(_length);
|
||||
}
|
||||
|
||||
class _WasiStreamIterable extends Iterable<List<int>> {
|
||||
Pointer<WasmerWasiEnv> _env;
|
||||
Function _reader;
|
||||
_WasiStreamIterable(this._env, this._reader) {}
|
||||
@override
|
||||
Iterator<List<int>> get iterator => _WasiStreamIterator(_env, _reader);
|
||||
}
|
||||
|
|
|
@ -33,13 +33,23 @@ def ptrWrap(t, n):
|
|||
return t
|
||||
|
||||
|
||||
def removePrefix(t):
|
||||
assert (t.startswith('wasm_') or t.startswith('wasi_') or
|
||||
t.startswith('wasmer_'))
|
||||
return t[(5 if t.startswith('wasm_') else 0):]
|
||||
|
||||
|
||||
def addPrefix(t):
|
||||
if t.startswith('wasi_') or t.startswith('wasmer_'):
|
||||
return t
|
||||
return 'wasm_' + t
|
||||
|
||||
|
||||
def getDartType(t, i):
|
||||
if t in predefTypes:
|
||||
t = predefTypes[t][i]
|
||||
else:
|
||||
assert (t.startswith('wasm_') and t.endswith('_t'))
|
||||
t = 'Wasmer' + camel(t[5:-2])
|
||||
return t
|
||||
return predefTypes[t][i]
|
||||
assert (t.endswith('_t'))
|
||||
return 'Wasmer' + camel(removePrefix(t[:-2]))
|
||||
|
||||
|
||||
def dartArgType(a, i):
|
||||
|
@ -54,13 +64,11 @@ def dartFnType(r, a, i):
|
|||
|
||||
|
||||
def dartFnTypeName(n):
|
||||
assert (n.startswith('wasm_'))
|
||||
return camel(n[5:])
|
||||
return camel(removePrefix(n))
|
||||
|
||||
|
||||
def dartFnMembName(n):
|
||||
assert (n.startswith('wasm_'))
|
||||
return n[4:]
|
||||
return '_' + removePrefix(n)
|
||||
|
||||
|
||||
def nativeTypeToFfi(n):
|
||||
|
@ -77,10 +85,10 @@ def getFns():
|
|||
yield name, retType, args
|
||||
|
||||
|
||||
opaqueTypeTemplate = '''// wasm_%s_t
|
||||
opaqueTypeTemplate = '''// %s_t
|
||||
class Wasmer%s extends Struct {}'''
|
||||
|
||||
vecTypeTemplate = '''// wasm_%s_vec_t
|
||||
vecTypeTemplate = '''// %s_vec_t
|
||||
class Wasmer%sVec extends Struct {
|
||||
@Uint64()
|
||||
external int length;
|
||||
|
@ -103,12 +111,13 @@ typedef Wasmer%sFn = %s;'''
|
|||
|
||||
def getWasmerApi():
|
||||
return ('\n\n'.join([
|
||||
opaqueTypeTemplate % (t, camel(t)) for t in sorted(opaqueTypes)
|
||||
opaqueTypeTemplate % (addPrefix(t), camel(t))
|
||||
for t in sorted(opaqueTypes)
|
||||
]) + '\n\n' + '\n\n'.join([
|
||||
vecTypeTemplate %
|
||||
(t, camel(t),
|
||||
('Pointer<%s>' if ptr else '%s') % nativeTypeToFfi('wasm_%s_t' % t),
|
||||
(byteVecToStringTemplate if t == 'byte' else ''))
|
||||
vecTypeTemplate % (addPrefix(t), camel(t),
|
||||
('Pointer<%s>' if ptr else '%s') % nativeTypeToFfi(
|
||||
'%s_t' % addPrefix(t)),
|
||||
(byteVecToStringTemplate if t == 'byte' else ''))
|
||||
for t, ptr in sorted(vecTypes.items())
|
||||
]) + '\n' + '\n'.join([
|
||||
fnApiTemplate %
|
||||
|
@ -189,38 +198,41 @@ def addFn(sig):
|
|||
retType = parseType(ret)
|
||||
args = [parseType(a) for a in argpack.split(',') if len(a.strip()) > 0]
|
||||
for _, t in args + [retType]:
|
||||
if t not in predefTypes and t[5:-2] not in opaqueTypes and t[
|
||||
5:-6] not in vecTypes:
|
||||
if t not in predefTypes and removePrefix(
|
||||
t[:-2]) not in opaqueTypes and removePrefix(
|
||||
t[:-6]) not in vecTypes:
|
||||
print('Missing type: ' + t)
|
||||
fns.append((name, retType, args))
|
||||
|
||||
|
||||
def declareOwn(name):
|
||||
opaqueTypes.add(name)
|
||||
addFn('void wasm_%s_delete(wasm_%s_t*)' % (name, name))
|
||||
n = addPrefix(name)
|
||||
addFn('void %s_delete(%s_t*)' % (n, n))
|
||||
|
||||
|
||||
def declareVec(name, storePtr):
|
||||
vecTypes[name] = storePtr
|
||||
addFn('void wasm_%s_vec_new_empty(wasm_%s_vec_t* out)' % (name, name))
|
||||
addFn('void wasm_%s_vec_new_uninitialized(wasm_%s_vec_t* out, size_t)' %
|
||||
(name, name))
|
||||
addFn('void wasm_%s_vec_new(wasm_%s_vec_t* out, size_t, wasm_%s_t %s[])' %
|
||||
(name, name, name, '*' if storePtr else ''))
|
||||
addFn('void wasm_%s_vec_copy(wasm_%s_vec_t* out, const wasm_%s_vec_t*)' %
|
||||
(name, name, name))
|
||||
addFn('void wasm_%s_vec_delete(wasm_%s_vec_t*)' % (name, name))
|
||||
n = addPrefix(name)
|
||||
addFn('void %s_vec_new_empty(%s_vec_t* out)' % (n, n))
|
||||
addFn('void %s_vec_new_uninitialized(%s_vec_t* out, size_t)' % (n, n))
|
||||
addFn('void %s_vec_new(%s_vec_t* out, size_t, %s_t %s[])' %
|
||||
(n, n, n, '*' if storePtr else ''))
|
||||
addFn('void %s_vec_copy(%s_vec_t* out, const %s_vec_t*)' % (n, n, n))
|
||||
addFn('void %s_vec_delete(%s_vec_t*)' % (n, n))
|
||||
|
||||
|
||||
def declareType(name, withCopy=True):
|
||||
declareOwn(name)
|
||||
declareVec(name, True)
|
||||
if withCopy:
|
||||
addFn('wasm_%s_t* wasm_%s_copy(wasm_%s_t*)' % (name, name, name))
|
||||
n = addPrefix(name)
|
||||
addFn('%s_t* %s_copy(%s_t*)' % (n, n, n))
|
||||
|
||||
|
||||
predefinedType('void', 'Void', 'void')
|
||||
predefinedType('bool', 'Uint8', 'int')
|
||||
predefinedType('int', 'Int64', 'int')
|
||||
predefinedType('byte_t', 'Uint8', 'int')
|
||||
predefinedType('wasm_byte_t', 'Uint8', 'int')
|
||||
predefinedType('uint8_t', 'Uint8', 'int')
|
||||
|
@ -228,6 +240,8 @@ predefinedType('uint16_t', 'Uint16', 'int')
|
|||
predefinedType('uint32_t', 'Uint32', 'int')
|
||||
predefinedType('uint64_t', 'Uint64', 'int')
|
||||
predefinedType('size_t', 'Uint64', 'int')
|
||||
predefinedType('uintptr_t', 'Uint64', 'int')
|
||||
predefinedType('intptr_t', 'Int64', 'int')
|
||||
predefinedType('int8_t', 'Int8', 'int')
|
||||
predefinedType('int16_t', 'Int16', 'int')
|
||||
predefinedType('int32_t', 'Int32', 'int')
|
||||
|
@ -239,6 +253,8 @@ predefinedType('wasm_val_t', 'WasmerVal', 'WasmerVal')
|
|||
|
||||
declareOwn('engine')
|
||||
declareOwn('store')
|
||||
declareOwn('wasi_config')
|
||||
declareOwn('wasi_env')
|
||||
declareVec('byte', False)
|
||||
declareVec('val', False)
|
||||
declareType('importtype')
|
||||
|
@ -291,6 +307,16 @@ WASM_API_EXTERN const wasm_valtype_vec_t* wasm_functype_results(const wasm_funct
|
|||
WASM_API_EXTERN own wasm_func_t* wasm_func_new_with_env( wasm_store_t*, const wasm_functype_t* type, void* fn, void* env, void *finalizer);
|
||||
WASM_API_EXTERN own wasm_trap_t* wasm_func_call(const wasm_func_t*, const wasm_val_t args[], wasm_val_t results[]);
|
||||
WASM_API_EXTERN wasm_valkind_t wasm_valtype_kind(const wasm_valtype_t*);
|
||||
wasi_config_t* wasi_config_new(const uint8_t* program_name);
|
||||
wasi_env_t* wasi_env_new(wasi_config_t* config);
|
||||
bool wasi_get_imports(const wasm_store_t* store, const wasm_module_t* module, const wasi_env_t* wasi_env, wasm_extern_t** imports);
|
||||
int wasmer_last_error_message(uint8_t* buffer, int length);
|
||||
int wasmer_last_error_length();
|
||||
void wasi_env_set_memory(wasi_env_t* env, const wasm_memory_t* memory);
|
||||
void wasi_config_inherit_stdout(wasi_config_t* config);
|
||||
void wasi_config_inherit_stderr(wasi_config_t* config);
|
||||
intptr_t wasi_env_read_stderr(wasi_env_t* env, uint8_t* buffer, uintptr_t buffer_len);
|
||||
intptr_t wasi_env_read_stdout(wasi_env_t* env, uint8_t* buffer, uintptr_t buffer_len);
|
||||
'''
|
||||
for f in rawFns.split('\n'):
|
||||
if len(f.strip()) > 0:
|
||||
|
@ -312,6 +338,7 @@ unusedFns = {
|
|||
'wasm_val_vec_new_uninitialized',
|
||||
'wasm_valtype_copy',
|
||||
'wasm_valtype_vec_copy',
|
||||
'wasi_config_delete',
|
||||
}
|
||||
|
||||
genDoc = '''// This file has been automatically generated. Please do not edit it manually.
|
||||
|
|
|
@ -4,6 +4,7 @@
|
|||
|
||||
/* <GEN_DOC> */
|
||||
|
||||
import 'dart:async';
|
||||
import 'dart:convert';
|
||||
import 'dart:ffi';
|
||||
import 'dart:io';
|
||||
|
@ -59,9 +60,7 @@ class WasmRuntime {
|
|||
/* <RUNTIME_MEMB> */
|
||||
|
||||
factory WasmRuntime() {
|
||||
WasmRuntime inst = _inst ?? WasmRuntime._init();
|
||||
_inst = inst;
|
||||
return inst;
|
||||
return _inst ??= WasmRuntime._init();
|
||||
}
|
||||
|
||||
static String _getLibName() {
|
||||
|
@ -125,11 +124,7 @@ class WasmRuntime {
|
|||
free(dataPtr);
|
||||
free(dataVec);
|
||||
|
||||
if (modulePtr == nullptr) {
|
||||
throw Exception("Wasm module compile failed");
|
||||
}
|
||||
|
||||
return modulePtr;
|
||||
return _checkNotEqual(modulePtr, nullptr, "Wasm module compile failed.");
|
||||
}
|
||||
|
||||
List<WasmExportDescriptor> exportDescriptors(Pointer<WasmerModule> module) {
|
||||
|
@ -173,12 +168,8 @@ class WasmRuntime {
|
|||
|
||||
Pointer<WasmerInstance> instantiate(Pointer<WasmerStore> store,
|
||||
Pointer<WasmerModule> module, Pointer<Pointer<WasmerExtern>> imports) {
|
||||
var instancePtr = _instance_new(store, module, imports, nullptr);
|
||||
if (instancePtr == nullptr) {
|
||||
throw Exception("Wasm module instantiation failed");
|
||||
}
|
||||
|
||||
return instancePtr;
|
||||
return _checkNotEqual(_instance_new(store, module, imports, nullptr),
|
||||
nullptr, "Wasm module instantiation failed.");
|
||||
}
|
||||
|
||||
Pointer<WasmerExternVec> exports(Pointer<WasmerInstance> instancePtr) {
|
||||
|
@ -238,19 +229,13 @@ class WasmRuntime {
|
|||
limPtr.ref.max = maxPages ?? wasm_limits_max_default;
|
||||
var memType = _memorytype_new(limPtr);
|
||||
free(limPtr);
|
||||
Pointer<WasmerMemory> memPtr = _memory_new(store, memType);
|
||||
|
||||
if (memPtr == nullptr) {
|
||||
throw Exception("Failed to create memory");
|
||||
}
|
||||
return memPtr;
|
||||
return _checkNotEqual(
|
||||
_memory_new(store, memType), nullptr, "Failed to create memory.");
|
||||
}
|
||||
|
||||
void growMemory(Pointer<WasmerMemory> memory, int deltaPages) {
|
||||
var result = _memory_grow(memory, deltaPages);
|
||||
if (result == 0) {
|
||||
throw Exception("Failed to grow memory");
|
||||
}
|
||||
_checkNotEqual(
|
||||
_memory_grow(memory, deltaPages), 0, "Failed to grow memory.");
|
||||
}
|
||||
|
||||
int memoryLength(Pointer<WasmerMemory> memory) {
|
||||
|
@ -271,9 +256,89 @@ class WasmRuntime {
|
|||
store, funcType, func.cast(), env.cast(), finalizer.cast());
|
||||
}
|
||||
|
||||
Pointer<WasmerWasiConfig> newWasiConfig() {
|
||||
var name = allocate<Uint8>();
|
||||
name[0] = 0;
|
||||
var config = _wasi_config_new(name);
|
||||
free(name);
|
||||
return _checkNotEqual(config, nullptr, "Failed to create WASI config.");
|
||||
}
|
||||
|
||||
void captureWasiStdout(Pointer<WasmerWasiConfig> config) {
|
||||
_wasi_config_inherit_stdout(config);
|
||||
}
|
||||
|
||||
void captureWasiStderr(Pointer<WasmerWasiConfig> config) {
|
||||
_wasi_config_inherit_stderr(config);
|
||||
}
|
||||
|
||||
Pointer<WasmerWasiEnv> newWasiEnv(Pointer<WasmerWasiConfig> config) {
|
||||
return _checkNotEqual(
|
||||
_wasi_env_new(config), nullptr, "Failed to create WASI environment.");
|
||||
}
|
||||
|
||||
void wasiEnvSetMemory(
|
||||
Pointer<WasmerWasiEnv> env, Pointer<WasmerMemory> memory) {
|
||||
_wasi_env_set_memory(env, memory);
|
||||
}
|
||||
|
||||
void getWasiImports(Pointer<WasmerStore> store, Pointer<WasmerModule> mod,
|
||||
Pointer<WasmerWasiEnv> env, Pointer<Pointer<WasmerExtern>> imports) {
|
||||
_checkNotEqual(_wasi_get_imports(store, mod, env, imports), 0,
|
||||
"Failed to fill WASI imports.");
|
||||
}
|
||||
|
||||
Stream<List<int>> getWasiStdoutStream(Pointer<WasmerWasiEnv> env) {
|
||||
return Stream.fromIterable(_WasiStreamIterable(env, _wasi_env_read_stdout));
|
||||
}
|
||||
|
||||
Stream<List<int>> getWasiStderrStream(Pointer<WasmerWasiEnv> env) {
|
||||
return Stream.fromIterable(_WasiStreamIterable(env, _wasi_env_read_stderr));
|
||||
}
|
||||
|
||||
String _getLastError() {
|
||||
var length = _wasmer_last_error_length();
|
||||
var buf = allocate<Uint8>(count: length);
|
||||
_wasmer_last_error_message(buf, length);
|
||||
String message = utf8.decode(buf.asTypedList(length));
|
||||
free(buf);
|
||||
return message;
|
||||
}
|
||||
|
||||
T _checkNotEqual<T>(T x, T y, String errorMessage) {
|
||||
if (x == y) {
|
||||
throw Exception("$errorMessage\n${_getLastError()}");
|
||||
}
|
||||
return x;
|
||||
}
|
||||
|
||||
static String getSignatureString(
|
||||
String name, List<int> argTypes, int returnType) {
|
||||
return "${wasmerValKindName(returnType)} $name" +
|
||||
"(${argTypes.map(wasmerValKindName).join(", ")})";
|
||||
}
|
||||
}
|
||||
|
||||
class _WasiStreamIterator implements Iterator<List<int>> {
|
||||
static final int _bufferLength = 1024;
|
||||
Pointer<WasmerWasiEnv> _env;
|
||||
Function _reader;
|
||||
Pointer<Uint8> _buf = allocate<Uint8>(count: _bufferLength);
|
||||
int _length = 0;
|
||||
_WasiStreamIterator(this._env, this._reader) {}
|
||||
|
||||
bool moveNext() {
|
||||
_length = _reader(_env, _buf, _bufferLength);
|
||||
return true;
|
||||
}
|
||||
|
||||
List<int> get current => _buf.asTypedList(_length);
|
||||
}
|
||||
|
||||
class _WasiStreamIterable extends Iterable<List<int>> {
|
||||
Pointer<WasmerWasiEnv> _env;
|
||||
Function _reader;
|
||||
_WasiStreamIterable(this._env, this._reader) {}
|
||||
@override
|
||||
Iterator<List<int>> get iterator => _WasiStreamIterator(_env, _reader);
|
||||
}
|
||||
|
|
|
@ -157,6 +157,12 @@ class WasmerTrap extends Struct {}
|
|||
// wasm_valtype_t
|
||||
class WasmerValtype extends Struct {}
|
||||
|
||||
// wasi_config_t
|
||||
class WasmerWasiConfig extends Struct {}
|
||||
|
||||
// wasi_env_t
|
||||
class WasmerWasiEnv extends Struct {}
|
||||
|
||||
// wasm_byte_vec_t
|
||||
class WasmerByteVec extends Struct {
|
||||
@Uint64()
|
||||
|
@ -208,6 +214,64 @@ class WasmerValtypeVec extends Struct {
|
|||
external Pointer<Pointer<WasmerValtype>> data;
|
||||
}
|
||||
|
||||
// wasi_config_inherit_stderr
|
||||
typedef NativeWasmerWasiConfigInheritStderrFn = Void Function(
|
||||
Pointer<WasmerWasiConfig>);
|
||||
typedef WasmerWasiConfigInheritStderrFn = void Function(
|
||||
Pointer<WasmerWasiConfig>);
|
||||
|
||||
// wasi_config_inherit_stdout
|
||||
typedef NativeWasmerWasiConfigInheritStdoutFn = Void Function(
|
||||
Pointer<WasmerWasiConfig>);
|
||||
typedef WasmerWasiConfigInheritStdoutFn = void Function(
|
||||
Pointer<WasmerWasiConfig>);
|
||||
|
||||
// wasi_config_new
|
||||
typedef NativeWasmerWasiConfigNewFn = Pointer<WasmerWasiConfig> Function(
|
||||
Pointer<Uint8>);
|
||||
typedef WasmerWasiConfigNewFn = Pointer<WasmerWasiConfig> Function(
|
||||
Pointer<Uint8>);
|
||||
|
||||
// wasi_env_delete
|
||||
typedef NativeWasmerWasiEnvDeleteFn = Void Function(Pointer<WasmerWasiEnv>);
|
||||
typedef WasmerWasiEnvDeleteFn = void Function(Pointer<WasmerWasiEnv>);
|
||||
|
||||
// wasi_env_new
|
||||
typedef NativeWasmerWasiEnvNewFn = Pointer<WasmerWasiEnv> Function(
|
||||
Pointer<WasmerWasiConfig>);
|
||||
typedef WasmerWasiEnvNewFn = Pointer<WasmerWasiEnv> Function(
|
||||
Pointer<WasmerWasiConfig>);
|
||||
|
||||
// wasi_env_read_stderr
|
||||
typedef NativeWasmerWasiEnvReadStderrFn = Int64 Function(
|
||||
Pointer<WasmerWasiEnv>, Pointer<Uint8>, Uint64);
|
||||
typedef WasmerWasiEnvReadStderrFn = int Function(
|
||||
Pointer<WasmerWasiEnv>, Pointer<Uint8>, int);
|
||||
|
||||
// wasi_env_read_stdout
|
||||
typedef NativeWasmerWasiEnvReadStdoutFn = Int64 Function(
|
||||
Pointer<WasmerWasiEnv>, Pointer<Uint8>, Uint64);
|
||||
typedef WasmerWasiEnvReadStdoutFn = int Function(
|
||||
Pointer<WasmerWasiEnv>, Pointer<Uint8>, int);
|
||||
|
||||
// wasi_env_set_memory
|
||||
typedef NativeWasmerWasiEnvSetMemoryFn = Void Function(
|
||||
Pointer<WasmerWasiEnv>, Pointer<WasmerMemory>);
|
||||
typedef WasmerWasiEnvSetMemoryFn = void Function(
|
||||
Pointer<WasmerWasiEnv>, Pointer<WasmerMemory>);
|
||||
|
||||
// wasi_get_imports
|
||||
typedef NativeWasmerWasiGetImportsFn = Uint8 Function(
|
||||
Pointer<WasmerStore>,
|
||||
Pointer<WasmerModule>,
|
||||
Pointer<WasmerWasiEnv>,
|
||||
Pointer<Pointer<WasmerExtern>>);
|
||||
typedef WasmerWasiGetImportsFn = int Function(
|
||||
Pointer<WasmerStore>,
|
||||
Pointer<WasmerModule>,
|
||||
Pointer<WasmerWasiEnv>,
|
||||
Pointer<Pointer<WasmerExtern>>);
|
||||
|
||||
// wasm_byte_vec_delete
|
||||
typedef NativeWasmerByteVecDeleteFn = Void Function(Pointer<WasmerByteVec>);
|
||||
typedef WasmerByteVecDeleteFn = void Function(Pointer<WasmerByteVec>);
|
||||
|
@ -548,3 +612,12 @@ typedef NativeWasmerValtypeVecNewUninitializedFn = Void Function(
|
|||
Pointer<WasmerValtypeVec>, Uint64);
|
||||
typedef WasmerValtypeVecNewUninitializedFn = void Function(
|
||||
Pointer<WasmerValtypeVec>, int);
|
||||
|
||||
// wasmer_last_error_length
|
||||
typedef NativeWasmerWasmerLastErrorLengthFn = Int64 Function();
|
||||
typedef WasmerWasmerLastErrorLengthFn = int Function();
|
||||
|
||||
// wasmer_last_error_message
|
||||
typedef NativeWasmerWasmerLastErrorMessageFn = Int64 Function(
|
||||
Pointer<Uint8>, Int64);
|
||||
typedef WasmerWasmerLastErrorMessageFn = int Function(Pointer<Uint8>, int);
|
||||
|
|
|
@ -27,25 +27,42 @@ void main() {
|
|||
var mod = WasmModule(data);
|
||||
|
||||
// Valid instantiation.
|
||||
var inst = mod.instantiate()
|
||||
.addFunction(
|
||||
"env", "someFn", (int a, int b, num c, double d) => 123).build();
|
||||
var inst = mod
|
||||
.instantiate()
|
||||
.addFunction("env", "someFn", (int a, int b, num c, double d) => 123)
|
||||
.build();
|
||||
|
||||
// Missing imports.
|
||||
Expect.throws(() => mod.instantiate().build(), (Exception e) => "$e".contains("Missing import"));
|
||||
Expect.throws(() => mod.instantiate().build(),
|
||||
(Exception e) => "$e".contains("Missing import"));
|
||||
|
||||
// Wrong kind of import.
|
||||
Expect.throws(() => mod.instantiate().addMemory("env", "someFn", mod.createMemory(10)), (Exception e) => "$e".contains("Import is not a memory"));
|
||||
Expect.throws(
|
||||
() => mod.instantiate().addMemory("env", "someFn", mod.createMemory(10)),
|
||||
(Exception e) => "$e".contains("Import is not a memory"));
|
||||
|
||||
// Wrong namespace.
|
||||
Expect.throws(() => mod.instantiate().addFunction("foo", "someFn", (int a, int b, num c, double d) => 123).build(), (Exception e) => "$e".contains("Import not found"));
|
||||
Expect.throws(
|
||||
() => mod
|
||||
.instantiate()
|
||||
.addFunction("foo", "someFn", (int a, int b, num c, double d) => 123)
|
||||
.build(),
|
||||
(Exception e) => "$e".contains("Import not found"));
|
||||
|
||||
// Wrong name.
|
||||
Expect.throws(() => mod.instantiate().addFunction("env", "otherFn", (int a, int b, num c, double d) => 123).build(), (Exception e) => "$e".contains("Import not found"));
|
||||
Expect.throws(
|
||||
() => mod
|
||||
.instantiate()
|
||||
.addFunction("env", "otherFn", (int a, int b, num c, double d) => 123)
|
||||
.build(),
|
||||
(Exception e) => "$e".contains("Import not found"));
|
||||
|
||||
// Already filled.
|
||||
Expect.throws(() => mod.instantiate()
|
||||
.addFunction("env", "someFn", (int a, int b, num c, double d) => 123)
|
||||
.addFunction("env", "someFn", (int a, int b, num c, double d) => 456)
|
||||
.build(), (Exception e) => "$e".contains("Import already filled"));
|
||||
Expect.throws(
|
||||
() => mod
|
||||
.instantiate()
|
||||
.addFunction("env", "someFn", (int a, int b, num c, double d) => 123)
|
||||
.addFunction("env", "someFn", (int a, int b, num c, double d) => 456)
|
||||
.build(),
|
||||
(Exception e) => "$e".contains("Import already filled"));
|
||||
}
|
||||
|
|
184
tests/lib/wasm/hello_wasi_test.dart
Normal file
184
tests/lib/wasm/hello_wasi_test.dart
Normal file
|
@ -0,0 +1,184 @@
|
|||
// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
|
||||
// for details. All rights reserved. Use of this source code is governed by a
|
||||
// BSD-style license that can be found in the LICENSE file.
|
||||
|
||||
// Variant of hello_world_test that uses the default WASI imports.
|
||||
|
||||
import "package:async_helper/async_helper.dart";
|
||||
import "package:expect/expect.dart";
|
||||
import "package:wasm/wasm.dart";
|
||||
import "dart:convert";
|
||||
import "dart:typed_data";
|
||||
|
||||
void main() async {
|
||||
asyncStart();
|
||||
|
||||
// Hello world module generated by emscripten+WASI. Exports a function like
|
||||
// `void _start()`, and prints using `int fd_write(int, int, int, int)`.
|
||||
var data = Uint8List.fromList([
|
||||
0x00, 0x61, 0x73, 0x6d, 0x01, 0x00, 0x00, 0x00, 0x01, 0x33, 0x09, 0x60,
|
||||
0x03, 0x7f, 0x7f, 0x7f, 0x01, 0x7f, 0x60, 0x04, 0x7f, 0x7f, 0x7f, 0x7f,
|
||||
0x01, 0x7f, 0x60, 0x00, 0x00, 0x60, 0x02, 0x7f, 0x7f, 0x01, 0x7f, 0x60,
|
||||
0x01, 0x7f, 0x01, 0x7f, 0x60, 0x03, 0x7f, 0x7e, 0x7f, 0x01, 0x7e, 0x60,
|
||||
0x00, 0x01, 0x7f, 0x60, 0x01, 0x7f, 0x00, 0x60, 0x03, 0x7f, 0x7f, 0x7f,
|
||||
0x00, 0x02, 0x1a, 0x01, 0x0d, 0x77, 0x61, 0x73, 0x69, 0x5f, 0x75, 0x6e,
|
||||
0x73, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x08, 0x66, 0x64, 0x5f, 0x77, 0x72,
|
||||
0x69, 0x74, 0x65, 0x00, 0x01, 0x03, 0x0f, 0x0e, 0x03, 0x04, 0x00, 0x03,
|
||||
0x02, 0x07, 0x05, 0x04, 0x03, 0x06, 0x02, 0x02, 0x08, 0x00, 0x04, 0x05,
|
||||
0x01, 0x70, 0x01, 0x04, 0x04, 0x05, 0x06, 0x01, 0x01, 0x80, 0x02, 0x80,
|
||||
0x02, 0x06, 0x09, 0x01, 0x7f, 0x01, 0x41, 0xc0, 0x95, 0xc0, 0x02, 0x0b,
|
||||
0x07, 0x2e, 0x04, 0x06, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x02, 0x00,
|
||||
0x11, 0x5f, 0x5f, 0x77, 0x61, 0x73, 0x6d, 0x5f, 0x63, 0x61, 0x6c, 0x6c,
|
||||
0x5f, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x00, 0x05, 0x04, 0x6d, 0x61, 0x69,
|
||||
0x6e, 0x00, 0x04, 0x06, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x00, 0x0b,
|
||||
0x09, 0x09, 0x01, 0x00, 0x41, 0x01, 0x0b, 0x03, 0x08, 0x0e, 0x07, 0x0a,
|
||||
0xae, 0x0c, 0x0e, 0xbf, 0x01, 0x01, 0x05, 0x7f, 0x41, 0x80, 0x08, 0x21,
|
||||
0x04, 0x02, 0x40, 0x20, 0x01, 0x28, 0x02, 0x10, 0x22, 0x02, 0x04, 0x7f,
|
||||
0x20, 0x02, 0x05, 0x20, 0x01, 0x10, 0x02, 0x0d, 0x01, 0x20, 0x01, 0x28,
|
||||
0x02, 0x10, 0x0b, 0x20, 0x01, 0x28, 0x02, 0x14, 0x22, 0x05, 0x6b, 0x20,
|
||||
0x00, 0x49, 0x04, 0x40, 0x20, 0x01, 0x41, 0x80, 0x08, 0x20, 0x00, 0x20,
|
||||
0x01, 0x28, 0x02, 0x24, 0x11, 0x00, 0x00, 0x0f, 0x0b, 0x02, 0x40, 0x20,
|
||||
0x01, 0x2c, 0x00, 0x4b, 0x41, 0x00, 0x48, 0x0d, 0x00, 0x20, 0x00, 0x21,
|
||||
0x03, 0x03, 0x40, 0x20, 0x03, 0x22, 0x02, 0x45, 0x0d, 0x01, 0x20, 0x02,
|
||||
0x41, 0x7f, 0x6a, 0x22, 0x03, 0x41, 0x80, 0x08, 0x6a, 0x2d, 0x00, 0x00,
|
||||
0x41, 0x0a, 0x47, 0x0d, 0x00, 0x0b, 0x20, 0x01, 0x41, 0x80, 0x08, 0x20,
|
||||
0x02, 0x20, 0x01, 0x28, 0x02, 0x24, 0x11, 0x00, 0x00, 0x22, 0x03, 0x20,
|
||||
0x02, 0x49, 0x0d, 0x01, 0x20, 0x00, 0x20, 0x02, 0x6b, 0x21, 0x00, 0x20,
|
||||
0x02, 0x41, 0x80, 0x08, 0x6a, 0x21, 0x04, 0x20, 0x01, 0x28, 0x02, 0x14,
|
||||
0x21, 0x05, 0x20, 0x02, 0x21, 0x06, 0x0b, 0x20, 0x05, 0x20, 0x04, 0x20,
|
||||
0x00, 0x10, 0x03, 0x1a, 0x20, 0x01, 0x20, 0x01, 0x28, 0x02, 0x14, 0x20,
|
||||
0x00, 0x6a, 0x36, 0x02, 0x14, 0x20, 0x00, 0x20, 0x06, 0x6a, 0x21, 0x03,
|
||||
0x0b, 0x20, 0x03, 0x0b, 0x59, 0x01, 0x01, 0x7f, 0x20, 0x00, 0x20, 0x00,
|
||||
0x2d, 0x00, 0x4a, 0x22, 0x01, 0x41, 0x7f, 0x6a, 0x20, 0x01, 0x72, 0x3a,
|
||||
0x00, 0x4a, 0x20, 0x00, 0x28, 0x02, 0x00, 0x22, 0x01, 0x41, 0x08, 0x71,
|
||||
0x04, 0x40, 0x20, 0x00, 0x20, 0x01, 0x41, 0x20, 0x72, 0x36, 0x02, 0x00,
|
||||
0x41, 0x7f, 0x0f, 0x0b, 0x20, 0x00, 0x42, 0x00, 0x37, 0x02, 0x04, 0x20,
|
||||
0x00, 0x20, 0x00, 0x28, 0x02, 0x2c, 0x22, 0x01, 0x36, 0x02, 0x1c, 0x20,
|
||||
0x00, 0x20, 0x01, 0x36, 0x02, 0x14, 0x20, 0x00, 0x20, 0x01, 0x20, 0x00,
|
||||
0x28, 0x02, 0x30, 0x6a, 0x36, 0x02, 0x10, 0x41, 0x00, 0x0b, 0x82, 0x04,
|
||||
0x01, 0x03, 0x7f, 0x20, 0x02, 0x41, 0x80, 0xc0, 0x00, 0x4f, 0x04, 0x40,
|
||||
0x20, 0x00, 0x20, 0x01, 0x20, 0x02, 0x10, 0x0d, 0x20, 0x00, 0x0f, 0x0b,
|
||||
0x20, 0x00, 0x20, 0x02, 0x6a, 0x21, 0x03, 0x02, 0x40, 0x20, 0x00, 0x20,
|
||||
0x01, 0x73, 0x41, 0x03, 0x71, 0x45, 0x04, 0x40, 0x02, 0x40, 0x20, 0x02,
|
||||
0x41, 0x01, 0x48, 0x04, 0x40, 0x20, 0x00, 0x21, 0x02, 0x0c, 0x01, 0x0b,
|
||||
0x20, 0x00, 0x41, 0x03, 0x71, 0x45, 0x04, 0x40, 0x20, 0x00, 0x21, 0x02,
|
||||
0x0c, 0x01, 0x0b, 0x20, 0x00, 0x21, 0x02, 0x03, 0x40, 0x20, 0x02, 0x20,
|
||||
0x01, 0x2d, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x20, 0x01, 0x41, 0x01, 0x6a,
|
||||
0x21, 0x01, 0x20, 0x02, 0x41, 0x01, 0x6a, 0x22, 0x02, 0x20, 0x03, 0x4f,
|
||||
0x0d, 0x01, 0x20, 0x02, 0x41, 0x03, 0x71, 0x0d, 0x00, 0x0b, 0x0b, 0x02,
|
||||
0x40, 0x20, 0x03, 0x41, 0x7c, 0x71, 0x22, 0x04, 0x41, 0xc0, 0x00, 0x49,
|
||||
0x0d, 0x00, 0x20, 0x02, 0x20, 0x04, 0x41, 0x40, 0x6a, 0x22, 0x05, 0x4b,
|
||||
0x0d, 0x00, 0x03, 0x40, 0x20, 0x02, 0x20, 0x01, 0x28, 0x02, 0x00, 0x36,
|
||||
0x02, 0x00, 0x20, 0x02, 0x20, 0x01, 0x28, 0x02, 0x04, 0x36, 0x02, 0x04,
|
||||
0x20, 0x02, 0x20, 0x01, 0x28, 0x02, 0x08, 0x36, 0x02, 0x08, 0x20, 0x02,
|
||||
0x20, 0x01, 0x28, 0x02, 0x0c, 0x36, 0x02, 0x0c, 0x20, 0x02, 0x20, 0x01,
|
||||
0x28, 0x02, 0x10, 0x36, 0x02, 0x10, 0x20, 0x02, 0x20, 0x01, 0x28, 0x02,
|
||||
0x14, 0x36, 0x02, 0x14, 0x20, 0x02, 0x20, 0x01, 0x28, 0x02, 0x18, 0x36,
|
||||
0x02, 0x18, 0x20, 0x02, 0x20, 0x01, 0x28, 0x02, 0x1c, 0x36, 0x02, 0x1c,
|
||||
0x20, 0x02, 0x20, 0x01, 0x28, 0x02, 0x20, 0x36, 0x02, 0x20, 0x20, 0x02,
|
||||
0x20, 0x01, 0x28, 0x02, 0x24, 0x36, 0x02, 0x24, 0x20, 0x02, 0x20, 0x01,
|
||||
0x28, 0x02, 0x28, 0x36, 0x02, 0x28, 0x20, 0x02, 0x20, 0x01, 0x28, 0x02,
|
||||
0x2c, 0x36, 0x02, 0x2c, 0x20, 0x02, 0x20, 0x01, 0x28, 0x02, 0x30, 0x36,
|
||||
0x02, 0x30, 0x20, 0x02, 0x20, 0x01, 0x28, 0x02, 0x34, 0x36, 0x02, 0x34,
|
||||
0x20, 0x02, 0x20, 0x01, 0x28, 0x02, 0x38, 0x36, 0x02, 0x38, 0x20, 0x02,
|
||||
0x20, 0x01, 0x28, 0x02, 0x3c, 0x36, 0x02, 0x3c, 0x20, 0x01, 0x41, 0x40,
|
||||
0x6b, 0x21, 0x01, 0x20, 0x02, 0x41, 0x40, 0x6b, 0x22, 0x02, 0x20, 0x05,
|
||||
0x4d, 0x0d, 0x00, 0x0b, 0x0b, 0x20, 0x02, 0x20, 0x04, 0x4f, 0x0d, 0x01,
|
||||
0x03, 0x40, 0x20, 0x02, 0x20, 0x01, 0x28, 0x02, 0x00, 0x36, 0x02, 0x00,
|
||||
0x20, 0x01, 0x41, 0x04, 0x6a, 0x21, 0x01, 0x20, 0x02, 0x41, 0x04, 0x6a,
|
||||
0x22, 0x02, 0x20, 0x04, 0x49, 0x0d, 0x00, 0x0b, 0x0c, 0x01, 0x0b, 0x20,
|
||||
0x03, 0x41, 0x04, 0x49, 0x04, 0x40, 0x20, 0x00, 0x21, 0x02, 0x0c, 0x01,
|
||||
0x0b, 0x20, 0x03, 0x41, 0x7c, 0x6a, 0x22, 0x04, 0x20, 0x00, 0x49, 0x04,
|
||||
0x40, 0x20, 0x00, 0x21, 0x02, 0x0c, 0x01, 0x0b, 0x20, 0x00, 0x21, 0x02,
|
||||
0x03, 0x40, 0x20, 0x02, 0x20, 0x01, 0x2d, 0x00, 0x00, 0x3a, 0x00, 0x00,
|
||||
0x20, 0x02, 0x20, 0x01, 0x2d, 0x00, 0x01, 0x3a, 0x00, 0x01, 0x20, 0x02,
|
||||
0x20, 0x01, 0x2d, 0x00, 0x02, 0x3a, 0x00, 0x02, 0x20, 0x02, 0x20, 0x01,
|
||||
0x2d, 0x00, 0x03, 0x3a, 0x00, 0x03, 0x20, 0x01, 0x41, 0x04, 0x6a, 0x21,
|
||||
0x01, 0x20, 0x02, 0x41, 0x04, 0x6a, 0x22, 0x02, 0x20, 0x04, 0x4d, 0x0d,
|
||||
0x00, 0x0b, 0x0b, 0x20, 0x02, 0x20, 0x03, 0x49, 0x04, 0x40, 0x03, 0x40,
|
||||
0x20, 0x02, 0x20, 0x01, 0x2d, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x20, 0x01,
|
||||
0x41, 0x01, 0x6a, 0x21, 0x01, 0x20, 0x02, 0x41, 0x01, 0x6a, 0x22, 0x02,
|
||||
0x20, 0x03, 0x47, 0x0d, 0x00, 0x0b, 0x0b, 0x20, 0x00, 0x0b, 0x06, 0x00,
|
||||
0x10, 0x0c, 0x41, 0x00, 0x0b, 0x03, 0x00, 0x01, 0x0b, 0x7e, 0x01, 0x03,
|
||||
0x7f, 0x23, 0x00, 0x41, 0x10, 0x6b, 0x22, 0x01, 0x24, 0x00, 0x20, 0x01,
|
||||
0x41, 0x0a, 0x3a, 0x00, 0x0f, 0x02, 0x40, 0x20, 0x00, 0x28, 0x02, 0x10,
|
||||
0x22, 0x02, 0x45, 0x04, 0x40, 0x20, 0x00, 0x10, 0x02, 0x0d, 0x01, 0x20,
|
||||
0x00, 0x28, 0x02, 0x10, 0x21, 0x02, 0x0b, 0x02, 0x40, 0x20, 0x00, 0x28,
|
||||
0x02, 0x14, 0x22, 0x03, 0x20, 0x02, 0x4f, 0x0d, 0x00, 0x20, 0x00, 0x2c,
|
||||
0x00, 0x4b, 0x41, 0x0a, 0x46, 0x0d, 0x00, 0x20, 0x00, 0x20, 0x03, 0x41,
|
||||
0x01, 0x6a, 0x36, 0x02, 0x14, 0x20, 0x03, 0x41, 0x0a, 0x3a, 0x00, 0x00,
|
||||
0x0c, 0x01, 0x0b, 0x20, 0x00, 0x20, 0x01, 0x41, 0x0f, 0x6a, 0x41, 0x01,
|
||||
0x20, 0x00, 0x28, 0x02, 0x24, 0x11, 0x00, 0x00, 0x41, 0x01, 0x47, 0x0d,
|
||||
0x00, 0x20, 0x01, 0x2d, 0x00, 0x0f, 0x1a, 0x0b, 0x20, 0x01, 0x41, 0x10,
|
||||
0x6a, 0x24, 0x00, 0x0b, 0x04, 0x00, 0x42, 0x00, 0x0b, 0x04, 0x00, 0x41,
|
||||
0x00, 0x0b, 0x31, 0x01, 0x01, 0x7f, 0x20, 0x00, 0x21, 0x02, 0x20, 0x02,
|
||||
0x02, 0x7f, 0x20, 0x01, 0x28, 0x02, 0x4c, 0x41, 0x7f, 0x4c, 0x04, 0x40,
|
||||
0x20, 0x02, 0x20, 0x01, 0x10, 0x01, 0x0c, 0x01, 0x0b, 0x20, 0x02, 0x20,
|
||||
0x01, 0x10, 0x01, 0x0b, 0x22, 0x01, 0x46, 0x04, 0x40, 0x20, 0x00, 0x0f,
|
||||
0x0b, 0x20, 0x01, 0x0b, 0x62, 0x01, 0x03, 0x7f, 0x41, 0x80, 0x08, 0x21,
|
||||
0x00, 0x03, 0x40, 0x20, 0x00, 0x22, 0x01, 0x41, 0x04, 0x6a, 0x21, 0x00,
|
||||
0x20, 0x01, 0x28, 0x02, 0x00, 0x22, 0x02, 0x41, 0x7f, 0x73, 0x20, 0x02,
|
||||
0x41, 0xff, 0xfd, 0xfb, 0x77, 0x6a, 0x71, 0x41, 0x80, 0x81, 0x82, 0x84,
|
||||
0x78, 0x71, 0x45, 0x0d, 0x00, 0x0b, 0x02, 0x40, 0x20, 0x02, 0x41, 0xff,
|
||||
0x01, 0x71, 0x45, 0x04, 0x40, 0x20, 0x01, 0x21, 0x00, 0x0c, 0x01, 0x0b,
|
||||
0x03, 0x40, 0x20, 0x01, 0x2d, 0x00, 0x01, 0x21, 0x02, 0x20, 0x01, 0x41,
|
||||
0x01, 0x6a, 0x22, 0x00, 0x21, 0x01, 0x20, 0x02, 0x0d, 0x00, 0x0b, 0x0b,
|
||||
0x20, 0x00, 0x41, 0x80, 0x08, 0x6b, 0x0b, 0x0c, 0x00, 0x02, 0x7f, 0x41,
|
||||
0x00, 0x41, 0x00, 0x10, 0x04, 0x0b, 0x1a, 0x0b, 0x66, 0x01, 0x02, 0x7f,
|
||||
0x41, 0x90, 0x08, 0x28, 0x02, 0x00, 0x22, 0x00, 0x28, 0x02, 0x4c, 0x41,
|
||||
0x00, 0x4e, 0x04, 0x7f, 0x41, 0x01, 0x05, 0x20, 0x01, 0x0b, 0x1a, 0x02,
|
||||
0x40, 0x41, 0x7f, 0x41, 0x00, 0x10, 0x0a, 0x22, 0x01, 0x20, 0x01, 0x20,
|
||||
0x00, 0x10, 0x09, 0x47, 0x1b, 0x41, 0x00, 0x48, 0x0d, 0x00, 0x02, 0x40,
|
||||
0x20, 0x00, 0x2d, 0x00, 0x4b, 0x41, 0x0a, 0x46, 0x0d, 0x00, 0x20, 0x00,
|
||||
0x28, 0x02, 0x14, 0x22, 0x01, 0x20, 0x00, 0x28, 0x02, 0x10, 0x4f, 0x0d,
|
||||
0x00, 0x20, 0x00, 0x20, 0x01, 0x41, 0x01, 0x6a, 0x36, 0x02, 0x14, 0x20,
|
||||
0x01, 0x41, 0x0a, 0x3a, 0x00, 0x00, 0x0c, 0x01, 0x0b, 0x20, 0x00, 0x10,
|
||||
0x06, 0x0b, 0x0b, 0x3d, 0x01, 0x01, 0x7f, 0x20, 0x02, 0x04, 0x40, 0x03,
|
||||
0x40, 0x20, 0x00, 0x20, 0x01, 0x20, 0x02, 0x41, 0x80, 0xc0, 0x00, 0x20,
|
||||
0x02, 0x41, 0x80, 0xc0, 0x00, 0x49, 0x1b, 0x22, 0x03, 0x10, 0x03, 0x21,
|
||||
0x00, 0x20, 0x01, 0x41, 0x80, 0x40, 0x6b, 0x21, 0x01, 0x20, 0x00, 0x41,
|
||||
0x80, 0x40, 0x6b, 0x21, 0x00, 0x20, 0x02, 0x20, 0x03, 0x6b, 0x22, 0x02,
|
||||
0x0d, 0x00, 0x0b, 0x0b, 0x0b, 0xb1, 0x02, 0x01, 0x06, 0x7f, 0x23, 0x00,
|
||||
0x41, 0x20, 0x6b, 0x22, 0x03, 0x24, 0x00, 0x20, 0x03, 0x20, 0x00, 0x28,
|
||||
0x02, 0x1c, 0x22, 0x04, 0x36, 0x02, 0x10, 0x20, 0x00, 0x28, 0x02, 0x14,
|
||||
0x21, 0x05, 0x20, 0x03, 0x20, 0x02, 0x36, 0x02, 0x1c, 0x20, 0x03, 0x20,
|
||||
0x01, 0x36, 0x02, 0x18, 0x20, 0x03, 0x20, 0x05, 0x20, 0x04, 0x6b, 0x22,
|
||||
0x01, 0x36, 0x02, 0x14, 0x20, 0x01, 0x20, 0x02, 0x6a, 0x21, 0x06, 0x41,
|
||||
0x02, 0x21, 0x05, 0x20, 0x03, 0x41, 0x10, 0x6a, 0x21, 0x01, 0x03, 0x40,
|
||||
0x02, 0x40, 0x02, 0x7f, 0x20, 0x06, 0x02, 0x7f, 0x20, 0x00, 0x28, 0x02,
|
||||
0x3c, 0x20, 0x01, 0x20, 0x05, 0x20, 0x03, 0x41, 0x0c, 0x6a, 0x10, 0x00,
|
||||
0x04, 0x40, 0x20, 0x03, 0x41, 0x7f, 0x36, 0x02, 0x0c, 0x41, 0x7f, 0x0c,
|
||||
0x01, 0x0b, 0x20, 0x03, 0x28, 0x02, 0x0c, 0x0b, 0x22, 0x04, 0x46, 0x04,
|
||||
0x40, 0x20, 0x00, 0x20, 0x00, 0x28, 0x02, 0x2c, 0x22, 0x01, 0x36, 0x02,
|
||||
0x1c, 0x20, 0x00, 0x20, 0x01, 0x36, 0x02, 0x14, 0x20, 0x00, 0x20, 0x01,
|
||||
0x20, 0x00, 0x28, 0x02, 0x30, 0x6a, 0x36, 0x02, 0x10, 0x20, 0x02, 0x0c,
|
||||
0x01, 0x0b, 0x20, 0x04, 0x41, 0x7f, 0x4a, 0x0d, 0x01, 0x20, 0x00, 0x41,
|
||||
0x00, 0x36, 0x02, 0x1c, 0x20, 0x00, 0x42, 0x00, 0x37, 0x03, 0x10, 0x20,
|
||||
0x00, 0x20, 0x00, 0x28, 0x02, 0x00, 0x41, 0x20, 0x72, 0x36, 0x02, 0x00,
|
||||
0x41, 0x00, 0x20, 0x05, 0x41, 0x02, 0x46, 0x0d, 0x00, 0x1a, 0x20, 0x02,
|
||||
0x20, 0x01, 0x28, 0x02, 0x04, 0x6b, 0x0b, 0x21, 0x04, 0x20, 0x03, 0x41,
|
||||
0x20, 0x6a, 0x24, 0x00, 0x20, 0x04, 0x0f, 0x0b, 0x20, 0x01, 0x41, 0x08,
|
||||
0x6a, 0x20, 0x01, 0x20, 0x04, 0x20, 0x01, 0x28, 0x02, 0x04, 0x22, 0x07,
|
||||
0x4b, 0x22, 0x08, 0x1b, 0x22, 0x01, 0x20, 0x04, 0x20, 0x07, 0x41, 0x00,
|
||||
0x20, 0x08, 0x1b, 0x6b, 0x22, 0x07, 0x20, 0x01, 0x28, 0x02, 0x00, 0x6a,
|
||||
0x36, 0x02, 0x00, 0x20, 0x01, 0x20, 0x01, 0x28, 0x02, 0x04, 0x20, 0x07,
|
||||
0x6b, 0x36, 0x02, 0x04, 0x20, 0x06, 0x20, 0x04, 0x6b, 0x21, 0x06, 0x20,
|
||||
0x05, 0x20, 0x08, 0x6b, 0x21, 0x05, 0x0c, 0x00, 0x00, 0x0b, 0x00, 0x0b,
|
||||
0x0b, 0x4d, 0x06, 0x00, 0x41, 0x80, 0x08, 0x0b, 0x12, 0x68, 0x65, 0x6c,
|
||||
0x6c, 0x6f, 0x2c, 0x20, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x21, 0x00, 0x00,
|
||||
0x00, 0x18, 0x04, 0x00, 0x41, 0x98, 0x08, 0x0b, 0x01, 0x05, 0x00, 0x41,
|
||||
0xa4, 0x08, 0x0b, 0x01, 0x01, 0x00, 0x41, 0xbc, 0x08, 0x0b, 0x0e, 0x02,
|
||||
0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0xb8, 0x04, 0x00, 0x00, 0x00,
|
||||
0x04, 0x00, 0x41, 0xd4, 0x08, 0x0b, 0x01, 0x01, 0x00, 0x41, 0xe3, 0x08,
|
||||
0x0b, 0x05, 0x0a, 0xff, 0xff, 0xff, 0xff,
|
||||
]);
|
||||
|
||||
var inst =
|
||||
WasmModule(data).instantiate().enableWasi(captureStdout: true).build();
|
||||
|
||||
var fn = inst.lookupFunction("_start");
|
||||
fn();
|
||||
var out = utf8.decode(await inst.stdout.first);
|
||||
Expect.equals("hello, world!\n", out);
|
||||
asyncEnd();
|
||||
}
|
204
tests/lib/wasm/wasi_error_test.dart
Normal file
204
tests/lib/wasm/wasi_error_test.dart
Normal file
|
@ -0,0 +1,204 @@
|
|||
// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
|
||||
// for details. All rights reserved. Use of this source code is governed by a
|
||||
// BSD-style license that can be found in the LICENSE file.
|
||||
|
||||
// Test the errors that can be thrown by WASI.
|
||||
|
||||
import "package:expect/expect.dart";
|
||||
import "package:wasm/wasm.dart";
|
||||
import "dart:typed_data";
|
||||
|
||||
void main() {
|
||||
// Empty wasm module.
|
||||
var emptyModuleData = Uint8List.fromList(
|
||||
[0x00, 0x61, 0x73, 0x6d, 0x01, 0x00, 0x00, 0x00, 0x06, 0x81, 0x00, 0x00]);
|
||||
|
||||
// Failed to fill WASI imports (the empty module was not built with WASI).
|
||||
Expect.throws(() => WasmModule(emptyModuleData).instantiate().enableWasi(),
|
||||
(Exception e) => "$e".contains("Failed to fill WASI imports"));
|
||||
|
||||
// Hello world module generated by emscripten+WASI. Exports a function like
|
||||
// `void _start()`, and prints using `int fd_write(int, int, int, int)`.
|
||||
var helloWorldData = Uint8List.fromList([
|
||||
0x00, 0x61, 0x73, 0x6d, 0x01, 0x00, 0x00, 0x00, 0x01, 0x33, 0x09, 0x60,
|
||||
0x03, 0x7f, 0x7f, 0x7f, 0x01, 0x7f, 0x60, 0x04, 0x7f, 0x7f, 0x7f, 0x7f,
|
||||
0x01, 0x7f, 0x60, 0x00, 0x00, 0x60, 0x02, 0x7f, 0x7f, 0x01, 0x7f, 0x60,
|
||||
0x01, 0x7f, 0x01, 0x7f, 0x60, 0x03, 0x7f, 0x7e, 0x7f, 0x01, 0x7e, 0x60,
|
||||
0x00, 0x01, 0x7f, 0x60, 0x01, 0x7f, 0x00, 0x60, 0x03, 0x7f, 0x7f, 0x7f,
|
||||
0x00, 0x02, 0x1a, 0x01, 0x0d, 0x77, 0x61, 0x73, 0x69, 0x5f, 0x75, 0x6e,
|
||||
0x73, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x08, 0x66, 0x64, 0x5f, 0x77, 0x72,
|
||||
0x69, 0x74, 0x65, 0x00, 0x01, 0x03, 0x0f, 0x0e, 0x03, 0x04, 0x00, 0x03,
|
||||
0x02, 0x07, 0x05, 0x04, 0x03, 0x06, 0x02, 0x02, 0x08, 0x00, 0x04, 0x05,
|
||||
0x01, 0x70, 0x01, 0x04, 0x04, 0x05, 0x06, 0x01, 0x01, 0x80, 0x02, 0x80,
|
||||
0x02, 0x06, 0x09, 0x01, 0x7f, 0x01, 0x41, 0xc0, 0x95, 0xc0, 0x02, 0x0b,
|
||||
0x07, 0x2e, 0x04, 0x06, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x02, 0x00,
|
||||
0x11, 0x5f, 0x5f, 0x77, 0x61, 0x73, 0x6d, 0x5f, 0x63, 0x61, 0x6c, 0x6c,
|
||||
0x5f, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x00, 0x05, 0x04, 0x6d, 0x61, 0x69,
|
||||
0x6e, 0x00, 0x04, 0x06, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x00, 0x0b,
|
||||
0x09, 0x09, 0x01, 0x00, 0x41, 0x01, 0x0b, 0x03, 0x08, 0x0e, 0x07, 0x0a,
|
||||
0xae, 0x0c, 0x0e, 0xbf, 0x01, 0x01, 0x05, 0x7f, 0x41, 0x80, 0x08, 0x21,
|
||||
0x04, 0x02, 0x40, 0x20, 0x01, 0x28, 0x02, 0x10, 0x22, 0x02, 0x04, 0x7f,
|
||||
0x20, 0x02, 0x05, 0x20, 0x01, 0x10, 0x02, 0x0d, 0x01, 0x20, 0x01, 0x28,
|
||||
0x02, 0x10, 0x0b, 0x20, 0x01, 0x28, 0x02, 0x14, 0x22, 0x05, 0x6b, 0x20,
|
||||
0x00, 0x49, 0x04, 0x40, 0x20, 0x01, 0x41, 0x80, 0x08, 0x20, 0x00, 0x20,
|
||||
0x01, 0x28, 0x02, 0x24, 0x11, 0x00, 0x00, 0x0f, 0x0b, 0x02, 0x40, 0x20,
|
||||
0x01, 0x2c, 0x00, 0x4b, 0x41, 0x00, 0x48, 0x0d, 0x00, 0x20, 0x00, 0x21,
|
||||
0x03, 0x03, 0x40, 0x20, 0x03, 0x22, 0x02, 0x45, 0x0d, 0x01, 0x20, 0x02,
|
||||
0x41, 0x7f, 0x6a, 0x22, 0x03, 0x41, 0x80, 0x08, 0x6a, 0x2d, 0x00, 0x00,
|
||||
0x41, 0x0a, 0x47, 0x0d, 0x00, 0x0b, 0x20, 0x01, 0x41, 0x80, 0x08, 0x20,
|
||||
0x02, 0x20, 0x01, 0x28, 0x02, 0x24, 0x11, 0x00, 0x00, 0x22, 0x03, 0x20,
|
||||
0x02, 0x49, 0x0d, 0x01, 0x20, 0x00, 0x20, 0x02, 0x6b, 0x21, 0x00, 0x20,
|
||||
0x02, 0x41, 0x80, 0x08, 0x6a, 0x21, 0x04, 0x20, 0x01, 0x28, 0x02, 0x14,
|
||||
0x21, 0x05, 0x20, 0x02, 0x21, 0x06, 0x0b, 0x20, 0x05, 0x20, 0x04, 0x20,
|
||||
0x00, 0x10, 0x03, 0x1a, 0x20, 0x01, 0x20, 0x01, 0x28, 0x02, 0x14, 0x20,
|
||||
0x00, 0x6a, 0x36, 0x02, 0x14, 0x20, 0x00, 0x20, 0x06, 0x6a, 0x21, 0x03,
|
||||
0x0b, 0x20, 0x03, 0x0b, 0x59, 0x01, 0x01, 0x7f, 0x20, 0x00, 0x20, 0x00,
|
||||
0x2d, 0x00, 0x4a, 0x22, 0x01, 0x41, 0x7f, 0x6a, 0x20, 0x01, 0x72, 0x3a,
|
||||
0x00, 0x4a, 0x20, 0x00, 0x28, 0x02, 0x00, 0x22, 0x01, 0x41, 0x08, 0x71,
|
||||
0x04, 0x40, 0x20, 0x00, 0x20, 0x01, 0x41, 0x20, 0x72, 0x36, 0x02, 0x00,
|
||||
0x41, 0x7f, 0x0f, 0x0b, 0x20, 0x00, 0x42, 0x00, 0x37, 0x02, 0x04, 0x20,
|
||||
0x00, 0x20, 0x00, 0x28, 0x02, 0x2c, 0x22, 0x01, 0x36, 0x02, 0x1c, 0x20,
|
||||
0x00, 0x20, 0x01, 0x36, 0x02, 0x14, 0x20, 0x00, 0x20, 0x01, 0x20, 0x00,
|
||||
0x28, 0x02, 0x30, 0x6a, 0x36, 0x02, 0x10, 0x41, 0x00, 0x0b, 0x82, 0x04,
|
||||
0x01, 0x03, 0x7f, 0x20, 0x02, 0x41, 0x80, 0xc0, 0x00, 0x4f, 0x04, 0x40,
|
||||
0x20, 0x00, 0x20, 0x01, 0x20, 0x02, 0x10, 0x0d, 0x20, 0x00, 0x0f, 0x0b,
|
||||
0x20, 0x00, 0x20, 0x02, 0x6a, 0x21, 0x03, 0x02, 0x40, 0x20, 0x00, 0x20,
|
||||
0x01, 0x73, 0x41, 0x03, 0x71, 0x45, 0x04, 0x40, 0x02, 0x40, 0x20, 0x02,
|
||||
0x41, 0x01, 0x48, 0x04, 0x40, 0x20, 0x00, 0x21, 0x02, 0x0c, 0x01, 0x0b,
|
||||
0x20, 0x00, 0x41, 0x03, 0x71, 0x45, 0x04, 0x40, 0x20, 0x00, 0x21, 0x02,
|
||||
0x0c, 0x01, 0x0b, 0x20, 0x00, 0x21, 0x02, 0x03, 0x40, 0x20, 0x02, 0x20,
|
||||
0x01, 0x2d, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x20, 0x01, 0x41, 0x01, 0x6a,
|
||||
0x21, 0x01, 0x20, 0x02, 0x41, 0x01, 0x6a, 0x22, 0x02, 0x20, 0x03, 0x4f,
|
||||
0x0d, 0x01, 0x20, 0x02, 0x41, 0x03, 0x71, 0x0d, 0x00, 0x0b, 0x0b, 0x02,
|
||||
0x40, 0x20, 0x03, 0x41, 0x7c, 0x71, 0x22, 0x04, 0x41, 0xc0, 0x00, 0x49,
|
||||
0x0d, 0x00, 0x20, 0x02, 0x20, 0x04, 0x41, 0x40, 0x6a, 0x22, 0x05, 0x4b,
|
||||
0x0d, 0x00, 0x03, 0x40, 0x20, 0x02, 0x20, 0x01, 0x28, 0x02, 0x00, 0x36,
|
||||
0x02, 0x00, 0x20, 0x02, 0x20, 0x01, 0x28, 0x02, 0x04, 0x36, 0x02, 0x04,
|
||||
0x20, 0x02, 0x20, 0x01, 0x28, 0x02, 0x08, 0x36, 0x02, 0x08, 0x20, 0x02,
|
||||
0x20, 0x01, 0x28, 0x02, 0x0c, 0x36, 0x02, 0x0c, 0x20, 0x02, 0x20, 0x01,
|
||||
0x28, 0x02, 0x10, 0x36, 0x02, 0x10, 0x20, 0x02, 0x20, 0x01, 0x28, 0x02,
|
||||
0x14, 0x36, 0x02, 0x14, 0x20, 0x02, 0x20, 0x01, 0x28, 0x02, 0x18, 0x36,
|
||||
0x02, 0x18, 0x20, 0x02, 0x20, 0x01, 0x28, 0x02, 0x1c, 0x36, 0x02, 0x1c,
|
||||
0x20, 0x02, 0x20, 0x01, 0x28, 0x02, 0x20, 0x36, 0x02, 0x20, 0x20, 0x02,
|
||||
0x20, 0x01, 0x28, 0x02, 0x24, 0x36, 0x02, 0x24, 0x20, 0x02, 0x20, 0x01,
|
||||
0x28, 0x02, 0x28, 0x36, 0x02, 0x28, 0x20, 0x02, 0x20, 0x01, 0x28, 0x02,
|
||||
0x2c, 0x36, 0x02, 0x2c, 0x20, 0x02, 0x20, 0x01, 0x28, 0x02, 0x30, 0x36,
|
||||
0x02, 0x30, 0x20, 0x02, 0x20, 0x01, 0x28, 0x02, 0x34, 0x36, 0x02, 0x34,
|
||||
0x20, 0x02, 0x20, 0x01, 0x28, 0x02, 0x38, 0x36, 0x02, 0x38, 0x20, 0x02,
|
||||
0x20, 0x01, 0x28, 0x02, 0x3c, 0x36, 0x02, 0x3c, 0x20, 0x01, 0x41, 0x40,
|
||||
0x6b, 0x21, 0x01, 0x20, 0x02, 0x41, 0x40, 0x6b, 0x22, 0x02, 0x20, 0x05,
|
||||
0x4d, 0x0d, 0x00, 0x0b, 0x0b, 0x20, 0x02, 0x20, 0x04, 0x4f, 0x0d, 0x01,
|
||||
0x03, 0x40, 0x20, 0x02, 0x20, 0x01, 0x28, 0x02, 0x00, 0x36, 0x02, 0x00,
|
||||
0x20, 0x01, 0x41, 0x04, 0x6a, 0x21, 0x01, 0x20, 0x02, 0x41, 0x04, 0x6a,
|
||||
0x22, 0x02, 0x20, 0x04, 0x49, 0x0d, 0x00, 0x0b, 0x0c, 0x01, 0x0b, 0x20,
|
||||
0x03, 0x41, 0x04, 0x49, 0x04, 0x40, 0x20, 0x00, 0x21, 0x02, 0x0c, 0x01,
|
||||
0x0b, 0x20, 0x03, 0x41, 0x7c, 0x6a, 0x22, 0x04, 0x20, 0x00, 0x49, 0x04,
|
||||
0x40, 0x20, 0x00, 0x21, 0x02, 0x0c, 0x01, 0x0b, 0x20, 0x00, 0x21, 0x02,
|
||||
0x03, 0x40, 0x20, 0x02, 0x20, 0x01, 0x2d, 0x00, 0x00, 0x3a, 0x00, 0x00,
|
||||
0x20, 0x02, 0x20, 0x01, 0x2d, 0x00, 0x01, 0x3a, 0x00, 0x01, 0x20, 0x02,
|
||||
0x20, 0x01, 0x2d, 0x00, 0x02, 0x3a, 0x00, 0x02, 0x20, 0x02, 0x20, 0x01,
|
||||
0x2d, 0x00, 0x03, 0x3a, 0x00, 0x03, 0x20, 0x01, 0x41, 0x04, 0x6a, 0x21,
|
||||
0x01, 0x20, 0x02, 0x41, 0x04, 0x6a, 0x22, 0x02, 0x20, 0x04, 0x4d, 0x0d,
|
||||
0x00, 0x0b, 0x0b, 0x20, 0x02, 0x20, 0x03, 0x49, 0x04, 0x40, 0x03, 0x40,
|
||||
0x20, 0x02, 0x20, 0x01, 0x2d, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x20, 0x01,
|
||||
0x41, 0x01, 0x6a, 0x21, 0x01, 0x20, 0x02, 0x41, 0x01, 0x6a, 0x22, 0x02,
|
||||
0x20, 0x03, 0x47, 0x0d, 0x00, 0x0b, 0x0b, 0x20, 0x00, 0x0b, 0x06, 0x00,
|
||||
0x10, 0x0c, 0x41, 0x00, 0x0b, 0x03, 0x00, 0x01, 0x0b, 0x7e, 0x01, 0x03,
|
||||
0x7f, 0x23, 0x00, 0x41, 0x10, 0x6b, 0x22, 0x01, 0x24, 0x00, 0x20, 0x01,
|
||||
0x41, 0x0a, 0x3a, 0x00, 0x0f, 0x02, 0x40, 0x20, 0x00, 0x28, 0x02, 0x10,
|
||||
0x22, 0x02, 0x45, 0x04, 0x40, 0x20, 0x00, 0x10, 0x02, 0x0d, 0x01, 0x20,
|
||||
0x00, 0x28, 0x02, 0x10, 0x21, 0x02, 0x0b, 0x02, 0x40, 0x20, 0x00, 0x28,
|
||||
0x02, 0x14, 0x22, 0x03, 0x20, 0x02, 0x4f, 0x0d, 0x00, 0x20, 0x00, 0x2c,
|
||||
0x00, 0x4b, 0x41, 0x0a, 0x46, 0x0d, 0x00, 0x20, 0x00, 0x20, 0x03, 0x41,
|
||||
0x01, 0x6a, 0x36, 0x02, 0x14, 0x20, 0x03, 0x41, 0x0a, 0x3a, 0x00, 0x00,
|
||||
0x0c, 0x01, 0x0b, 0x20, 0x00, 0x20, 0x01, 0x41, 0x0f, 0x6a, 0x41, 0x01,
|
||||
0x20, 0x00, 0x28, 0x02, 0x24, 0x11, 0x00, 0x00, 0x41, 0x01, 0x47, 0x0d,
|
||||
0x00, 0x20, 0x01, 0x2d, 0x00, 0x0f, 0x1a, 0x0b, 0x20, 0x01, 0x41, 0x10,
|
||||
0x6a, 0x24, 0x00, 0x0b, 0x04, 0x00, 0x42, 0x00, 0x0b, 0x04, 0x00, 0x41,
|
||||
0x00, 0x0b, 0x31, 0x01, 0x01, 0x7f, 0x20, 0x00, 0x21, 0x02, 0x20, 0x02,
|
||||
0x02, 0x7f, 0x20, 0x01, 0x28, 0x02, 0x4c, 0x41, 0x7f, 0x4c, 0x04, 0x40,
|
||||
0x20, 0x02, 0x20, 0x01, 0x10, 0x01, 0x0c, 0x01, 0x0b, 0x20, 0x02, 0x20,
|
||||
0x01, 0x10, 0x01, 0x0b, 0x22, 0x01, 0x46, 0x04, 0x40, 0x20, 0x00, 0x0f,
|
||||
0x0b, 0x20, 0x01, 0x0b, 0x62, 0x01, 0x03, 0x7f, 0x41, 0x80, 0x08, 0x21,
|
||||
0x00, 0x03, 0x40, 0x20, 0x00, 0x22, 0x01, 0x41, 0x04, 0x6a, 0x21, 0x00,
|
||||
0x20, 0x01, 0x28, 0x02, 0x00, 0x22, 0x02, 0x41, 0x7f, 0x73, 0x20, 0x02,
|
||||
0x41, 0xff, 0xfd, 0xfb, 0x77, 0x6a, 0x71, 0x41, 0x80, 0x81, 0x82, 0x84,
|
||||
0x78, 0x71, 0x45, 0x0d, 0x00, 0x0b, 0x02, 0x40, 0x20, 0x02, 0x41, 0xff,
|
||||
0x01, 0x71, 0x45, 0x04, 0x40, 0x20, 0x01, 0x21, 0x00, 0x0c, 0x01, 0x0b,
|
||||
0x03, 0x40, 0x20, 0x01, 0x2d, 0x00, 0x01, 0x21, 0x02, 0x20, 0x01, 0x41,
|
||||
0x01, 0x6a, 0x22, 0x00, 0x21, 0x01, 0x20, 0x02, 0x0d, 0x00, 0x0b, 0x0b,
|
||||
0x20, 0x00, 0x41, 0x80, 0x08, 0x6b, 0x0b, 0x0c, 0x00, 0x02, 0x7f, 0x41,
|
||||
0x00, 0x41, 0x00, 0x10, 0x04, 0x0b, 0x1a, 0x0b, 0x66, 0x01, 0x02, 0x7f,
|
||||
0x41, 0x90, 0x08, 0x28, 0x02, 0x00, 0x22, 0x00, 0x28, 0x02, 0x4c, 0x41,
|
||||
0x00, 0x4e, 0x04, 0x7f, 0x41, 0x01, 0x05, 0x20, 0x01, 0x0b, 0x1a, 0x02,
|
||||
0x40, 0x41, 0x7f, 0x41, 0x00, 0x10, 0x0a, 0x22, 0x01, 0x20, 0x01, 0x20,
|
||||
0x00, 0x10, 0x09, 0x47, 0x1b, 0x41, 0x00, 0x48, 0x0d, 0x00, 0x02, 0x40,
|
||||
0x20, 0x00, 0x2d, 0x00, 0x4b, 0x41, 0x0a, 0x46, 0x0d, 0x00, 0x20, 0x00,
|
||||
0x28, 0x02, 0x14, 0x22, 0x01, 0x20, 0x00, 0x28, 0x02, 0x10, 0x4f, 0x0d,
|
||||
0x00, 0x20, 0x00, 0x20, 0x01, 0x41, 0x01, 0x6a, 0x36, 0x02, 0x14, 0x20,
|
||||
0x01, 0x41, 0x0a, 0x3a, 0x00, 0x00, 0x0c, 0x01, 0x0b, 0x20, 0x00, 0x10,
|
||||
0x06, 0x0b, 0x0b, 0x3d, 0x01, 0x01, 0x7f, 0x20, 0x02, 0x04, 0x40, 0x03,
|
||||
0x40, 0x20, 0x00, 0x20, 0x01, 0x20, 0x02, 0x41, 0x80, 0xc0, 0x00, 0x20,
|
||||
0x02, 0x41, 0x80, 0xc0, 0x00, 0x49, 0x1b, 0x22, 0x03, 0x10, 0x03, 0x21,
|
||||
0x00, 0x20, 0x01, 0x41, 0x80, 0x40, 0x6b, 0x21, 0x01, 0x20, 0x00, 0x41,
|
||||
0x80, 0x40, 0x6b, 0x21, 0x00, 0x20, 0x02, 0x20, 0x03, 0x6b, 0x22, 0x02,
|
||||
0x0d, 0x00, 0x0b, 0x0b, 0x0b, 0xb1, 0x02, 0x01, 0x06, 0x7f, 0x23, 0x00,
|
||||
0x41, 0x20, 0x6b, 0x22, 0x03, 0x24, 0x00, 0x20, 0x03, 0x20, 0x00, 0x28,
|
||||
0x02, 0x1c, 0x22, 0x04, 0x36, 0x02, 0x10, 0x20, 0x00, 0x28, 0x02, 0x14,
|
||||
0x21, 0x05, 0x20, 0x03, 0x20, 0x02, 0x36, 0x02, 0x1c, 0x20, 0x03, 0x20,
|
||||
0x01, 0x36, 0x02, 0x18, 0x20, 0x03, 0x20, 0x05, 0x20, 0x04, 0x6b, 0x22,
|
||||
0x01, 0x36, 0x02, 0x14, 0x20, 0x01, 0x20, 0x02, 0x6a, 0x21, 0x06, 0x41,
|
||||
0x02, 0x21, 0x05, 0x20, 0x03, 0x41, 0x10, 0x6a, 0x21, 0x01, 0x03, 0x40,
|
||||
0x02, 0x40, 0x02, 0x7f, 0x20, 0x06, 0x02, 0x7f, 0x20, 0x00, 0x28, 0x02,
|
||||
0x3c, 0x20, 0x01, 0x20, 0x05, 0x20, 0x03, 0x41, 0x0c, 0x6a, 0x10, 0x00,
|
||||
0x04, 0x40, 0x20, 0x03, 0x41, 0x7f, 0x36, 0x02, 0x0c, 0x41, 0x7f, 0x0c,
|
||||
0x01, 0x0b, 0x20, 0x03, 0x28, 0x02, 0x0c, 0x0b, 0x22, 0x04, 0x46, 0x04,
|
||||
0x40, 0x20, 0x00, 0x20, 0x00, 0x28, 0x02, 0x2c, 0x22, 0x01, 0x36, 0x02,
|
||||
0x1c, 0x20, 0x00, 0x20, 0x01, 0x36, 0x02, 0x14, 0x20, 0x00, 0x20, 0x01,
|
||||
0x20, 0x00, 0x28, 0x02, 0x30, 0x6a, 0x36, 0x02, 0x10, 0x20, 0x02, 0x0c,
|
||||
0x01, 0x0b, 0x20, 0x04, 0x41, 0x7f, 0x4a, 0x0d, 0x01, 0x20, 0x00, 0x41,
|
||||
0x00, 0x36, 0x02, 0x1c, 0x20, 0x00, 0x42, 0x00, 0x37, 0x03, 0x10, 0x20,
|
||||
0x00, 0x20, 0x00, 0x28, 0x02, 0x00, 0x41, 0x20, 0x72, 0x36, 0x02, 0x00,
|
||||
0x41, 0x00, 0x20, 0x05, 0x41, 0x02, 0x46, 0x0d, 0x00, 0x1a, 0x20, 0x02,
|
||||
0x20, 0x01, 0x28, 0x02, 0x04, 0x6b, 0x0b, 0x21, 0x04, 0x20, 0x03, 0x41,
|
||||
0x20, 0x6a, 0x24, 0x00, 0x20, 0x04, 0x0f, 0x0b, 0x20, 0x01, 0x41, 0x08,
|
||||
0x6a, 0x20, 0x01, 0x20, 0x04, 0x20, 0x01, 0x28, 0x02, 0x04, 0x22, 0x07,
|
||||
0x4b, 0x22, 0x08, 0x1b, 0x22, 0x01, 0x20, 0x04, 0x20, 0x07, 0x41, 0x00,
|
||||
0x20, 0x08, 0x1b, 0x6b, 0x22, 0x07, 0x20, 0x01, 0x28, 0x02, 0x00, 0x6a,
|
||||
0x36, 0x02, 0x00, 0x20, 0x01, 0x20, 0x01, 0x28, 0x02, 0x04, 0x20, 0x07,
|
||||
0x6b, 0x36, 0x02, 0x04, 0x20, 0x06, 0x20, 0x04, 0x6b, 0x21, 0x06, 0x20,
|
||||
0x05, 0x20, 0x08, 0x6b, 0x21, 0x05, 0x0c, 0x00, 0x00, 0x0b, 0x00, 0x0b,
|
||||
0x0b, 0x4d, 0x06, 0x00, 0x41, 0x80, 0x08, 0x0b, 0x12, 0x68, 0x65, 0x6c,
|
||||
0x6c, 0x6f, 0x2c, 0x20, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x21, 0x00, 0x00,
|
||||
0x00, 0x18, 0x04, 0x00, 0x41, 0x98, 0x08, 0x0b, 0x01, 0x05, 0x00, 0x41,
|
||||
0xa4, 0x08, 0x0b, 0x01, 0x01, 0x00, 0x41, 0xbc, 0x08, 0x0b, 0x0e, 0x02,
|
||||
0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0xb8, 0x04, 0x00, 0x00, 0x00,
|
||||
0x04, 0x00, 0x41, 0xd4, 0x08, 0x0b, 0x01, 0x01, 0x00, 0x41, 0xe3, 0x08,
|
||||
0x0b, 0x05, 0x0a, 0xff, 0xff, 0xff, 0xff,
|
||||
]);
|
||||
|
||||
// Trying to import WASI twice.
|
||||
Expect.throws(
|
||||
() => WasmModule(helloWorldData).instantiate().enableWasi().enableWasi(),
|
||||
(Exception e) => "$e".contains("WASI is already enabled"));
|
||||
|
||||
// Missing imports due to not enabling WASI.
|
||||
Expect.throws(() => WasmModule(helloWorldData).instantiate().build(),
|
||||
(Exception e) => "$e".contains("Missing import"));
|
||||
|
||||
// Trying to get stdout/stderr without WASI enabled (WASI function import has
|
||||
// been manually filled).
|
||||
var inst = WasmModule(helloWorldData)
|
||||
.instantiate()
|
||||
.addFunction("wasi_unstable", "fd_write",
|
||||
(int fd, int iovs, int iovs_len, int unused) => 0)
|
||||
.build();
|
||||
Expect.throws(
|
||||
() => inst.stdout,
|
||||
(Exception e) =>
|
||||
"$e".contains("Can't capture stdout without WASI enabled"));
|
||||
Expect.throws(
|
||||
() => inst.stderr,
|
||||
(Exception e) =>
|
||||
"$e".contains("Can't capture stderr without WASI enabled"));
|
||||
}
|
|
@ -27,25 +27,42 @@ void main() {
|
|||
var mod = WasmModule(data);
|
||||
|
||||
// Valid instantiation.
|
||||
var inst = mod.instantiate()
|
||||
.addFunction(
|
||||
"env", "someFn", (int a, int b, num c, double d) => 123).build();
|
||||
var inst = mod
|
||||
.instantiate()
|
||||
.addFunction("env", "someFn", (int a, int b, num c, double d) => 123)
|
||||
.build();
|
||||
|
||||
// Missing imports.
|
||||
Expect.throws(() => mod.instantiate().build(), (Exception e) => "$e".contains("Missing import"));
|
||||
Expect.throws(() => mod.instantiate().build(),
|
||||
(Exception e) => "$e".contains("Missing import"));
|
||||
|
||||
// Wrong kind of import.
|
||||
Expect.throws(() => mod.instantiate().addMemory("env", "someFn", mod.createMemory(10)), (Exception e) => "$e".contains("Import is not a memory"));
|
||||
Expect.throws(
|
||||
() => mod.instantiate().addMemory("env", "someFn", mod.createMemory(10)),
|
||||
(Exception e) => "$e".contains("Import is not a memory"));
|
||||
|
||||
// Wrong namespace.
|
||||
Expect.throws(() => mod.instantiate().addFunction("foo", "someFn", (int a, int b, num c, double d) => 123).build(), (Exception e) => "$e".contains("Import not found"));
|
||||
Expect.throws(
|
||||
() => mod
|
||||
.instantiate()
|
||||
.addFunction("foo", "someFn", (int a, int b, num c, double d) => 123)
|
||||
.build(),
|
||||
(Exception e) => "$e".contains("Import not found"));
|
||||
|
||||
// Wrong name.
|
||||
Expect.throws(() => mod.instantiate().addFunction("env", "otherFn", (int a, int b, num c, double d) => 123).build(), (Exception e) => "$e".contains("Import not found"));
|
||||
Expect.throws(
|
||||
() => mod
|
||||
.instantiate()
|
||||
.addFunction("env", "otherFn", (int a, int b, num c, double d) => 123)
|
||||
.build(),
|
||||
(Exception e) => "$e".contains("Import not found"));
|
||||
|
||||
// Already filled.
|
||||
Expect.throws(() => mod.instantiate()
|
||||
.addFunction("env", "someFn", (int a, int b, num c, double d) => 123)
|
||||
.addFunction("env", "someFn", (int a, int b, num c, double d) => 456)
|
||||
.build(), (Exception e) => "$e".contains("Import already filled"));
|
||||
Expect.throws(
|
||||
() => mod
|
||||
.instantiate()
|
||||
.addFunction("env", "someFn", (int a, int b, num c, double d) => 123)
|
||||
.addFunction("env", "someFn", (int a, int b, num c, double d) => 456)
|
||||
.build(),
|
||||
(Exception e) => "$e".contains("Import already filled"));
|
||||
}
|
||||
|
|
184
tests/lib_2/wasm/hello_wasi_test.dart
Normal file
184
tests/lib_2/wasm/hello_wasi_test.dart
Normal file
|
@ -0,0 +1,184 @@
|
|||
// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
|
||||
// for details. All rights reserved. Use of this source code is governed by a
|
||||
// BSD-style license that can be found in the LICENSE file.
|
||||
|
||||
// Variant of hello_world_test that uses the default WASI imports.
|
||||
|
||||
import "package:async_helper/async_helper.dart";
|
||||
import "package:expect/expect.dart";
|
||||
import "package:wasm/wasm.dart";
|
||||
import "dart:convert";
|
||||
import "dart:typed_data";
|
||||
|
||||
void main() async {
|
||||
asyncStart();
|
||||
|
||||
// Hello world module generated by emscripten+WASI. Exports a function like
|
||||
// `void _start()`, and prints using `int fd_write(int, int, int, int)`.
|
||||
var data = Uint8List.fromList([
|
||||
0x00, 0x61, 0x73, 0x6d, 0x01, 0x00, 0x00, 0x00, 0x01, 0x33, 0x09, 0x60,
|
||||
0x03, 0x7f, 0x7f, 0x7f, 0x01, 0x7f, 0x60, 0x04, 0x7f, 0x7f, 0x7f, 0x7f,
|
||||
0x01, 0x7f, 0x60, 0x00, 0x00, 0x60, 0x02, 0x7f, 0x7f, 0x01, 0x7f, 0x60,
|
||||
0x01, 0x7f, 0x01, 0x7f, 0x60, 0x03, 0x7f, 0x7e, 0x7f, 0x01, 0x7e, 0x60,
|
||||
0x00, 0x01, 0x7f, 0x60, 0x01, 0x7f, 0x00, 0x60, 0x03, 0x7f, 0x7f, 0x7f,
|
||||
0x00, 0x02, 0x1a, 0x01, 0x0d, 0x77, 0x61, 0x73, 0x69, 0x5f, 0x75, 0x6e,
|
||||
0x73, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x08, 0x66, 0x64, 0x5f, 0x77, 0x72,
|
||||
0x69, 0x74, 0x65, 0x00, 0x01, 0x03, 0x0f, 0x0e, 0x03, 0x04, 0x00, 0x03,
|
||||
0x02, 0x07, 0x05, 0x04, 0x03, 0x06, 0x02, 0x02, 0x08, 0x00, 0x04, 0x05,
|
||||
0x01, 0x70, 0x01, 0x04, 0x04, 0x05, 0x06, 0x01, 0x01, 0x80, 0x02, 0x80,
|
||||
0x02, 0x06, 0x09, 0x01, 0x7f, 0x01, 0x41, 0xc0, 0x95, 0xc0, 0x02, 0x0b,
|
||||
0x07, 0x2e, 0x04, 0x06, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x02, 0x00,
|
||||
0x11, 0x5f, 0x5f, 0x77, 0x61, 0x73, 0x6d, 0x5f, 0x63, 0x61, 0x6c, 0x6c,
|
||||
0x5f, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x00, 0x05, 0x04, 0x6d, 0x61, 0x69,
|
||||
0x6e, 0x00, 0x04, 0x06, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x00, 0x0b,
|
||||
0x09, 0x09, 0x01, 0x00, 0x41, 0x01, 0x0b, 0x03, 0x08, 0x0e, 0x07, 0x0a,
|
||||
0xae, 0x0c, 0x0e, 0xbf, 0x01, 0x01, 0x05, 0x7f, 0x41, 0x80, 0x08, 0x21,
|
||||
0x04, 0x02, 0x40, 0x20, 0x01, 0x28, 0x02, 0x10, 0x22, 0x02, 0x04, 0x7f,
|
||||
0x20, 0x02, 0x05, 0x20, 0x01, 0x10, 0x02, 0x0d, 0x01, 0x20, 0x01, 0x28,
|
||||
0x02, 0x10, 0x0b, 0x20, 0x01, 0x28, 0x02, 0x14, 0x22, 0x05, 0x6b, 0x20,
|
||||
0x00, 0x49, 0x04, 0x40, 0x20, 0x01, 0x41, 0x80, 0x08, 0x20, 0x00, 0x20,
|
||||
0x01, 0x28, 0x02, 0x24, 0x11, 0x00, 0x00, 0x0f, 0x0b, 0x02, 0x40, 0x20,
|
||||
0x01, 0x2c, 0x00, 0x4b, 0x41, 0x00, 0x48, 0x0d, 0x00, 0x20, 0x00, 0x21,
|
||||
0x03, 0x03, 0x40, 0x20, 0x03, 0x22, 0x02, 0x45, 0x0d, 0x01, 0x20, 0x02,
|
||||
0x41, 0x7f, 0x6a, 0x22, 0x03, 0x41, 0x80, 0x08, 0x6a, 0x2d, 0x00, 0x00,
|
||||
0x41, 0x0a, 0x47, 0x0d, 0x00, 0x0b, 0x20, 0x01, 0x41, 0x80, 0x08, 0x20,
|
||||
0x02, 0x20, 0x01, 0x28, 0x02, 0x24, 0x11, 0x00, 0x00, 0x22, 0x03, 0x20,
|
||||
0x02, 0x49, 0x0d, 0x01, 0x20, 0x00, 0x20, 0x02, 0x6b, 0x21, 0x00, 0x20,
|
||||
0x02, 0x41, 0x80, 0x08, 0x6a, 0x21, 0x04, 0x20, 0x01, 0x28, 0x02, 0x14,
|
||||
0x21, 0x05, 0x20, 0x02, 0x21, 0x06, 0x0b, 0x20, 0x05, 0x20, 0x04, 0x20,
|
||||
0x00, 0x10, 0x03, 0x1a, 0x20, 0x01, 0x20, 0x01, 0x28, 0x02, 0x14, 0x20,
|
||||
0x00, 0x6a, 0x36, 0x02, 0x14, 0x20, 0x00, 0x20, 0x06, 0x6a, 0x21, 0x03,
|
||||
0x0b, 0x20, 0x03, 0x0b, 0x59, 0x01, 0x01, 0x7f, 0x20, 0x00, 0x20, 0x00,
|
||||
0x2d, 0x00, 0x4a, 0x22, 0x01, 0x41, 0x7f, 0x6a, 0x20, 0x01, 0x72, 0x3a,
|
||||
0x00, 0x4a, 0x20, 0x00, 0x28, 0x02, 0x00, 0x22, 0x01, 0x41, 0x08, 0x71,
|
||||
0x04, 0x40, 0x20, 0x00, 0x20, 0x01, 0x41, 0x20, 0x72, 0x36, 0x02, 0x00,
|
||||
0x41, 0x7f, 0x0f, 0x0b, 0x20, 0x00, 0x42, 0x00, 0x37, 0x02, 0x04, 0x20,
|
||||
0x00, 0x20, 0x00, 0x28, 0x02, 0x2c, 0x22, 0x01, 0x36, 0x02, 0x1c, 0x20,
|
||||
0x00, 0x20, 0x01, 0x36, 0x02, 0x14, 0x20, 0x00, 0x20, 0x01, 0x20, 0x00,
|
||||
0x28, 0x02, 0x30, 0x6a, 0x36, 0x02, 0x10, 0x41, 0x00, 0x0b, 0x82, 0x04,
|
||||
0x01, 0x03, 0x7f, 0x20, 0x02, 0x41, 0x80, 0xc0, 0x00, 0x4f, 0x04, 0x40,
|
||||
0x20, 0x00, 0x20, 0x01, 0x20, 0x02, 0x10, 0x0d, 0x20, 0x00, 0x0f, 0x0b,
|
||||
0x20, 0x00, 0x20, 0x02, 0x6a, 0x21, 0x03, 0x02, 0x40, 0x20, 0x00, 0x20,
|
||||
0x01, 0x73, 0x41, 0x03, 0x71, 0x45, 0x04, 0x40, 0x02, 0x40, 0x20, 0x02,
|
||||
0x41, 0x01, 0x48, 0x04, 0x40, 0x20, 0x00, 0x21, 0x02, 0x0c, 0x01, 0x0b,
|
||||
0x20, 0x00, 0x41, 0x03, 0x71, 0x45, 0x04, 0x40, 0x20, 0x00, 0x21, 0x02,
|
||||
0x0c, 0x01, 0x0b, 0x20, 0x00, 0x21, 0x02, 0x03, 0x40, 0x20, 0x02, 0x20,
|
||||
0x01, 0x2d, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x20, 0x01, 0x41, 0x01, 0x6a,
|
||||
0x21, 0x01, 0x20, 0x02, 0x41, 0x01, 0x6a, 0x22, 0x02, 0x20, 0x03, 0x4f,
|
||||
0x0d, 0x01, 0x20, 0x02, 0x41, 0x03, 0x71, 0x0d, 0x00, 0x0b, 0x0b, 0x02,
|
||||
0x40, 0x20, 0x03, 0x41, 0x7c, 0x71, 0x22, 0x04, 0x41, 0xc0, 0x00, 0x49,
|
||||
0x0d, 0x00, 0x20, 0x02, 0x20, 0x04, 0x41, 0x40, 0x6a, 0x22, 0x05, 0x4b,
|
||||
0x0d, 0x00, 0x03, 0x40, 0x20, 0x02, 0x20, 0x01, 0x28, 0x02, 0x00, 0x36,
|
||||
0x02, 0x00, 0x20, 0x02, 0x20, 0x01, 0x28, 0x02, 0x04, 0x36, 0x02, 0x04,
|
||||
0x20, 0x02, 0x20, 0x01, 0x28, 0x02, 0x08, 0x36, 0x02, 0x08, 0x20, 0x02,
|
||||
0x20, 0x01, 0x28, 0x02, 0x0c, 0x36, 0x02, 0x0c, 0x20, 0x02, 0x20, 0x01,
|
||||
0x28, 0x02, 0x10, 0x36, 0x02, 0x10, 0x20, 0x02, 0x20, 0x01, 0x28, 0x02,
|
||||
0x14, 0x36, 0x02, 0x14, 0x20, 0x02, 0x20, 0x01, 0x28, 0x02, 0x18, 0x36,
|
||||
0x02, 0x18, 0x20, 0x02, 0x20, 0x01, 0x28, 0x02, 0x1c, 0x36, 0x02, 0x1c,
|
||||
0x20, 0x02, 0x20, 0x01, 0x28, 0x02, 0x20, 0x36, 0x02, 0x20, 0x20, 0x02,
|
||||
0x20, 0x01, 0x28, 0x02, 0x24, 0x36, 0x02, 0x24, 0x20, 0x02, 0x20, 0x01,
|
||||
0x28, 0x02, 0x28, 0x36, 0x02, 0x28, 0x20, 0x02, 0x20, 0x01, 0x28, 0x02,
|
||||
0x2c, 0x36, 0x02, 0x2c, 0x20, 0x02, 0x20, 0x01, 0x28, 0x02, 0x30, 0x36,
|
||||
0x02, 0x30, 0x20, 0x02, 0x20, 0x01, 0x28, 0x02, 0x34, 0x36, 0x02, 0x34,
|
||||
0x20, 0x02, 0x20, 0x01, 0x28, 0x02, 0x38, 0x36, 0x02, 0x38, 0x20, 0x02,
|
||||
0x20, 0x01, 0x28, 0x02, 0x3c, 0x36, 0x02, 0x3c, 0x20, 0x01, 0x41, 0x40,
|
||||
0x6b, 0x21, 0x01, 0x20, 0x02, 0x41, 0x40, 0x6b, 0x22, 0x02, 0x20, 0x05,
|
||||
0x4d, 0x0d, 0x00, 0x0b, 0x0b, 0x20, 0x02, 0x20, 0x04, 0x4f, 0x0d, 0x01,
|
||||
0x03, 0x40, 0x20, 0x02, 0x20, 0x01, 0x28, 0x02, 0x00, 0x36, 0x02, 0x00,
|
||||
0x20, 0x01, 0x41, 0x04, 0x6a, 0x21, 0x01, 0x20, 0x02, 0x41, 0x04, 0x6a,
|
||||
0x22, 0x02, 0x20, 0x04, 0x49, 0x0d, 0x00, 0x0b, 0x0c, 0x01, 0x0b, 0x20,
|
||||
0x03, 0x41, 0x04, 0x49, 0x04, 0x40, 0x20, 0x00, 0x21, 0x02, 0x0c, 0x01,
|
||||
0x0b, 0x20, 0x03, 0x41, 0x7c, 0x6a, 0x22, 0x04, 0x20, 0x00, 0x49, 0x04,
|
||||
0x40, 0x20, 0x00, 0x21, 0x02, 0x0c, 0x01, 0x0b, 0x20, 0x00, 0x21, 0x02,
|
||||
0x03, 0x40, 0x20, 0x02, 0x20, 0x01, 0x2d, 0x00, 0x00, 0x3a, 0x00, 0x00,
|
||||
0x20, 0x02, 0x20, 0x01, 0x2d, 0x00, 0x01, 0x3a, 0x00, 0x01, 0x20, 0x02,
|
||||
0x20, 0x01, 0x2d, 0x00, 0x02, 0x3a, 0x00, 0x02, 0x20, 0x02, 0x20, 0x01,
|
||||
0x2d, 0x00, 0x03, 0x3a, 0x00, 0x03, 0x20, 0x01, 0x41, 0x04, 0x6a, 0x21,
|
||||
0x01, 0x20, 0x02, 0x41, 0x04, 0x6a, 0x22, 0x02, 0x20, 0x04, 0x4d, 0x0d,
|
||||
0x00, 0x0b, 0x0b, 0x20, 0x02, 0x20, 0x03, 0x49, 0x04, 0x40, 0x03, 0x40,
|
||||
0x20, 0x02, 0x20, 0x01, 0x2d, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x20, 0x01,
|
||||
0x41, 0x01, 0x6a, 0x21, 0x01, 0x20, 0x02, 0x41, 0x01, 0x6a, 0x22, 0x02,
|
||||
0x20, 0x03, 0x47, 0x0d, 0x00, 0x0b, 0x0b, 0x20, 0x00, 0x0b, 0x06, 0x00,
|
||||
0x10, 0x0c, 0x41, 0x00, 0x0b, 0x03, 0x00, 0x01, 0x0b, 0x7e, 0x01, 0x03,
|
||||
0x7f, 0x23, 0x00, 0x41, 0x10, 0x6b, 0x22, 0x01, 0x24, 0x00, 0x20, 0x01,
|
||||
0x41, 0x0a, 0x3a, 0x00, 0x0f, 0x02, 0x40, 0x20, 0x00, 0x28, 0x02, 0x10,
|
||||
0x22, 0x02, 0x45, 0x04, 0x40, 0x20, 0x00, 0x10, 0x02, 0x0d, 0x01, 0x20,
|
||||
0x00, 0x28, 0x02, 0x10, 0x21, 0x02, 0x0b, 0x02, 0x40, 0x20, 0x00, 0x28,
|
||||
0x02, 0x14, 0x22, 0x03, 0x20, 0x02, 0x4f, 0x0d, 0x00, 0x20, 0x00, 0x2c,
|
||||
0x00, 0x4b, 0x41, 0x0a, 0x46, 0x0d, 0x00, 0x20, 0x00, 0x20, 0x03, 0x41,
|
||||
0x01, 0x6a, 0x36, 0x02, 0x14, 0x20, 0x03, 0x41, 0x0a, 0x3a, 0x00, 0x00,
|
||||
0x0c, 0x01, 0x0b, 0x20, 0x00, 0x20, 0x01, 0x41, 0x0f, 0x6a, 0x41, 0x01,
|
||||
0x20, 0x00, 0x28, 0x02, 0x24, 0x11, 0x00, 0x00, 0x41, 0x01, 0x47, 0x0d,
|
||||
0x00, 0x20, 0x01, 0x2d, 0x00, 0x0f, 0x1a, 0x0b, 0x20, 0x01, 0x41, 0x10,
|
||||
0x6a, 0x24, 0x00, 0x0b, 0x04, 0x00, 0x42, 0x00, 0x0b, 0x04, 0x00, 0x41,
|
||||
0x00, 0x0b, 0x31, 0x01, 0x01, 0x7f, 0x20, 0x00, 0x21, 0x02, 0x20, 0x02,
|
||||
0x02, 0x7f, 0x20, 0x01, 0x28, 0x02, 0x4c, 0x41, 0x7f, 0x4c, 0x04, 0x40,
|
||||
0x20, 0x02, 0x20, 0x01, 0x10, 0x01, 0x0c, 0x01, 0x0b, 0x20, 0x02, 0x20,
|
||||
0x01, 0x10, 0x01, 0x0b, 0x22, 0x01, 0x46, 0x04, 0x40, 0x20, 0x00, 0x0f,
|
||||
0x0b, 0x20, 0x01, 0x0b, 0x62, 0x01, 0x03, 0x7f, 0x41, 0x80, 0x08, 0x21,
|
||||
0x00, 0x03, 0x40, 0x20, 0x00, 0x22, 0x01, 0x41, 0x04, 0x6a, 0x21, 0x00,
|
||||
0x20, 0x01, 0x28, 0x02, 0x00, 0x22, 0x02, 0x41, 0x7f, 0x73, 0x20, 0x02,
|
||||
0x41, 0xff, 0xfd, 0xfb, 0x77, 0x6a, 0x71, 0x41, 0x80, 0x81, 0x82, 0x84,
|
||||
0x78, 0x71, 0x45, 0x0d, 0x00, 0x0b, 0x02, 0x40, 0x20, 0x02, 0x41, 0xff,
|
||||
0x01, 0x71, 0x45, 0x04, 0x40, 0x20, 0x01, 0x21, 0x00, 0x0c, 0x01, 0x0b,
|
||||
0x03, 0x40, 0x20, 0x01, 0x2d, 0x00, 0x01, 0x21, 0x02, 0x20, 0x01, 0x41,
|
||||
0x01, 0x6a, 0x22, 0x00, 0x21, 0x01, 0x20, 0x02, 0x0d, 0x00, 0x0b, 0x0b,
|
||||
0x20, 0x00, 0x41, 0x80, 0x08, 0x6b, 0x0b, 0x0c, 0x00, 0x02, 0x7f, 0x41,
|
||||
0x00, 0x41, 0x00, 0x10, 0x04, 0x0b, 0x1a, 0x0b, 0x66, 0x01, 0x02, 0x7f,
|
||||
0x41, 0x90, 0x08, 0x28, 0x02, 0x00, 0x22, 0x00, 0x28, 0x02, 0x4c, 0x41,
|
||||
0x00, 0x4e, 0x04, 0x7f, 0x41, 0x01, 0x05, 0x20, 0x01, 0x0b, 0x1a, 0x02,
|
||||
0x40, 0x41, 0x7f, 0x41, 0x00, 0x10, 0x0a, 0x22, 0x01, 0x20, 0x01, 0x20,
|
||||
0x00, 0x10, 0x09, 0x47, 0x1b, 0x41, 0x00, 0x48, 0x0d, 0x00, 0x02, 0x40,
|
||||
0x20, 0x00, 0x2d, 0x00, 0x4b, 0x41, 0x0a, 0x46, 0x0d, 0x00, 0x20, 0x00,
|
||||
0x28, 0x02, 0x14, 0x22, 0x01, 0x20, 0x00, 0x28, 0x02, 0x10, 0x4f, 0x0d,
|
||||
0x00, 0x20, 0x00, 0x20, 0x01, 0x41, 0x01, 0x6a, 0x36, 0x02, 0x14, 0x20,
|
||||
0x01, 0x41, 0x0a, 0x3a, 0x00, 0x00, 0x0c, 0x01, 0x0b, 0x20, 0x00, 0x10,
|
||||
0x06, 0x0b, 0x0b, 0x3d, 0x01, 0x01, 0x7f, 0x20, 0x02, 0x04, 0x40, 0x03,
|
||||
0x40, 0x20, 0x00, 0x20, 0x01, 0x20, 0x02, 0x41, 0x80, 0xc0, 0x00, 0x20,
|
||||
0x02, 0x41, 0x80, 0xc0, 0x00, 0x49, 0x1b, 0x22, 0x03, 0x10, 0x03, 0x21,
|
||||
0x00, 0x20, 0x01, 0x41, 0x80, 0x40, 0x6b, 0x21, 0x01, 0x20, 0x00, 0x41,
|
||||
0x80, 0x40, 0x6b, 0x21, 0x00, 0x20, 0x02, 0x20, 0x03, 0x6b, 0x22, 0x02,
|
||||
0x0d, 0x00, 0x0b, 0x0b, 0x0b, 0xb1, 0x02, 0x01, 0x06, 0x7f, 0x23, 0x00,
|
||||
0x41, 0x20, 0x6b, 0x22, 0x03, 0x24, 0x00, 0x20, 0x03, 0x20, 0x00, 0x28,
|
||||
0x02, 0x1c, 0x22, 0x04, 0x36, 0x02, 0x10, 0x20, 0x00, 0x28, 0x02, 0x14,
|
||||
0x21, 0x05, 0x20, 0x03, 0x20, 0x02, 0x36, 0x02, 0x1c, 0x20, 0x03, 0x20,
|
||||
0x01, 0x36, 0x02, 0x18, 0x20, 0x03, 0x20, 0x05, 0x20, 0x04, 0x6b, 0x22,
|
||||
0x01, 0x36, 0x02, 0x14, 0x20, 0x01, 0x20, 0x02, 0x6a, 0x21, 0x06, 0x41,
|
||||
0x02, 0x21, 0x05, 0x20, 0x03, 0x41, 0x10, 0x6a, 0x21, 0x01, 0x03, 0x40,
|
||||
0x02, 0x40, 0x02, 0x7f, 0x20, 0x06, 0x02, 0x7f, 0x20, 0x00, 0x28, 0x02,
|
||||
0x3c, 0x20, 0x01, 0x20, 0x05, 0x20, 0x03, 0x41, 0x0c, 0x6a, 0x10, 0x00,
|
||||
0x04, 0x40, 0x20, 0x03, 0x41, 0x7f, 0x36, 0x02, 0x0c, 0x41, 0x7f, 0x0c,
|
||||
0x01, 0x0b, 0x20, 0x03, 0x28, 0x02, 0x0c, 0x0b, 0x22, 0x04, 0x46, 0x04,
|
||||
0x40, 0x20, 0x00, 0x20, 0x00, 0x28, 0x02, 0x2c, 0x22, 0x01, 0x36, 0x02,
|
||||
0x1c, 0x20, 0x00, 0x20, 0x01, 0x36, 0x02, 0x14, 0x20, 0x00, 0x20, 0x01,
|
||||
0x20, 0x00, 0x28, 0x02, 0x30, 0x6a, 0x36, 0x02, 0x10, 0x20, 0x02, 0x0c,
|
||||
0x01, 0x0b, 0x20, 0x04, 0x41, 0x7f, 0x4a, 0x0d, 0x01, 0x20, 0x00, 0x41,
|
||||
0x00, 0x36, 0x02, 0x1c, 0x20, 0x00, 0x42, 0x00, 0x37, 0x03, 0x10, 0x20,
|
||||
0x00, 0x20, 0x00, 0x28, 0x02, 0x00, 0x41, 0x20, 0x72, 0x36, 0x02, 0x00,
|
||||
0x41, 0x00, 0x20, 0x05, 0x41, 0x02, 0x46, 0x0d, 0x00, 0x1a, 0x20, 0x02,
|
||||
0x20, 0x01, 0x28, 0x02, 0x04, 0x6b, 0x0b, 0x21, 0x04, 0x20, 0x03, 0x41,
|
||||
0x20, 0x6a, 0x24, 0x00, 0x20, 0x04, 0x0f, 0x0b, 0x20, 0x01, 0x41, 0x08,
|
||||
0x6a, 0x20, 0x01, 0x20, 0x04, 0x20, 0x01, 0x28, 0x02, 0x04, 0x22, 0x07,
|
||||
0x4b, 0x22, 0x08, 0x1b, 0x22, 0x01, 0x20, 0x04, 0x20, 0x07, 0x41, 0x00,
|
||||
0x20, 0x08, 0x1b, 0x6b, 0x22, 0x07, 0x20, 0x01, 0x28, 0x02, 0x00, 0x6a,
|
||||
0x36, 0x02, 0x00, 0x20, 0x01, 0x20, 0x01, 0x28, 0x02, 0x04, 0x20, 0x07,
|
||||
0x6b, 0x36, 0x02, 0x04, 0x20, 0x06, 0x20, 0x04, 0x6b, 0x21, 0x06, 0x20,
|
||||
0x05, 0x20, 0x08, 0x6b, 0x21, 0x05, 0x0c, 0x00, 0x00, 0x0b, 0x00, 0x0b,
|
||||
0x0b, 0x4d, 0x06, 0x00, 0x41, 0x80, 0x08, 0x0b, 0x12, 0x68, 0x65, 0x6c,
|
||||
0x6c, 0x6f, 0x2c, 0x20, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x21, 0x00, 0x00,
|
||||
0x00, 0x18, 0x04, 0x00, 0x41, 0x98, 0x08, 0x0b, 0x01, 0x05, 0x00, 0x41,
|
||||
0xa4, 0x08, 0x0b, 0x01, 0x01, 0x00, 0x41, 0xbc, 0x08, 0x0b, 0x0e, 0x02,
|
||||
0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0xb8, 0x04, 0x00, 0x00, 0x00,
|
||||
0x04, 0x00, 0x41, 0xd4, 0x08, 0x0b, 0x01, 0x01, 0x00, 0x41, 0xe3, 0x08,
|
||||
0x0b, 0x05, 0x0a, 0xff, 0xff, 0xff, 0xff,
|
||||
]);
|
||||
|
||||
var inst =
|
||||
WasmModule(data).instantiate().enableWasi(captureStdout: true).build();
|
||||
|
||||
var fn = inst.lookupFunction("_start");
|
||||
fn();
|
||||
var out = utf8.decode(await inst.stdout.first);
|
||||
Expect.equals("hello, world!\n", out);
|
||||
asyncEnd();
|
||||
}
|
204
tests/lib_2/wasm/wasi_error_test.dart
Normal file
204
tests/lib_2/wasm/wasi_error_test.dart
Normal file
|
@ -0,0 +1,204 @@
|
|||
// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
|
||||
// for details. All rights reserved. Use of this source code is governed by a
|
||||
// BSD-style license that can be found in the LICENSE file.
|
||||
|
||||
// Test the errors that can be thrown by WASI.
|
||||
|
||||
import "package:expect/expect.dart";
|
||||
import "package:wasm/wasm.dart";
|
||||
import "dart:typed_data";
|
||||
|
||||
void main() {
|
||||
// Empty wasm module.
|
||||
var emptyModuleData = Uint8List.fromList(
|
||||
[0x00, 0x61, 0x73, 0x6d, 0x01, 0x00, 0x00, 0x00, 0x06, 0x81, 0x00, 0x00]);
|
||||
|
||||
// Failed to fill WASI imports (the empty module was not built with WASI).
|
||||
Expect.throws(() => WasmModule(emptyModuleData).instantiate().enableWasi(),
|
||||
(Exception e) => "$e".contains("Failed to fill WASI imports"));
|
||||
|
||||
// Hello world module generated by emscripten+WASI. Exports a function like
|
||||
// `void _start()`, and prints using `int fd_write(int, int, int, int)`.
|
||||
var helloWorldData = Uint8List.fromList([
|
||||
0x00, 0x61, 0x73, 0x6d, 0x01, 0x00, 0x00, 0x00, 0x01, 0x33, 0x09, 0x60,
|
||||
0x03, 0x7f, 0x7f, 0x7f, 0x01, 0x7f, 0x60, 0x04, 0x7f, 0x7f, 0x7f, 0x7f,
|
||||
0x01, 0x7f, 0x60, 0x00, 0x00, 0x60, 0x02, 0x7f, 0x7f, 0x01, 0x7f, 0x60,
|
||||
0x01, 0x7f, 0x01, 0x7f, 0x60, 0x03, 0x7f, 0x7e, 0x7f, 0x01, 0x7e, 0x60,
|
||||
0x00, 0x01, 0x7f, 0x60, 0x01, 0x7f, 0x00, 0x60, 0x03, 0x7f, 0x7f, 0x7f,
|
||||
0x00, 0x02, 0x1a, 0x01, 0x0d, 0x77, 0x61, 0x73, 0x69, 0x5f, 0x75, 0x6e,
|
||||
0x73, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x08, 0x66, 0x64, 0x5f, 0x77, 0x72,
|
||||
0x69, 0x74, 0x65, 0x00, 0x01, 0x03, 0x0f, 0x0e, 0x03, 0x04, 0x00, 0x03,
|
||||
0x02, 0x07, 0x05, 0x04, 0x03, 0x06, 0x02, 0x02, 0x08, 0x00, 0x04, 0x05,
|
||||
0x01, 0x70, 0x01, 0x04, 0x04, 0x05, 0x06, 0x01, 0x01, 0x80, 0x02, 0x80,
|
||||
0x02, 0x06, 0x09, 0x01, 0x7f, 0x01, 0x41, 0xc0, 0x95, 0xc0, 0x02, 0x0b,
|
||||
0x07, 0x2e, 0x04, 0x06, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x02, 0x00,
|
||||
0x11, 0x5f, 0x5f, 0x77, 0x61, 0x73, 0x6d, 0x5f, 0x63, 0x61, 0x6c, 0x6c,
|
||||
0x5f, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x00, 0x05, 0x04, 0x6d, 0x61, 0x69,
|
||||
0x6e, 0x00, 0x04, 0x06, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x00, 0x0b,
|
||||
0x09, 0x09, 0x01, 0x00, 0x41, 0x01, 0x0b, 0x03, 0x08, 0x0e, 0x07, 0x0a,
|
||||
0xae, 0x0c, 0x0e, 0xbf, 0x01, 0x01, 0x05, 0x7f, 0x41, 0x80, 0x08, 0x21,
|
||||
0x04, 0x02, 0x40, 0x20, 0x01, 0x28, 0x02, 0x10, 0x22, 0x02, 0x04, 0x7f,
|
||||
0x20, 0x02, 0x05, 0x20, 0x01, 0x10, 0x02, 0x0d, 0x01, 0x20, 0x01, 0x28,
|
||||
0x02, 0x10, 0x0b, 0x20, 0x01, 0x28, 0x02, 0x14, 0x22, 0x05, 0x6b, 0x20,
|
||||
0x00, 0x49, 0x04, 0x40, 0x20, 0x01, 0x41, 0x80, 0x08, 0x20, 0x00, 0x20,
|
||||
0x01, 0x28, 0x02, 0x24, 0x11, 0x00, 0x00, 0x0f, 0x0b, 0x02, 0x40, 0x20,
|
||||
0x01, 0x2c, 0x00, 0x4b, 0x41, 0x00, 0x48, 0x0d, 0x00, 0x20, 0x00, 0x21,
|
||||
0x03, 0x03, 0x40, 0x20, 0x03, 0x22, 0x02, 0x45, 0x0d, 0x01, 0x20, 0x02,
|
||||
0x41, 0x7f, 0x6a, 0x22, 0x03, 0x41, 0x80, 0x08, 0x6a, 0x2d, 0x00, 0x00,
|
||||
0x41, 0x0a, 0x47, 0x0d, 0x00, 0x0b, 0x20, 0x01, 0x41, 0x80, 0x08, 0x20,
|
||||
0x02, 0x20, 0x01, 0x28, 0x02, 0x24, 0x11, 0x00, 0x00, 0x22, 0x03, 0x20,
|
||||
0x02, 0x49, 0x0d, 0x01, 0x20, 0x00, 0x20, 0x02, 0x6b, 0x21, 0x00, 0x20,
|
||||
0x02, 0x41, 0x80, 0x08, 0x6a, 0x21, 0x04, 0x20, 0x01, 0x28, 0x02, 0x14,
|
||||
0x21, 0x05, 0x20, 0x02, 0x21, 0x06, 0x0b, 0x20, 0x05, 0x20, 0x04, 0x20,
|
||||
0x00, 0x10, 0x03, 0x1a, 0x20, 0x01, 0x20, 0x01, 0x28, 0x02, 0x14, 0x20,
|
||||
0x00, 0x6a, 0x36, 0x02, 0x14, 0x20, 0x00, 0x20, 0x06, 0x6a, 0x21, 0x03,
|
||||
0x0b, 0x20, 0x03, 0x0b, 0x59, 0x01, 0x01, 0x7f, 0x20, 0x00, 0x20, 0x00,
|
||||
0x2d, 0x00, 0x4a, 0x22, 0x01, 0x41, 0x7f, 0x6a, 0x20, 0x01, 0x72, 0x3a,
|
||||
0x00, 0x4a, 0x20, 0x00, 0x28, 0x02, 0x00, 0x22, 0x01, 0x41, 0x08, 0x71,
|
||||
0x04, 0x40, 0x20, 0x00, 0x20, 0x01, 0x41, 0x20, 0x72, 0x36, 0x02, 0x00,
|
||||
0x41, 0x7f, 0x0f, 0x0b, 0x20, 0x00, 0x42, 0x00, 0x37, 0x02, 0x04, 0x20,
|
||||
0x00, 0x20, 0x00, 0x28, 0x02, 0x2c, 0x22, 0x01, 0x36, 0x02, 0x1c, 0x20,
|
||||
0x00, 0x20, 0x01, 0x36, 0x02, 0x14, 0x20, 0x00, 0x20, 0x01, 0x20, 0x00,
|
||||
0x28, 0x02, 0x30, 0x6a, 0x36, 0x02, 0x10, 0x41, 0x00, 0x0b, 0x82, 0x04,
|
||||
0x01, 0x03, 0x7f, 0x20, 0x02, 0x41, 0x80, 0xc0, 0x00, 0x4f, 0x04, 0x40,
|
||||
0x20, 0x00, 0x20, 0x01, 0x20, 0x02, 0x10, 0x0d, 0x20, 0x00, 0x0f, 0x0b,
|
||||
0x20, 0x00, 0x20, 0x02, 0x6a, 0x21, 0x03, 0x02, 0x40, 0x20, 0x00, 0x20,
|
||||
0x01, 0x73, 0x41, 0x03, 0x71, 0x45, 0x04, 0x40, 0x02, 0x40, 0x20, 0x02,
|
||||
0x41, 0x01, 0x48, 0x04, 0x40, 0x20, 0x00, 0x21, 0x02, 0x0c, 0x01, 0x0b,
|
||||
0x20, 0x00, 0x41, 0x03, 0x71, 0x45, 0x04, 0x40, 0x20, 0x00, 0x21, 0x02,
|
||||
0x0c, 0x01, 0x0b, 0x20, 0x00, 0x21, 0x02, 0x03, 0x40, 0x20, 0x02, 0x20,
|
||||
0x01, 0x2d, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x20, 0x01, 0x41, 0x01, 0x6a,
|
||||
0x21, 0x01, 0x20, 0x02, 0x41, 0x01, 0x6a, 0x22, 0x02, 0x20, 0x03, 0x4f,
|
||||
0x0d, 0x01, 0x20, 0x02, 0x41, 0x03, 0x71, 0x0d, 0x00, 0x0b, 0x0b, 0x02,
|
||||
0x40, 0x20, 0x03, 0x41, 0x7c, 0x71, 0x22, 0x04, 0x41, 0xc0, 0x00, 0x49,
|
||||
0x0d, 0x00, 0x20, 0x02, 0x20, 0x04, 0x41, 0x40, 0x6a, 0x22, 0x05, 0x4b,
|
||||
0x0d, 0x00, 0x03, 0x40, 0x20, 0x02, 0x20, 0x01, 0x28, 0x02, 0x00, 0x36,
|
||||
0x02, 0x00, 0x20, 0x02, 0x20, 0x01, 0x28, 0x02, 0x04, 0x36, 0x02, 0x04,
|
||||
0x20, 0x02, 0x20, 0x01, 0x28, 0x02, 0x08, 0x36, 0x02, 0x08, 0x20, 0x02,
|
||||
0x20, 0x01, 0x28, 0x02, 0x0c, 0x36, 0x02, 0x0c, 0x20, 0x02, 0x20, 0x01,
|
||||
0x28, 0x02, 0x10, 0x36, 0x02, 0x10, 0x20, 0x02, 0x20, 0x01, 0x28, 0x02,
|
||||
0x14, 0x36, 0x02, 0x14, 0x20, 0x02, 0x20, 0x01, 0x28, 0x02, 0x18, 0x36,
|
||||
0x02, 0x18, 0x20, 0x02, 0x20, 0x01, 0x28, 0x02, 0x1c, 0x36, 0x02, 0x1c,
|
||||
0x20, 0x02, 0x20, 0x01, 0x28, 0x02, 0x20, 0x36, 0x02, 0x20, 0x20, 0x02,
|
||||
0x20, 0x01, 0x28, 0x02, 0x24, 0x36, 0x02, 0x24, 0x20, 0x02, 0x20, 0x01,
|
||||
0x28, 0x02, 0x28, 0x36, 0x02, 0x28, 0x20, 0x02, 0x20, 0x01, 0x28, 0x02,
|
||||
0x2c, 0x36, 0x02, 0x2c, 0x20, 0x02, 0x20, 0x01, 0x28, 0x02, 0x30, 0x36,
|
||||
0x02, 0x30, 0x20, 0x02, 0x20, 0x01, 0x28, 0x02, 0x34, 0x36, 0x02, 0x34,
|
||||
0x20, 0x02, 0x20, 0x01, 0x28, 0x02, 0x38, 0x36, 0x02, 0x38, 0x20, 0x02,
|
||||
0x20, 0x01, 0x28, 0x02, 0x3c, 0x36, 0x02, 0x3c, 0x20, 0x01, 0x41, 0x40,
|
||||
0x6b, 0x21, 0x01, 0x20, 0x02, 0x41, 0x40, 0x6b, 0x22, 0x02, 0x20, 0x05,
|
||||
0x4d, 0x0d, 0x00, 0x0b, 0x0b, 0x20, 0x02, 0x20, 0x04, 0x4f, 0x0d, 0x01,
|
||||
0x03, 0x40, 0x20, 0x02, 0x20, 0x01, 0x28, 0x02, 0x00, 0x36, 0x02, 0x00,
|
||||
0x20, 0x01, 0x41, 0x04, 0x6a, 0x21, 0x01, 0x20, 0x02, 0x41, 0x04, 0x6a,
|
||||
0x22, 0x02, 0x20, 0x04, 0x49, 0x0d, 0x00, 0x0b, 0x0c, 0x01, 0x0b, 0x20,
|
||||
0x03, 0x41, 0x04, 0x49, 0x04, 0x40, 0x20, 0x00, 0x21, 0x02, 0x0c, 0x01,
|
||||
0x0b, 0x20, 0x03, 0x41, 0x7c, 0x6a, 0x22, 0x04, 0x20, 0x00, 0x49, 0x04,
|
||||
0x40, 0x20, 0x00, 0x21, 0x02, 0x0c, 0x01, 0x0b, 0x20, 0x00, 0x21, 0x02,
|
||||
0x03, 0x40, 0x20, 0x02, 0x20, 0x01, 0x2d, 0x00, 0x00, 0x3a, 0x00, 0x00,
|
||||
0x20, 0x02, 0x20, 0x01, 0x2d, 0x00, 0x01, 0x3a, 0x00, 0x01, 0x20, 0x02,
|
||||
0x20, 0x01, 0x2d, 0x00, 0x02, 0x3a, 0x00, 0x02, 0x20, 0x02, 0x20, 0x01,
|
||||
0x2d, 0x00, 0x03, 0x3a, 0x00, 0x03, 0x20, 0x01, 0x41, 0x04, 0x6a, 0x21,
|
||||
0x01, 0x20, 0x02, 0x41, 0x04, 0x6a, 0x22, 0x02, 0x20, 0x04, 0x4d, 0x0d,
|
||||
0x00, 0x0b, 0x0b, 0x20, 0x02, 0x20, 0x03, 0x49, 0x04, 0x40, 0x03, 0x40,
|
||||
0x20, 0x02, 0x20, 0x01, 0x2d, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x20, 0x01,
|
||||
0x41, 0x01, 0x6a, 0x21, 0x01, 0x20, 0x02, 0x41, 0x01, 0x6a, 0x22, 0x02,
|
||||
0x20, 0x03, 0x47, 0x0d, 0x00, 0x0b, 0x0b, 0x20, 0x00, 0x0b, 0x06, 0x00,
|
||||
0x10, 0x0c, 0x41, 0x00, 0x0b, 0x03, 0x00, 0x01, 0x0b, 0x7e, 0x01, 0x03,
|
||||
0x7f, 0x23, 0x00, 0x41, 0x10, 0x6b, 0x22, 0x01, 0x24, 0x00, 0x20, 0x01,
|
||||
0x41, 0x0a, 0x3a, 0x00, 0x0f, 0x02, 0x40, 0x20, 0x00, 0x28, 0x02, 0x10,
|
||||
0x22, 0x02, 0x45, 0x04, 0x40, 0x20, 0x00, 0x10, 0x02, 0x0d, 0x01, 0x20,
|
||||
0x00, 0x28, 0x02, 0x10, 0x21, 0x02, 0x0b, 0x02, 0x40, 0x20, 0x00, 0x28,
|
||||
0x02, 0x14, 0x22, 0x03, 0x20, 0x02, 0x4f, 0x0d, 0x00, 0x20, 0x00, 0x2c,
|
||||
0x00, 0x4b, 0x41, 0x0a, 0x46, 0x0d, 0x00, 0x20, 0x00, 0x20, 0x03, 0x41,
|
||||
0x01, 0x6a, 0x36, 0x02, 0x14, 0x20, 0x03, 0x41, 0x0a, 0x3a, 0x00, 0x00,
|
||||
0x0c, 0x01, 0x0b, 0x20, 0x00, 0x20, 0x01, 0x41, 0x0f, 0x6a, 0x41, 0x01,
|
||||
0x20, 0x00, 0x28, 0x02, 0x24, 0x11, 0x00, 0x00, 0x41, 0x01, 0x47, 0x0d,
|
||||
0x00, 0x20, 0x01, 0x2d, 0x00, 0x0f, 0x1a, 0x0b, 0x20, 0x01, 0x41, 0x10,
|
||||
0x6a, 0x24, 0x00, 0x0b, 0x04, 0x00, 0x42, 0x00, 0x0b, 0x04, 0x00, 0x41,
|
||||
0x00, 0x0b, 0x31, 0x01, 0x01, 0x7f, 0x20, 0x00, 0x21, 0x02, 0x20, 0x02,
|
||||
0x02, 0x7f, 0x20, 0x01, 0x28, 0x02, 0x4c, 0x41, 0x7f, 0x4c, 0x04, 0x40,
|
||||
0x20, 0x02, 0x20, 0x01, 0x10, 0x01, 0x0c, 0x01, 0x0b, 0x20, 0x02, 0x20,
|
||||
0x01, 0x10, 0x01, 0x0b, 0x22, 0x01, 0x46, 0x04, 0x40, 0x20, 0x00, 0x0f,
|
||||
0x0b, 0x20, 0x01, 0x0b, 0x62, 0x01, 0x03, 0x7f, 0x41, 0x80, 0x08, 0x21,
|
||||
0x00, 0x03, 0x40, 0x20, 0x00, 0x22, 0x01, 0x41, 0x04, 0x6a, 0x21, 0x00,
|
||||
0x20, 0x01, 0x28, 0x02, 0x00, 0x22, 0x02, 0x41, 0x7f, 0x73, 0x20, 0x02,
|
||||
0x41, 0xff, 0xfd, 0xfb, 0x77, 0x6a, 0x71, 0x41, 0x80, 0x81, 0x82, 0x84,
|
||||
0x78, 0x71, 0x45, 0x0d, 0x00, 0x0b, 0x02, 0x40, 0x20, 0x02, 0x41, 0xff,
|
||||
0x01, 0x71, 0x45, 0x04, 0x40, 0x20, 0x01, 0x21, 0x00, 0x0c, 0x01, 0x0b,
|
||||
0x03, 0x40, 0x20, 0x01, 0x2d, 0x00, 0x01, 0x21, 0x02, 0x20, 0x01, 0x41,
|
||||
0x01, 0x6a, 0x22, 0x00, 0x21, 0x01, 0x20, 0x02, 0x0d, 0x00, 0x0b, 0x0b,
|
||||
0x20, 0x00, 0x41, 0x80, 0x08, 0x6b, 0x0b, 0x0c, 0x00, 0x02, 0x7f, 0x41,
|
||||
0x00, 0x41, 0x00, 0x10, 0x04, 0x0b, 0x1a, 0x0b, 0x66, 0x01, 0x02, 0x7f,
|
||||
0x41, 0x90, 0x08, 0x28, 0x02, 0x00, 0x22, 0x00, 0x28, 0x02, 0x4c, 0x41,
|
||||
0x00, 0x4e, 0x04, 0x7f, 0x41, 0x01, 0x05, 0x20, 0x01, 0x0b, 0x1a, 0x02,
|
||||
0x40, 0x41, 0x7f, 0x41, 0x00, 0x10, 0x0a, 0x22, 0x01, 0x20, 0x01, 0x20,
|
||||
0x00, 0x10, 0x09, 0x47, 0x1b, 0x41, 0x00, 0x48, 0x0d, 0x00, 0x02, 0x40,
|
||||
0x20, 0x00, 0x2d, 0x00, 0x4b, 0x41, 0x0a, 0x46, 0x0d, 0x00, 0x20, 0x00,
|
||||
0x28, 0x02, 0x14, 0x22, 0x01, 0x20, 0x00, 0x28, 0x02, 0x10, 0x4f, 0x0d,
|
||||
0x00, 0x20, 0x00, 0x20, 0x01, 0x41, 0x01, 0x6a, 0x36, 0x02, 0x14, 0x20,
|
||||
0x01, 0x41, 0x0a, 0x3a, 0x00, 0x00, 0x0c, 0x01, 0x0b, 0x20, 0x00, 0x10,
|
||||
0x06, 0x0b, 0x0b, 0x3d, 0x01, 0x01, 0x7f, 0x20, 0x02, 0x04, 0x40, 0x03,
|
||||
0x40, 0x20, 0x00, 0x20, 0x01, 0x20, 0x02, 0x41, 0x80, 0xc0, 0x00, 0x20,
|
||||
0x02, 0x41, 0x80, 0xc0, 0x00, 0x49, 0x1b, 0x22, 0x03, 0x10, 0x03, 0x21,
|
||||
0x00, 0x20, 0x01, 0x41, 0x80, 0x40, 0x6b, 0x21, 0x01, 0x20, 0x00, 0x41,
|
||||
0x80, 0x40, 0x6b, 0x21, 0x00, 0x20, 0x02, 0x20, 0x03, 0x6b, 0x22, 0x02,
|
||||
0x0d, 0x00, 0x0b, 0x0b, 0x0b, 0xb1, 0x02, 0x01, 0x06, 0x7f, 0x23, 0x00,
|
||||
0x41, 0x20, 0x6b, 0x22, 0x03, 0x24, 0x00, 0x20, 0x03, 0x20, 0x00, 0x28,
|
||||
0x02, 0x1c, 0x22, 0x04, 0x36, 0x02, 0x10, 0x20, 0x00, 0x28, 0x02, 0x14,
|
||||
0x21, 0x05, 0x20, 0x03, 0x20, 0x02, 0x36, 0x02, 0x1c, 0x20, 0x03, 0x20,
|
||||
0x01, 0x36, 0x02, 0x18, 0x20, 0x03, 0x20, 0x05, 0x20, 0x04, 0x6b, 0x22,
|
||||
0x01, 0x36, 0x02, 0x14, 0x20, 0x01, 0x20, 0x02, 0x6a, 0x21, 0x06, 0x41,
|
||||
0x02, 0x21, 0x05, 0x20, 0x03, 0x41, 0x10, 0x6a, 0x21, 0x01, 0x03, 0x40,
|
||||
0x02, 0x40, 0x02, 0x7f, 0x20, 0x06, 0x02, 0x7f, 0x20, 0x00, 0x28, 0x02,
|
||||
0x3c, 0x20, 0x01, 0x20, 0x05, 0x20, 0x03, 0x41, 0x0c, 0x6a, 0x10, 0x00,
|
||||
0x04, 0x40, 0x20, 0x03, 0x41, 0x7f, 0x36, 0x02, 0x0c, 0x41, 0x7f, 0x0c,
|
||||
0x01, 0x0b, 0x20, 0x03, 0x28, 0x02, 0x0c, 0x0b, 0x22, 0x04, 0x46, 0x04,
|
||||
0x40, 0x20, 0x00, 0x20, 0x00, 0x28, 0x02, 0x2c, 0x22, 0x01, 0x36, 0x02,
|
||||
0x1c, 0x20, 0x00, 0x20, 0x01, 0x36, 0x02, 0x14, 0x20, 0x00, 0x20, 0x01,
|
||||
0x20, 0x00, 0x28, 0x02, 0x30, 0x6a, 0x36, 0x02, 0x10, 0x20, 0x02, 0x0c,
|
||||
0x01, 0x0b, 0x20, 0x04, 0x41, 0x7f, 0x4a, 0x0d, 0x01, 0x20, 0x00, 0x41,
|
||||
0x00, 0x36, 0x02, 0x1c, 0x20, 0x00, 0x42, 0x00, 0x37, 0x03, 0x10, 0x20,
|
||||
0x00, 0x20, 0x00, 0x28, 0x02, 0x00, 0x41, 0x20, 0x72, 0x36, 0x02, 0x00,
|
||||
0x41, 0x00, 0x20, 0x05, 0x41, 0x02, 0x46, 0x0d, 0x00, 0x1a, 0x20, 0x02,
|
||||
0x20, 0x01, 0x28, 0x02, 0x04, 0x6b, 0x0b, 0x21, 0x04, 0x20, 0x03, 0x41,
|
||||
0x20, 0x6a, 0x24, 0x00, 0x20, 0x04, 0x0f, 0x0b, 0x20, 0x01, 0x41, 0x08,
|
||||
0x6a, 0x20, 0x01, 0x20, 0x04, 0x20, 0x01, 0x28, 0x02, 0x04, 0x22, 0x07,
|
||||
0x4b, 0x22, 0x08, 0x1b, 0x22, 0x01, 0x20, 0x04, 0x20, 0x07, 0x41, 0x00,
|
||||
0x20, 0x08, 0x1b, 0x6b, 0x22, 0x07, 0x20, 0x01, 0x28, 0x02, 0x00, 0x6a,
|
||||
0x36, 0x02, 0x00, 0x20, 0x01, 0x20, 0x01, 0x28, 0x02, 0x04, 0x20, 0x07,
|
||||
0x6b, 0x36, 0x02, 0x04, 0x20, 0x06, 0x20, 0x04, 0x6b, 0x21, 0x06, 0x20,
|
||||
0x05, 0x20, 0x08, 0x6b, 0x21, 0x05, 0x0c, 0x00, 0x00, 0x0b, 0x00, 0x0b,
|
||||
0x0b, 0x4d, 0x06, 0x00, 0x41, 0x80, 0x08, 0x0b, 0x12, 0x68, 0x65, 0x6c,
|
||||
0x6c, 0x6f, 0x2c, 0x20, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x21, 0x00, 0x00,
|
||||
0x00, 0x18, 0x04, 0x00, 0x41, 0x98, 0x08, 0x0b, 0x01, 0x05, 0x00, 0x41,
|
||||
0xa4, 0x08, 0x0b, 0x01, 0x01, 0x00, 0x41, 0xbc, 0x08, 0x0b, 0x0e, 0x02,
|
||||
0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0xb8, 0x04, 0x00, 0x00, 0x00,
|
||||
0x04, 0x00, 0x41, 0xd4, 0x08, 0x0b, 0x01, 0x01, 0x00, 0x41, 0xe3, 0x08,
|
||||
0x0b, 0x05, 0x0a, 0xff, 0xff, 0xff, 0xff,
|
||||
]);
|
||||
|
||||
// Trying to import WASI twice.
|
||||
Expect.throws(
|
||||
() => WasmModule(helloWorldData).instantiate().enableWasi().enableWasi(),
|
||||
(Exception e) => "$e".contains("WASI is already enabled"));
|
||||
|
||||
// Missing imports due to not enabling WASI.
|
||||
Expect.throws(() => WasmModule(helloWorldData).instantiate().build(),
|
||||
(Exception e) => "$e".contains("Missing import"));
|
||||
|
||||
// Trying to get stdout/stderr without WASI enabled (WASI function import has
|
||||
// been manually filled).
|
||||
var inst = WasmModule(helloWorldData)
|
||||
.instantiate()
|
||||
.addFunction("wasi_unstable", "fd_write",
|
||||
(int fd, int iovs, int iovs_len, int unused) => 0)
|
||||
.build();
|
||||
Expect.throws(
|
||||
() => inst.stdout,
|
||||
(Exception e) =>
|
||||
"$e".contains("Can't capture stdout without WASI enabled"));
|
||||
Expect.throws(
|
||||
() => inst.stderr,
|
||||
(Exception e) =>
|
||||
"$e".contains("Can't capture stderr without WASI enabled"));
|
||||
}
|
Loading…
Reference in a new issue