Skip to content

Commit c6ae64f

Browse files
WIP
1 parent 9a0f5f7 commit c6ae64f

File tree

2 files changed

+12
-95
lines changed

2 files changed

+12
-95
lines changed

Plugins/BridgeJS/Sources/BridgeJSLink/BridgeJSLink.swift

Lines changed: 1 addition & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -251,7 +251,6 @@ public struct BridgeJSLink {
251251
"let \(JSGlueVariableScope.reservedF32Stack) = [];",
252252
"let \(JSGlueVariableScope.reservedF64Stack) = [];",
253253
"let \(JSGlueVariableScope.reservedPointerStack) = [];",
254-
"let \(JSGlueVariableScope.reservedTmpStructCleanups) = [];",
255254
"const \(JSGlueVariableScope.reservedEnumHelpers) = {};",
256255
"const \(JSGlueVariableScope.reservedStructHelpers) = {};",
257256
"",
@@ -391,37 +390,13 @@ public struct BridgeJSLink {
391390
printer.write("return \(JSGlueVariableScope.reservedPointerStack).pop();")
392391
}
393392
printer.write("}")
394-
printer.write("bjs[\"swift_js_struct_cleanup\"] = function(cleanupId) {")
395-
printer.indent {
396-
printer.write("if (cleanupId === 0) { return; }")
397-
printer.write("const index = (cleanupId | 0) - 1;")
398-
printer.write("const cleanup = \(JSGlueVariableScope.reservedTmpStructCleanups)[index];")
399-
printer.write("\(JSGlueVariableScope.reservedTmpStructCleanups)[index] = null;")
400-
printer.write("if (cleanup) { cleanup(); }")
401-
printer.write(
402-
"while (\(JSGlueVariableScope.reservedTmpStructCleanups).length > 0 && \(JSGlueVariableScope.reservedTmpStructCleanups)[\(JSGlueVariableScope.reservedTmpStructCleanups).length - 1] == null) {"
403-
)
404-
printer.indent {
405-
printer.write("\(JSGlueVariableScope.reservedTmpStructCleanups).pop();")
406-
}
407-
printer.write("}")
408-
}
409-
printer.write("}")
410-
411393
if !allStructs.isEmpty {
412394
for structDef in allStructs {
413395
printer.write("bjs[\"swift_js_struct_lower_\(structDef.name)\"] = function(objectId) {")
414396
printer.indent {
415397
printer.write(
416-
"const { cleanup: cleanup } = \(JSGlueVariableScope.reservedStructHelpers).\(structDef.name).lower(\(JSGlueVariableScope.reservedSwift).memory.getObject(objectId));"
398+
"\(JSGlueVariableScope.reservedStructHelpers).\(structDef.name).lower(\(JSGlueVariableScope.reservedSwift).memory.getObject(objectId));"
417399
)
418-
printer.write("if (cleanup) {")
419-
printer.indent {
420-
printer.write(
421-
"return \(JSGlueVariableScope.reservedTmpStructCleanups).push(cleanup);"
422-
)
423-
}
424-
printer.write("}")
425400
printer.write("return 0;")
426401
}
427402
printer.write("}")

Plugins/BridgeJS/Sources/BridgeJSLink/JSGlueGen.swift

Lines changed: 11 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@ final class JSGlueVariableScope {
2828
static let reservedF32Stack = "f32Stack"
2929
static let reservedF64Stack = "f64Stack"
3030
static let reservedPointerStack = "ptrStack"
31-
static let reservedTmpStructCleanups = "tmpStructCleanups"
3231
static let reservedEnumHelpers = "enumHelpers"
3332
static let reservedStructHelpers = "structHelpers"
3433
static let reservedSwiftClosureRegistry = "swiftClosureRegistry"
@@ -56,7 +55,6 @@ final class JSGlueVariableScope {
5655
reservedF32Stack,
5756
reservedF64Stack,
5857
reservedPointerStack,
59-
reservedTmpStructCleanups,
6058
reservedEnumHelpers,
6159
reservedStructHelpers,
6260
reservedSwiftClosureRegistry,
@@ -635,7 +633,7 @@ struct IntrinsicJSFragment: Sendable {
635633
IntrinsicJSFragment(
636634
parameters: ["value"],
637635
printCode: { arguments, context in
638-
let (printer, cleanup) = (context.printer, context.cleanupCode)
636+
let printer = context.printer
639637
let value = arguments[0]
640638
let caseIdName = "\(value)CaseId"
641639
printer.write(
@@ -812,15 +810,11 @@ struct IntrinsicJSFragment: Sendable {
812810
switch wrappedType {
813811
case .swiftStruct(let fullName):
814812
let base = fullName.components(separatedBy: ".").last ?? fullName
815-
let cleanupVar = scope.variable("\(value)Cleanup")
816-
printer.write("let \(cleanupVar);")
817813
printer.write("if (\(isSomeVar)) {")
818814
printer.indent {
819-
let resultVar = scope.variable("structResult")
820815
printer.write(
821-
"const \(resultVar) = \(JSGlueVariableScope.reservedStructHelpers).\(base).lower(\(value));"
816+
"\(JSGlueVariableScope.reservedStructHelpers).\(base).lower(\(value));"
822817
)
823-
printer.write("\(cleanupVar) = \(resultVar).cleanup;")
824818
}
825819
printer.write("}")
826820
printer.write("\(JSGlueVariableScope.reservedI32Stack).push(+\(isSomeVar));")
@@ -1774,16 +1768,15 @@ struct IntrinsicJSFragment: Sendable {
17741768
return IntrinsicJSFragment(
17751769
parameters: ["value", "enumName", "caseName"],
17761770
printCode: { arguments, context in
1777-
let (printer, cleanup) = (context.printer, context.cleanupCode)
1771+
let printer = context.printer
17781772
let enumName = arguments[1]
17791773
let caseName = arguments[2]
17801774

17811775
printer.write("case \(enumName).Tag.\(caseName): {")
17821776

17831777
try printer.indent {
17841778
if enumCase.associatedValues.isEmpty {
1785-
printer.write("const cleanup = undefined;")
1786-
printer.write("return { caseId: \(enumName).Tag.\(caseName), cleanup };")
1779+
printer.write("return { caseId: \(enumName).Tag.\(caseName) };")
17871780
} else {
17881781
// Process associated values in reverse order (to match the order they'll be popped)
17891782
let reversedValues = enumCase.associatedValues.enumerated().reversed()
@@ -1797,14 +1790,7 @@ struct IntrinsicJSFragment: Sendable {
17971790
_ = try fragment.printCode(["value.\(prop)"], context)
17981791
}
17991792

1800-
if cleanup.lines.isEmpty {
1801-
printer.write("const cleanup = undefined;")
1802-
} else {
1803-
printer.write("const cleanup = () => {")
1804-
printer.write(contentsOf: cleanup)
1805-
printer.write("};")
1806-
}
1807-
printer.write("return { caseId: \(enumName).Tag.\(caseName), cleanup };")
1793+
printer.write("return { caseId: \(enumName).Tag.\(caseName) };")
18081794
}
18091795
}
18101796

@@ -1950,15 +1936,11 @@ struct IntrinsicJSFragment: Sendable {
19501936
}
19511937
case .swiftStruct(let structName):
19521938
let structBase = structName.components(separatedBy: ".").last ?? structName
1953-
let nestedCleanupVar = scope.variable("nestedCleanup")
1954-
printer.write("let \(nestedCleanupVar);")
19551939
printer.write("if (\(isSomeVar)) {")
19561940
printer.indent {
1957-
let structResultVar = scope.variable("structResult")
19581941
printer.write(
1959-
"const \(structResultVar) = \(JSGlueVariableScope.reservedStructHelpers).\(structBase).lower(\(value));"
1942+
"\(JSGlueVariableScope.reservedStructHelpers).\(structBase).lower(\(value));"
19601943
)
1961-
printer.write("\(nestedCleanupVar) = \(structResultVar).cleanup;")
19621944
}
19631945
printer.write("}")
19641946
scope.emitPushI32Parameter("\(isSomeVar) ? 1 : 0", printer: printer)
@@ -1991,16 +1973,12 @@ struct IntrinsicJSFragment: Sendable {
19911973
case .associatedValueEnum(let enumName):
19921974
let base = enumName.components(separatedBy: ".").last ?? enumName
19931975
let caseIdVar = scope.variable("enumCaseId")
1994-
let enumCleanupVar = scope.variable("enumCleanup")
1995-
printer.write("let \(caseIdVar), \(enumCleanupVar);")
1976+
printer.write("let \(caseIdVar);")
19961977
printer.write("if (\(isSomeVar)) {")
19971978
printer.indent {
1998-
let enumResultVar = scope.variable("enumResult")
19991979
printer.write(
2000-
"const \(enumResultVar) = \(JSGlueVariableScope.reservedEnumHelpers).\(base).lower(\(value));"
1980+
"const \(caseIdVar) = \(JSGlueVariableScope.reservedEnumHelpers).\(base).lower(\(value));"
20011981
)
2002-
printer.write("\(caseIdVar) = \(enumResultVar).caseId;")
2003-
printer.write("\(enumCleanupVar) = \(enumResultVar).cleanup;")
20041982
scope.emitPushI32Parameter(caseIdVar, printer: printer)
20051983
}
20061984
printer.write("} else {")
@@ -2010,30 +1988,13 @@ struct IntrinsicJSFragment: Sendable {
20101988
printer.write("}")
20111989
scope.emitPushI32Parameter("\(isSomeVar) ? 1 : 0", printer: printer)
20121990
case .array(let elementType):
2013-
// Array cleanup references variables declared inside the if block,
2014-
// so capture cleanup into a variable declared at the outer scope.
2015-
let arrCleanupVar = scope.variable("arrCleanup")
2016-
printer.write("let \(arrCleanupVar);")
20171991
printer.write("if (\(isSomeVar)) {")
20181992
try printer.indent {
2019-
let localCleanup = CodeFragmentPrinter()
20201993
let arrFragment = try arrayLower(elementType: elementType)
20211994
_ = try arrFragment.printCode(
20221995
[value],
2023-
context.with(\.cleanupCode, localCleanup)
1996+
context
20241997
)
2025-
let cleanupLines = localCleanup.lines.filter {
2026-
!$0.trimmingCharacters(in: .whitespaces).isEmpty
2027-
}
2028-
if !cleanupLines.isEmpty {
2029-
printer.write("\(arrCleanupVar) = () => {")
2030-
printer.indent {
2031-
for line in cleanupLines {
2032-
printer.write(line)
2033-
}
2034-
}
2035-
printer.write("};")
2036-
}
20371998
}
20381999
printer.write("}")
20392000
scope.emitPushI32Parameter("\(isSomeVar) ? 1 : 0", printer: printer)
@@ -2857,31 +2818,22 @@ struct IntrinsicJSFragment: Sendable {
28572818
let (scope, printer) = (context.scope, context.printer)
28582819
let lowerPrinter = CodeFragmentPrinter()
28592820
let lowerScope = scope.makeChildScope()
2860-
let lowerCleanup = CodeFragmentPrinter()
2861-
lowerCleanup.indent()
28622821

28632822
let instanceProps = structDef.properties.filter { !$0.isStatic }
28642823
for property in instanceProps {
28652824
let fragment = try structFieldLowerFragment(field: property, allStructs: allStructs)
28662825
let fieldValue = "value.\(property.name)"
28672826
_ = try fragment.printCode(
28682827
[fieldValue],
2869-
context.with(\.scope, lowerScope).with(\.printer, lowerPrinter).with(\.cleanupCode, lowerCleanup)
2828+
context.with(\.scope, lowerScope).with(\.printer, lowerPrinter)
28702829
)
28712830
}
28722831

28732832
for line in lowerPrinter.lines {
28742833
printer.write(line)
28752834
}
28762835

2877-
if !lowerCleanup.lines.isEmpty {
2878-
printer.write("const cleanup = () => {")
2879-
printer.write(contentsOf: lowerCleanup)
2880-
printer.write("};")
2881-
printer.write("return { cleanup };")
2882-
} else {
2883-
printer.write("return { cleanup: undefined };")
2884-
}
2836+
printer.write("return { cleanup: undefined };")
28852837
}
28862838

28872839
private static func generateStructLiftCode(
@@ -2925,12 +2877,6 @@ struct IntrinsicJSFragment: Sendable {
29252877
)
29262878
try printer.indent {
29272879
let methodScope = scope.makeChildScope()
2928-
let methodCleanup = CodeFragmentPrinter()
2929-
2930-
let structCleanupVar = methodScope.variable("structCleanup")
2931-
printer.write(
2932-
"const { cleanup: \(structCleanupVar) } = \(JSGlueVariableScope.reservedStructHelpers).\(structDef.name).lower(this);"
2933-
)
29342880

29352881
var paramForwardings: [String] = []
29362882
for param in method.parameters {
@@ -2946,10 +2892,6 @@ struct IntrinsicJSFragment: Sendable {
29462892
printer.write("const ret = \(callExpr);")
29472893
}
29482894

2949-
// Cleanup
2950-
printer.write("if (\(structCleanupVar)) { \(structCleanupVar)(); }")
2951-
printer.write(contentsOf: methodCleanup)
2952-
29532895
// Lift return value if needed
29542896
if method.returnType != .void {
29552897
let liftFragment = try IntrinsicJSFragment.liftReturn(type: method.returnType)

0 commit comments

Comments
 (0)