@@ -24,41 +24,47 @@ class WasmExportDescriptor {
24
24
}
25
25
26
26
class WasmRuntime {
27
- static WasmRuntime _inst;
27
+ static WasmRuntime ? _inst;
28
28
29
29
DynamicLibrary _lib;
30
- WasmerCompileFn _compile;
31
- WasmerInstantiateFn _instantiate;
32
- WasmerInstanceExportsFn _instance_exports;
33
- WasmerExportsLenFn _exports_len;
34
- WasmerExportsGetFn _exports_get;
35
- WasmerExportKindFn _export_kind;
36
- WasmerExportToFuncFn _export_to_func;
37
- WasmerExportFuncReturnsArityFn _export_func_returns_arity;
38
- WasmerExportFuncReturnsFn _export_func_returns;
39
- WasmerExportFuncParamsArityFn _export_func_params_arity;
40
- WasmerExportFuncParamsFn _export_func_params;
41
- WasmerExportFuncCallFn _export_func_call;
42
- WasmerExportNamePtrFn _export_name_ptr;
43
- WasmerExportDescriptorsFn _export_descriptors;
44
- WasmerExportDescriptorsDestroyFn _export_descriptors_destroy;
45
- WasmerExportDescriptorsLenFn _export_descriptors_len;
46
- WasmerExportDescriptorsGetFn _export_descriptors_get;
47
- WasmerExportDescriptorKindFn _export_descriptor_kind;
48
- WasmerExportDescriptorNamePtrFn _export_descriptor_name_ptr;
49
- WasmerImportDescriptorModuleNamePtrFn _import_descriptor_module_name_ptr;
50
- WasmerImportDescriptorNamePtrFn _import_descriptor_name_ptr;
51
- WasmerImportDescriptorsFn _import_descriptors;
52
- WasmerImportDescriptorsDestroyFn _import_descriptors_destroy;
53
- WasmerImportDescriptorsLenFn _import_descriptors_len;
54
- WasmerImportDescriptorsGetFn _import_descriptors_get;
55
- WasmerImportDescriptorKindFn _import_descriptor_kind;
30
+ late WasmerCompileFn _compile;
31
+ late WasmerInstantiateFn _instantiate;
32
+ late WasmerInstanceExportsFn _instance_exports;
33
+ late WasmerExportsLenFn _exports_len;
34
+ late WasmerExportsGetFn _exports_get;
35
+ late WasmerExportKindFn _export_kind;
36
+ late WasmerExportToFuncFn _export_to_func;
37
+ late WasmerExportFuncReturnsArityFn _export_func_returns_arity;
38
+ late WasmerExportFuncReturnsFn _export_func_returns;
39
+ late WasmerExportFuncParamsArityFn _export_func_params_arity;
40
+ late WasmerExportFuncParamsFn _export_func_params;
41
+ late WasmerExportFuncCallFn _export_func_call;
42
+ late WasmerExportNamePtrFn _export_name_ptr;
43
+ late WasmerExportDescriptorsFn _export_descriptors;
44
+ late WasmerExportDescriptorsDestroyFn _export_descriptors_destroy;
45
+ late WasmerExportDescriptorsLenFn _export_descriptors_len;
46
+ late WasmerExportDescriptorsGetFn _export_descriptors_get;
47
+ late WasmerExportDescriptorKindFn _export_descriptor_kind;
48
+ late WasmerExportDescriptorNamePtrFn _export_descriptor_name_ptr;
49
+ late WasmerImportDescriptorModuleNamePtrFn _import_descriptor_module_name_ptr;
50
+ late WasmerImportDescriptorNamePtrFn _import_descriptor_name_ptr;
51
+ late WasmerImportDescriptorsFn _import_descriptors;
52
+ late WasmerImportDescriptorsDestroyFn _import_descriptors_destroy;
53
+ late WasmerImportDescriptorsLenFn _import_descriptors_len;
54
+ late WasmerImportDescriptorsGetFn _import_descriptors_get;
55
+ late WasmerImportDescriptorKindFn _import_descriptor_kind;
56
+ late WasmerExportToMemoryFn _export_to_memory;
57
+ late WasmerMemoryNewPtrFn _memory_new_ptr;
58
+ late WasmerMemoryGrowFn _memory_grow;
59
+ late WasmerMemoryLengthFn _memory_length;
60
+ late WasmerMemoryDataFn _memory_data;
61
+ late WasmerMemoryDataLengthFn _memory_data_length;
56
62
57
63
factory WasmRuntime () {
58
64
if (_inst == null ) {
59
65
_inst = WasmRuntime ._init ();
60
66
}
61
- return _inst;
67
+ return _inst as WasmRuntime ;
62
68
}
63
69
64
70
static String _getLibName () {
@@ -96,9 +102,8 @@ class WasmRuntime {
96
102
return commonLibDir;
97
103
}
98
104
99
- WasmRuntime ._init () {
100
- var libPath = path.join (_getLibDir (), _getLibName ());
101
- _lib = DynamicLibrary .open (libPath);
105
+ WasmRuntime ._init ()
106
+ : _lib = DynamicLibrary .open (path.join (_getLibDir (), _getLibName ())) {
102
107
_compile = _lib.lookupFunction <NativeWasmerCompileFn , WasmerCompileFn >(
103
108
'wasmer_compile' );
104
109
_instantiate =
@@ -171,6 +176,22 @@ class WasmRuntime {
171
176
_import_descriptor_name_ptr = _lib.lookupFunction<
172
177
NativeWasmerImportDescriptorNamePtrFn ,
173
178
WasmerImportDescriptorNamePtrFn > ('wasmer_import_descriptor_name_ptr' );
179
+ _export_to_memory = _lib.lookupFunction< NativeWasmerExportToMemoryFn ,
180
+ WasmerExportToMemoryFn > ('wasmer_export_to_memory' );
181
+ _memory_new_ptr =
182
+ _lib.lookupFunction <NativeWasmerMemoryNewPtrFn , WasmerMemoryNewPtrFn >(
183
+ 'wasmer_memory_new_ptr' );
184
+ _memory_grow =
185
+ _lib.lookupFunction <NativeWasmerMemoryGrowFn , WasmerMemoryGrowFn >(
186
+ 'wasmer_memory_grow' );
187
+ _memory_length =
188
+ _lib.lookupFunction <NativeWasmerMemoryLengthFn , WasmerMemoryLengthFn >(
189
+ 'wasmer_memory_length' );
190
+ _memory_data =
191
+ _lib.lookupFunction <NativeWasmerMemoryDataFn , WasmerMemoryDataFn >(
192
+ 'wasmer_memory_data' );
193
+ _memory_data_length = _lib.lookupFunction< NativeWasmerMemoryDataLengthFn ,
194
+ WasmerMemoryDataLengthFn > ('wasmer_memory_data_length' );
174
195
}
175
196
176
197
Pointer <WasmerModule > compile (Uint8List data) {
@@ -331,4 +352,48 @@ class WasmRuntime {
331
352
throw Exception ("Failed to call WASM function" );
332
353
}
333
354
}
355
+
356
+ Pointer <WasmerMemory > exportToMemory (Pointer <WasmerExport > export) {
357
+ var memPtrPtr = allocate <Pointer <WasmerMemory >>();
358
+ var result = _export_to_memory (export, memPtrPtr);
359
+ if (result != WasmerResultOk ) {
360
+ free (memPtrPtr);
361
+ throw Exception ("Failed to get exported memory" );
362
+ }
363
+ Pointer <WasmerMemory > memPtr = memPtrPtr.value;
364
+ free (memPtrPtr);
365
+ return memPtr;
366
+ }
367
+
368
+ Pointer <WasmerMemory > newMemory (int pages, int ? maxPages) {
369
+ var memPtrPtr = allocate <Pointer <WasmerMemory >>();
370
+ var limPtr = allocate <WasmerLimits >();
371
+ limPtr.ref.min = pages;
372
+ limPtr.ref.has_max = maxPages != null ? 1 : 0 ;
373
+ limPtr.ref.max = maxPages ?? 0 ;
374
+ var result = _memory_new_ptr (memPtrPtr, limPtr);
375
+ free (limPtr);
376
+ if (result != WasmerResultOk ) {
377
+ free (memPtrPtr);
378
+ throw Exception ("Failed to create memory" );
379
+ }
380
+ Pointer <WasmerMemory > memPtr = memPtrPtr.value;
381
+ free (memPtrPtr);
382
+ return memPtr;
383
+ }
384
+
385
+ void growMemory (Pointer <WasmerMemory > memory, int deltaPages) {
386
+ var result = _memory_grow (memory, deltaPages);
387
+ if (result != WasmerResultOk ) {
388
+ throw Exception ("Failed to grow memory" );
389
+ }
390
+ }
391
+
392
+ int memoryLength (Pointer <WasmerMemory > memory) {
393
+ return _memory_length (memory);
394
+ }
395
+
396
+ Uint8List memoryView (Pointer <WasmerMemory > memory) {
397
+ return _memory_data (memory).asTypedList (_memory_data_length (memory));
398
+ }
334
399
}
0 commit comments