Skip to content

Commit c2233fd

Browse files
Merge pull request #372 from swiftwasm/yt/add-import-ts-runtime-tests
BridgeJS: Add support for JSObject in exported Swift interface
2 parents c5a0b87 + 3bf63a1 commit c2233fd

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

47 files changed

+338
-48
lines changed

Plugins/BridgeJS/Sources/BridgeJSLink/BridgeJSLink.swift

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,12 @@ struct BridgeJSLink {
134134
target.set(tmpRetBytes);
135135
tmpRetBytes = undefined;
136136
}
137+
bjs["swift_js_retain"] = function(id) {
138+
return swift.memory.retainByRef(id);
139+
}
140+
bjs["swift_js_release"] = function(id) {
141+
swift.memory.release(id);
142+
}
137143
\(importObjectBuilders.flatMap { $0.importedLines }.map { $0.indent(count: 12) }.joined(separator: "\n"))
138144
},
139145
setInstance: (i) => {

Plugins/BridgeJS/Sources/BridgeJSTool/ExportSwift.swift

Lines changed: 26 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -221,11 +221,9 @@ class ExportSwift {
221221
return nil
222222
}
223223
guard let typeDecl = typeDeclResolver.lookupType(for: identifier) else {
224-
print("Failed to lookup type \(type.trimmedDescription): not found in typeDeclResolver")
225224
return nil
226225
}
227226
guard typeDecl.is(ClassDeclSyntax.self) || typeDecl.is(ActorDeclSyntax.self) else {
228-
print("Failed to lookup type \(type.trimmedDescription): is not a class or actor")
229227
return nil
230228
}
231229
return .swiftHeapObject(typeDecl.name.text)
@@ -237,10 +235,16 @@ class ExportSwift {
237235
//
238236
// To update this file, just rebuild your project or run
239237
// `swift package bridge-js`.
238+
239+
@_spi(JSObject_id) import JavaScriptKit
240+
240241
@_extern(wasm, module: "bjs", name: "return_string")
241242
private func _return_string(_ ptr: UnsafePointer<UInt8>?, _ len: Int32)
242243
@_extern(wasm, module: "bjs", name: "init_memory")
243244
private func _init_memory(_ sourceId: Int32, _ ptr: UnsafeMutablePointer<UInt8>?)
245+
246+
@_extern(wasm, module: "bjs", name: "swift_js_retain")
247+
private func _swift_js_retain(_ ptr: Int32) -> Int32
244248
"""
245249

246250
func renderSwiftGlue() -> String? {
@@ -317,11 +321,19 @@ class ExportSwift {
317321
)
318322
abiParameterSignatures.append((bytesLabel, .i32))
319323
abiParameterSignatures.append((lengthLabel, .i32))
320-
case .jsObject:
324+
case .jsObject(nil):
321325
abiParameterForwardings.append(
322326
LabeledExprSyntax(
323327
label: param.label,
324-
expression: ExprSyntax("\(raw: param.name)")
328+
expression: ExprSyntax("JSObject(id: UInt32(bitPattern: \(raw: param.name)))")
329+
)
330+
)
331+
abiParameterSignatures.append((param.name, .i32))
332+
case .jsObject(let name):
333+
abiParameterForwardings.append(
334+
LabeledExprSyntax(
335+
label: param.label,
336+
expression: ExprSyntax("\(raw: name)(takingThis: UInt32(bitPattern: \(raw: param.name)))")
325337
)
326338
)
327339
abiParameterSignatures.append((param.name, .i32))
@@ -404,10 +416,16 @@ class ExportSwift {
404416
}
405417
"""
406418
)
407-
case .jsObject:
419+
case .jsObject(nil):
420+
body.append(
421+
"""
422+
return _swift_js_retain(Int32(bitPattern: ret.id))
423+
"""
424+
)
425+
case .jsObject(_?):
408426
body.append(
409427
"""
410-
return ret.id
428+
return _swift_js_retain(Int32(bitPattern: ret.this.id))
411429
"""
412430
)
413431
case .swiftHeapObject:
@@ -566,6 +584,8 @@ extension BridgeType {
566584
self = .bool
567585
case "Void":
568586
self = .void
587+
case "JSObject":
588+
self = .jsObject(nil)
569589
default:
570590
return nil
571591
}

Plugins/BridgeJS/Sources/BridgeJSTool/ImportTS.swift

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -333,9 +333,6 @@ struct ImportTS {
333333
334334
@_extern(wasm, module: "bjs", name: "init_memory_with_result")
335335
private func _init_memory_with_result(_ ptr: UnsafePointer<UInt8>?, _ len: Int32)
336-
337-
@_extern(wasm, module: "bjs", name: "free_jsobject")
338-
private func _free_jsobject(_ ptr: Int32) -> Void
339336
"""
340337

341338
func renderSwiftThunk(

Plugins/BridgeJS/Sources/JavaScript/src/processor.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -238,7 +238,8 @@ export class TypeProcessor {
238238

239239
for (const member of node.members) {
240240
if (ts.isPropertyDeclaration(member)) {
241-
// TODO
241+
const property = this.visitPropertyDecl(member);
242+
if (property) properties.push(property);
242243
} else if (ts.isMethodDeclaration(member)) {
243244
const decl = this.visitFunctionLikeDecl(member);
244245
if (decl) methods.push(decl);

Plugins/BridgeJS/Tests/BridgeJSToolTests/Inputs/TypeScriptClass.d.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
export class Greeter {
2+
name: string;
3+
readonly age: number;
24
constructor(name: string);
35
greet(): string;
46
changeName(name: string): void;

Plugins/BridgeJS/Tests/BridgeJSToolTests/__Snapshots__/BridgeJSLinkTests/ArrayParameter.Import.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,12 @@ export async function createInstantiator(options, swift) {
3535
target.set(tmpRetBytes);
3636
tmpRetBytes = undefined;
3737
}
38+
bjs["swift_js_retain"] = function(id) {
39+
return swift.memory.retainByRef(id);
40+
}
41+
bjs["swift_js_release"] = function(id) {
42+
swift.memory.release(id);
43+
}
3844
const TestModule = importObject["TestModule"] = {};
3945
TestModule["bjs_checkArray"] = function bjs_checkArray(a) {
4046
options.imports.checkArray(swift.memory.getObject(a));

Plugins/BridgeJS/Tests/BridgeJSToolTests/__Snapshots__/BridgeJSLinkTests/Interface.Import.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,12 @@ export async function createInstantiator(options, swift) {
3535
target.set(tmpRetBytes);
3636
tmpRetBytes = undefined;
3737
}
38+
bjs["swift_js_retain"] = function(id) {
39+
return swift.memory.retainByRef(id);
40+
}
41+
bjs["swift_js_release"] = function(id) {
42+
swift.memory.release(id);
43+
}
3844
const TestModule = importObject["TestModule"] = {};
3945
TestModule["bjs_returnAnimatable"] = function bjs_returnAnimatable() {
4046
let ret = options.imports.returnAnimatable();

Plugins/BridgeJS/Tests/BridgeJSToolTests/__Snapshots__/BridgeJSLinkTests/PrimitiveParameters.Export.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,12 @@ export async function createInstantiator(options, swift) {
3535
target.set(tmpRetBytes);
3636
tmpRetBytes = undefined;
3737
}
38+
bjs["swift_js_retain"] = function(id) {
39+
return swift.memory.retainByRef(id);
40+
}
41+
bjs["swift_js_release"] = function(id) {
42+
swift.memory.release(id);
43+
}
3844

3945
},
4046
setInstance: (i) => {

Plugins/BridgeJS/Tests/BridgeJSToolTests/__Snapshots__/BridgeJSLinkTests/PrimitiveParameters.Import.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,12 @@ export async function createInstantiator(options, swift) {
3535
target.set(tmpRetBytes);
3636
tmpRetBytes = undefined;
3737
}
38+
bjs["swift_js_retain"] = function(id) {
39+
return swift.memory.retainByRef(id);
40+
}
41+
bjs["swift_js_release"] = function(id) {
42+
swift.memory.release(id);
43+
}
3844
const TestModule = importObject["TestModule"] = {};
3945
TestModule["bjs_check"] = function bjs_check(a, b) {
4046
options.imports.check(a, b);

Plugins/BridgeJS/Tests/BridgeJSToolTests/__Snapshots__/BridgeJSLinkTests/PrimitiveReturn.Export.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,12 @@ export async function createInstantiator(options, swift) {
3535
target.set(tmpRetBytes);
3636
tmpRetBytes = undefined;
3737
}
38+
bjs["swift_js_retain"] = function(id) {
39+
return swift.memory.retainByRef(id);
40+
}
41+
bjs["swift_js_release"] = function(id) {
42+
swift.memory.release(id);
43+
}
3844

3945
},
4046
setInstance: (i) => {

Plugins/BridgeJS/Tests/BridgeJSToolTests/__Snapshots__/BridgeJSLinkTests/PrimitiveReturn.Import.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,12 @@ export async function createInstantiator(options, swift) {
3535
target.set(tmpRetBytes);
3636
tmpRetBytes = undefined;
3737
}
38+
bjs["swift_js_retain"] = function(id) {
39+
return swift.memory.retainByRef(id);
40+
}
41+
bjs["swift_js_release"] = function(id) {
42+
swift.memory.release(id);
43+
}
3844
const TestModule = importObject["TestModule"] = {};
3945
TestModule["bjs_checkNumber"] = function bjs_checkNumber() {
4046
let ret = options.imports.checkNumber();

Plugins/BridgeJS/Tests/BridgeJSToolTests/__Snapshots__/BridgeJSLinkTests/StringParameter.Export.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,12 @@ export async function createInstantiator(options, swift) {
3535
target.set(tmpRetBytes);
3636
tmpRetBytes = undefined;
3737
}
38+
bjs["swift_js_retain"] = function(id) {
39+
return swift.memory.retainByRef(id);
40+
}
41+
bjs["swift_js_release"] = function(id) {
42+
swift.memory.release(id);
43+
}
3844

3945
},
4046
setInstance: (i) => {

Plugins/BridgeJS/Tests/BridgeJSToolTests/__Snapshots__/BridgeJSLinkTests/StringParameter.Import.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,12 @@ export async function createInstantiator(options, swift) {
3535
target.set(tmpRetBytes);
3636
tmpRetBytes = undefined;
3737
}
38+
bjs["swift_js_retain"] = function(id) {
39+
return swift.memory.retainByRef(id);
40+
}
41+
bjs["swift_js_release"] = function(id) {
42+
swift.memory.release(id);
43+
}
3844
const TestModule = importObject["TestModule"] = {};
3945
TestModule["bjs_checkString"] = function bjs_checkString(a) {
4046
const aObject = swift.memory.getObject(a);

Plugins/BridgeJS/Tests/BridgeJSToolTests/__Snapshots__/BridgeJSLinkTests/StringReturn.Export.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,12 @@ export async function createInstantiator(options, swift) {
3535
target.set(tmpRetBytes);
3636
tmpRetBytes = undefined;
3737
}
38+
bjs["swift_js_retain"] = function(id) {
39+
return swift.memory.retainByRef(id);
40+
}
41+
bjs["swift_js_release"] = function(id) {
42+
swift.memory.release(id);
43+
}
3844

3945
},
4046
setInstance: (i) => {

Plugins/BridgeJS/Tests/BridgeJSToolTests/__Snapshots__/BridgeJSLinkTests/StringReturn.Import.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,12 @@ export async function createInstantiator(options, swift) {
3535
target.set(tmpRetBytes);
3636
tmpRetBytes = undefined;
3737
}
38+
bjs["swift_js_retain"] = function(id) {
39+
return swift.memory.retainByRef(id);
40+
}
41+
bjs["swift_js_release"] = function(id) {
42+
swift.memory.release(id);
43+
}
3844
const TestModule = importObject["TestModule"] = {};
3945
TestModule["bjs_checkString"] = function bjs_checkString() {
4046
let ret = options.imports.checkString();

Plugins/BridgeJS/Tests/BridgeJSToolTests/__Snapshots__/BridgeJSLinkTests/SwiftClass.Export.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,12 @@ export async function createInstantiator(options, swift) {
3535
target.set(tmpRetBytes);
3636
tmpRetBytes = undefined;
3737
}
38+
bjs["swift_js_retain"] = function(id) {
39+
return swift.memory.retainByRef(id);
40+
}
41+
bjs["swift_js_release"] = function(id) {
42+
swift.memory.release(id);
43+
}
3844

3945
},
4046
setInstance: (i) => {

Plugins/BridgeJS/Tests/BridgeJSToolTests/__Snapshots__/BridgeJSLinkTests/TypeAlias.Import.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,12 @@ export async function createInstantiator(options, swift) {
3535
target.set(tmpRetBytes);
3636
tmpRetBytes = undefined;
3737
}
38+
bjs["swift_js_retain"] = function(id) {
39+
return swift.memory.retainByRef(id);
40+
}
41+
bjs["swift_js_release"] = function(id) {
42+
swift.memory.release(id);
43+
}
3844
const TestModule = importObject["TestModule"] = {};
3945
TestModule["bjs_checkSimple"] = function bjs_checkSimple(a) {
4046
options.imports.checkSimple(a);

Plugins/BridgeJS/Tests/BridgeJSToolTests/__Snapshots__/BridgeJSLinkTests/TypeScriptClass.Import.js

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,13 +35,33 @@ export async function createInstantiator(options, swift) {
3535
target.set(tmpRetBytes);
3636
tmpRetBytes = undefined;
3737
}
38+
bjs["swift_js_retain"] = function(id) {
39+
return swift.memory.retainByRef(id);
40+
}
41+
bjs["swift_js_release"] = function(id) {
42+
swift.memory.release(id);
43+
}
3844
const TestModule = importObject["TestModule"] = {};
3945
TestModule["bjs_Greeter_init"] = function bjs_Greeter_init(name) {
4046
const nameObject = swift.memory.getObject(name);
4147
swift.memory.release(name);
4248
let ret = new options.imports.Greeter(nameObject);
4349
return swift.memory.retain(ret);
4450
}
51+
TestModule["bjs_Greeter_name_get"] = function bjs_Greeter_name_get(self) {
52+
let ret = swift.memory.getObject(self).name;
53+
tmpRetBytes = textEncoder.encode(ret);
54+
return tmpRetBytes.length;
55+
}
56+
TestModule["bjs_Greeter_name_set"] = function bjs_Greeter_name_set(self, newValue) {
57+
const newValueObject = swift.memory.getObject(newValue);
58+
swift.memory.release(newValue);
59+
swift.memory.getObject(self).name = newValueObject;
60+
}
61+
TestModule["bjs_Greeter_age_get"] = function bjs_Greeter_age_get(self) {
62+
let ret = swift.memory.getObject(self).age;
63+
return ret;
64+
}
4565
TestModule["bjs_Greeter_greet"] = function bjs_Greeter_greet(self) {
4666
let ret = swift.memory.getObject(self).greet();
4767
tmpRetBytes = textEncoder.encode(ret);

Plugins/BridgeJS/Tests/BridgeJSToolTests/__Snapshots__/BridgeJSLinkTests/VoidParameterVoidReturn.Export.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,12 @@ export async function createInstantiator(options, swift) {
3535
target.set(tmpRetBytes);
3636
tmpRetBytes = undefined;
3737
}
38+
bjs["swift_js_retain"] = function(id) {
39+
return swift.memory.retainByRef(id);
40+
}
41+
bjs["swift_js_release"] = function(id) {
42+
swift.memory.release(id);
43+
}
3844

3945
},
4046
setInstance: (i) => {

Plugins/BridgeJS/Tests/BridgeJSToolTests/__Snapshots__/BridgeJSLinkTests/VoidParameterVoidReturn.Import.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,12 @@ export async function createInstantiator(options, swift) {
3535
target.set(tmpRetBytes);
3636
tmpRetBytes = undefined;
3737
}
38+
bjs["swift_js_retain"] = function(id) {
39+
return swift.memory.retainByRef(id);
40+
}
41+
bjs["swift_js_release"] = function(id) {
42+
swift.memory.release(id);
43+
}
3844
const TestModule = importObject["TestModule"] = {};
3945
TestModule["bjs_check"] = function bjs_check() {
4046
options.imports.check();

Plugins/BridgeJS/Tests/BridgeJSToolTests/__Snapshots__/ExportSwiftTests/PrimitiveParameters.swift

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,17 @@
33
//
44
// To update this file, just rebuild your project or run
55
// `swift package bridge-js`.
6+
7+
@_spi(JSObject_id) import JavaScriptKit
8+
69
@_extern(wasm, module: "bjs", name: "return_string")
710
private func _return_string(_ ptr: UnsafePointer<UInt8>?, _ len: Int32)
811
@_extern(wasm, module: "bjs", name: "init_memory")
912
private func _init_memory(_ sourceId: Int32, _ ptr: UnsafeMutablePointer<UInt8>?)
1013
14+
@_extern(wasm, module: "bjs", name: "swift_js_retain")
15+
private func _swift_js_retain(_ ptr: Int32) -> Int32
16+
1117
@_expose(wasm, "bjs_check")
1218
@_cdecl("bjs_check")
1319
public func _bjs_check(a: Int32, b: Float32, c: Float64, d: Int32) -> Void {

Plugins/BridgeJS/Tests/BridgeJSToolTests/__Snapshots__/ExportSwiftTests/PrimitiveReturn.swift

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,17 @@
33
//
44
// To update this file, just rebuild your project or run
55
// `swift package bridge-js`.
6+
7+
@_spi(JSObject_id) import JavaScriptKit
8+
69
@_extern(wasm, module: "bjs", name: "return_string")
710
private func _return_string(_ ptr: UnsafePointer<UInt8>?, _ len: Int32)
811
@_extern(wasm, module: "bjs", name: "init_memory")
912
private func _init_memory(_ sourceId: Int32, _ ptr: UnsafeMutablePointer<UInt8>?)
1013
14+
@_extern(wasm, module: "bjs", name: "swift_js_retain")
15+
private func _swift_js_retain(_ ptr: Int32) -> Int32
16+
1117
@_expose(wasm, "bjs_checkInt")
1218
@_cdecl("bjs_checkInt")
1319
public func _bjs_checkInt() -> Int32 {

Plugins/BridgeJS/Tests/BridgeJSToolTests/__Snapshots__/ExportSwiftTests/StringParameter.swift

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,17 @@
33
//
44
// To update this file, just rebuild your project or run
55
// `swift package bridge-js`.
6+
7+
@_spi(JSObject_id) import JavaScriptKit
8+
69
@_extern(wasm, module: "bjs", name: "return_string")
710
private func _return_string(_ ptr: UnsafePointer<UInt8>?, _ len: Int32)
811
@_extern(wasm, module: "bjs", name: "init_memory")
912
private func _init_memory(_ sourceId: Int32, _ ptr: UnsafeMutablePointer<UInt8>?)
1013
14+
@_extern(wasm, module: "bjs", name: "swift_js_retain")
15+
private func _swift_js_retain(_ ptr: Int32) -> Int32
16+
1117
@_expose(wasm, "bjs_checkString")
1218
@_cdecl("bjs_checkString")
1319
public func _bjs_checkString(aBytes: Int32, aLen: Int32) -> Void {

0 commit comments

Comments
 (0)