33
44import { mono_wasm_new_root , WasmRoot } from "./roots" ;
55import {
6- GCHandle , Int32Ptr , JSHandleDisposed , MonoArray ,
7- MonoArrayNull , MonoObject , MonoObjectNull , MonoString
6+ GCHandle , Int32Ptr , JSHandle , JSHandleDisposed , MonoArray ,
7+ MonoArrayNull , MonoObject , MonoObjectNull , MonoString , MonoClass ,
8+ MonoClassNull , MonoType , MonoTypeNull
89} from "./types" ;
910import { Module , runtimeHelpers } from "./modules" ;
1011import { conv_string } from "./strings" ;
@@ -15,6 +16,49 @@ import { mono_method_get_call_signature, call_method, wrap_error } from "./metho
1516import { _js_to_mono_obj } from "./js-to-cs" ;
1617import { _are_promises_supported , _create_cancelable_promise } from "./cancelable-promise" ;
1718
19+ // see src/mono/wasm/driver.c MARSHAL_TYPE_xxx and Runtime.cs MarshalType
20+ export enum MarshalType {
21+ NULL = 0 ,
22+ INT = 1 ,
23+ FP64 = 2 ,
24+ STRING = 3 ,
25+ VT = 4 ,
26+ DELEGATE = 5 ,
27+ TASK = 6 ,
28+ OBJECT = 7 ,
29+ BOOL = 8 ,
30+ ENUM = 9 ,
31+ URI = 22 ,
32+ SAFEHANDLE = 23 ,
33+ ARRAY_BYTE = 10 ,
34+ ARRAY_UBYTE = 11 ,
35+ ARRAY_UBYTE_C = 12 ,
36+ ARRAY_SHORT = 13 ,
37+ ARRAY_USHORT = 14 ,
38+ ARRAY_INT = 15 ,
39+ ARRAY_UINT = 16 ,
40+ ARRAY_FLOAT = 17 ,
41+ ARRAY_DOUBLE = 18 ,
42+ FP32 = 24 ,
43+ UINT32 = 25 ,
44+ INT64 = 26 ,
45+ UINT64 = 27 ,
46+ CHAR = 28 ,
47+ STRING_INTERNED = 29 ,
48+ VOID = 30 ,
49+ ENUM64 = 31 ,
50+ POINTER = 32
51+ }
52+
53+ // see src/mono/wasm/driver.c MARSHAL_ERROR_xxx and Runtime.cs
54+ export enum MarshalError {
55+ BUFFER_TOO_SMALL = 512 ,
56+ NULL_CLASS_POINTER = 513 ,
57+ NULL_TYPE_POINTER = 514 ,
58+ UNSUPPORTED_TYPE = 515 ,
59+ FIRST = BUFFER_TOO_SMALL
60+ }
61+
1862const delegate_invoke_symbol = Symbol . for ( "wasm delegate_invoke" ) ;
1963const delegate_invoke_signature_symbol = Symbol . for ( "wasm delegate_invoke_signature" ) ;
2064
@@ -38,72 +82,89 @@ function _unbox_cs_owned_root_as_js_object(root: WasmRoot<any>) {
3882 return js_obj ;
3983}
4084
41- export function _unbox_mono_obj_root_with_known_nonprimitive_type ( root : WasmRoot < any > , type : number ) : any {
42- if ( root . value === undefined )
43- throw new Error ( `Expected a root but got ${ root } ` ) ;
44-
85+ function _unbox_mono_obj_root_with_known_nonprimitive_type_impl ( root : WasmRoot < any > , type : MarshalType , typePtr : MonoType , unbox_buffer : VoidPtr ) : any {
4586 //See MARSHAL_TYPE_ defines in driver.c
4687 switch ( type ) {
47- case 26 : // int64
48- case 27 : // uint64
88+ case MarshalType . INT64 :
89+ case MarshalType . UINT64 :
4990 // TODO: Fix this once emscripten offers HEAPI64/HEAPU64 or can return them
5091 throw new Error ( "int64 not available" ) ;
51- case 3 : // string
52- case 29 : // interned string
92+ case MarshalType . STRING :
93+ case MarshalType . STRING_INTERNED :
5394 return conv_string ( root . value ) ;
54- case 4 : //vts
95+ case MarshalType . VT :
5596 throw new Error ( "no idea on how to unbox value types" ) ;
56- case 5 : // delegate
97+ case MarshalType . DELEGATE :
5798 return _wrap_delegate_root_as_function ( root ) ;
58- case 6 : // Task
99+ case MarshalType . TASK :
59100 return _unbox_task_root_as_promise ( root ) ;
60- case 7 : // ref type
101+ case MarshalType . OBJECT :
61102 return _unbox_ref_type_root_as_js_object ( root ) ;
62- case 10 : // arrays
63- case 11 :
64- case 12 :
65- case 13 :
66- case 14 :
67- case 15 :
68- case 16 :
69- case 17 :
70- case 18 :
103+ case MarshalType . ARRAY_BYTE :
104+ case MarshalType . ARRAY_UBYTE :
105+ case MarshalType . ARRAY_UBYTE_C :
106+ case MarshalType . ARRAY_SHORT :
107+ case MarshalType . ARRAY_USHORT :
108+ case MarshalType . ARRAY_INT :
109+ case MarshalType . ARRAY_UINT :
110+ case MarshalType . ARRAY_FLOAT :
111+ case MarshalType . ARRAY_DOUBLE :
71112 throw new Error ( "Marshalling of primitive arrays are not supported. Use the corresponding TypedArray instead." ) ;
72- case 20 : // clr .NET DateTime
113+ case < MarshalType > 20 : // clr .NET DateTime
73114 return new Date ( corebindings . _get_date_value ( root . value ) ) ;
74- case 21 : // clr .NET DateTimeOffset
115+ case < MarshalType > 21 : // clr .NET DateTimeOffset
75116 return corebindings . _object_to_string ( root . value ) ;
76- case 22 : // clr .NET Uri
117+ case MarshalType . URI :
77118 return corebindings . _object_to_string ( root . value ) ;
78- case 23 : // clr .NET SafeHandle/JSObject
119+ case MarshalType . SAFEHANDLE :
79120 return _unbox_cs_owned_root_as_js_object ( root ) ;
80- case 30 :
121+ case MarshalType . VOID :
81122 return undefined ;
82123 default :
83- throw new Error ( `no idea on how to unbox object kind ${ type } at offset ${ root . value } (root address is ${ root . get_address ( ) } )` ) ;
124+ throw new Error ( `no idea on how to unbox object of MarshalType ${ type } at offset ${ root . value } (root address is ${ root . get_address ( ) } )` ) ;
125+ }
126+ }
127+
128+ export function _unbox_mono_obj_root_with_known_nonprimitive_type ( root : WasmRoot < any > , type : MarshalType , unbox_buffer : VoidPtr ) : any {
129+ if ( type >= MarshalError . FIRST )
130+ throw new Error ( `Got marshaling error ${ type } when attempting to unbox object at address ${ root . value } (root located at ${ root . get_address ( ) } )` ) ;
131+
132+ let typePtr = MonoTypeNull ;
133+ if ( ( type === MarshalType . VT ) || ( type == MarshalType . OBJECT ) ) {
134+ typePtr = < MonoType > < any > Module . HEAPU32 [ < any > unbox_buffer >>> 2 ] ;
135+ if ( < number > < any > typePtr < 1024 )
136+ throw new Error ( `Got invalid MonoType ${ typePtr } for object at address ${ root . value } (root located at ${ root . get_address ( ) } )` ) ;
84137 }
138+
139+ return _unbox_mono_obj_root_with_known_nonprimitive_type_impl ( root , type , typePtr , unbox_buffer ) ;
85140}
86141
87- export function _unbox_mono_obj_root ( root : WasmRoot < any > ) : any {
142+ export function _unbox_mono_obj_root ( root : WasmRoot < any > ) : any {
88143 if ( root . value === 0 )
89144 return undefined ;
90145
91- const type = cwraps . mono_wasm_try_unbox_primitive_and_get_type ( root . value , runtimeHelpers . _unbox_buffer ) ;
146+ const unbox_buffer = runtimeHelpers . _unbox_buffer ;
147+ const type = cwraps . mono_wasm_try_unbox_primitive_and_get_type ( root . value , unbox_buffer , runtimeHelpers . _unbox_buffer_size ) ;
92148 switch ( type ) {
93- case 1 : // int
94- return Module . HEAP32 [ < any > runtimeHelpers . _unbox_buffer / 4 ] ;
95- case 25 : // uint32
96- return Module . HEAPU32 [ < any > runtimeHelpers . _unbox_buffer / 4 ] ;
97- case 24 : // float32
98- return Module . HEAPF32 [ < any > runtimeHelpers . _unbox_buffer / 4 ] ;
99- case 2 : // float64
100- return Module . HEAPF64 [ < any > runtimeHelpers . _unbox_buffer / 8 ] ;
101- case 8 : // boolean
102- return ( Module . HEAP32 [ < any > runtimeHelpers . _unbox_buffer / 4 ] ) !== 0 ;
103- case 28 : // char
104- return String . fromCharCode ( Module . HEAP32 [ < any > runtimeHelpers . _unbox_buffer / 4 ] ) ;
149+ case MarshalType . INT :
150+ return Module . HEAP32 [ < any > unbox_buffer >>> 2 ] ;
151+ case MarshalType . UINT32 :
152+ return Module . HEAPU32 [ < any > unbox_buffer >>> 2 ] ;
153+ case MarshalType . POINTER :
154+ // FIXME: Is this right?
155+ return Module . HEAPU32 [ < any > unbox_buffer >>> 2 ] ;
156+ case MarshalType . FP32 :
157+ return Module . HEAPF32 [ < any > unbox_buffer >>> 2 ] ;
158+ case MarshalType . FP64 :
159+ return Module . HEAPF64 [ < any > unbox_buffer >>> 3 ] ;
160+ case MarshalType . BOOL :
161+ return ( Module . HEAP32 [ < any > unbox_buffer >>> 2 ] ) !== 0 ;
162+ case MarshalType . CHAR :
163+ return String . fromCharCode ( Module . HEAP32 [ < any > unbox_buffer >>> 2 ] ) ;
164+ case MarshalType . NULL :
165+ return null ;
105166 default :
106- return _unbox_mono_obj_root_with_known_nonprimitive_type ( root , type ) ;
167+ return _unbox_mono_obj_root_with_known_nonprimitive_type ( root , type , unbox_buffer ) ;
107168 }
108169}
109170
@@ -289,7 +350,7 @@ function _unbox_task_root_as_promise(root: WasmRoot<MonoObject>) {
289350 return result ;
290351}
291352
292- function _unbox_ref_type_root_as_js_object ( root : WasmRoot < MonoObject > ) {
353+ export function _unbox_ref_type_root_as_js_object ( root : WasmRoot < MonoObject > ) {
293354
294355 if ( root . value === MonoObjectNull )
295356 return null ;
0 commit comments