Skip to content

Commit 59a6274

Browse files
committed
BridgeJS: Don’t put dots in mangled name
1 parent ae935a9 commit 59a6274

4 files changed

Lines changed: 35 additions & 29 deletions

File tree

Plugins/BridgeJS/Sources/BridgeJSSkeleton/BridgeJSSkeleton.swift

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1987,11 +1987,11 @@ extension BridgeType {
19871987
case .void: return "y"
19881988
case .jsObject(let name):
19891989
let typeName = name ?? "JSObject"
1990-
return "\(typeName.count)\(typeName)C"
1990+
return "\(Self.mangleQualifiedName(typeName))C"
19911991
case .jsValue:
19921992
return "7JSValueV"
19931993
case .swiftHeapObject(let name):
1994-
return "\(name.count)\(name)C"
1994+
return "\(Self.mangleQualifiedName(name))C"
19951995
case .unsafePointer(let ptr):
19961996
func sanitize(_ s: String) -> String {
19971997
s.filter { $0.isNumber || $0.isLetter }
@@ -2016,11 +2016,11 @@ extension BridgeType {
20162016
.rawValueEnum(let name, _),
20172017
.associatedValueEnum(let name),
20182018
.namespaceEnum(let name):
2019-
return "\(name.count)\(name)O"
2019+
return "\(Self.mangleQualifiedName(name))O"
20202020
case .swiftProtocol(let name):
2021-
return "\(name.count)\(name)P"
2021+
return "\(Self.mangleQualifiedName(name))P"
20222022
case .swiftStruct(let name):
2023-
return "\(name.count)\(name)V"
2023+
return "\(Self.mangleQualifiedName(name))V"
20242024
case .closure(let signature, let useJSTypedClosure):
20252025
let params =
20262026
signature.parameters.isEmpty
@@ -2037,12 +2037,18 @@ extension BridgeType {
20372037
case .alias(let name, _):
20382038
// `name` is the namespace-qualified swiftCallName (unique), so the underlying
20392039
// representation isn't mangled in - aliases bridge via their JS type's ABI.
2040-
return "Al\(name.count)\(name)"
2040+
return "Al\(Self.mangleQualifiedName(name))"
20412041
case .generic(let name):
20422042
return "\(name.count)\(name)T"
20432043
}
20442044
}
20452045

2046+
/// Transforms a namespace-qualified name into a valid identifier by removing
2047+
/// each dot and prefixing each component with length (e.g. `Workshop.Bench` -> `8Workshop5Bench`).
2048+
private static func mangleQualifiedName(_ name: String) -> String {
2049+
name.split(separator: ".").map { "\($0.count)\($0)" }.joined()
2050+
}
2051+
20462052
/// Determines if an optional type requires side-channel communication for protocol property returns
20472053
///
20482054
/// Side channels are needed when the wrapped type cannot be directly returned via WASM,

Plugins/BridgeJS/Tests/BridgeJSToolTests/__Snapshots__/BridgeJSCodegenTests/NamespacedClassSignature.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@
9191
"_0" : {
9292
"isAsync" : false,
9393
"isThrows" : false,
94-
"mangleName" : "10TestModule14Workshop.BenchC_14Workshop.BenchC",
94+
"mangleName" : "10TestModule8Workshop5BenchC_8Workshop5BenchC",
9595
"moduleName" : "TestModule",
9696
"parameters" : [
9797
{

Plugins/BridgeJS/Tests/BridgeJSToolTests/__Snapshots__/BridgeJSCodegenTests/NamespacedClassSignature.swift

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,35 @@
11
#if arch(wasm32)
2-
@_extern(wasm, module: "bjs", name: "invoke_js_callback_TestModule_10TestModule14Workshop.BenchC_14Workshop.BenchC")
3-
fileprivate func invoke_js_callback_TestModule_10TestModule14Workshop.BenchC_14Workshop.BenchC_extern(_ callback: Int32, _ param0: UnsafeMutableRawPointer) -> UnsafeMutableRawPointer
2+
@_extern(wasm, module: "bjs", name: "invoke_js_callback_TestModule_10TestModule8Workshop5BenchC_8Workshop5BenchC")
3+
fileprivate func invoke_js_callback_TestModule_10TestModule8Workshop5BenchC_8Workshop5BenchC_extern(_ callback: Int32, _ param0: UnsafeMutableRawPointer) -> UnsafeMutableRawPointer
44
#else
5-
fileprivate func invoke_js_callback_TestModule_10TestModule14Workshop.BenchC_14Workshop.BenchC_extern(_ callback: Int32, _ param0: UnsafeMutableRawPointer) -> UnsafeMutableRawPointer {
5+
fileprivate func invoke_js_callback_TestModule_10TestModule8Workshop5BenchC_8Workshop5BenchC_extern(_ callback: Int32, _ param0: UnsafeMutableRawPointer) -> UnsafeMutableRawPointer {
66
fatalError("Only available on WebAssembly")
77
}
88
#endif
9-
@inline(never) fileprivate func invoke_js_callback_TestModule_10TestModule14Workshop.BenchC_14Workshop.BenchC(_ callback: Int32, _ param0: UnsafeMutableRawPointer) -> UnsafeMutableRawPointer {
10-
return invoke_js_callback_TestModule_10TestModule14Workshop.BenchC_14Workshop.BenchC_extern(callback, param0)
9+
@inline(never) fileprivate func invoke_js_callback_TestModule_10TestModule8Workshop5BenchC_8Workshop5BenchC(_ callback: Int32, _ param0: UnsafeMutableRawPointer) -> UnsafeMutableRawPointer {
10+
return invoke_js_callback_TestModule_10TestModule8Workshop5BenchC_8Workshop5BenchC_extern(callback, param0)
1111
}
1212

1313
#if arch(wasm32)
14-
@_extern(wasm, module: "bjs", name: "make_swift_closure_TestModule_10TestModule14Workshop.BenchC_14Workshop.BenchC")
15-
fileprivate func make_swift_closure_TestModule_10TestModule14Workshop.BenchC_14Workshop.BenchC_extern(_ boxPtr: UnsafeMutableRawPointer, _ file: UnsafePointer<UInt8>, _ line: UInt32) -> Int32
14+
@_extern(wasm, module: "bjs", name: "make_swift_closure_TestModule_10TestModule8Workshop5BenchC_8Workshop5BenchC")
15+
fileprivate func make_swift_closure_TestModule_10TestModule8Workshop5BenchC_8Workshop5BenchC_extern(_ boxPtr: UnsafeMutableRawPointer, _ file: UnsafePointer<UInt8>, _ line: UInt32) -> Int32
1616
#else
17-
fileprivate func make_swift_closure_TestModule_10TestModule14Workshop.BenchC_14Workshop.BenchC_extern(_ boxPtr: UnsafeMutableRawPointer, _ file: UnsafePointer<UInt8>, _ line: UInt32) -> Int32 {
17+
fileprivate func make_swift_closure_TestModule_10TestModule8Workshop5BenchC_8Workshop5BenchC_extern(_ boxPtr: UnsafeMutableRawPointer, _ file: UnsafePointer<UInt8>, _ line: UInt32) -> Int32 {
1818
fatalError("Only available on WebAssembly")
1919
}
2020
#endif
21-
@inline(never) fileprivate func make_swift_closure_TestModule_10TestModule14Workshop.BenchC_14Workshop.BenchC(_ boxPtr: UnsafeMutableRawPointer, _ file: UnsafePointer<UInt8>, _ line: UInt32) -> Int32 {
22-
return make_swift_closure_TestModule_10TestModule14Workshop.BenchC_14Workshop.BenchC_extern(boxPtr, file, line)
21+
@inline(never) fileprivate func make_swift_closure_TestModule_10TestModule8Workshop5BenchC_8Workshop5BenchC(_ boxPtr: UnsafeMutableRawPointer, _ file: UnsafePointer<UInt8>, _ line: UInt32) -> Int32 {
22+
return make_swift_closure_TestModule_10TestModule8Workshop5BenchC_8Workshop5BenchC_extern(boxPtr, file, line)
2323
}
2424

25-
private enum _BJS_Closure_10TestModule14Workshop.BenchC_14Workshop.BenchC {
25+
private enum _BJS_Closure_10TestModule8Workshop5BenchC_8Workshop5BenchC {
2626
static func bridgeJSLift(_ callbackId: Int32) -> (Workshop.Bench) -> Workshop.Bench {
2727
let callback = JSObject.bridgeJSLiftParameter(callbackId)
2828
return { [callback] param0 in
2929
#if arch(wasm32)
3030
let param0Pointer = param0.bridgeJSLowerParameter()
3131
let callbackValue = callback.bridgeJSLowerParameter()
32-
let ret = invoke_js_callback_TestModule_10TestModule14Workshop.BenchC_14Workshop.BenchC(callbackValue, param0Pointer)
32+
let ret = invoke_js_callback_TestModule_10TestModule8Workshop5BenchC_8Workshop5BenchC(callbackValue, param0Pointer)
3333
return Workshop.Bench.bridgeJSLiftReturn(ret)
3434
#else
3535
fatalError("Only available on WebAssembly")
@@ -41,17 +41,17 @@ private enum _BJS_Closure_10TestModule14Workshop.BenchC_14Workshop.BenchC {
4141
extension JSTypedClosure where Signature == (Workshop.Bench) -> Workshop.Bench {
4242
init(fileID: StaticString = #fileID, line: UInt32 = #line, _ body: @escaping (Workshop.Bench) -> Workshop.Bench) {
4343
self.init(
44-
makeClosure: make_swift_closure_TestModule_10TestModule14Workshop.BenchC_14Workshop.BenchC,
44+
makeClosure: make_swift_closure_TestModule_10TestModule8Workshop5BenchC_8Workshop5BenchC,
4545
body: body,
4646
fileID: fileID,
4747
line: line
4848
)
4949
}
5050
}
5151

52-
@_expose(wasm, "invoke_swift_closure_TestModule_10TestModule14Workshop.BenchC_14Workshop.BenchC")
53-
@_cdecl("invoke_swift_closure_TestModule_10TestModule14Workshop.BenchC_14Workshop.BenchC")
54-
public func _invoke_swift_closure_TestModule_10TestModule14Workshop.BenchC_14Workshop.BenchC(_ boxPtr: UnsafeMutableRawPointer, _ param0: UnsafeMutableRawPointer) -> UnsafeMutableRawPointer {
52+
@_expose(wasm, "invoke_swift_closure_TestModule_10TestModule8Workshop5BenchC_8Workshop5BenchC")
53+
@_cdecl("invoke_swift_closure_TestModule_10TestModule8Workshop5BenchC_8Workshop5BenchC")
54+
public func _invoke_swift_closure_TestModule_10TestModule8Workshop5BenchC_8Workshop5BenchC(_ boxPtr: UnsafeMutableRawPointer, _ param0: UnsafeMutableRawPointer) -> UnsafeMutableRawPointer {
5555
#if arch(wasm32)
5656
let closure = Unmanaged<_BridgeJSTypedClosureBox<(Workshop.Bench) -> Workshop.Bench>>.fromOpaque(boxPtr).takeUnretainedValue().closure
5757
let result = closure(Workshop.Bench.bridgeJSLiftParameter(param0))
@@ -76,7 +76,7 @@ public func _bjs_makeBench() -> UnsafeMutableRawPointer {
7676
@_cdecl("bjs_refitBench")
7777
public func _bjs_refitBench(_ bench: UnsafeMutableRawPointer, _ transform: Int32) -> UnsafeMutableRawPointer {
7878
#if arch(wasm32)
79-
let ret = refitBench(_: Workshop.Bench.bridgeJSLiftParameter(bench), _: _BJS_Closure_10TestModule14Workshop.BenchC_14Workshop.BenchC.bridgeJSLift(transform))
79+
let ret = refitBench(_: Workshop.Bench.bridgeJSLiftParameter(bench), _: _BJS_Closure_10TestModule8Workshop5BenchC_8Workshop5BenchC.bridgeJSLift(transform))
8080
return ret.bridgeJSLowerReturn()
8181
#else
8282
fatalError("Only available on WebAssembly")

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

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -233,7 +233,7 @@ export async function createInstantiator(options, swift) {
233233
const func = swift.memory.getObject(funcRef);
234234
func.__unregister();
235235
}
236-
bjs["invoke_js_callback_TestModule_10TestModule14Workshop.BenchC_14Workshop.BenchC"] = function(callbackId, param0) {
236+
bjs["invoke_js_callback_TestModule_10TestModule8Workshop5BenchC_8Workshop5BenchC"] = function(callbackId, param0) {
237237
try {
238238
const callback = swift.memory.getObject(callbackId);
239239
let ret = callback(_exports.Workshop.Bench.__construct(param0));
@@ -243,9 +243,9 @@ export async function createInstantiator(options, swift) {
243243
return 0
244244
}
245245
}
246-
bjs["make_swift_closure_TestModule_10TestModule14Workshop.BenchC_14Workshop.BenchC"] = function(boxPtr, file, line) {
247-
const lower_closure_TestModule_10TestModule14Workshop.BenchC_14Workshop.BenchC = function(param0) {
248-
const ret = instance.exports.invoke_swift_closure_TestModule_10TestModule14Workshop.BenchC_14Workshop.BenchC(boxPtr, param0.pointer);
246+
bjs["make_swift_closure_TestModule_10TestModule8Workshop5BenchC_8Workshop5BenchC"] = function(boxPtr, file, line) {
247+
const lower_closure_TestModule_10TestModule8Workshop5BenchC_8Workshop5BenchC = function(param0) {
248+
const ret = instance.exports.invoke_swift_closure_TestModule_10TestModule8Workshop5BenchC_8Workshop5BenchC(boxPtr, param0.pointer);
249249
if (tmpRetException) {
250250
const error = swift.memory.getObject(tmpRetException);
251251
swift.memory.release(tmpRetException);
@@ -254,7 +254,7 @@ export async function createInstantiator(options, swift) {
254254
}
255255
return _exports.Workshop.Bench.__construct(ret);
256256
};
257-
return makeClosure(boxPtr, file, line, lower_closure_TestModule_10TestModule14Workshop.BenchC_14Workshop.BenchC);
257+
return makeClosure(boxPtr, file, line, lower_closure_TestModule_10TestModule8Workshop5BenchC_8Workshop5BenchC);
258258
}
259259
// Wrapper functions for module: TestModule
260260
if (!importObject["TestModule"]) {

0 commit comments

Comments
 (0)