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
26 changes: 18 additions & 8 deletions Plugins/BridgeJS/Sources/BridgeJSLink/BridgeJSLink.swift
Original file line number Diff line number Diff line change
Expand Up @@ -51,23 +51,33 @@ public struct BridgeJSLink {
"""

let swiftHeapObjectClassJs = """
const swiftHeapObjectFinalizationRegistry = (typeof FinalizationRegistry === "undefined") ? { register: () => {}, unregister: () => {} } : new FinalizationRegistry((state) => {
if (state.hasReleased) {
return;
}
state.hasReleased = true;
state.deinit(state.pointer);
});

/// Represents a Swift heap object like a class instance or an actor instance.
class SwiftHeapObject {
static __wrap(pointer, deinit, prototype) {
const obj = Object.create(prototype);
const state = { pointer, deinit, hasReleased: false };
obj.pointer = pointer;
obj.hasReleased = false;
obj.deinit = deinit;
obj.registry = new FinalizationRegistry((pointer) => {
deinit(pointer);
});
obj.registry.register(this, obj.pointer);
obj.__swiftHeapObjectState = state;
swiftHeapObjectFinalizationRegistry.register(obj, state, state);
return obj;
}

release() {
this.registry.unregister(this);
this.deinit(this.pointer);
const state = this.__swiftHeapObjectState;
if (state.hasReleased) {
return;
}
state.hasReleased = true;
swiftHeapObjectFinalizationRegistry.unregister(state);
state.deinit(state.pointer);
}
}
"""
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -355,23 +355,33 @@ export async function createInstantiator(options, swift) {
/** @param {WebAssembly.Instance} instance */
createExports: (instance) => {
const js = swift.memory.heap;
const swiftHeapObjectFinalizationRegistry = (typeof FinalizationRegistry === "undefined") ? { register: () => {}, unregister: () => {} } : new FinalizationRegistry((state) => {
if (state.hasReleased) {
return;
}
state.hasReleased = true;
state.deinit(state.pointer);
});

/// Represents a Swift heap object like a class instance or an actor instance.
class SwiftHeapObject {
static __wrap(pointer, deinit, prototype) {
const obj = Object.create(prototype);
const state = { pointer, deinit, hasReleased: false };
obj.pointer = pointer;
obj.hasReleased = false;
obj.deinit = deinit;
obj.registry = new FinalizationRegistry((pointer) => {
deinit(pointer);
});
obj.registry.register(this, obj.pointer);
obj.__swiftHeapObjectState = state;
swiftHeapObjectFinalizationRegistry.register(obj, state, state);
return obj;
}

release() {
this.registry.unregister(this);
this.deinit(this.pointer);
const state = this.__swiftHeapObjectState;
if (state.hasReleased) {
return;
}
state.hasReleased = true;
swiftHeapObjectFinalizationRegistry.unregister(state);
state.deinit(state.pointer);
}
}
class Item extends SwiftHeapObject {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -295,23 +295,33 @@ export async function createInstantiator(options, swift) {
/** @param {WebAssembly.Instance} instance */
createExports: (instance) => {
const js = swift.memory.heap;
const swiftHeapObjectFinalizationRegistry = (typeof FinalizationRegistry === "undefined") ? { register: () => {}, unregister: () => {} } : new FinalizationRegistry((state) => {
if (state.hasReleased) {
return;
}
state.hasReleased = true;
state.deinit(state.pointer);
});

/// Represents a Swift heap object like a class instance or an actor instance.
class SwiftHeapObject {
static __wrap(pointer, deinit, prototype) {
const obj = Object.create(prototype);
const state = { pointer, deinit, hasReleased: false };
obj.pointer = pointer;
obj.hasReleased = false;
obj.deinit = deinit;
obj.registry = new FinalizationRegistry((pointer) => {
deinit(pointer);
});
obj.registry.register(this, obj.pointer);
obj.__swiftHeapObjectState = state;
swiftHeapObjectFinalizationRegistry.register(obj, state, state);
return obj;
}

release() {
this.registry.unregister(this);
this.deinit(this.pointer);
const state = this.__swiftHeapObjectState;
if (state.hasReleased) {
return;
}
state.hasReleased = true;
swiftHeapObjectFinalizationRegistry.unregister(state);
state.deinit(state.pointer);
}
}
class DefaultGreeter extends SwiftHeapObject {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -242,23 +242,33 @@ export async function createInstantiator(options, swift) {
/** @param {WebAssembly.Instance} instance */
createExports: (instance) => {
const js = swift.memory.heap;
const swiftHeapObjectFinalizationRegistry = (typeof FinalizationRegistry === "undefined") ? { register: () => {}, unregister: () => {} } : new FinalizationRegistry((state) => {
if (state.hasReleased) {
return;
}
state.hasReleased = true;
state.deinit(state.pointer);
});

/// Represents a Swift heap object like a class instance or an actor instance.
class SwiftHeapObject {
static __wrap(pointer, deinit, prototype) {
const obj = Object.create(prototype);
const state = { pointer, deinit, hasReleased: false };
obj.pointer = pointer;
obj.hasReleased = false;
obj.deinit = deinit;
obj.registry = new FinalizationRegistry((pointer) => {
deinit(pointer);
});
obj.registry.register(this, obj.pointer);
obj.__swiftHeapObjectState = state;
swiftHeapObjectFinalizationRegistry.register(obj, state, state);
return obj;
}

release() {
this.registry.unregister(this);
this.deinit(this.pointer);
const state = this.__swiftHeapObjectState;
if (state.hasReleased) {
return;
}
state.hasReleased = true;
swiftHeapObjectFinalizationRegistry.unregister(state);
state.deinit(state.pointer);
}
}
class Box extends SwiftHeapObject {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1042,23 +1042,33 @@ export async function createInstantiator(options, swift) {
/** @param {WebAssembly.Instance} instance */
createExports: (instance) => {
const js = swift.memory.heap;
const swiftHeapObjectFinalizationRegistry = (typeof FinalizationRegistry === "undefined") ? { register: () => {}, unregister: () => {} } : new FinalizationRegistry((state) => {
if (state.hasReleased) {
return;
}
state.hasReleased = true;
state.deinit(state.pointer);
});

/// Represents a Swift heap object like a class instance or an actor instance.
class SwiftHeapObject {
static __wrap(pointer, deinit, prototype) {
const obj = Object.create(prototype);
const state = { pointer, deinit, hasReleased: false };
obj.pointer = pointer;
obj.hasReleased = false;
obj.deinit = deinit;
obj.registry = new FinalizationRegistry((pointer) => {
deinit(pointer);
});
obj.registry.register(this, obj.pointer);
obj.__swiftHeapObjectState = state;
swiftHeapObjectFinalizationRegistry.register(obj, state, state);
return obj;
}

release() {
this.registry.unregister(this);
this.deinit(this.pointer);
const state = this.__swiftHeapObjectState;
if (state.hasReleased) {
return;
}
state.hasReleased = true;
swiftHeapObjectFinalizationRegistry.unregister(state);
state.deinit(state.pointer);
}
}
class User extends SwiftHeapObject {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -267,23 +267,33 @@ export async function createInstantiator(options, swift) {
/** @param {WebAssembly.Instance} instance */
createExports: (instance) => {
const js = swift.memory.heap;
const swiftHeapObjectFinalizationRegistry = (typeof FinalizationRegistry === "undefined") ? { register: () => {}, unregister: () => {} } : new FinalizationRegistry((state) => {
if (state.hasReleased) {
return;
}
state.hasReleased = true;
state.deinit(state.pointer);
});

/// Represents a Swift heap object like a class instance or an actor instance.
class SwiftHeapObject {
static __wrap(pointer, deinit, prototype) {
const obj = Object.create(prototype);
const state = { pointer, deinit, hasReleased: false };
obj.pointer = pointer;
obj.hasReleased = false;
obj.deinit = deinit;
obj.registry = new FinalizationRegistry((pointer) => {
deinit(pointer);
});
obj.registry.register(this, obj.pointer);
obj.__swiftHeapObjectState = state;
swiftHeapObjectFinalizationRegistry.register(obj, state, state);
return obj;
}

release() {
this.registry.unregister(this);
this.deinit(this.pointer);
const state = this.__swiftHeapObjectState;
if (state.hasReleased) {
return;
}
state.hasReleased = true;
swiftHeapObjectFinalizationRegistry.unregister(state);
state.deinit(state.pointer);
}
}
class Converter extends SwiftHeapObject {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -248,23 +248,33 @@ export async function createInstantiator(options, swift) {
/** @param {WebAssembly.Instance} instance */
createExports: (instance) => {
const js = swift.memory.heap;
const swiftHeapObjectFinalizationRegistry = (typeof FinalizationRegistry === "undefined") ? { register: () => {}, unregister: () => {} } : new FinalizationRegistry((state) => {
if (state.hasReleased) {
return;
}
state.hasReleased = true;
state.deinit(state.pointer);
});

/// Represents a Swift heap object like a class instance or an actor instance.
class SwiftHeapObject {
static __wrap(pointer, deinit, prototype) {
const obj = Object.create(prototype);
const state = { pointer, deinit, hasReleased: false };
obj.pointer = pointer;
obj.hasReleased = false;
obj.deinit = deinit;
obj.registry = new FinalizationRegistry((pointer) => {
deinit(pointer);
});
obj.registry.register(this, obj.pointer);
obj.__swiftHeapObjectState = state;
swiftHeapObjectFinalizationRegistry.register(obj, state, state);
return obj;
}

release() {
this.registry.unregister(this);
this.deinit(this.pointer);
const state = this.__swiftHeapObjectState;
if (state.hasReleased) {
return;
}
state.hasReleased = true;
swiftHeapObjectFinalizationRegistry.unregister(state);
state.deinit(state.pointer);
}
}
class Converter extends SwiftHeapObject {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -343,23 +343,33 @@ export async function createInstantiator(options, swift) {
/** @param {WebAssembly.Instance} instance */
createExports: (instance) => {
const js = swift.memory.heap;
const swiftHeapObjectFinalizationRegistry = (typeof FinalizationRegistry === "undefined") ? { register: () => {}, unregister: () => {} } : new FinalizationRegistry((state) => {
if (state.hasReleased) {
return;
}
state.hasReleased = true;
state.deinit(state.pointer);
});

/// Represents a Swift heap object like a class instance or an actor instance.
class SwiftHeapObject {
static __wrap(pointer, deinit, prototype) {
const obj = Object.create(prototype);
const state = { pointer, deinit, hasReleased: false };
obj.pointer = pointer;
obj.hasReleased = false;
obj.deinit = deinit;
obj.registry = new FinalizationRegistry((pointer) => {
deinit(pointer);
});
obj.registry.register(this, obj.pointer);
obj.__swiftHeapObjectState = state;
swiftHeapObjectFinalizationRegistry.register(obj, state, state);
return obj;
}

release() {
this.registry.unregister(this);
this.deinit(this.pointer);
const state = this.__swiftHeapObjectState;
if (state.hasReleased) {
return;
}
state.hasReleased = true;
swiftHeapObjectFinalizationRegistry.unregister(state);
state.deinit(state.pointer);
}
}
class JSValueHolder extends SwiftHeapObject {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -215,23 +215,33 @@ export async function createInstantiator(options, swift) {
/** @param {WebAssembly.Instance} instance */
createExports: (instance) => {
const js = swift.memory.heap;
const swiftHeapObjectFinalizationRegistry = (typeof FinalizationRegistry === "undefined") ? { register: () => {}, unregister: () => {} } : new FinalizationRegistry((state) => {
if (state.hasReleased) {
return;
}
state.hasReleased = true;
state.deinit(state.pointer);
});

/// Represents a Swift heap object like a class instance or an actor instance.
class SwiftHeapObject {
static __wrap(pointer, deinit, prototype) {
const obj = Object.create(prototype);
const state = { pointer, deinit, hasReleased: false };
obj.pointer = pointer;
obj.hasReleased = false;
obj.deinit = deinit;
obj.registry = new FinalizationRegistry((pointer) => {
deinit(pointer);
});
obj.registry.register(this, obj.pointer);
obj.__swiftHeapObjectState = state;
swiftHeapObjectFinalizationRegistry.register(obj, state, state);
return obj;
}

release() {
this.registry.unregister(this);
this.deinit(this.pointer);
const state = this.__swiftHeapObjectState;
if (state.hasReleased) {
return;
}
state.hasReleased = true;
swiftHeapObjectFinalizationRegistry.unregister(state);
state.deinit(state.pointer);
}
}
class GlobalClass extends SwiftHeapObject {
Expand Down
Loading