Skip to content

Commit 8463e56

Browse files
liamappelbecommit-bot@chromium.org
authored andcommitted
Port package:wasm to new FFI Opaque structs and Allocator API
Bug: #37882 Change-Id: Ibdc64d594ac1645a566477e083d79fe23b0e3ee5 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/181060 Commit-Queue: Liam Appelbe <[email protected]> Reviewed-by: Daco Harkes <[email protected]>
1 parent 8d7dfd6 commit 8463e56

File tree

6 files changed

+76
-78
lines changed

6 files changed

+76
-78
lines changed

pkg/wasm/lib/src/function.dart

+5-6
Original file line numberDiff line numberDiff line change
@@ -13,17 +13,16 @@ class WasmFunction {
1313
Pointer<WasmerFunc> _func;
1414
List<int> _argTypes;
1515
int _returnType;
16-
Pointer<WasmerValVec> _args = allocate<WasmerValVec>();
17-
Pointer<WasmerValVec> _results = allocate<WasmerValVec>();
16+
Pointer<WasmerValVec> _args = calloc<WasmerValVec>();
17+
Pointer<WasmerValVec> _results = calloc<WasmerValVec>();
1818

1919
WasmFunction(this._name, this._func, this._argTypes, this._returnType) {
2020
_args.ref.length = _argTypes.length;
21-
_args.ref.data = _argTypes.length == 0
22-
? nullptr
23-
: allocate<WasmerVal>(count: _argTypes.length);
21+
_args.ref.data =
22+
_argTypes.length == 0 ? nullptr : calloc<WasmerVal>(_argTypes.length);
2423
_results.ref.length = _returnType == WasmerValKindVoid ? 0 : 1;
2524
_results.ref.data =
26-
_returnType == WasmerValKindVoid ? nullptr : allocate<WasmerVal>();
25+
_returnType == WasmerValKindVoid ? nullptr : calloc<WasmerVal>();
2726
for (var i = 0; i < _argTypes.length; ++i) {
2827
_args.ref.data[i].kind = _argTypes[i];
2928
}

pkg/wasm/lib/src/module.dart

+4-5
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ Pointer<WasmerTrap> _wasmFnImportTrampoline(Pointer<_WasmFnImport> imp,
6262

6363
void _wasmFnImportFinalizer(Pointer<_WasmFnImport> imp) {
6464
_wasmFnImportToFn.remove(imp.address);
65-
free(imp);
65+
calloc.free(imp);
6666
}
6767

6868
final _wasmFnImportTrampolineNative = Pointer.fromFunction<
@@ -115,15 +115,14 @@ class WasmInstanceBuilder {
115115
WasmModule _module;
116116
late List<WasmImportDescriptor> _importDescs;
117117
Map<String, int> _importIndex;
118-
Pointer<WasmerExternVec> _imports = allocate<WasmerExternVec>();
118+
Pointer<WasmerExternVec> _imports = calloc<WasmerExternVec>();
119119
Pointer<WasmerWasiEnv> _wasiEnv = nullptr;
120120
Object _importOwner = Object();
121121

122122
WasmInstanceBuilder(this._module) : _importIndex = {} {
123123
_importDescs = WasmRuntime().importDescriptors(_module._module);
124124
_imports.ref.length = _importDescs.length;
125-
_imports.ref.data =
126-
allocate<Pointer<WasmerExtern>>(count: _importDescs.length);
125+
_imports.ref.data = calloc<Pointer<WasmerExtern>>(_importDescs.length);
127126
for (var i = 0; i < _importDescs.length; ++i) {
128127
var imp = _importDescs[i];
129128
_importIndex["${imp.moduleName}::${imp.name}"] = i;
@@ -166,7 +165,7 @@ class WasmInstanceBuilder {
166165

167166
var argTypes = runtime.getArgTypes(imp.funcType);
168167
var returnType = runtime.getReturnType(imp.funcType);
169-
var wasmFnImport = allocate<_WasmFnImport>();
168+
var wasmFnImport = calloc<_WasmFnImport>();
170169
wasmFnImport.ref.returnType = returnType;
171170
wasmFnImport.ref.store = _module._store;
172171
_wasmFnImportToFn[wasmFnImport.address] = fn;

pkg/wasm/lib/src/runtime.dart

+25-25
Original file line numberDiff line numberDiff line change
@@ -435,26 +435,26 @@ class WasmRuntime {
435435

436436
Pointer<WasmerModule> compile(
437437
Object owner, Pointer<WasmerStore> store, Uint8List data) {
438-
var dataPtr = allocate<Uint8>(count: data.length);
438+
var dataPtr = calloc<Uint8>(data.length);
439439
for (int i = 0; i < data.length; ++i) {
440440
dataPtr[i] = data[i];
441441
}
442-
var dataVec = allocate<WasmerByteVec>();
442+
var dataVec = calloc<WasmerByteVec>();
443443
dataVec.ref.data = dataPtr;
444444
dataVec.ref.length = data.length;
445445

446446
var modulePtr = _module_new(store, dataVec);
447447

448-
free(dataPtr);
449-
free(dataVec);
448+
calloc.free(dataPtr);
449+
calloc.free(dataVec);
450450

451451
_checkNotEqual(modulePtr, nullptr, "Wasm module compile failed.");
452452
_set_finalizer_for_module(owner, modulePtr);
453453
return modulePtr;
454454
}
455455

456456
List<WasmExportDescriptor> exportDescriptors(Pointer<WasmerModule> module) {
457-
var exportsVec = allocate<WasmerExporttypeVec>();
457+
var exportsVec = calloc<WasmerExporttypeVec>();
458458
_module_exports(module, exportsVec);
459459
var exps = <WasmExportDescriptor>[];
460460
for (var i = 0; i < exportsVec.ref.length; ++i) {
@@ -467,12 +467,12 @@ class WasmRuntime {
467467
exps.add(WasmExportDescriptor(
468468
kind, _exporttype_name(exp).ref.toString(), fnType));
469469
}
470-
free(exportsVec);
470+
calloc.free(exportsVec);
471471
return exps;
472472
}
473473

474474
List<WasmImportDescriptor> importDescriptors(Pointer<WasmerModule> module) {
475-
var importsVec = allocate<WasmerImporttypeVec>();
475+
var importsVec = calloc<WasmerImporttypeVec>();
476476
_module_imports(module, importsVec);
477477
var imps = <WasmImportDescriptor>[];
478478
for (var i = 0; i < importsVec.ref.length; ++i) {
@@ -488,7 +488,7 @@ class WasmRuntime {
488488
_importtype_name(imp).ref.toString(),
489489
fnType));
490490
}
491-
free(importsVec);
491+
calloc.free(importsVec);
492492
return imps;
493493
}
494494

@@ -504,11 +504,11 @@ class WasmRuntime {
504504
traps.remove(entry);
505505
throw entry.exception;
506506
} else {
507-
var trapMessage = allocate<WasmerByteVec>();
507+
var trapMessage = calloc<WasmerByteVec>();
508508
_trap_message(trap, trapMessage);
509509
var message = "Wasm trap when calling $source: ${trapMessage.ref}";
510510
_byte_vec_delete(trapMessage);
511-
free(trapMessage);
511+
calloc.free(trapMessage);
512512
_trap_delete(trap);
513513
throw Exception(message);
514514
}
@@ -517,26 +517,26 @@ class WasmRuntime {
517517

518518
Pointer<WasmerInstance> instantiate(Object owner, Pointer<WasmerStore> store,
519519
Pointer<WasmerModule> module, Pointer<WasmerExternVec> imports) {
520-
var trap = allocate<Pointer<WasmerTrap>>();
520+
var trap = calloc<Pointer<WasmerTrap>>();
521521
trap.value = nullptr;
522522
var inst = _instance_new(store, module, imports, trap);
523523
maybeThrowTrap(trap.value, "module initialization function");
524-
free(trap);
524+
calloc.free(trap);
525525
_checkNotEqual(inst, nullptr, "Wasm module instantiation failed.");
526526
_set_finalizer_for_instance(owner, inst);
527527
return inst;
528528
}
529529

530530
// Clean up the exports after use, with deleteExports.
531531
Pointer<WasmerExternVec> exports(Pointer<WasmerInstance> instancePtr) {
532-
var exports = allocate<WasmerExternVec>();
532+
var exports = calloc<WasmerExternVec>();
533533
_instance_exports(instancePtr, exports);
534534
return exports;
535535
}
536536

537537
void deleteExports(Pointer<WasmerExternVec> exports) {
538538
_extern_vec_delete(exports);
539-
free(exports);
539+
calloc.free(exports);
540540
}
541541

542542
int externKind(Pointer<WasmerExtern> extern) {
@@ -585,11 +585,11 @@ class WasmRuntime {
585585

586586
Pointer<WasmerMemory> newMemory(
587587
Object owner, Pointer<WasmerStore> store, int pages, int? maxPages) {
588-
var limPtr = allocate<WasmerLimits>();
588+
var limPtr = calloc<WasmerLimits>();
589589
limPtr.ref.min = pages;
590590
limPtr.ref.max = maxPages ?? wasm_limits_max_default;
591591
var memType = _memorytype_new(limPtr);
592-
free(limPtr);
592+
calloc.free(limPtr);
593593
_checkNotEqual(memType, nullptr, "Failed to create memory type.");
594594
_set_finalizer_for_memorytype(owner, memType);
595595
var memory = _checkNotEqual(
@@ -626,13 +626,13 @@ class WasmRuntime {
626626
}
627627

628628
Pointer<WasmerTrap> newTrap(Pointer<WasmerStore> store, dynamic exception) {
629-
var msg = allocate<WasmerByteVec>();
630-
msg.ref.data = allocate<Uint8>();
629+
var msg = calloc<WasmerByteVec>();
630+
msg.ref.data = calloc<Uint8>();
631631
msg.ref.data[0] = 0;
632632
msg.ref.length = 0;
633633
var trap = _trap_new(store, msg);
634-
free(msg.ref.data);
635-
free(msg);
634+
calloc.free(msg.ref.data);
635+
calloc.free(msg);
636636
_checkNotEqual(trap, nullptr, "Failed to create trap.");
637637
var entry = _WasmTrapsEntry(exception);
638638
_set_finalizer_for_trap(entry, trap);
@@ -641,10 +641,10 @@ class WasmRuntime {
641641
}
642642

643643
Pointer<WasmerWasiConfig> newWasiConfig() {
644-
var name = allocate<Uint8>();
644+
var name = calloc<Uint8>();
645645
name[0] = 0;
646646
var config = _wasi_config_new(name);
647-
free(name);
647+
calloc.free(name);
648648
return _checkNotEqual(config, nullptr, "Failed to create WASI config.");
649649
}
650650

@@ -682,10 +682,10 @@ class WasmRuntime {
682682

683683
String _getLastError() {
684684
var length = _wasmer_last_error_length();
685-
var buf = allocate<Uint8>(count: length);
685+
var buf = calloc<Uint8>(length);
686686
_wasmer_last_error_message(buf, length);
687687
String message = utf8.decode(buf.asTypedList(length));
688-
free(buf);
688+
calloc.free(buf);
689689
return message;
690690
}
691691

@@ -707,7 +707,7 @@ class _WasiStreamIterator implements Iterator<List<int>> {
707707
static final int _bufferLength = 1024;
708708
Pointer<WasmerWasiEnv> _env;
709709
Function _reader;
710-
Pointer<Uint8> _buf = allocate<Uint8>(count: _bufferLength);
710+
Pointer<Uint8> _buf = calloc<Uint8>(_bufferLength);
711711
int _length = 0;
712712
_WasiStreamIterator(this._env, this._reader) {}
713713

pkg/wasm/lib/src/tools/generate_ffi_boilerplate.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ def getFns():
8888

8989

9090
opaqueTypeTemplate = '''// %s_t
91-
class Wasmer%s extends Struct {}'''
91+
class Wasmer%s extends Opaque {}'''
9292

9393
vecTypeTemplate = '''// %s_vec_t
9494
class Wasmer%sVec extends Struct {

0 commit comments

Comments
 (0)