@@ -10,6 +10,19 @@ import 'package:ffi/ffi.dart';
10
10
import 'package:path/path.dart' as path;
11
11
import 'wasmer_api.dart' ;
12
12
13
+ class WasmImportDescriptor {
14
+ int kind;
15
+ String moduleName;
16
+ String name;
17
+ WasmImportDescriptor (this .kind, this .moduleName, this .name);
18
+ }
19
+
20
+ class WasmExportDescriptor {
21
+ int kind;
22
+ String name;
23
+ WasmExportDescriptor (this .kind, this .name);
24
+ }
25
+
13
26
class WasmRuntime {
14
27
static WasmRuntime _inst;
15
28
@@ -26,6 +39,20 @@ class WasmRuntime {
26
39
WasmerExportFuncParamsArityFn _export_func_params_arity;
27
40
WasmerExportFuncParamsFn _export_func_params;
28
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;
29
56
30
57
factory WasmRuntime () {
31
58
if (_inst == null ) {
@@ -35,8 +62,8 @@ class WasmRuntime {
35
62
}
36
63
37
64
static String _getLibName () {
38
- if (Platform .isMacOS) return "libwasmer .dylib" ;
39
- if (Platform .isLinux) return "libwasmer .so" ;
65
+ if (Platform .isMacOS) return "libwasmer_wrapper .dylib" ;
66
+ if (Platform .isLinux) return "libwasmer_wrapper .so" ;
40
67
throw Exception ("Wasm not currently supported on this platform" );
41
68
}
42
69
@@ -103,6 +130,47 @@ class WasmRuntime {
103
130
WasmerExportFuncParamsFn > ('wasmer_export_func_params' );
104
131
_export_func_call = _lib.lookupFunction< NativeWasmerExportFuncCallFn ,
105
132
WasmerExportFuncCallFn > ('wasmer_export_func_call' );
133
+ _export_descriptors = _lib.lookupFunction< NativeWasmerExportDescriptorsFn ,
134
+ WasmerExportDescriptorsFn > ('wasmer_export_descriptors' );
135
+ _export_descriptors_destroy = _lib.lookupFunction<
136
+ NativeWasmerExportDescriptorsDestroyFn ,
137
+ WasmerExportDescriptorsDestroyFn > ('wasmer_export_descriptors_destroy' );
138
+ _export_descriptors_len = _lib.lookupFunction<
139
+ NativeWasmerExportDescriptorsLenFn ,
140
+ WasmerExportDescriptorsLenFn > ('wasmer_export_descriptors_len' );
141
+ _export_descriptors_get = _lib.lookupFunction<
142
+ NativeWasmerExportDescriptorsGetFn ,
143
+ WasmerExportDescriptorsGetFn > ('wasmer_export_descriptors_get' );
144
+ _export_descriptor_kind = _lib.lookupFunction<
145
+ NativeWasmerExportDescriptorKindFn ,
146
+ WasmerExportDescriptorKindFn > ('wasmer_export_descriptor_kind' );
147
+ _export_name_ptr =
148
+ _lib.lookupFunction <NativeWasmerExportNamePtrFn , WasmerExportNamePtrFn >(
149
+ 'wasmer_export_name_ptr' );
150
+ _export_descriptor_name_ptr = _lib.lookupFunction<
151
+ NativeWasmerExportDescriptorNamePtrFn ,
152
+ WasmerExportDescriptorNamePtrFn > ('wasmer_export_descriptor_name_ptr' );
153
+ _import_descriptors = _lib.lookupFunction< NativeWasmerImportDescriptorsFn ,
154
+ WasmerImportDescriptorsFn > ('wasmer_import_descriptors' );
155
+ _import_descriptors_destroy = _lib.lookupFunction<
156
+ NativeWasmerImportDescriptorsDestroyFn ,
157
+ WasmerImportDescriptorsDestroyFn > ('wasmer_import_descriptors_destroy' );
158
+ _import_descriptors_len = _lib.lookupFunction<
159
+ NativeWasmerImportDescriptorsLenFn ,
160
+ WasmerImportDescriptorsLenFn > ('wasmer_import_descriptors_len' );
161
+ _import_descriptors_get = _lib.lookupFunction<
162
+ NativeWasmerImportDescriptorsGetFn ,
163
+ WasmerImportDescriptorsGetFn > ('wasmer_import_descriptors_get' );
164
+ _import_descriptor_kind = _lib.lookupFunction<
165
+ NativeWasmerImportDescriptorKindFn ,
166
+ WasmerImportDescriptorKindFn > ('wasmer_import_descriptor_kind' );
167
+ _import_descriptor_module_name_ptr = _lib.lookupFunction<
168
+ NativeWasmerImportDescriptorModuleNamePtrFn ,
169
+ WasmerImportDescriptorModuleNamePtrFn > (
170
+ 'wasmer_import_descriptor_module_name_ptr' );
171
+ _import_descriptor_name_ptr = _lib.lookupFunction<
172
+ NativeWasmerImportDescriptorNamePtrFn ,
173
+ WasmerImportDescriptorNamePtrFn > ('wasmer_import_descriptor_name_ptr' );
106
174
}
107
175
108
176
Pointer <WasmerModule > compile (Uint8List data) {
@@ -125,6 +193,49 @@ class WasmRuntime {
125
193
return modulePtr;
126
194
}
127
195
196
+ String _callStringWrapperFunction (Function fn, dynamic arg) {
197
+ var strPtr = allocate <WasmerByteArray >();
198
+ fn (arg, strPtr);
199
+ var str = strPtr.ref.string;
200
+ free (strPtr);
201
+ return str;
202
+ }
203
+
204
+ List <WasmExportDescriptor > exportDescriptors (Pointer <WasmerModule > module) {
205
+ var exportsPtrPtr = allocate <Pointer <WasmerExportDescriptors >>();
206
+ _export_descriptors (module, exportsPtrPtr);
207
+ Pointer <WasmerExportDescriptors > exportsPtr = exportsPtrPtr.value;
208
+ free (exportsPtrPtr);
209
+ var n = _export_descriptors_len (exportsPtr);
210
+ var exps = < WasmExportDescriptor > [];
211
+ for (var i = 0 ; i < n; ++ i) {
212
+ var exp = _export_descriptors_get (exportsPtr, i);
213
+ exps.add (WasmExportDescriptor (_export_descriptor_kind (exp),
214
+ _callStringWrapperFunction (_export_descriptor_name_ptr, exp)));
215
+ }
216
+ _export_descriptors_destroy (exportsPtr);
217
+ return exps;
218
+ }
219
+
220
+ List <WasmImportDescriptor > importDescriptors (Pointer <WasmerModule > module) {
221
+ var importsPtrPtr = allocate <Pointer <WasmerImportDescriptors >>();
222
+ _import_descriptors (module, importsPtrPtr);
223
+ Pointer <WasmerImportDescriptors > importsPtr = importsPtrPtr.value;
224
+ free (importsPtrPtr);
225
+
226
+ var n = _import_descriptors_len (importsPtr);
227
+ var imps = < WasmImportDescriptor > [];
228
+ for (var i = 0 ; i < n; ++ i) {
229
+ var imp = _import_descriptors_get (importsPtr, i);
230
+ imps.add (WasmImportDescriptor (
231
+ _import_descriptor_kind (imp),
232
+ _callStringWrapperFunction (_import_descriptor_module_name_ptr, imp),
233
+ _callStringWrapperFunction (_import_descriptor_name_ptr, imp)));
234
+ }
235
+ _import_descriptors_destroy (importsPtr);
236
+ return imps;
237
+ }
238
+
128
239
Pointer <WasmerInstance > instantiate (Pointer <WasmerModule > module,
129
240
Pointer <WasmerImport > imports, int numImports) {
130
241
var instancePtrPtr = allocate <Pointer <WasmerInstance >>();
@@ -157,6 +268,10 @@ class WasmRuntime {
157
268
return _export_kind (export);
158
269
}
159
270
271
+ String exportName (Pointer <WasmerExport > export) {
272
+ return _callStringWrapperFunction (_export_name_ptr, export);
273
+ }
274
+
160
275
Pointer <WasmerExportFunc > exportToFunction (Pointer <WasmerExport > export) {
161
276
return _export_to_func (export);
162
277
}
0 commit comments