Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .github/workflows/test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -163,7 +163,7 @@ jobs:
# which collapses the wall-clock time from ~1h to that of the slowest single example.
build-examples:
if: github.event_name == 'pull_request'
runs-on: ubuntu-latest
runs-on: ubuntu-22.04
strategy:
fail-fast: false
matrix:
Expand Down Expand Up @@ -196,7 +196,7 @@ jobs:
# main: build all examples in release and publish them to GitHub Pages.
build-examples-deploy:
if: github.event_name == 'push' && github.ref == 'refs/heads/main'
runs-on: ubuntu-latest
runs-on: ubuntu-22.04
steps:
- uses: actions/checkout@v7
- uses: ./.github/actions/install-swift
Expand Down
9 changes: 4 additions & 5 deletions Plugins/BridgeJS/Sources/BridgeJSLink/BridgeJSLink.swift
Original file line number Diff line number Diff line change
Expand Up @@ -1809,6 +1809,7 @@ public struct BridgeJSLink {
body.write("const \(returnVariable) = \(call);")
fragmentArguments = [returnVariable]
}
body.write(lines: checkExceptionLines())
let liftedValues = try liftingFragment.printCode(fragmentArguments, context)
assert(liftedValues.count <= 1, "Lifting fragment should produce at most one value")
return liftedValues.first
Expand All @@ -1818,10 +1819,11 @@ public struct BridgeJSLink {
let call =
"\(JSGlueVariableScope.reservedInstance).exports.\(abiName)(\(parameterForwardings.joined(separator: ", ")))"
body.write("const ret = \(call);")
body.write(lines: checkExceptionLines())
return "ret"
}

func checkExceptionLines() -> [String] {
private func checkExceptionLines() -> [String] {
guard effects.isThrows else {
return []
}
Expand All @@ -1837,10 +1839,9 @@ public struct BridgeJSLink {
]
}

/// Renders the thunk body (body code, exception handling, and optional return) into a printer.
/// Renders the thunk body and optional return; `call`/`callConstructor` put the exception check in `body`.
func renderFunctionBody(into printer: CodeFragmentPrinter, returnExpr: String?) {
printer.write(contentsOf: body)
printer.write(lines: checkExceptionLines())
if let returnExpr = returnExpr {
printer.write("return \(returnExpr);")
}
Expand Down Expand Up @@ -3490,7 +3491,6 @@ extension BridgeJSLink {
getterPrinter.write("get \(property.resolvedJSName)() {")
getterPrinter.indent {
getterPrinter.write(contentsOf: getterThunkBuilder.body)
getterPrinter.write(lines: getterThunkBuilder.checkExceptionLines())
if let returnExpr = getterReturnExpr {
getterPrinter.write("return \(returnExpr);")
}
Expand All @@ -3517,7 +3517,6 @@ extension BridgeJSLink {
setterPrinter.write("set \(property.resolvedJSName)(\(setterThunkBuilder.parameterList)) {")
setterPrinter.indent {
setterPrinter.write(contentsOf: setterThunkBuilder.body)
setterPrinter.write(lines: setterThunkBuilder.checkExceptionLines())
}
setterPrinter.write("},")

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -107,6 +107,11 @@ import JavaScriptKit
@JS func loadLabel(_ key: String) async throws(JSException) -> String {
return try await delegate.loadLabel(key)
}

@JS func validatedDelegate() throws(JSException) -> MyViewControllerDelegate {
_ = try delegate.validate(0)
return delegate
}
}

// Protocol array support
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -286,6 +286,23 @@

}
}
},
{
"abiName" : "bjs_MyViewController_validatedDelegate",
"effects" : {
"isAsync" : false,
"isStatic" : false,
"isThrows" : true
},
"name" : "validatedDelegate",
"parameters" : [

],
"returnType" : {
"swiftProtocol" : {
"_0" : "MyViewControllerDelegate"
}
}
}
],
"name" : "MyViewController",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1257,6 +1257,32 @@ public func _bjs_MyViewController_loadLabel(_ _self: UnsafeMutableRawPointer, _
#endif
}

@_expose(wasm, "bjs_MyViewController_validatedDelegate")
@_cdecl("bjs_MyViewController_validatedDelegate")
public func _bjs_MyViewController_validatedDelegate(_ _self: UnsafeMutableRawPointer) -> Int32 {
#if arch(wasm32)
let _self = MyViewController.bridgeJSLiftParameter(_self)
do {
let ret = _bridgeJSUnwrapProtocolExportable(try _self.validatedDelegate(), "MyViewControllerDelegate")
return ret.bridgeJSLowerAsProtocolReturn()
} catch let error {
if let error = error.thrownValue.object {
withExtendedLifetime(error) {
_swift_js_throw(Int32(bitPattern: $0.id))
}
} else {
let jsError = JSError(message: error.description)
withExtendedLifetime(jsError.jsObject) {
_swift_js_throw(Int32(bitPattern: $0.id))
}
}
return 0
}
#else
fatalError("Only available on WebAssembly")
#endif
}

@_expose(wasm, "bjs_MyViewController_delegate_get")
@_cdecl("bjs_MyViewController_delegate_get")
public func _bjs_MyViewController_delegate_get(_ _self: UnsafeMutableRawPointer) -> Int32 {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -944,26 +944,26 @@ export async function createInstantiator(options, swift) {
asyncRoundTripStructThrows: function bjs_asyncRoundTripStructThrows(v) {
structHelpers.M10TestModuleT10AsyncPoint.lower(v);
const ret = instance.exports.bjs_asyncRoundTripStructThrows();
const ret1 = swift.memory.getObject(ret);
swift.memory.release(ret);
if (tmpRetException) {
const error = swift.memory.getObject(tmpRetException);
swift.memory.release(tmpRetException);
tmpRetException = undefined;
throw error;
}
const ret1 = swift.memory.getObject(ret);
swift.memory.release(ret);
return ret1;
},
asyncThrowsZeroArg: function bjs_asyncThrowsZeroArg() {
const ret = instance.exports.bjs_asyncThrowsZeroArg();
const ret1 = swift.memory.getObject(ret);
swift.memory.release(ret);
if (tmpRetException) {
const error = swift.memory.getObject(tmpRetException);
swift.memory.release(tmpRetException);
tmpRetException = undefined;
throw error;
}
const ret1 = swift.memory.getObject(ret);
swift.memory.release(ret);
return ret1;
},
asyncCombineStructs: function bjs_asyncCombineStructs(a, b) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -755,14 +755,14 @@ export async function createInstantiator(options, swift) {
const exports = {
makeFoo: function bjs_makeFoo() {
const ret = instance.exports.bjs_makeFoo();
const ret1 = swift.memory.getObject(ret);
swift.memory.release(ret);
if (tmpRetException) {
const error = swift.memory.getObject(tmpRetException);
swift.memory.release(tmpRetException);
tmpRetException = undefined;
throw error;
}
const ret1 = swift.memory.getObject(ret);
swift.memory.release(ret);
return ret1;
},
processFooArray: function bjs_processFooArray(foos) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,7 @@ export interface MyViewController extends SwiftHeapObject {
sendHelper(helper: Helper): void;
validateValue(value: number): number;
loadLabel(key: string): Promise<string>;
validatedDelegate(): MyViewControllerDelegate;
delegate: MyViewControllerDelegate;
secondDelegate: MyViewControllerDelegate | null;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1363,14 +1363,26 @@ export async function createInstantiator(options, swift) {
const keyBytes = textEncoder.encode(key);
const keyId = swift.memory.retain(keyBytes);
const ret = instance.exports.bjs_MyViewController_loadLabel(this.pointer, keyId, keyBytes.length);
if (tmpRetException) {
const error = swift.memory.getObject(tmpRetException);
swift.memory.release(tmpRetException);
tmpRetException = undefined;
throw error;
}
const ret1 = swift.memory.getObject(ret);
swift.memory.release(ret);
return ret1;
}
validatedDelegate() {
const ret = instance.exports.bjs_MyViewController_validatedDelegate(this.pointer);
if (tmpRetException) {
const error = swift.memory.getObject(tmpRetException);
swift.memory.release(tmpRetException);
tmpRetException = undefined;
throw error;
}
const ret1 = swift.memory.getObject(ret);
swift.memory.release(ret);
return ret1;
}
get delegate() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -248,14 +248,14 @@ export async function createInstantiator(options, swift) {
bjs["make_swift_closure_TestModule_10TestModule10RenderableP_10RenderableP"] = function(boxPtr, file, line) {
const lower_closure_TestModule_10TestModule10RenderableP_10RenderableP = function(param0) {
const ret = instance.exports.invoke_swift_closure_TestModule_10TestModule10RenderableP_10RenderableP(boxPtr, swift.memory.retain(param0));
const ret1 = swift.memory.getObject(ret);
swift.memory.release(ret);
if (tmpRetException) {
const error = swift.memory.getObject(tmpRetException);
swift.memory.release(tmpRetException);
tmpRetException = undefined;
throw error;
}
const ret1 = swift.memory.getObject(ret);
swift.memory.release(ret);
return ret1;
};
return makeClosure(boxPtr, file, line, lower_closure_TestModule_10TestModule10RenderableP_10RenderableP);
Expand All @@ -273,14 +273,14 @@ export async function createInstantiator(options, swift) {
bjs["make_swift_closure_TestModule_10TestModule10RenderableP_SS"] = function(boxPtr, file, line) {
const lower_closure_TestModule_10TestModule10RenderableP_SS = function(param0) {
instance.exports.invoke_swift_closure_TestModule_10TestModule10RenderableP_SS(boxPtr, swift.memory.retain(param0));
const ret = tmpRetString;
tmpRetString = undefined;
if (tmpRetException) {
const error = swift.memory.getObject(tmpRetException);
swift.memory.release(tmpRetException);
tmpRetException = undefined;
throw error;
}
const ret = tmpRetString;
tmpRetString = undefined;
return ret;
};
return makeClosure(boxPtr, file, line, lower_closure_TestModule_10TestModule10RenderableP_SS);
Expand All @@ -305,14 +305,14 @@ export async function createInstantiator(options, swift) {
result = 0;
}
instance.exports.invoke_swift_closure_TestModule_10TestModuleSq10RenderableP_SS(boxPtr, +isSome, result);
const ret = tmpRetString;
tmpRetString = undefined;
if (tmpRetException) {
const error = swift.memory.getObject(tmpRetException);
swift.memory.release(tmpRetException);
tmpRetException = undefined;
throw error;
}
const ret = tmpRetString;
tmpRetString = undefined;
return ret;
};
return makeClosure(boxPtr, file, line, lower_closure_TestModule_10TestModuleSq10RenderableP_SS);
Expand All @@ -330,14 +330,14 @@ export async function createInstantiator(options, swift) {
bjs["make_swift_closure_TestModule_10TestModuley_10RenderableP"] = function(boxPtr, file, line) {
const lower_closure_TestModule_10TestModuley_10RenderableP = function() {
const ret = instance.exports.invoke_swift_closure_TestModule_10TestModuley_10RenderableP(boxPtr);
const ret1 = swift.memory.getObject(ret);
swift.memory.release(ret);
if (tmpRetException) {
const error = swift.memory.getObject(tmpRetException);
swift.memory.release(tmpRetException);
tmpRetException = undefined;
throw error;
}
const ret1 = swift.memory.getObject(ret);
swift.memory.release(ret);
return ret1;
};
return makeClosure(boxPtr, file, line, lower_closure_TestModule_10TestModuley_10RenderableP);
Expand Down
Loading
Loading