Skip to content

Commit fb7d54f

Browse files
BridgeJS: Change @js init to generate static init() methods instead of constructors
1 parent 8ebf07e commit fb7d54f

File tree

1 file changed

+16
-4
lines changed

1 file changed

+16
-4
lines changed

Plugins/BridgeJS/Sources/BridgeJSLink/BridgeJSLink.swift

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)