@@ -43,6 +43,10 @@ struct BridgeJSLink {
43
43
let swiftHeapObjectClassJs = """
44
44
/// Represents a Swift heap object like a class instance or an actor instance.
45
45
class SwiftHeapObject {
46
+ static __construct(ptr, deinit) {
47
+ return new SwiftHeapObject(ptr, deinit);
48
+ }
49
+
46
50
constructor(pointer, deinit) {
47
51
this.pointer = pointer;
48
52
this.hasReleased = false;
@@ -401,7 +405,7 @@ struct BridgeJSLink {
401
405
bodyLines. append ( " swift.memory.release(retId); " )
402
406
returnExpr = " ret "
403
407
case . swiftHeapObject( let name) :
404
- bodyLines. append ( " const ret = new \( name) ( \( call) ); " )
408
+ bodyLines. append ( " const ret = \( name) .__construct (\( call) ); " )
405
409
returnExpr = " ret "
406
410
}
407
411
return returnExpr
@@ -484,23 +488,37 @@ struct BridgeJSLink {
484
488
dtsExportEntryLines. append ( " \( klass. name) : { " )
485
489
jsLines. append ( " class \( klass. name) extends SwiftHeapObject { " )
486
490
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
+
487
504
if let constructor: ExportedConstructor = klass. constructor {
488
505
let thunkBuilder = ExportedThunkBuilder ( effects: constructor. effects)
489
506
for param in constructor. parameters {
490
507
thunkBuilder. lowerParameter ( param: param)
491
508
}
492
509
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: " , " ) ) ) { " )
494
512
let returnExpr = thunkBuilder. callConstructor ( abiName: constructor. abiName)
495
513
funcLines. append ( contentsOf: thunkBuilder. bodyLines. map { $0. indent ( count: 4 ) } )
496
514
funcLines. append ( contentsOf: thunkBuilder. cleanupLines. map { $0. indent ( count: 4 ) } )
497
515
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 ) )
499
517
funcLines. append ( " } " )
500
518
jsLines. append ( contentsOf: funcLines. map { $0. indent ( count: 4 ) } )
501
519
502
520
dtsExportEntryLines. append (
503
- " new \( renderTSSignature ( parameters: constructor. parameters, returnType: . swiftHeapObject( klass. name) ) ) ; "
521
+ " init \( renderTSSignature ( parameters: constructor. parameters, returnType: . swiftHeapObject( klass. name) ) ) ; "
504
522
. indent ( count: 4 )
505
523
)
506
524
}
0 commit comments