@@ -118,7 +118,7 @@ class SwiftRuntimeHeap {
118118export class SwiftRuntime {
119119 private instance : WebAssembly . Instance | null ;
120120 private heap : SwiftRuntimeHeap ;
121- private version : number = 700 ;
121+ private version : number = 701 ;
122122
123123 constructor ( ) {
124124 this . instance = null ;
@@ -151,7 +151,7 @@ export class SwiftRuntime {
151151 for ( let index = 0 ; index < args . length ; index ++ ) {
152152 const argument = args [ index ] ;
153153 const base = argv + 16 * index ;
154- writeValue ( argument , base , base + 4 , base + 8 ) ;
154+ writeValue ( argument , base , base + 4 , base + 8 , false ) ;
155155 }
156156 let output : any ;
157157 const callback_func_ref = this . heap . retain ( function ( result : any ) {
@@ -251,39 +251,59 @@ export class SwiftRuntime {
251251 value : any ,
252252 kind_ptr : pointer ,
253253 payload1_ptr : pointer ,
254- payload2_ptr : pointer
254+ payload2_ptr : pointer ,
255+ is_exception : boolean
255256 ) => {
257+ const exceptionBit = ( is_exception ? 1 : 0 ) << 31 ;
256258 if ( value === null ) {
257- writeUint32 ( kind_ptr , JavaScriptValueKind . Null ) ;
259+ writeUint32 ( kind_ptr , exceptionBit | JavaScriptValueKind . Null ) ;
258260 return ;
259261 }
260262 switch ( typeof value ) {
261263 case "boolean" : {
262- writeUint32 ( kind_ptr , JavaScriptValueKind . Boolean ) ;
264+ writeUint32 (
265+ kind_ptr ,
266+ exceptionBit | JavaScriptValueKind . Boolean
267+ ) ;
263268 writeUint32 ( payload1_ptr , value ? 1 : 0 ) ;
264269 break ;
265270 }
266271 case "number" : {
267- writeUint32 ( kind_ptr , JavaScriptValueKind . Number ) ;
272+ writeUint32 (
273+ kind_ptr ,
274+ exceptionBit | JavaScriptValueKind . Number
275+ ) ;
268276 writeFloat64 ( payload2_ptr , value ) ;
269277 break ;
270278 }
271279 case "string" : {
272- writeUint32 ( kind_ptr , JavaScriptValueKind . String ) ;
280+ writeUint32 (
281+ kind_ptr ,
282+ exceptionBit | JavaScriptValueKind . String
283+ ) ;
273284 writeUint32 ( payload1_ptr , this . heap . retain ( value ) ) ;
274285 break ;
275286 }
276287 case "undefined" : {
277- writeUint32 ( kind_ptr , JavaScriptValueKind . Undefined ) ;
288+ writeUint32 (
289+ kind_ptr ,
290+ exceptionBit | JavaScriptValueKind . Undefined
291+ ) ;
278292 break ;
279293 }
280294 case "object" : {
281- writeUint32 ( kind_ptr , JavaScriptValueKind . Object ) ;
295+ writeUint32 (
296+ kind_ptr ,
297+ exceptionBit | JavaScriptValueKind . Object
298+ ) ;
282299 writeUint32 ( payload1_ptr , this . heap . retain ( value ) ) ;
283300 break ;
284301 }
285302 case "function" : {
286- writeUint32 ( kind_ptr , JavaScriptValueKind . Function ) ;
303+ writeUint32 (
304+ kind_ptr ,
305+ exceptionBit | JavaScriptValueKind . Function
306+ ) ;
287307 writeUint32 ( payload1_ptr , this . heap . retain ( value ) ) ;
288308 break ;
289309 }
@@ -332,7 +352,7 @@ export class SwiftRuntime {
332352 ) => {
333353 const obj = this . heap . referenceHeap ( ref ) ;
334354 const result = Reflect . get ( obj , readString ( name ) ) ;
335- writeValue ( result , kind_ptr , payload1_ptr , payload2_ptr ) ;
355+ writeValue ( result , kind_ptr , payload1_ptr , payload2_ptr , false ) ;
336356 } ,
337357 swjs_set_subscript : (
338358 ref : ref ,
@@ -353,7 +373,7 @@ export class SwiftRuntime {
353373 ) => {
354374 const obj = this . heap . referenceHeap ( ref ) ;
355375 const result = Reflect . get ( obj , index ) ;
356- writeValue ( result , kind_ptr , payload1_ptr , payload2_ptr ) ;
376+ writeValue ( result , kind_ptr , payload1_ptr , payload2_ptr , false ) ;
357377 } ,
358378 swjs_encode_string : ( ref : ref , bytes_ptr_result : pointer ) => {
359379 const bytes = textEncoder . encode ( this . heap . referenceHeap ( ref ) ) ;
@@ -383,12 +403,24 @@ export class SwiftRuntime {
383403 payload2_ptr : pointer
384404 ) => {
385405 const func = this . heap . referenceHeap ( ref ) ;
386- const result = Reflect . apply (
387- func ,
388- undefined ,
389- decodeValues ( argv , argc )
390- ) ;
391- writeValue ( result , kind_ptr , payload1_ptr , payload2_ptr ) ;
406+ let result : any ;
407+ try {
408+ result = Reflect . apply (
409+ func ,
410+ undefined ,
411+ decodeValues ( argv , argc )
412+ ) ;
413+ } catch ( error ) {
414+ writeValue (
415+ error ,
416+ kind_ptr ,
417+ payload1_ptr ,
418+ payload2_ptr ,
419+ true
420+ ) ;
421+ return ;
422+ }
423+ writeValue ( result , kind_ptr , payload1_ptr , payload2_ptr , false ) ;
392424 } ,
393425 swjs_call_function_with_this : (
394426 obj_ref : ref ,
@@ -401,12 +433,20 @@ export class SwiftRuntime {
401433 ) => {
402434 const obj = this . heap . referenceHeap ( obj_ref ) ;
403435 const func = this . heap . referenceHeap ( func_ref ) ;
404- const result = Reflect . apply (
405- func ,
406- obj ,
407- decodeValues ( argv , argc )
408- ) ;
409- writeValue ( result , kind_ptr , payload1_ptr , payload2_ptr ) ;
436+ let result : any ;
437+ try {
438+ result = Reflect . apply ( func , obj , decodeValues ( argv , argc ) ) ;
439+ } catch ( error ) {
440+ writeValue (
441+ error ,
442+ kind_ptr ,
443+ payload1_ptr ,
444+ payload2_ptr ,
445+ true
446+ ) ;
447+ return ;
448+ }
449+ writeValue ( result , kind_ptr , payload1_ptr , payload2_ptr , false ) ;
410450 } ,
411451 swjs_create_function : (
412452 host_func_id : number ,
@@ -420,6 +460,31 @@ export class SwiftRuntime {
420460 } ) ;
421461 writeUint32 ( func_ref_ptr , func_ref ) ;
422462 } ,
463+ swjs_call_throwing_new : (
464+ ref : ref ,
465+ argv : pointer ,
466+ argc : number ,
467+ result_obj : pointer ,
468+ exception_kind_ptr : pointer ,
469+ exception_payload1_ptr : pointer ,
470+ exception_payload2_ptr : pointer
471+ ) => {
472+ const obj = this . heap . referenceHeap ( ref ) ;
473+ let result : any ;
474+ try {
475+ result = Reflect . construct ( obj , decodeValues ( argv , argc ) ) ;
476+ } catch ( error ) {
477+ writeValue (
478+ error ,
479+ exception_kind_ptr ,
480+ exception_payload1_ptr ,
481+ exception_payload2_ptr ,
482+ true
483+ ) ;
484+ return ;
485+ }
486+ writeUint32 ( result_obj , this . heap . retain ( result ) ) ;
487+ } ,
423488 swjs_call_new : (
424489 ref : ref ,
425490 argv : pointer ,
@@ -428,10 +493,6 @@ export class SwiftRuntime {
428493 ) => {
429494 const obj = this . heap . referenceHeap ( ref ) ;
430495 const result = Reflect . construct ( obj , decodeValues ( argv , argc ) ) ;
431- if ( typeof result != "object" )
432- throw Error (
433- `Invalid result type of object constructor of "${ obj } ": "${ result } "`
434- ) ;
435496 writeUint32 ( result_obj , this . heap . retain ( result ) ) ;
436497 } ,
437498 swjs_instanceof : ( obj_ref : ref , constructor_ref : ref ) => {
0 commit comments