@@ -43,6 +43,10 @@ struct BridgeJSLink {
4343 let swiftHeapObjectClassJs = """
4444 /// Represents a Swift heap object like a class instance or an actor instance.
4545 class SwiftHeapObject {
46+ static __construct(ptr, deinit) {
47+ return new SwiftHeapObject(ptr, deinit);
48+ }
49+
4650 constructor(pointer, deinit) {
4751 this.pointer = pointer;
4852 this.hasReleased = false;
@@ -401,7 +405,7 @@ struct BridgeJSLink {
401405 bodyLines. append ( " swift.memory.release(retId); " )
402406 returnExpr = " ret "
403407 case . swiftHeapObject( let name) :
404- bodyLines. append ( " const ret = new \( name) ( \( call) ); " )
408+ bodyLines. append ( " const ret = \( name) .__construct (\( call) ); " )
405409 returnExpr = " ret "
406410 }
407411 return returnExpr
@@ -490,17 +494,25 @@ struct BridgeJSLink {
490494 thunkBuilder. lowerParameter ( param: param)
491495 }
492496 var funcLines : [ String ] = [ ]
493- funcLines. append ( " constructor( \( constructor. parameters. map { $0. name } . joined ( separator: " , " ) ) ) { " )
497+ funcLines. append ( " static __construct(ptr) { " )
498+ funcLines. append ( " return new \( klass. name) (ptr, instance.exports.bjs_ \( klass. name) _deinit); " . indent ( count: 4 ) )
499+ funcLines. append ( " } " )
500+ funcLines. append ( " " )
501+ funcLines. append ( " constructor(pointer, deinit) { " )
502+ funcLines. append ( " super(pointer, deinit); " . indent ( count: 4 ) )
503+ funcLines. append ( " } " )
504+ funcLines. append ( " " )
505+ funcLines. append ( " static init( \( constructor. parameters. map { $0. name } . joined ( separator: " , " ) ) ) { " )
494506 let returnExpr = thunkBuilder. callConstructor ( abiName: constructor. abiName)
495507 funcLines. append ( contentsOf: thunkBuilder. bodyLines. map { $0. indent ( count: 4 ) } )
496508 funcLines. append ( contentsOf: thunkBuilder. cleanupLines. map { $0. indent ( count: 4 ) } )
497509 funcLines. append ( contentsOf: thunkBuilder. checkExceptionLines ( ) . map { $0. indent ( count: 4 ) } )
498- funcLines. append ( " super( \( returnExpr ) , instance.exports.bjs_ \( klass. name) _deinit );" . indent ( count: 4 ) )
510+ funcLines. append ( " return \( klass. name) .__construct( \( returnExpr ) ); " . indent ( count: 4 ) )
499511 funcLines. append ( " } " )
500512 jsLines. append ( contentsOf: funcLines. map { $0. indent ( count: 4 ) } )
501513
502514 dtsExportEntryLines. append (
503- " new \( renderTSSignature ( parameters: constructor. parameters, returnType: . swiftHeapObject( klass. name) ) ) ; "
515+ " init \( renderTSSignature ( parameters: constructor. parameters, returnType: . swiftHeapObject( klass. name) ) ) ; "
504516 . indent ( count: 4 )
505517 )
506518 }
0 commit comments