@@ -118,7 +118,7 @@ class SwiftRuntimeHeap {
118
118
export class SwiftRuntime {
119
119
private instance : WebAssembly . Instance | null ;
120
120
private heap : SwiftRuntimeHeap ;
121
- private version : number = 700 ;
121
+ private version : number = 701 ;
122
122
123
123
constructor ( ) {
124
124
this . instance = null ;
@@ -151,7 +151,7 @@ export class SwiftRuntime {
151
151
for ( let index = 0 ; index < args . length ; index ++ ) {
152
152
const argument = args [ index ] ;
153
153
const base = argv + 16 * index ;
154
- writeValue ( argument , base , base + 4 , base + 8 ) ;
154
+ writeValue ( argument , base , base + 4 , base + 8 , false ) ;
155
155
}
156
156
let output : any ;
157
157
const callback_func_ref = this . heap . retain ( function ( result : any ) {
@@ -251,39 +251,59 @@ export class SwiftRuntime {
251
251
value : any ,
252
252
kind_ptr : pointer ,
253
253
payload1_ptr : pointer ,
254
- payload2_ptr : pointer
254
+ payload2_ptr : pointer ,
255
+ is_exception : boolean
255
256
) => {
257
+ const exceptionBit = ( is_exception ? 1 : 0 ) << 31 ;
256
258
if ( value === null ) {
257
- writeUint32 ( kind_ptr , JavaScriptValueKind . Null ) ;
259
+ writeUint32 ( kind_ptr , exceptionBit | JavaScriptValueKind . Null ) ;
258
260
return ;
259
261
}
260
262
switch ( typeof value ) {
261
263
case "boolean" : {
262
- writeUint32 ( kind_ptr , JavaScriptValueKind . Boolean ) ;
264
+ writeUint32 (
265
+ kind_ptr ,
266
+ exceptionBit | JavaScriptValueKind . Boolean
267
+ ) ;
263
268
writeUint32 ( payload1_ptr , value ? 1 : 0 ) ;
264
269
break ;
265
270
}
266
271
case "number" : {
267
- writeUint32 ( kind_ptr , JavaScriptValueKind . Number ) ;
272
+ writeUint32 (
273
+ kind_ptr ,
274
+ exceptionBit | JavaScriptValueKind . Number
275
+ ) ;
268
276
writeFloat64 ( payload2_ptr , value ) ;
269
277
break ;
270
278
}
271
279
case "string" : {
272
- writeUint32 ( kind_ptr , JavaScriptValueKind . String ) ;
280
+ writeUint32 (
281
+ kind_ptr ,
282
+ exceptionBit | JavaScriptValueKind . String
283
+ ) ;
273
284
writeUint32 ( payload1_ptr , this . heap . retain ( value ) ) ;
274
285
break ;
275
286
}
276
287
case "undefined" : {
277
- writeUint32 ( kind_ptr , JavaScriptValueKind . Undefined ) ;
288
+ writeUint32 (
289
+ kind_ptr ,
290
+ exceptionBit | JavaScriptValueKind . Undefined
291
+ ) ;
278
292
break ;
279
293
}
280
294
case "object" : {
281
- writeUint32 ( kind_ptr , JavaScriptValueKind . Object ) ;
295
+ writeUint32 (
296
+ kind_ptr ,
297
+ exceptionBit | JavaScriptValueKind . Object
298
+ ) ;
282
299
writeUint32 ( payload1_ptr , this . heap . retain ( value ) ) ;
283
300
break ;
284
301
}
285
302
case "function" : {
286
- writeUint32 ( kind_ptr , JavaScriptValueKind . Function ) ;
303
+ writeUint32 (
304
+ kind_ptr ,
305
+ exceptionBit | JavaScriptValueKind . Function
306
+ ) ;
287
307
writeUint32 ( payload1_ptr , this . heap . retain ( value ) ) ;
288
308
break ;
289
309
}
@@ -332,7 +352,7 @@ export class SwiftRuntime {
332
352
) => {
333
353
const obj = this . heap . referenceHeap ( ref ) ;
334
354
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 ) ;
336
356
} ,
337
357
swjs_set_subscript : (
338
358
ref : ref ,
@@ -353,7 +373,7 @@ export class SwiftRuntime {
353
373
) => {
354
374
const obj = this . heap . referenceHeap ( ref ) ;
355
375
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 ) ;
357
377
} ,
358
378
swjs_encode_string : ( ref : ref , bytes_ptr_result : pointer ) => {
359
379
const bytes = textEncoder . encode ( this . heap . referenceHeap ( ref ) ) ;
@@ -383,12 +403,24 @@ export class SwiftRuntime {
383
403
payload2_ptr : pointer
384
404
) => {
385
405
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 ) ;
392
424
} ,
393
425
swjs_call_function_with_this : (
394
426
obj_ref : ref ,
@@ -401,12 +433,20 @@ export class SwiftRuntime {
401
433
) => {
402
434
const obj = this . heap . referenceHeap ( obj_ref ) ;
403
435
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 ) ;
410
450
} ,
411
451
swjs_create_function : (
412
452
host_func_id : number ,
@@ -420,6 +460,31 @@ export class SwiftRuntime {
420
460
} ) ;
421
461
writeUint32 ( func_ref_ptr , func_ref ) ;
422
462
} ,
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
+ } ,
423
488
swjs_call_new : (
424
489
ref : ref ,
425
490
argv : pointer ,
@@ -428,10 +493,6 @@ export class SwiftRuntime {
428
493
) => {
429
494
const obj = this . heap . referenceHeap ( ref ) ;
430
495
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
- ) ;
435
496
writeUint32 ( result_obj , this . heap . retain ( result ) ) ;
436
497
} ,
437
498
swjs_instanceof : ( obj_ref : ref , constructor_ref : ref ) => {
0 commit comments