@@ -5,7 +5,7 @@ interface ExportedMemory {
5
5
type ref = number ;
6
6
type pointer = number ;
7
7
8
- interface GlobalVariable { }
8
+ interface GlobalVariable { }
9
9
declare const window : GlobalVariable ;
10
10
declare const global : GlobalVariable ;
11
11
let globalVariable : any ;
@@ -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,41 @@ 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 ( kind_ptr , exceptionBit | JavaScriptValueKind . Boolean ) ;
263
265
writeUint32 ( payload1_ptr , value ? 1 : 0 ) ;
264
266
break ;
265
267
}
266
268
case "number" : {
267
- writeUint32 ( kind_ptr , JavaScriptValueKind . Number ) ;
269
+ writeUint32 ( kind_ptr , exceptionBit | JavaScriptValueKind . Number ) ;
268
270
writeFloat64 ( payload2_ptr , value ) ;
269
271
break ;
270
272
}
271
273
case "string" : {
272
- writeUint32 ( kind_ptr , JavaScriptValueKind . String ) ;
274
+ writeUint32 ( kind_ptr , exceptionBit | JavaScriptValueKind . String ) ;
273
275
writeUint32 ( payload1_ptr , this . heap . retain ( value ) ) ;
274
276
break ;
275
277
}
276
278
case "undefined" : {
277
- writeUint32 ( kind_ptr , JavaScriptValueKind . Undefined ) ;
279
+ writeUint32 ( kind_ptr , exceptionBit | JavaScriptValueKind . Undefined ) ;
278
280
break ;
279
281
}
280
282
case "object" : {
281
- writeUint32 ( kind_ptr , JavaScriptValueKind . Object ) ;
283
+ writeUint32 ( kind_ptr , exceptionBit | JavaScriptValueKind . Object ) ;
282
284
writeUint32 ( payload1_ptr , this . heap . retain ( value ) ) ;
283
285
break ;
284
286
}
285
287
case "function" : {
286
- writeUint32 ( kind_ptr , JavaScriptValueKind . Function ) ;
288
+ writeUint32 ( kind_ptr , exceptionBit | JavaScriptValueKind . Function ) ;
287
289
writeUint32 ( payload1_ptr , this . heap . retain ( value ) ) ;
288
290
break ;
289
291
}
@@ -332,7 +334,7 @@ export class SwiftRuntime {
332
334
) => {
333
335
const obj = this . heap . referenceHeap ( ref ) ;
334
336
const result = Reflect . get ( obj , readString ( name ) ) ;
335
- writeValue ( result , kind_ptr , payload1_ptr , payload2_ptr ) ;
337
+ writeValue ( result , kind_ptr , payload1_ptr , payload2_ptr , false ) ;
336
338
} ,
337
339
swjs_set_subscript : (
338
340
ref : ref ,
@@ -353,7 +355,7 @@ export class SwiftRuntime {
353
355
) => {
354
356
const obj = this . heap . referenceHeap ( ref ) ;
355
357
const result = Reflect . get ( obj , index ) ;
356
- writeValue ( result , kind_ptr , payload1_ptr , payload2_ptr ) ;
358
+ writeValue ( result , kind_ptr , payload1_ptr , payload2_ptr , false ) ;
357
359
} ,
358
360
swjs_encode_string : ( ref : ref , bytes_ptr_result : pointer ) => {
359
361
const bytes = textEncoder . encode ( this . heap . referenceHeap ( ref ) ) ;
@@ -383,12 +385,18 @@ export class SwiftRuntime {
383
385
payload2_ptr : pointer
384
386
) => {
385
387
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 ) ;
388
+ let result : any ;
389
+ try {
390
+ result = Reflect . apply (
391
+ func ,
392
+ undefined ,
393
+ decodeValues ( argv , argc )
394
+ ) ;
395
+ } catch ( error ) {
396
+ writeValue ( error , kind_ptr , payload1_ptr , payload2_ptr , true ) ;
397
+ return ;
398
+ }
399
+ writeValue ( result , kind_ptr , payload1_ptr , payload2_ptr , false ) ;
392
400
} ,
393
401
swjs_call_function_with_this : (
394
402
obj_ref : ref ,
@@ -401,12 +409,18 @@ export class SwiftRuntime {
401
409
) => {
402
410
const obj = this . heap . referenceHeap ( obj_ref ) ;
403
411
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 ) ;
412
+ let result : any ;
413
+ try {
414
+ result = Reflect . apply (
415
+ func ,
416
+ obj ,
417
+ decodeValues ( argv , argc )
418
+ ) ;
419
+ } catch ( error ) {
420
+ writeValue ( error , kind_ptr , payload1_ptr , payload2_ptr , true ) ;
421
+ return ;
422
+ }
423
+ writeValue ( result , kind_ptr , payload1_ptr , payload2_ptr , false ) ;
410
424
} ,
411
425
swjs_create_function : (
412
426
host_func_id : number ,
@@ -420,6 +434,29 @@ export class SwiftRuntime {
420
434
} ) ;
421
435
writeUint32 ( func_ref_ptr , func_ref ) ;
422
436
} ,
437
+ swjs_call_throwing_new : (
438
+ ref : ref ,
439
+ argv : pointer ,
440
+ argc : number ,
441
+ result_obj : pointer ,
442
+ exception_kind_ptr : pointer ,
443
+ exception_payload1_ptr : pointer ,
444
+ exception_payload2_ptr : pointer
445
+ ) => {
446
+ const obj = this . heap . referenceHeap ( ref ) ;
447
+ let result : any
448
+ try {
449
+ result = Reflect . construct ( obj , decodeValues ( argv , argc ) ) ;
450
+ if ( typeof result != "object" )
451
+ throw Error (
452
+ `Invalid result type of object constructor of "${ obj } ": "${ result } "`
453
+ ) ;
454
+ } catch ( error ) {
455
+ writeValue ( error , exception_kind_ptr , exception_payload1_ptr , exception_payload2_ptr , true ) ;
456
+ return ;
457
+ }
458
+ writeUint32 ( result_obj , this . heap . retain ( result ) ) ;
459
+ } ,
423
460
swjs_call_new : (
424
461
ref : ref ,
425
462
argv : pointer ,
0 commit comments