Skip to content

Commit 11eb81c

Browse files
BridgeJSLink: remove cleanup hooks
2 parents a9dae88 + 4554604 commit 11eb81c

File tree

7 files changed

+32
-86
lines changed

7 files changed

+32
-86
lines changed

Plugins/BridgeJS/Sources/BridgeJSLink/BridgeJSLink.swift

Lines changed: 4 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -921,14 +921,12 @@ public struct BridgeJSLink {
921921
for structDef in allStructs {
922922
let structPrinter = CodeFragmentPrinter()
923923
let structScope = JSGlueVariableScope(intrinsicRegistry: intrinsicRegistry)
924-
let structCleanup = CodeFragmentPrinter()
925924
let fragment = IntrinsicJSFragment.structHelper(structDefinition: structDef, allStructs: allStructs)
926925
_ = try fragment.printCode(
927926
[structDef.name],
928927
IntrinsicJSFragment.PrintCodeContext(
929928
scope: structScope,
930-
printer: structPrinter,
931-
cleanupCode: structCleanup
929+
printer: structPrinter
932930
)
933931
)
934932
bodyPrinter.write(lines: structPrinter.lines)
@@ -940,14 +938,12 @@ public struct BridgeJSLink {
940938
for enumDef in allAssocEnums {
941939
let enumPrinter = CodeFragmentPrinter()
942940
let enumScope = JSGlueVariableScope(intrinsicRegistry: intrinsicRegistry)
943-
let enumCleanup = CodeFragmentPrinter()
944941
let fragment = IntrinsicJSFragment.associatedValueEnumHelperFactory(enumDefinition: enumDef)
945942
_ = try fragment.printCode(
946943
[enumDef.valuesName],
947944
IntrinsicJSFragment.PrintCodeContext(
948945
scope: enumScope,
949-
printer: enumPrinter,
950-
cleanupCode: enumCleanup
946+
printer: enumPrinter
951947
)
952948
)
953949
bodyPrinter.write(lines: enumPrinter.lines)
@@ -1192,7 +1188,6 @@ public struct BridgeJSLink {
11921188

11931189
class ExportedThunkBuilder {
11941190
var body: CodeFragmentPrinter
1195-
var cleanupCode: CodeFragmentPrinter
11961191
var parameterForwardings: [String] = []
11971192
let effects: Effects
11981193
let scope: JSGlueVariableScope
@@ -1202,11 +1197,9 @@ public struct BridgeJSLink {
12021197
self.effects = effects
12031198
self.scope = JSGlueVariableScope(intrinsicRegistry: intrinsicRegistry)
12041199
self.body = CodeFragmentPrinter()
1205-
self.cleanupCode = CodeFragmentPrinter()
12061200
self.context = IntrinsicJSFragment.PrintCodeContext(
12071201
scope: scope,
12081202
printer: body,
1209-
cleanupCode: cleanupCode,
12101203
hasDirectAccessToSwiftClass: hasDirectAccessToSwiftClass
12111204
)
12121205
}
@@ -1280,7 +1273,6 @@ public struct BridgeJSLink {
12801273
/// Renders the thunk body (body code, cleanup, exception handling, and optional return) into a printer.
12811274
func renderFunctionBody(into printer: CodeFragmentPrinter, returnExpr: String?) {
12821275
printer.write(contentsOf: body)
1283-
printer.write(contentsOf: cleanupCode)
12841276
printer.write(lines: checkExceptionLines())
12851277
if let returnExpr = returnExpr {
12861278
printer.write("return \(returnExpr);")
@@ -1506,8 +1498,7 @@ public struct BridgeJSLink {
15061498
let printer = CodeFragmentPrinter()
15071499
let context = IntrinsicJSFragment.PrintCodeContext(
15081500
scope: scope,
1509-
printer: printer,
1510-
cleanupCode: CodeFragmentPrinter()
1501+
printer: printer
15111502
)
15121503
let enumValuesName = enumDefinition.valuesName
15131504

@@ -2092,7 +2083,6 @@ extension BridgeJSLink {
20922083
class ImportedThunkBuilder {
20932084
let body: CodeFragmentPrinter
20942085
let scope: JSGlueVariableScope
2095-
let cleanupCode: CodeFragmentPrinter
20962086
let context: BridgeContext
20972087
var parameterNames: [String] = []
20982088
var parameterForwardings: [String] = []
@@ -2101,12 +2091,10 @@ extension BridgeJSLink {
21012091
init(context: BridgeContext = .importTS, intrinsicRegistry: JSIntrinsicRegistry) {
21022092
self.body = CodeFragmentPrinter()
21032093
self.scope = JSGlueVariableScope(intrinsicRegistry: intrinsicRegistry)
2104-
self.cleanupCode = CodeFragmentPrinter()
21052094
self.context = context
21062095
self.printContext = IntrinsicJSFragment.PrintCodeContext(
21072096
scope: scope,
2108-
printer: body,
2109-
cleanupCode: cleanupCode
2097+
printer: body
21102098
)
21112099
}
21122100

@@ -2645,7 +2633,6 @@ extension BridgeJSLink {
26452633
getterPrinter.write("get \(property.name)() {")
26462634
getterPrinter.indent {
26472635
getterPrinter.write(contentsOf: getterThunkBuilder.body)
2648-
getterPrinter.write(contentsOf: getterThunkBuilder.cleanupCode)
26492636
getterPrinter.write(lines: getterThunkBuilder.checkExceptionLines())
26502637
if let returnExpr = getterReturnExpr {
26512638
getterPrinter.write("return \(returnExpr);")
@@ -2673,7 +2660,6 @@ extension BridgeJSLink {
26732660
setterPrinter.write("set \(property.name)(value) {")
26742661
setterPrinter.indent {
26752662
setterPrinter.write(contentsOf: setterThunkBuilder.body)
2676-
setterPrinter.write(contentsOf: setterThunkBuilder.cleanupCode)
26772663
setterPrinter.write(lines: setterThunkBuilder.checkExceptionLines())
26782664
}
26792665
setterPrinter.write("},")

Plugins/BridgeJS/Sources/BridgeJSLink/JSGlueGen.swift

Lines changed: 19 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -145,8 +145,6 @@ struct IntrinsicJSFragment: Sendable {
145145
var scope: JSGlueVariableScope
146146
/// The printer to print the main fragment code.
147147
var printer: CodeFragmentPrinter
148-
/// The printer to print the code that is expected to be executed at the end of the caller of the fragment.
149-
var cleanupCode: CodeFragmentPrinter
150148
/// Whether the fragment has direct access to the SwiftHeapObject classes.
151149
/// If false, the fragment needs to use `_exports["<class name>"]` to access the class.
152150
var hasDirectAccessToSwiftClass: Bool = true
@@ -236,7 +234,7 @@ struct IntrinsicJSFragment: Sendable {
236234
static let stringLowerParameter = IntrinsicJSFragment(
237235
parameters: ["value"],
238236
printCode: { arguments, context in
239-
let (scope, printer, cleanupCode) = (context.scope, context.printer, context.cleanupCode)
237+
let (scope, printer) = (context.scope, context.printer)
240238
let argument = arguments[0]
241239
let bytesLabel = scope.variable("\(argument)Bytes")
242240
let bytesIdLabel = scope.variable("\(argument)Id")
@@ -248,7 +246,7 @@ struct IntrinsicJSFragment: Sendable {
248246
static let stringLiftReturn = IntrinsicJSFragment(
249247
parameters: [],
250248
printCode: { arguments, context in
251-
let (scope, printer, cleanupCode) = (context.scope, context.printer, context.cleanupCode)
249+
let (scope, printer) = (context.scope, context.printer)
252250
let resultLabel = scope.variable("ret")
253251
printer.write("const \(resultLabel) = \(JSGlueVariableScope.reservedStorageToReturnString);")
254252
printer.write("\(JSGlueVariableScope.reservedStorageToReturnString) = undefined;")
@@ -258,7 +256,7 @@ struct IntrinsicJSFragment: Sendable {
258256
static let stringLiftParameter = IntrinsicJSFragment(
259257
parameters: ["objectId"],
260258
printCode: { arguments, context in
261-
let (scope, printer, cleanupCode) = (context.scope, context.printer, context.cleanupCode)
259+
let (scope, printer) = (context.scope, context.printer)
262260
let objectId = arguments[0]
263261
let objectLabel = scope.variable("\(objectId)Object")
264262
// TODO: Implement "take" operation
@@ -270,7 +268,7 @@ struct IntrinsicJSFragment: Sendable {
270268
static let stringLowerReturn = IntrinsicJSFragment(
271269
parameters: ["value"],
272270
printCode: { arguments, context in
273-
let (scope, printer, cleanupCode) = (context.scope, context.printer, context.cleanupCode)
271+
let (scope, printer) = (context.scope, context.printer)
274272
printer.write(
275273
"\(JSGlueVariableScope.reservedStorageToReturnBytes) = \(JSGlueVariableScope.reservedTextEncoder).encode(\(arguments[0]));"
276274
)
@@ -287,7 +285,7 @@ struct IntrinsicJSFragment: Sendable {
287285
static let jsObjectLiftReturn = IntrinsicJSFragment(
288286
parameters: ["retId"],
289287
printCode: { arguments, context in
290-
let (scope, printer, cleanupCode) = (context.scope, context.printer, context.cleanupCode)
288+
let (scope, printer) = (context.scope, context.printer)
291289
// TODO: Implement "take" operation
292290
let resultLabel = scope.variable("ret")
293291
let retId = arguments[0]
@@ -299,7 +297,7 @@ struct IntrinsicJSFragment: Sendable {
299297
static let jsObjectLiftRetainedObjectId = IntrinsicJSFragment(
300298
parameters: ["objectId"],
301299
printCode: { arguments, context in
302-
let (scope, printer, cleanupCode) = (context.scope, context.printer, context.cleanupCode)
300+
let (scope, printer) = (context.scope, context.printer)
303301
let resultLabel = scope.variable("value")
304302
let objectId = arguments[0]
305303
printer.write(
@@ -444,7 +442,7 @@ struct IntrinsicJSFragment: Sendable {
444442
static let jsValueLower = IntrinsicJSFragment(
445443
parameters: ["value"],
446444
printCode: { arguments, context in
447-
let (scope, printer, cleanupCode) = (context.scope, context.printer, context.cleanupCode)
445+
let (scope, printer) = (context.scope, context.printer)
448446
let value = arguments[0]
449447
let kindVar = scope.variable("\(value)Kind")
450448
let payload1Var = scope.variable("\(value)Payload1")
@@ -570,7 +568,7 @@ struct IntrinsicJSFragment: Sendable {
570568
static let jsValueLift = IntrinsicJSFragment(
571569
parameters: [],
572570
printCode: { _, context in
573-
let (scope, printer, cleanupCode) = (context.scope, context.printer, context.cleanupCode)
571+
let (scope, printer) = (context.scope, context.printer)
574572
let payload2 = scope.variable("jsValuePayload2")
575573
let payload1 = scope.variable("jsValuePayload1")
576574
let kind = scope.variable("jsValueKind")
@@ -588,7 +586,7 @@ struct IntrinsicJSFragment: Sendable {
588586
static let jsValueLiftParameter = IntrinsicJSFragment(
589587
parameters: ["kind", "payload1", "payload2"],
590588
printCode: { arguments, context in
591-
let (scope, printer, cleanupCode) = (context.scope, context.printer, context.cleanupCode)
589+
let (scope, printer) = (context.scope, context.printer)
592590
let resultVar = scope.variable("jsValue")
593591
registerJSValueHelpers(scope: scope)
594592
printer.write(
@@ -1128,16 +1126,7 @@ struct IntrinsicJSFragment: Sendable {
11281126
printer.write("if (\(isSomeVar)) {")
11291127
try printer.indent {
11301128
let arrayLowerFragment = try arrayLower(elementType: elementType)
1131-
let arrayCleanup = CodeFragmentPrinter()
1132-
let _ = try arrayLowerFragment.printCode(
1133-
[value],
1134-
context.with(\.cleanupCode, arrayCleanup)
1135-
)
1136-
if !arrayCleanup.lines.isEmpty {
1137-
for line in arrayCleanup.lines {
1138-
printer.write(line)
1139-
}
1140-
}
1129+
let _ = try arrayLowerFragment.printCode([value], context)
11411130
}
11421131
printer.write("}")
11431132
scope.emitPushI32Parameter("\(isSomeVar) ? 1 : 0", printer: printer)
@@ -1176,11 +1165,10 @@ struct IntrinsicJSFragment: Sendable {
11761165
case .associatedValueEnum(let fullName):
11771166
let base = fullName.components(separatedBy: ".").last ?? fullName
11781167
let caseIdVar = scope.variable("caseId")
1179-
let cleanupVar = scope.variable("cleanup")
11801168
printer.write("if (\(isSomeVar)) {")
11811169
printer.indent {
11821170
printer.write(
1183-
"const { caseId: \(caseIdVar), cleanup: \(cleanupVar) } = \(JSGlueVariableScope.reservedEnumHelpers).\(base).lower(\(value));"
1171+
"const { caseId: \(caseIdVar) } = \(JSGlueVariableScope.reservedEnumHelpers).\(base).lower(\(value));"
11841172
)
11851173
printer.write("return \(caseIdVar);")
11861174
}
@@ -1529,9 +1517,8 @@ struct IntrinsicJSFragment: Sendable {
15291517
let (scope, printer) = (context.scope, context.printer)
15301518
let value = arguments[0]
15311519
let caseIdVar = scope.variable("caseId")
1532-
let cleanupVar = scope.variable("cleanup")
15331520
printer.write(
1534-
"const { caseId: \(caseIdVar), cleanup: \(cleanupVar) } = \(JSGlueVariableScope.reservedEnumHelpers).\(base).lower(\(value));"
1521+
"const { caseId: \(caseIdVar) } = \(JSGlueVariableScope.reservedEnumHelpers).\(base).lower(\(value));"
15351522
)
15361523
printer.write("return \(caseIdVar);")
15371524
return []
@@ -1593,15 +1580,10 @@ struct IntrinsicJSFragment: Sendable {
15931580
for enumCase in enumDefinition.cases {
15941581
let caseName = enumCase.name.capitalizedFirstLetter
15951582
let caseScope = scope.makeChildScope()
1596-
let caseCleanup = CodeFragmentPrinter()
1597-
caseCleanup.indent()
15981583
let fragment = IntrinsicJSFragment.associatedValuePushPayload(enumCase: enumCase)
15991584
_ = try fragment.printCode(
16001585
["value", enumName, caseName],
1601-
context.with(\.scope, caseScope).with(\.printer, lowerPrinter).with(
1602-
\.cleanupCode,
1603-
caseCleanup
1604-
)
1586+
context.with(\.scope, caseScope).with(\.printer, lowerPrinter)
16051587
)
16061588
}
16071589

@@ -1627,15 +1609,11 @@ struct IntrinsicJSFragment: Sendable {
16271609
for enumCase in enumDefinition.cases {
16281610
let caseName = enumCase.name.capitalizedFirstLetter
16291611
let caseScope = scope.makeChildScope()
1630-
let caseCleanup = CodeFragmentPrinter()
16311612

16321613
let fragment = IntrinsicJSFragment.associatedValuePopPayload(enumCase: enumCase)
16331614
_ = try fragment.printCode(
16341615
[enumName, caseName],
1635-
context.with(\.scope, caseScope).with(\.printer, liftPrinter).with(
1636-
\.cleanupCode,
1637-
caseCleanup
1638-
)
1616+
context.with(\.scope, caseScope).with(\.printer, liftPrinter)
16391617
)
16401618
}
16411619

@@ -2012,12 +1990,9 @@ struct IntrinsicJSFragment: Sendable {
20121990
return IntrinsicJSFragment(
20131991
parameters: ["value"],
20141992
printCode: { arguments, context in
2015-
let (scope, printer) = (context.scope, context.printer)
1993+
let printer = context.printer
20161994
let value = arguments[0]
2017-
let cleanupVar = scope.variable("cleanup")
2018-
printer.write(
2019-
"const { cleanup: \(cleanupVar) } = \(JSGlueVariableScope.reservedStructHelpers).\(base).lower(\(value));"
2020-
)
1995+
printer.write("\(JSGlueVariableScope.reservedStructHelpers).\(base).lower(\(value));")
20211996
return []
20221997
}
20231998
)
@@ -2027,12 +2002,9 @@ struct IntrinsicJSFragment: Sendable {
20272002
return IntrinsicJSFragment(
20282003
parameters: ["value"],
20292004
printCode: { arguments, context in
2030-
let (scope, printer) = (context.scope, context.printer)
2005+
let printer = context.printer
20312006
let value = arguments[0]
2032-
let cleanupVar = scope.variable("cleanup")
2033-
printer.write(
2034-
"const { cleanup: \(cleanupVar) } = \(JSGlueVariableScope.reservedStructHelpers).\(structBase).lower(\(value));"
2035-
)
2007+
printer.write("\(JSGlueVariableScope.reservedStructHelpers).\(structBase).lower(\(value));")
20362008
return []
20372009
}
20382010
)
@@ -2614,22 +2586,10 @@ struct IntrinsicJSFragment: Sendable {
26142586

26152587
let presenceExpr = kind.presenceCheck(value: value)
26162588
printer.write("const \(isSomeVar) = \(presenceExpr) ? 1 : 0;")
2617-
// Cleanup is written inside the if block so retained id is in scope
2618-
let localCleanupWriter = CodeFragmentPrinter()
26192589
printer.write("if (\(isSomeVar)) {")
26202590
try printer.indent {
26212591
let innerFragment = try stackLowerFragment(elementType: wrappedType)
2622-
let _ = try innerFragment.printCode(
2623-
[value],
2624-
context.with(\.cleanupCode, localCleanupWriter)
2625-
)
2626-
let localCleanupLines = localCleanupWriter.lines.filter {
2627-
!$0.trimmingCharacters(in: .whitespaces).isEmpty
2628-
}
2629-
if !localCleanupLines.isEmpty {
2630-
let localCleanupCode = localCleanupLines.joined(separator: " ")
2631-
printer.write("arrayCleanups.push(() => { \(localCleanupCode) });")
2632-
}
2592+
let _ = try innerFragment.printCode([value], context)
26332593
}
26342594
printer.write("} else {")
26352595
printer.indent {

Plugins/BridgeJS/Tests/BridgeJSToolTests/__Snapshots__/BridgeJSLinkTests/ImportedTypeInExportedInterface.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -330,7 +330,7 @@ export async function createInstantiator(options, swift) {
330330
return arrayResult;
331331
},
332332
roundtripFooContainer: function bjs_roundtripFooContainer(container) {
333-
const { cleanup: cleanup } = structHelpers.FooContainer.lower(container);
333+
structHelpers.FooContainer.lower(container);
334334
instance.exports.bjs_roundtripFooContainer();
335335
const structValue = structHelpers.FooContainer.lift();
336336
return structValue;

Plugins/BridgeJS/Tests/BridgeJSToolTests/__Snapshots__/BridgeJSLinkTests/Protocol.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -346,7 +346,7 @@ export async function createInstantiator(options, swift) {
346346
TestModule["bjs_MyViewControllerDelegate_result_get"] = function bjs_MyViewControllerDelegate_result_get(self) {
347347
try {
348348
let ret = swift.memory.getObject(self).result;
349-
const { caseId: caseId, cleanup: cleanup } = enumHelpers.Result.lower(ret);
349+
const { caseId: caseId } = enumHelpers.Result.lower(ret);
350350
return caseId;
351351
} catch (error) {
352352
setException(error);
@@ -365,7 +365,7 @@ export async function createInstantiator(options, swift) {
365365
let ret = swift.memory.getObject(self).optionalResult;
366366
const isSome = ret != null;
367367
if (isSome) {
368-
const { caseId: caseId, cleanup: cleanup } = enumHelpers.Result.lower(ret);
368+
const { caseId: caseId } = enumHelpers.Result.lower(ret);
369369
return caseId;
370370
} else {
371371
return -1;
@@ -545,7 +545,7 @@ export async function createInstantiator(options, swift) {
545545
TestModule["bjs_MyViewControllerDelegate_getResult"] = function bjs_MyViewControllerDelegate_getResult(self) {
546546
try {
547547
let ret = swift.memory.getObject(self).getResult();
548-
const { caseId: caseId, cleanup: cleanup } = enumHelpers.Result.lower(ret);
548+
const { caseId: caseId } = enumHelpers.Result.lower(ret);
549549
return caseId;
550550
} catch (error) {
551551
setException(error);

0 commit comments

Comments
 (0)