@@ -5,7 +5,7 @@ interface ExportedMemory {
55type ref = number ;
66type pointer = number ;
77
8- interface GlobalVariable { }
8+ interface GlobalVariable { }
99declare const window : GlobalVariable ;
1010declare const global : GlobalVariable ;
1111let globalVariable : any ;
@@ -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,41 @@ 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 ( kind_ptr , exceptionBit | JavaScriptValueKind . Boolean ) ;
263265 writeUint32 ( payload1_ptr , value ? 1 : 0 ) ;
264266 break ;
265267 }
266268 case "number" : {
267- writeUint32 ( kind_ptr , JavaScriptValueKind . Number ) ;
269+ writeUint32 ( kind_ptr , exceptionBit | JavaScriptValueKind . Number ) ;
268270 writeFloat64 ( payload2_ptr , value ) ;
269271 break ;
270272 }
271273 case "string" : {
272- writeUint32 ( kind_ptr , JavaScriptValueKind . String ) ;
274+ writeUint32 ( kind_ptr , exceptionBit | JavaScriptValueKind . String ) ;
273275 writeUint32 ( payload1_ptr , this . heap . retain ( value ) ) ;
274276 break ;
275277 }
276278 case "undefined" : {
277- writeUint32 ( kind_ptr , JavaScriptValueKind . Undefined ) ;
279+ writeUint32 ( kind_ptr , exceptionBit | JavaScriptValueKind . Undefined ) ;
278280 break ;
279281 }
280282 case "object" : {
281- writeUint32 ( kind_ptr , JavaScriptValueKind . Object ) ;
283+ writeUint32 ( kind_ptr , exceptionBit | JavaScriptValueKind . Object ) ;
282284 writeUint32 ( payload1_ptr , this . heap . retain ( value ) ) ;
283285 break ;
284286 }
285287 case "function" : {
286- writeUint32 ( kind_ptr , JavaScriptValueKind . Function ) ;
288+ writeUint32 ( kind_ptr , exceptionBit | JavaScriptValueKind . Function ) ;
287289 writeUint32 ( payload1_ptr , this . heap . retain ( value ) ) ;
288290 break ;
289291 }
@@ -332,7 +334,7 @@ export class SwiftRuntime {
332334 ) => {
333335 const obj = this . heap . referenceHeap ( ref ) ;
334336 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 ) ;
336338 } ,
337339 swjs_set_subscript : (
338340 ref : ref ,
@@ -353,7 +355,7 @@ export class SwiftRuntime {
353355 ) => {
354356 const obj = this . heap . referenceHeap ( ref ) ;
355357 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 ) ;
357359 } ,
358360 swjs_encode_string : ( ref : ref , bytes_ptr_result : pointer ) => {
359361 const bytes = textEncoder . encode ( this . heap . referenceHeap ( ref ) ) ;
@@ -383,12 +385,18 @@ export class SwiftRuntime {
383385 payload2_ptr : pointer
384386 ) => {
385387 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 ) ;
392400 } ,
393401 swjs_call_function_with_this : (
394402 obj_ref : ref ,
@@ -401,12 +409,18 @@ export class SwiftRuntime {
401409 ) => {
402410 const obj = this . heap . referenceHeap ( obj_ref ) ;
403411 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 ) ;
410424 } ,
411425 swjs_create_function : (
412426 host_func_id : number ,
@@ -420,6 +434,29 @@ export class SwiftRuntime {
420434 } ) ;
421435 writeUint32 ( func_ref_ptr , func_ref ) ;
422436 } ,
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+ } ,
423460 swjs_call_new : (
424461 ref : ref ,
425462 argv : pointer ,
0 commit comments