@@ -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
@@ -484,23 +488,37 @@ struct BridgeJSLink {
484488 dtsExportEntryLines. append ( " \( klass. name) : { " )
485489 jsLines. append ( " class \( klass. name) extends SwiftHeapObject { " )
486490
491+ // Always add __construct and constructor methods for all classes
492+ var constructorLines : [ String ] = [ ]
493+ constructorLines. append ( " static __construct(ptr) { " )
494+ constructorLines. append (
495+ " return new \( klass. name) (ptr, instance.exports.bjs_ \( klass. name) _deinit); " . indent ( count: 4 )
496+ )
497+ constructorLines. append ( " } " )
498+ constructorLines. append ( " " )
499+ constructorLines. append ( " constructor(pointer, deinit) { " )
500+ constructorLines. append ( " super(pointer, deinit); " . indent ( count: 4 ) )
501+ constructorLines. append ( " } " )
502+ jsLines. append ( contentsOf: constructorLines. map { $0. indent ( count: 4 ) } )
503+
487504 if let constructor: ExportedConstructor = klass. constructor {
488505 let thunkBuilder = ExportedThunkBuilder ( effects: constructor. effects)
489506 for param in constructor. parameters {
490507 thunkBuilder. lowerParameter ( param: param)
491508 }
492509 var funcLines : [ String ] = [ ]
493- funcLines. append ( " constructor( \( constructor. parameters. map { $0. name } . joined ( separator: " , " ) ) ) { " )
510+ funcLines. append ( " " )
511+ funcLines. append ( " static init( \( constructor. parameters. map { $0. name } . joined ( separator: " , " ) ) ) { " )
494512 let returnExpr = thunkBuilder. callConstructor ( abiName: constructor. abiName)
495513 funcLines. append ( contentsOf: thunkBuilder. bodyLines. map { $0. indent ( count: 4 ) } )
496514 funcLines. append ( contentsOf: thunkBuilder. cleanupLines. map { $0. indent ( count: 4 ) } )
497515 funcLines. append ( contentsOf: thunkBuilder. checkExceptionLines ( ) . map { $0. indent ( count: 4 ) } )
498- funcLines. append ( " super( \( returnExpr ) , instance.exports.bjs_ \( klass. name) _deinit );" . indent ( count: 4 ) )
516+ funcLines. append ( " return \( klass. name) .__construct( \( returnExpr ) ); " . indent ( count: 4 ) )
499517 funcLines. append ( " } " )
500518 jsLines. append ( contentsOf: funcLines. map { $0. indent ( count: 4 ) } )
501519
502520 dtsExportEntryLines. append (
503- " new \( renderTSSignature ( parameters: constructor. parameters, returnType: . swiftHeapObject( klass. name) ) ) ; "
521+ " init \( renderTSSignature ( parameters: constructor. parameters, returnType: . swiftHeapObject( klass. name) ) ) ; "
504522 . indent ( count: 4 )
505523 )
506524 }
0 commit comments