forked from bytecodealliance/wasmtime
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathInterop.cs
More file actions
986 lines (737 loc) · 31.1 KB
/
Interop.cs
File metadata and controls
986 lines (737 loc) · 31.1 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
using System;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using System.Text;
namespace Wasmtime
{
/// <summary>
/// Implements the Wasmtime API bindings.
/// </summary>
/// <remarks>See https://github.com/WebAssembly/wasm-c-api/blob/master/include/wasm.h for the C API reference.</remarks>
internal static class Interop
{
const string LibraryName = "wasmtime";
internal class EngineHandle : SafeHandle
{
public EngineHandle() : base(IntPtr.Zero, true)
{
}
public override bool IsInvalid => handle == IntPtr.Zero;
protected override bool ReleaseHandle()
{
Interop.wasm_engine_delete(handle);
return true;
}
}
internal class StoreHandle : SafeHandle
{
public StoreHandle() : base(IntPtr.Zero, true)
{
}
public override bool IsInvalid => handle == IntPtr.Zero;
protected override bool ReleaseHandle()
{
Interop.wasm_store_delete(handle);
return true;
}
}
internal class ModuleHandle : SafeHandle
{
public ModuleHandle() : base(IntPtr.Zero, true)
{
}
public override bool IsInvalid => handle == IntPtr.Zero;
protected override bool ReleaseHandle()
{
Interop.wasm_module_delete(handle);
return true;
}
}
internal class FunctionHandle : SafeHandle
{
public FunctionHandle() : base(IntPtr.Zero, true)
{
}
public WasmFuncCallback Callback { get; set; } = null;
public override bool IsInvalid => handle == IntPtr.Zero;
protected override bool ReleaseHandle()
{
Interop.wasm_func_delete(handle);
return true;
}
}
internal class GlobalHandle : SafeHandle
{
public GlobalHandle() : base(IntPtr.Zero, true)
{
}
public override bool IsInvalid => handle == IntPtr.Zero;
protected override bool ReleaseHandle()
{
Interop.wasm_global_delete(handle);
return true;
}
}
internal class MemoryHandle : SafeHandle
{
public MemoryHandle() : base(IntPtr.Zero, true)
{
}
public override bool IsInvalid => handle == IntPtr.Zero;
protected override bool ReleaseHandle()
{
Interop.wasm_memory_delete(handle);
return true;
}
}
internal class InstanceHandle : SafeHandle
{
public InstanceHandle() : base(IntPtr.Zero, true)
{
}
public override bool IsInvalid => handle == IntPtr.Zero;
protected override bool ReleaseHandle()
{
Interop.wasm_instance_delete(handle);
return true;
}
}
internal class FuncTypeHandle : SafeHandle
{
public FuncTypeHandle() : base(IntPtr.Zero, true)
{
}
public override bool IsInvalid => handle == IntPtr.Zero;
protected override bool ReleaseHandle()
{
Interop.wasm_functype_delete(handle);
return true;
}
}
internal class GlobalTypeHandle : SafeHandle
{
public GlobalTypeHandle() : base(IntPtr.Zero, true)
{
}
public override bool IsInvalid => handle == IntPtr.Zero;
protected override bool ReleaseHandle()
{
Interop.wasm_globaltype_delete(handle);
return true;
}
}
internal class MemoryTypeHandle : SafeHandle
{
public MemoryTypeHandle() : base(IntPtr.Zero, true)
{
}
public override bool IsInvalid => handle == IntPtr.Zero;
protected override bool ReleaseHandle()
{
Interop.wasm_memorytype_delete(handle);
return true;
}
}
internal class ValueTypeHandle : SafeHandle
{
public ValueTypeHandle() : base(IntPtr.Zero, true)
{
}
public override bool IsInvalid => handle == IntPtr.Zero;
protected override bool ReleaseHandle()
{
Interop.wasm_valtype_delete(handle);
return true;
}
}
internal class WasmConfigHandle : SafeHandle
{
public WasmConfigHandle() : base(IntPtr.Zero, true)
{
}
public override bool IsInvalid => handle == IntPtr.Zero;
protected override bool ReleaseHandle()
{
Interop.wasm_config_delete(handle);
return true;
}
}
internal class WasiConfigHandle : SafeHandle
{
public WasiConfigHandle() : base(IntPtr.Zero, true)
{
}
public override bool IsInvalid => handle == IntPtr.Zero;
protected override bool ReleaseHandle()
{
Interop.wasi_config_delete(handle);
return true;
}
}
internal class WasiInstanceHandle : SafeHandle
{
public WasiInstanceHandle() : base(IntPtr.Zero, true)
{
}
public override bool IsInvalid => handle == IntPtr.Zero;
protected override bool ReleaseHandle()
{
Interop.wasi_instance_delete(handle);
return true;
}
}
internal class WasiExportHandle : SafeHandle
{
public WasiExportHandle(IntPtr handle) : base(IntPtr.Zero, false /* not owned */)
{
SetHandle(handle);
}
public override bool IsInvalid => handle == IntPtr.Zero;
protected override bool ReleaseHandle()
{
return true;
}
}
[StructLayout(LayoutKind.Sequential)]
internal unsafe struct wasm_byte_vec_t
{
public UIntPtr size;
public byte* data;
}
[StructLayout(LayoutKind.Sequential)]
internal unsafe struct wasm_valtype_vec_t
{
public UIntPtr size;
public IntPtr* data;
}
[StructLayout(LayoutKind.Sequential)]
internal unsafe struct wasm_export_vec_t
{
public UIntPtr size;
public IntPtr* data;
}
[StructLayout(LayoutKind.Sequential)]
internal unsafe struct wasm_extern_vec_t
{
public UIntPtr size;
public IntPtr* data;
}
[StructLayout(LayoutKind.Sequential)]
internal unsafe struct wasm_importtype_vec_t
{
public UIntPtr size;
public IntPtr* data;
}
[StructLayout(LayoutKind.Sequential)]
internal unsafe struct wasm_exporttype_vec_t
{
public UIntPtr size;
public IntPtr* data;
}
internal enum wasm_valkind_t : byte
{
WASM_I32,
WASM_I64,
WASM_F32,
WASM_F64,
WASM_ANYREF = 128,
WASM_FUNCREF,
}
internal enum wasmtime_strategy_t : byte
{
WASMTIME_STRATEGY_AUTO,
WASMTIME_STRATEGY_CRANELIFT,
WASMTIME_STRATEGY_LIGHTBEAM
}
internal enum wasmtime_opt_level_t : byte
{
WASMTIME_OPT_LEVEL_NONE,
WASMTIME_OPT_LEVEL_SPEED,
WASMTIME_OPT_LEVEL_SPEED_AND_SIZE
}
[StructLayout(LayoutKind.Explicit)]
internal struct wasm_val_union_t
{
[FieldOffset(0)]
public int i32;
[FieldOffset(0)]
public long i64;
[FieldOffset(0)]
public float f32;
[FieldOffset(0)]
public double f64;
[FieldOffset(0)]
public IntPtr reference;
}
[StructLayout(LayoutKind.Sequential)]
internal struct wasm_val_t
{
public wasm_valkind_t kind;
public wasm_val_union_t of;
}
[StructLayout(LayoutKind.Sequential)]
internal struct wasm_limits_t
{
public uint min;
public uint max;
}
public static wasm_val_t ToValue(object o, ValueKind kind)
{
wasm_val_t value = new wasm_val_t();
switch (kind)
{
case ValueKind.Int32:
value.kind = wasm_valkind_t.WASM_I32;
value.of.i32 = (int)Convert.ChangeType(o, TypeCode.Int32);
break;
case ValueKind.Int64:
value.kind = wasm_valkind_t.WASM_I64;
value.of.i64 = (long)Convert.ChangeType(o, TypeCode.Int64);
break;
case ValueKind.Float32:
value.kind = wasm_valkind_t.WASM_F32;
value.of.f32 = (float)Convert.ChangeType(o, TypeCode.Single);
break;
case ValueKind.Float64:
value.kind = wasm_valkind_t.WASM_F64;
value.of.f64 = (double)Convert.ChangeType(o, TypeCode.Double);
break;
// TODO: support AnyRef
default:
throw new NotSupportedException("Unsupported value type.");
}
return value;
}
public static unsafe object ToObject(wasm_val_t* v)
{
switch (v->kind)
{
case Interop.wasm_valkind_t.WASM_I32:
return v->of.i32;
case Interop.wasm_valkind_t.WASM_I64:
return v->of.i64;
case Interop.wasm_valkind_t.WASM_F32:
return v->of.f32;
case Interop.wasm_valkind_t.WASM_F64:
return v->of.f64;
// TODO: support AnyRef
default:
throw new NotSupportedException("Unsupported value kind.");
}
}
public static bool TryGetValueKind(Type type, out ValueKind kind)
{
if (type == typeof(int))
{
kind = ValueKind.Int32;
return true;
}
if (type == typeof(long))
{
kind = ValueKind.Int64;
return true;
}
if (type == typeof(float))
{
kind = ValueKind.Float32;
return true;
}
if (type == typeof(double))
{
kind = ValueKind.Float64;
return true;
}
kind = default(ValueKind);
return false;
}
public static ValueKind ToValueKind(Type type)
{
if (TryGetValueKind(type, out var kind))
{
return kind;
}
throw new NotSupportedException($"Type '{type}' is not a supported WebAssembly value type.");
}
public static string ToString(ValueKind kind)
{
switch (kind)
{
case ValueKind.Int32:
return "int";
case ValueKind.Int64:
return "long";
case ValueKind.Float32:
return "float";
case ValueKind.Float64:
return "double";
default:
throw new NotSupportedException("Unsupported value kind.");
}
}
public static bool IsMatchingKind(ValueKind kind, ValueKind expected)
{
if (kind == expected)
{
return true;
}
if (expected == ValueKind.AnyRef)
{
return kind == ValueKind.FuncRef;
}
return false;
}
internal unsafe delegate IntPtr WasmFuncCallback(wasm_val_t* parameters, wasm_val_t* results);
internal enum wasm_externkind_t : byte
{
WASM_EXTERN_FUNC,
WASM_EXTERN_GLOBAL,
WASM_EXTERN_TABLE,
WASM_EXTERN_MEMORY,
}
internal enum wasm_mutability_t : byte
{
WASM_CONST,
WASM_VAR,
}
internal static unsafe List<ValueKind> ToValueKindList(Interop.wasm_valtype_vec_t* vec)
{
var list = new List<ValueKind>((int)vec->size);
for (int i = 0; i < (int)vec->size; ++i)
{
list.Add(Interop.wasm_valtype_kind(vec->data[i]));
}
return list;
}
internal static Interop.wasm_valtype_vec_t ToValueTypeVec(IReadOnlyList<ValueKind> collection)
{
Interop.wasm_valtype_vec_t vec;
Interop.wasm_valtype_vec_new_uninitialized(out vec, (UIntPtr)collection.Count);
int i = 0;
foreach (var type in collection)
{
var valType = Interop.wasm_valtype_new((wasm_valkind_t)type);
unsafe
{
vec.data[i++] = valType.DangerousGetHandle();
}
valType.SetHandleAsInvalid();
}
return vec;
}
internal static unsafe (byte*[], GCHandle[]) ToUTF8PtrArray(IList<string> strings)
{
// Unfortunately .NET cannot currently marshal string[] as UTF-8
// See: https://github.com/dotnet/runtime/issues/7315
// Therefore, we need to marshal the strings manually
var handles = new GCHandle[strings.Count];
var ptrs = new byte*[strings.Count];
for (int i = 0; i < strings.Count; ++i)
{
handles[i] = GCHandle.Alloc(
Encoding.UTF8.GetBytes(strings[i] + '\0'),
GCHandleType.Pinned
);
ptrs[i] = (byte*)handles[i].AddrOfPinnedObject();
}
return (ptrs, handles);
}
// Engine imports
[DllImport(LibraryName)]
public static extern EngineHandle wasm_engine_new();
[DllImport(LibraryName)]
public static extern EngineHandle wasm_engine_new_with_config(WasmConfigHandle config);
[DllImport(LibraryName)]
public static extern void wasm_engine_delete(IntPtr engine);
// Store imports
[DllImport(LibraryName)]
public static extern StoreHandle wasm_store_new(EngineHandle engine);
[DllImport(LibraryName)]
public static extern void wasm_store_delete(IntPtr engine);
// Byte vec imports
[DllImport(LibraryName)]
public static extern void wasm_byte_vec_new_empty(out wasm_byte_vec_t vec);
[DllImport(LibraryName)]
public static extern void wasm_byte_vec_new_uninitialized(out wasm_byte_vec_t vec, UIntPtr length);
[DllImport(LibraryName)]
public static extern void wasm_byte_vec_new(out wasm_byte_vec_t vec, UIntPtr length, byte[] data);
[DllImport(LibraryName)]
public static extern void wasm_byte_vec_copy(out wasm_byte_vec_t vec, ref wasm_byte_vec_t src);
[DllImport(LibraryName)]
public static extern void wasm_byte_vec_delete(ref wasm_byte_vec_t vec);
// Value type vec imports
[DllImport(LibraryName)]
public static extern void wasm_valtype_vec_new_empty(out wasm_valtype_vec_t vec);
[DllImport(LibraryName)]
public static extern void wasm_valtype_vec_new_uninitialized(out wasm_valtype_vec_t vec, UIntPtr length);
[DllImport(LibraryName)]
public static extern void wasm_valtype_vec_new(out wasm_valtype_vec_t vec, UIntPtr length, IntPtr[] data);
[DllImport(LibraryName)]
public static extern void wasm_valtype_vec_copy(out wasm_valtype_vec_t vec, ref wasm_valtype_vec_t src);
[DllImport(LibraryName)]
public static extern void wasm_valtype_vec_delete(ref wasm_valtype_vec_t vec);
// Extern vec imports
[DllImport(LibraryName)]
public static extern void wasm_extern_vec_new_empty(out wasm_extern_vec_t vec);
[DllImport(LibraryName)]
public static extern void wasm_extern_vec_new_uninitialized(out wasm_extern_vec_t vec, UIntPtr length);
[DllImport(LibraryName)]
public static extern void wasm_extern_vec_new(out wasm_extern_vec_t vec, UIntPtr length, IntPtr[] data);
[DllImport(LibraryName)]
public static extern void wasm_extern_vec_copy(out wasm_extern_vec_t vec, ref wasm_extern_vec_t src);
[DllImport(LibraryName)]
public static extern void wasm_extern_vec_delete(ref wasm_extern_vec_t vec);
// Import type vec imports
[DllImport(LibraryName)]
public static extern void wasm_importtype_vec_new_empty(out wasm_importtype_vec_t vec);
[DllImport(LibraryName)]
public static extern void wasm_importtype_vec_new_uninitialized(out wasm_importtype_vec_t vec, UIntPtr length);
[DllImport(LibraryName)]
public static extern void wasm_importtype_vec_new(out wasm_importtype_vec_t vec, UIntPtr length, IntPtr[] data);
[DllImport(LibraryName)]
public static extern void wasm_importtype_vec_copy(out wasm_importtype_vec_t vec, ref wasm_importtype_vec_t src);
[DllImport(LibraryName)]
public static extern void wasm_importtype_vec_delete(ref wasm_importtype_vec_t vec);
// Export type vec imports
[DllImport(LibraryName)]
public static extern void wasm_exporttype_vec_new_empty(out wasm_exporttype_vec_t vec);
[DllImport(LibraryName)]
public static extern void wasm_exporttype_vec_new_uninitialized(out wasm_exporttype_vec_t vec, UIntPtr length);
[DllImport(LibraryName)]
public static extern void wasm_exporttype_vec_new(out wasm_exporttype_vec_t vec, UIntPtr length, IntPtr[] data);
[DllImport(LibraryName)]
public static extern void wasm_exporttype_vec_copy(out wasm_exporttype_vec_t vec, ref wasm_exporttype_vec_t src);
[DllImport(LibraryName)]
public static extern void wasm_exporttype_vec_delete(ref wasm_exporttype_vec_t vec);
// Import type imports
[DllImport(LibraryName)]
public static extern unsafe wasm_byte_vec_t* wasm_importtype_module(IntPtr importType);
[DllImport(LibraryName)]
public static extern unsafe wasm_byte_vec_t* wasm_importtype_name(IntPtr importType);
[DllImport(LibraryName)]
public static extern unsafe IntPtr wasm_importtype_type(IntPtr importType);
// Export type imports
[DllImport(LibraryName)]
public static extern unsafe wasm_byte_vec_t* wasm_exporttype_name(IntPtr exportType);
[DllImport(LibraryName)]
public static extern unsafe IntPtr wasm_exporttype_type(IntPtr exportType);
// Module imports
[DllImport(LibraryName)]
public static extern ModuleHandle wasm_module_new(StoreHandle store, ref wasm_byte_vec_t bytes);
[DllImport(LibraryName)]
public static extern void wasm_module_imports(ModuleHandle module, out wasm_importtype_vec_t imports);
[DllImport(LibraryName)]
public static extern void wasm_module_exports(ModuleHandle module, out wasm_exporttype_vec_t exports);
[DllImport(LibraryName)]
public static extern void wasm_module_delete(IntPtr module);
// Value type imports
[DllImport(LibraryName)]
public static extern ValueTypeHandle wasm_valtype_new(wasm_valkind_t kind);
[DllImport(LibraryName)]
public static extern void wasm_valtype_delete(IntPtr valueType);
[DllImport(LibraryName)]
public static extern ValueKind wasm_valtype_kind(IntPtr valueType);
// Extern imports
[DllImport(LibraryName)]
public static extern wasm_externkind_t wasm_extern_kind(IntPtr ext);
[DllImport(LibraryName)]
public static extern IntPtr wasm_extern_type(IntPtr ext);
[DllImport(LibraryName)]
public static extern IntPtr wasm_extern_as_func(IntPtr ext);
[DllImport(LibraryName)]
public static extern IntPtr wasm_extern_as_global(IntPtr ext);
[DllImport(LibraryName)]
public static extern IntPtr wasm_extern_as_table(IntPtr ext);
[DllImport(LibraryName)]
public static extern IntPtr wasm_extern_as_memory(IntPtr ext);
// Extern type imports
[DllImport(LibraryName)]
public static extern wasm_externkind_t wasm_externtype_kind(IntPtr externType);
[DllImport(LibraryName)]
public static extern IntPtr wasm_externtype_as_functype_const(IntPtr externType);
[DllImport(LibraryName)]
public static extern IntPtr wasm_externtype_as_globaltype_const(IntPtr externType);
[DllImport(LibraryName)]
public static extern IntPtr wasm_externtype_as_tabletype_const(IntPtr externType);
[DllImport(LibraryName)]
public static extern IntPtr wasm_externtype_as_memorytype_const(IntPtr externType);
// Function imports
[DllImport(LibraryName)]
public static extern FunctionHandle wasm_func_new(StoreHandle store, FuncTypeHandle type, WasmFuncCallback callback);
[DllImport(LibraryName)]
public static extern void wasm_func_delete(IntPtr function);
[DllImport(LibraryName)]
public static unsafe extern IntPtr wasm_func_call(IntPtr function, wasm_val_t* args, wasm_val_t* results);
[DllImport(LibraryName)]
public static extern IntPtr wasm_func_as_extern(FunctionHandle function);
[DllImport(LibraryName)]
public static extern IntPtr wasm_global_as_extern(GlobalHandle global);
[DllImport(LibraryName)]
public static extern IntPtr wasm_memory_as_extern(MemoryHandle memory);
// Function type imports
[DllImport(LibraryName)]
public static extern unsafe wasm_valtype_vec_t* wasm_functype_params(IntPtr funcType);
[DllImport(LibraryName)]
public static extern unsafe wasm_valtype_vec_t* wasm_functype_results(IntPtr funcType);
// Instance imports
[DllImport(LibraryName)]
public static extern unsafe InstanceHandle wasm_instance_new(StoreHandle store, ModuleHandle module, IntPtr[] imports, out IntPtr trap);
[DllImport(LibraryName)]
public static extern void wasm_instance_delete(IntPtr ext);
[DllImport(LibraryName)]
public static extern void wasm_instance_exports(InstanceHandle instance, out wasm_extern_vec_t exports);
// Function type imports
[DllImport(LibraryName)]
public static extern FuncTypeHandle wasm_functype_new(ref wasm_valtype_vec_t parameters, ref wasm_valtype_vec_t results);
[DllImport(LibraryName)]
public static extern void wasm_functype_delete(IntPtr functype);
// Global type imports
[DllImport(LibraryName)]
public static extern GlobalTypeHandle wasm_globaltype_new(IntPtr valueType, wasm_mutability_t mutability);
[DllImport(LibraryName)]
public static extern IntPtr wasm_globaltype_delete(IntPtr globalType);
[DllImport(LibraryName)]
public static extern IntPtr wasm_globaltype_content(IntPtr globalType);
[DllImport(LibraryName)]
public static extern wasm_mutability_t wasm_globaltype_mutability(IntPtr globalType);
// Memory type imports
[DllImport(LibraryName)]
public static extern unsafe MemoryTypeHandle wasm_memorytype_new(wasm_limits_t* limits);
[DllImport(LibraryName)]
public static extern IntPtr wasm_memorytype_delete(IntPtr memoryType);
[DllImport(LibraryName)]
public static extern unsafe wasm_limits_t* wasm_memorytype_limits(MemoryTypeHandle memoryType);
// Trap imports
[DllImport(LibraryName)]
public static extern IntPtr wasm_trap_new(StoreHandle store, ref wasm_byte_vec_t message);
[DllImport(LibraryName)]
public static extern void wasm_trap_delete(IntPtr trap);
[DllImport(LibraryName)]
public static extern void wasm_trap_message(IntPtr trap, out wasm_byte_vec_t message);
// Table type imports
[DllImport(LibraryName)]
public static extern IntPtr wasm_tabletype_element(IntPtr tableType);
[DllImport(LibraryName)]
public static unsafe extern wasm_limits_t* wasm_tabletype_limits(IntPtr tableType);
// Memory type imports
[DllImport(LibraryName)]
public static unsafe extern wasm_limits_t* wasm_memorytype_limits(IntPtr memoryType);
// Global imports
[DllImport(LibraryName)]
public static unsafe extern GlobalHandle wasm_global_new(StoreHandle handle, GlobalTypeHandle globalType, wasm_val_t* initialValue);
[DllImport(LibraryName)]
public static extern void wasm_global_delete(IntPtr global);
[DllImport(LibraryName)]
public static extern IntPtr wasm_global_type(IntPtr global);
[DllImport(LibraryName)]
public static unsafe extern void wasm_global_get(IntPtr global, wasm_val_t* value);
[DllImport(LibraryName)]
public static unsafe extern void wasm_global_set(IntPtr global, wasm_val_t* value);
// Memory imports
[DllImport(LibraryName)]
public static extern MemoryHandle wasm_memory_new(StoreHandle handle, MemoryTypeHandle memoryType);
[DllImport(LibraryName)]
public static extern void wasm_memory_delete(IntPtr memory);
[DllImport(LibraryName)]
public static extern IntPtr wasm_memory_type(MemoryHandle memory);
[DllImport(LibraryName)]
public static unsafe extern byte* wasm_memory_data(IntPtr memory);
[DllImport(LibraryName)]
public static extern UIntPtr wasm_memory_data_size(IntPtr memory);
[DllImport(LibraryName)]
public static extern uint wasm_memory_size(MemoryHandle memory);
[DllImport(LibraryName)]
[return: MarshalAs(UnmanagedType.I1)]
public static extern bool wasm_memory_grow(MemoryHandle memory, uint delta);
// Wasm config
[DllImport(LibraryName)]
public static extern WasmConfigHandle wasm_config_new();
[DllImport(LibraryName)]
public static extern void wasm_config_delete(IntPtr config);
// WASI config
[DllImport(LibraryName)]
public static extern WasiConfigHandle wasi_config_new();
[DllImport(LibraryName)]
public static extern void wasi_config_delete(IntPtr config);
[DllImport(LibraryName)]
public unsafe static extern void wasi_config_set_argv(WasiConfigHandle config, int argc, byte*[] argv);
[DllImport(LibraryName)]
public static extern void wasi_config_inherit_argv(WasiConfigHandle config);
[DllImport(LibraryName)]
public static extern unsafe void wasi_config_set_env(
WasiConfigHandle config,
int envc,
byte*[] names,
byte*[] values
);
[DllImport(LibraryName)]
public static extern void wasi_config_inherit_env(WasiConfigHandle config);
[DllImport(LibraryName)]
[return: MarshalAs(UnmanagedType.I1)]
public static extern bool wasi_config_set_stdin_file(
WasiConfigHandle config,
[MarshalAs(UnmanagedType.LPUTF8Str)] string path
);
[DllImport(LibraryName)]
public static extern void wasi_config_inherit_stdin(WasiConfigHandle config);
[DllImport(LibraryName)]
[return: MarshalAs(UnmanagedType.I1)]
public static extern bool wasi_config_set_stdout_file(
WasiConfigHandle config,
[MarshalAs(UnmanagedType.LPUTF8Str)] string path
);
[DllImport(LibraryName)]
public static extern void wasi_config_inherit_stdout(WasiConfigHandle config);
[DllImport(LibraryName)]
[return: MarshalAs(UnmanagedType.I1)]
public static extern bool wasi_config_set_stderr_file(
WasiConfigHandle config,
[MarshalAs(UnmanagedType.LPUTF8Str)] string path
);
[DllImport(LibraryName)]
public static extern void wasi_config_inherit_stderr(WasiConfigHandle config);
[DllImport(LibraryName)]
[return: MarshalAs(UnmanagedType.I1)]
public static extern bool wasi_config_preopen_dir(
WasiConfigHandle config,
[MarshalAs(UnmanagedType.LPUTF8Str)] string path,
[MarshalAs(UnmanagedType.LPUTF8Str)] string guestPath
);
// WASI instance
[DllImport(LibraryName)]
public static extern WasiInstanceHandle wasi_instance_new(
StoreHandle store,
WasiConfigHandle config,
out IntPtr trap
);
[DllImport(LibraryName)]
public static extern void wasi_instance_delete(IntPtr instance);
[DllImport(LibraryName)]
public static extern IntPtr wasi_instance_bind_import(WasiInstanceHandle instance, IntPtr importType);
// Wasmtime config
[DllImport(LibraryName)]
public static extern void wasmtime_config_debug_info_set(WasmConfigHandle config, [MarshalAs(UnmanagedType.I1)] bool enable);
[DllImport(LibraryName)]
public static extern void wasmtime_config_wasm_threads_set(WasmConfigHandle config, [MarshalAs(UnmanagedType.I1)] bool enable);
[DllImport(LibraryName)]
public static extern void wasmtime_config_wasm_reference_types_set(WasmConfigHandle config, [MarshalAs(UnmanagedType.I1)] bool enable);
[DllImport(LibraryName)]
public static extern IntPtr wasmtime_config_wasm_simd_set(WasmConfigHandle config, [MarshalAs(UnmanagedType.I1)] bool enable);
[DllImport(LibraryName)]
public static extern void wasmtime_config_wasm_bulk_memory_set(WasmConfigHandle config, [MarshalAs(UnmanagedType.I1)] bool enable);
[DllImport(LibraryName)]
public static extern void wasmtime_config_wasm_multi_value_set(WasmConfigHandle config, [MarshalAs(UnmanagedType.I1)] bool enable);
[DllImport(LibraryName)]
public static extern void wasmtime_config_strategy_set(WasmConfigHandle config, wasmtime_strategy_t strategy);
[DllImport(LibraryName)]
public static extern void wasmtime_config_cranelift_debug_verifier_set(WasmConfigHandle config, [MarshalAs(UnmanagedType.I1)] bool enable);
[DllImport(LibraryName)]
public static extern void wasmtime_config_cranelift_opt_level_set(WasmConfigHandle config, wasmtime_opt_level_t level);
[DllImport(LibraryName, CharSet=CharSet.Ansi)]
[return: MarshalAs(UnmanagedType.I1)]
public static extern bool wasmtime_wat2wasm(
EngineHandle engine,
ref wasm_byte_vec_t wat,
out wasm_byte_vec_t vec
);
}
}