diff --git a/Examples/ActorOnWebWorker/Sources/MyApp.swift b/Examples/ActorOnWebWorker/Sources/MyApp.swift index 9b38fa30..c5f452d8 100644 --- a/Examples/ActorOnWebWorker/Sources/MyApp.swift +++ b/Examples/ActorOnWebWorker/Sources/MyApp.swift @@ -30,7 +30,7 @@ actor SearchService { // Utility function for fetch func fetch(_ url: String) -> JSPromise { - let jsFetch = JSObject.global.fetch.function! + let jsFetch = JSObject.global.fetch.object! return JSPromise(jsFetch(url).object!)! } @@ -117,7 +117,7 @@ struct SearchResult { @MainActor final class App { private let document = JSObject.global.document - private let alert = JSObject.global.alert.function! + private let alert = JSObject.global.alert.object! // UI elements private let container: JSValue diff --git a/Examples/Basic/Sources/main.swift b/Examples/Basic/Sources/main.swift index 7ea9231e..af0a1251 100644 --- a/Examples/Basic/Sources/main.swift +++ b/Examples/Basic/Sources/main.swift @@ -1,7 +1,7 @@ import JavaScriptEventLoop import JavaScriptKit -let alert = JSObject.global.alert.function! +let alert = JSObject.global.alert.object! let document = JSObject.global.document let divElement = document.createElement("div") @@ -19,7 +19,7 @@ buttonElement.onclick = .object( _ = document.body.appendChild(buttonElement) -private let jsFetch = JSObject.global.fetch.function! +private let jsFetch = JSObject.global.fetch.object! func fetch(_ url: String) -> JSPromise { JSPromise(jsFetch(url).object!)! } diff --git a/Examples/Embedded/Sources/EmbeddedApp/main.swift b/Examples/Embedded/Sources/EmbeddedApp/main.swift index 61047132..f6bf5b6a 100644 --- a/Examples/Embedded/Sources/EmbeddedApp/main.swift +++ b/Examples/Embedded/Sources/EmbeddedApp/main.swift @@ -1,6 +1,6 @@ import JavaScriptKit -let alert = JSObject.global.alert.function! +let alert = JSObject.global.alert.object! let document = JSObject.global.document print("Hello from WASM, document title: \(document.title.string ?? "")") @@ -28,8 +28,8 @@ textInputElement.type = "text" textInputElement.placeholder = "Enter text to encode to UTF-8" textInputElement.oninput = JSValue.object( JSClosure { _ in - let textEncoder = JSObject.global.TextEncoder.function!.new() - let encode = textEncoder.encode.function! + let textEncoder = JSObject.global.TextEncoder.object!.new() + let encode = textEncoder.encode.object! let encodedData = JSTypedArray( unsafelyWrapping: encode(this: textEncoder, textInputElement.value).object! ) diff --git a/Plugins/PackageToJS/Templates/runtime.mjs b/Plugins/PackageToJS/Templates/runtime.mjs index 6f4abe68..a40fc3df 100644 --- a/Plugins/PackageToJS/Templates/runtime.mjs +++ b/Plugins/PackageToJS/Templates/runtime.mjs @@ -34,7 +34,6 @@ const decode = (kind, payload1, payload2, objectSpace) => { return payload2; case 1 /* Kind.String */: case 3 /* Kind.Object */: - case 6 /* Kind.Function */: case 7 /* Kind.Symbol */: case 8 /* Kind.BigInt */: return objectSpace.getObject(payload1); @@ -100,7 +99,7 @@ const writeAndReturnKindBits = (value, payload1_ptr, payload2_ptr, is_exception, return writeRef(3 /* Kind.Object */); } case "function": { - return writeRef(6 /* Kind.Function */); + return writeRef(3 /* Kind.Object */); } case "symbol": { return writeRef(7 /* Kind.Symbol */); diff --git a/Runtime/src/js-value.ts b/Runtime/src/js-value.ts index b23f39d8..a188808b 100644 --- a/Runtime/src/js-value.ts +++ b/Runtime/src/js-value.ts @@ -8,7 +8,6 @@ export const enum Kind { Object = 3, Null = 4, Undefined = 5, - Function = 6, Symbol = 7, BigInt = 8, } @@ -32,7 +31,6 @@ export const decode = ( case Kind.String: case Kind.Object: - case Kind.Function: case Kind.Symbol: case Kind.BigInt: return objectSpace.getObject(payload1); @@ -129,7 +127,7 @@ export const writeAndReturnKindBits = ( return writeRef(Kind.Object); } case "function": { - return writeRef(Kind.Function); + return writeRef(Kind.Object); } case "symbol": { return writeRef(Kind.Symbol); diff --git a/Sources/JavaScriptBigIntSupport/Int64+I64.swift b/Sources/JavaScriptBigIntSupport/Int64+I64.swift index e361e72e..13ea7b92 100644 --- a/Sources/JavaScriptBigIntSupport/Int64+I64.swift +++ b/Sources/JavaScriptBigIntSupport/Int64+I64.swift @@ -1,13 +1,13 @@ import JavaScriptKit extension UInt64: JavaScriptKit.ConvertibleToJSValue, JavaScriptKit.TypedArrayElement { - public static var typedArrayClass: JSFunction { JSObject.global.BigUint64Array.function! } + public static var typedArrayClass: JSObject { JSObject.global.BigUint64Array.object! } public var jsValue: JSValue { .bigInt(JSBigInt(unsigned: self)) } } extension Int64: JavaScriptKit.ConvertibleToJSValue, JavaScriptKit.TypedArrayElement { - public static var typedArrayClass: JSFunction { JSObject.global.BigInt64Array.function! } + public static var typedArrayClass: JSObject { JSObject.global.BigInt64Array.object! } public var jsValue: JSValue { .bigInt(JSBigInt(self)) } } diff --git a/Sources/JavaScriptEventLoop/JSSending.swift b/Sources/JavaScriptEventLoop/JSSending.swift index 3408b232..7a3750c1 100644 --- a/Sources/JavaScriptEventLoop/JSSending.swift +++ b/Sources/JavaScriptEventLoop/JSSending.swift @@ -23,7 +23,7 @@ import Synchronization /// /// ```swift /// // Transfer an object to another thread -/// let buffer = JSObject.global.Uint8Array.function!.new(100).buffer.object! +/// let buffer = JSObject.global.Uint8Array.object!.new(100).buffer.object! /// let transferring = JSSending.transfer(buffer) /// /// // Receive the object on a worker thread @@ -34,7 +34,7 @@ import Synchronization /// } /// /// // Clone an object for use in another thread -/// let object = JSObject.global.Object.function!.new() +/// let object = JSObject.global.Object.object!.new() /// object["test"] = "Hello, World!" /// let cloning = JSSending(object) /// @@ -136,7 +136,7 @@ extension JSSending where T == JSObject { /// ## Example /// /// ```swift - /// let buffer = JSObject.global.Uint8Array.function!.new(100).buffer.object! + /// let buffer = JSObject.global.Uint8Array.object!.new(100).buffer.object! /// let transferring = JSSending.transfer(buffer) /// /// // After transfer, the original buffer is neutered @@ -167,7 +167,7 @@ extension JSSending where T == JSObject { /// ## Example /// /// ```swift - /// let object = JSObject.global.Object.function!.new() + /// let object = JSObject.global.Object.object!.new() /// object["test"] = "Hello, World!" /// let cloning = JSSending(object) /// @@ -212,7 +212,7 @@ extension JSSending { /// ## Example - Cloning /// /// ```swift - /// let data = JSObject.global.Object.function!.new() + /// let data = JSObject.global.Object.object!.new() /// data["value"] = 42 /// let cloning = JSSending(data) /// diff --git a/Sources/JavaScriptEventLoop/JavaScriptEventLoop.swift b/Sources/JavaScriptEventLoop/JavaScriptEventLoop.swift index 1cb90f8d..94678958 100644 --- a/Sources/JavaScriptEventLoop/JavaScriptEventLoop.swift +++ b/Sources/JavaScriptEventLoop/JavaScriptEventLoop.swift @@ -82,7 +82,7 @@ public final class JavaScriptEventLoop: SerialExecutor, @unchecked Sendable { let promise = JSPromise(resolver: { resolver -> Void in resolver(.success(.undefined)) }) - let setTimeout = JSObject.global.setTimeout.function! + let setTimeout = JSObject.global.setTimeout.object! let eventLoop = JavaScriptEventLoop( queueTask: { job in // TODO(katei): Should prefer `queueMicrotask` if available? diff --git a/Sources/JavaScriptEventLoop/WebWorkerTaskExecutor.swift b/Sources/JavaScriptEventLoop/WebWorkerTaskExecutor.swift index 992b6090..1d98f4e2 100644 --- a/Sources/JavaScriptEventLoop/WebWorkerTaskExecutor.swift +++ b/Sources/JavaScriptEventLoop/WebWorkerTaskExecutor.swift @@ -34,7 +34,7 @@ import WASILibc /// /// ```swift /// // Create and transfer an object to a worker thread -/// let buffer = JSObject.global.ArrayBuffer.function!.new(1024).object! +/// let buffer = JSObject.global.ArrayBuffer.object!.new(1024).object! /// let transferring = JSSending.transfer(buffer) /// /// let task = Task(executorPreference: executor) { diff --git a/Sources/JavaScriptKit/BasicObjects/JSArray.swift b/Sources/JavaScriptKit/BasicObjects/JSArray.swift index fad60246..876a4998 100644 --- a/Sources/JavaScriptKit/BasicObjects/JSArray.swift +++ b/Sources/JavaScriptKit/BasicObjects/JSArray.swift @@ -2,8 +2,8 @@ /// class](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array) /// that exposes its properties in a type-safe and Swifty way. public class JSArray: JSBridgedClass { - public static var constructor: JSFunction? { _constructor.wrappedValue } - private static let _constructor = LazyThreadLocal(initialize: { JSObject.global.Array.function }) + public static var constructor: JSObject? { _constructor.wrappedValue } + private static let _constructor = LazyThreadLocal(initialize: { JSObject.global.Array.object }) static func isArray(_ object: JSObject) -> Bool { constructor!.isArray!(object).boolean! diff --git a/Sources/JavaScriptKit/BasicObjects/JSDate.swift b/Sources/JavaScriptKit/BasicObjects/JSDate.swift index 9157796b..ba4f9b0a 100644 --- a/Sources/JavaScriptKit/BasicObjects/JSDate.swift +++ b/Sources/JavaScriptKit/BasicObjects/JSDate.swift @@ -7,8 +7,8 @@ /// property if you need those. public final class JSDate: JSBridgedClass { /// The constructor function used to create new `Date` objects. - public static var constructor: JSFunction? { _constructor.wrappedValue } - private static let _constructor = LazyThreadLocal(initialize: { JSObject.global.Date.function }) + public static var constructor: JSObject? { _constructor.wrappedValue } + private static let _constructor = LazyThreadLocal(initialize: { JSObject.global.Date.object }) /// The underlying JavaScript `Date` object. public let jsObject: JSObject diff --git a/Sources/JavaScriptKit/BasicObjects/JSError.swift b/Sources/JavaScriptKit/BasicObjects/JSError.swift index 38accb97..a2d385e9 100644 --- a/Sources/JavaScriptKit/BasicObjects/JSError.swift +++ b/Sources/JavaScriptKit/BasicObjects/JSError.swift @@ -3,8 +3,8 @@ /// exposes its properties in a type-safe way. public final class JSError: JSBridgedClass { /// The constructor function used to create new JavaScript `Error` objects. - public static var constructor: JSFunction? { _constructor.wrappedValue } - private static let _constructor = LazyThreadLocal(initialize: { JSObject.global.Error.function }) + public static var constructor: JSObject? { _constructor.wrappedValue } + private static let _constructor = LazyThreadLocal(initialize: { JSObject.global.Error.object }) /// The underlying JavaScript `Error` object. public let jsObject: JSObject diff --git a/Sources/JavaScriptKit/BasicObjects/JSPromise.swift b/Sources/JavaScriptKit/BasicObjects/JSPromise.swift index ee43f87f..c83d7067 100644 --- a/Sources/JavaScriptKit/BasicObjects/JSPromise.swift +++ b/Sources/JavaScriptKit/BasicObjects/JSPromise.swift @@ -12,8 +12,8 @@ public final class JSPromise: JSBridgedClass { .object(jsObject) } - public static var constructor: JSFunction? { - JSObject.global.Promise.function! + public static var constructor: JSObject? { + JSObject.global.Promise.object! } /// This private initializer assumes that the passed object is a JavaScript `Promise` @@ -54,8 +54,8 @@ public final class JSPromise: JSBridgedClass { let closure = JSOneshotClosure { arguments in // The arguments are always coming from the `Promise` constructor, so we should be // safe to assume their type here - let resolve = arguments[0].function! - let reject = arguments[1].function! + let resolve = arguments[0].object! + let reject = arguments[1].object! resolver { switch $0 { diff --git a/Sources/JavaScriptKit/BasicObjects/JSTimer.swift b/Sources/JavaScriptKit/BasicObjects/JSTimer.swift index 3655a185..edfea163 100644 --- a/Sources/JavaScriptKit/BasicObjects/JSTimer.swift +++ b/Sources/JavaScriptKit/BasicObjects/JSTimer.swift @@ -75,9 +75,9 @@ public final class JSTimer { } self.isRepeating = isRepeating if isRepeating { - value = global.setInterval.function!(arguments: [closure.jsValue, millisecondsDelay.jsValue]) + value = global.setInterval.object!(arguments: [closure.jsValue, millisecondsDelay.jsValue]) } else { - value = global.setTimeout.function!(arguments: [closure.jsValue, millisecondsDelay.jsValue]) + value = global.setTimeout.object!(arguments: [closure.jsValue, millisecondsDelay.jsValue]) } } @@ -87,9 +87,9 @@ public final class JSTimer { */ deinit { if isRepeating { - global.clearInterval.function!(value) + global.clearInterval.object!(value) } else { - global.clearTimeout.function!(value) + global.clearTimeout.object!(value) } closure.release() } diff --git a/Sources/JavaScriptKit/BasicObjects/JSTypedArray.swift b/Sources/JavaScriptKit/BasicObjects/JSTypedArray.swift index 47919b17..dceecf5b 100644 --- a/Sources/JavaScriptKit/BasicObjects/JSTypedArray.swift +++ b/Sources/JavaScriptKit/BasicObjects/JSTypedArray.swift @@ -7,7 +7,7 @@ import _CJavaScriptKit public protocol TypedArrayElement { associatedtype Element: ConvertibleToJSValue, ConstructibleFromJSValue = Self /// The constructor function for the TypedArray class for this particular kind of number - static var typedArrayClass: JSFunction { get } + static var typedArrayClass: JSObject { get } } /// A wrapper around all [JavaScript `TypedArray` @@ -15,7 +15,7 @@ public protocol TypedArrayElement { /// that exposes their properties in a type-safe way. public final class JSTypedArray: JSBridgedClass, ExpressibleByArrayLiteral where Traits: TypedArrayElement { public typealias Element = Traits.Element - public class var constructor: JSFunction? { Traits.typedArrayClass } + public class var constructor: JSObject? { Traits.typedArrayClass } public var jsObject: JSObject public subscript(_ index: Int) -> Element { @@ -141,11 +141,11 @@ public final class JSTypedArray: JSBridgedClass, ExpressibleByArrayLiter } extension Int: TypedArrayElement { - public static var typedArrayClass: JSFunction { + public static var typedArrayClass: JSObject { #if _pointerBitWidth(_32) - return JSObject.global.Int32Array.function! + return JSObject.global.Int32Array.object! #elseif _pointerBitWidth(_64) - return JSObject.global.Int64Array.function! + return JSObject.global.Int64Array.object! #else #error("Unsupported pointer width") #endif @@ -153,11 +153,11 @@ extension Int: TypedArrayElement { } extension UInt: TypedArrayElement { - public static var typedArrayClass: JSFunction { + public static var typedArrayClass: JSObject { #if _pointerBitWidth(_32) - return JSObject.global.Uint32Array.function! + return JSObject.global.Uint32Array.object! #elseif _pointerBitWidth(_64) - return JSObject.global.Uint64Array.function! + return JSObject.global.Uint64Array.object! #else #error("Unsupported pointer width") #endif @@ -165,40 +165,40 @@ extension UInt: TypedArrayElement { } extension Int8: TypedArrayElement { - public static var typedArrayClass: JSFunction { JSObject.global.Int8Array.function! } + public static var typedArrayClass: JSObject { JSObject.global.Int8Array.object! } } extension UInt8: TypedArrayElement { - public static var typedArrayClass: JSFunction { JSObject.global.Uint8Array.function! } + public static var typedArrayClass: JSObject { JSObject.global.Uint8Array.object! } } extension Int16: TypedArrayElement { - public static var typedArrayClass: JSFunction { JSObject.global.Int16Array.function! } + public static var typedArrayClass: JSObject { JSObject.global.Int16Array.object! } } extension UInt16: TypedArrayElement { - public static var typedArrayClass: JSFunction { JSObject.global.Uint16Array.function! } + public static var typedArrayClass: JSObject { JSObject.global.Uint16Array.object! } } extension Int32: TypedArrayElement { - public static var typedArrayClass: JSFunction { JSObject.global.Int32Array.function! } + public static var typedArrayClass: JSObject { JSObject.global.Int32Array.object! } } extension UInt32: TypedArrayElement { - public static var typedArrayClass: JSFunction { JSObject.global.Uint32Array.function! } + public static var typedArrayClass: JSObject { JSObject.global.Uint32Array.object! } } extension Float32: TypedArrayElement { - public static var typedArrayClass: JSFunction { JSObject.global.Float32Array.function! } + public static var typedArrayClass: JSObject { JSObject.global.Float32Array.object! } } extension Float64: TypedArrayElement { - public static var typedArrayClass: JSFunction { JSObject.global.Float64Array.function! } + public static var typedArrayClass: JSObject { JSObject.global.Float64Array.object! } } public enum JSUInt8Clamped: TypedArrayElement { public typealias Element = UInt8 - public static var typedArrayClass: JSFunction { JSObject.global.Uint8ClampedArray.function! } + public static var typedArrayClass: JSObject { JSObject.global.Uint8ClampedArray.object! } } public typealias JSUInt8ClampedArray = JSTypedArray diff --git a/Sources/JavaScriptKit/ConvertibleToJSValue.swift b/Sources/JavaScriptKit/ConvertibleToJSValue.swift index afa63274..966dbc82 100644 --- a/Sources/JavaScriptKit/ConvertibleToJSValue.swift +++ b/Sources/JavaScriptKit/ConvertibleToJSValue.swift @@ -79,15 +79,12 @@ extension JSString: ConvertibleToJSValue { public var jsValue: JSValue { .string(self) } } -extension JSObject: JSValueCompatible { - // `JSObject.jsValue` is defined in JSObject.swift to be able to overridden - // from `JSFunction` -} +extension JSObject: JSValueCompatible {} -private let _objectConstructor = LazyThreadLocal(initialize: { JSObject.global.Object.function! }) -private var objectConstructor: JSFunction { _objectConstructor.wrappedValue } -private let _arrayConstructor = LazyThreadLocal(initialize: { JSObject.global.Array.function! }) -private var arrayConstructor: JSFunction { _arrayConstructor.wrappedValue } +private let _objectConstructor = LazyThreadLocal(initialize: { JSObject.global.Object.object! }) +private var objectConstructor: JSObject { _objectConstructor.wrappedValue } +private let _arrayConstructor = LazyThreadLocal(initialize: { JSObject.global.Array.object! }) +private var arrayConstructor: JSObject { _arrayConstructor.wrappedValue } #if !hasFeature(Embedded) extension Dictionary where Value == ConvertibleToJSValue, Key == String { @@ -177,7 +174,7 @@ extension Array: ConstructibleFromJSValue where Element: ConstructibleFromJSValu public static func construct(from value: JSValue) -> [Element]? { guard let objectRef = value.object, - objectRef.isInstanceOf(JSObject.global.Array.function!) + objectRef.isInstanceOf(JSObject.global.Array.object!) else { return nil } let count: Int = objectRef.length.fromJSValue()! @@ -208,8 +205,6 @@ extension RawJSValue: ConvertibleToJSValue { return .null case .undefined: return .undefined - case .function: - return .function(JSFunction(id: UInt32(payload1))) case .symbol: return .symbol(JSSymbol(id: UInt32(payload1))) case .bigInt: @@ -248,9 +243,6 @@ extension JSValue { case .undefined: kind = .undefined payload1 = 0 - case .function(let functionRef): - kind = .function - payload1 = JavaScriptPayload1(functionRef.id) case .symbol(let symbolRef): kind = .symbol payload1 = JavaScriptPayload1(symbolRef.id) diff --git a/Sources/JavaScriptKit/FundamentalObjects/JSBigInt.swift b/Sources/JavaScriptKit/FundamentalObjects/JSBigInt.swift index 3f0c2632..aaa46220 100644 --- a/Sources/JavaScriptKit/FundamentalObjects/JSBigInt.swift +++ b/Sources/JavaScriptKit/FundamentalObjects/JSBigInt.swift @@ -1,6 +1,6 @@ import _CJavaScriptKit -private var constructor: JSFunction { JSObject.global.BigInt.function! } +private var constructor: JSObject { JSObject.global.BigInt.object! } /// A wrapper around [the JavaScript `BigInt` /// class](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array) diff --git a/Sources/JavaScriptKit/FundamentalObjects/JSClosure.swift b/Sources/JavaScriptKit/FundamentalObjects/JSClosure.swift index d290046a..cfdd7b41 100644 --- a/Sources/JavaScriptKit/FundamentalObjects/JSClosure.swift +++ b/Sources/JavaScriptKit/FundamentalObjects/JSClosure.swift @@ -103,7 +103,7 @@ public class JSOneshotClosure: JSObject, JSClosureProtocol { /// button.removeEventListener!("click", JSValue.function(eventListener)) /// ``` /// -public class JSClosure: JSFunction, JSClosureProtocol { +public class JSClosure: JSObject, JSClosureProtocol { class SharedJSClosure { // Note: 6.0 compilers built with assertions enabled crash when calling @@ -317,7 +317,7 @@ func _call_host_function_impl( arguments.append(argv[i].jsValue) } let result = hostFunc(arguments) - let callbackFuncRef = JSFunction(id: callbackFuncRef) + let callbackFuncRef = JSObject(id: callbackFuncRef) _ = callbackFuncRef(result) return false } diff --git a/Sources/JavaScriptKit/FundamentalObjects/JSFunction.swift b/Sources/JavaScriptKit/FundamentalObjects/JSObject+CallAsFunction.swift similarity index 96% rename from Sources/JavaScriptKit/FundamentalObjects/JSFunction.swift rename to Sources/JavaScriptKit/FundamentalObjects/JSObject+CallAsFunction.swift index 17248361..0b12f099 100644 --- a/Sources/JavaScriptKit/FundamentalObjects/JSFunction.swift +++ b/Sources/JavaScriptKit/FundamentalObjects/JSObject+CallAsFunction.swift @@ -1,16 +1,14 @@ import _CJavaScriptKit -/// `JSFunction` represents a function in JavaScript and supports new object instantiation. -/// This type can be callable as a function using `callAsFunction`. -/// -/// e.g. -/// ```swift -/// let alert: JSFunction = JSObject.global.alert.function! -/// // Call `JSFunction` as a function -/// alert("Hello, world") -/// ``` -/// -public class JSFunction: JSObject { +@available( + *, + deprecated, + renamed: "JSObject", + message: "Please use JSObject instead. JSFunction is unified with JSObject" +) +public typealias JSFunction = JSObject + +extension JSObject { #if !hasFeature(Embedded) /// Call this function with given `arguments` and binding given `this` as context. /// - Parameters: @@ -78,7 +76,7 @@ public class JSFunction: JSObject { /// ``` /// /// ```swift - /// let validateAge = JSObject.global.validateAge.function! + /// let validateAge = JSObject.global.validateAge.object! /// try validateAge.throws(20) /// ``` public var `throws`: JSThrowingFunction { @@ -104,10 +102,6 @@ public class JSFunction: JSObject { fatalError("unavailable") } - override public var jsValue: JSValue { - .function(self) - } - final func invokeNonThrowingJSFunction(arguments: [JSValue]) -> RawJSValue { arguments.withRawJSValues { invokeNonThrowingJSFunction(rawValues: $0) } } diff --git a/Sources/JavaScriptKit/FundamentalObjects/JSObject.swift b/Sources/JavaScriptKit/FundamentalObjects/JSObject.swift index b9330ae8..f6a14cfb 100644 --- a/Sources/JavaScriptKit/FundamentalObjects/JSObject.swift +++ b/Sources/JavaScriptKit/FundamentalObjects/JSObject.swift @@ -16,8 +16,8 @@ import _CJavaScriptKit /// reference counting system. @dynamicMemberLookup public class JSObject: Equatable, ExpressibleByDictionaryLiteral { - internal static var constructor: JSFunction { _constructor.wrappedValue } - private static let _constructor = LazyThreadLocal(initialize: { JSObject.global.Object.function! }) + internal static var constructor: JSObject { _constructor.wrappedValue } + private static let _constructor = LazyThreadLocal(initialize: { JSObject.global.Object.object! }) @usableFromInline internal var _id: JavaScriptObjectRef @@ -213,7 +213,7 @@ public class JSObject: Equatable, ExpressibleByDictionaryLiteral { /// Return `true` if this value is an instance of the passed `constructor` function. /// - Parameter constructor: The constructor function to check. /// - Returns: The result of `instanceof` in the JavaScript environment. - public func isInstanceOf(_ constructor: JSFunction) -> Bool { + public func isInstanceOf(_ constructor: JSObject) -> Bool { assertOnOwnerThread(hint: "calling 'isInstanceOf'") return swjs_instanceof(id, constructor.id) } @@ -258,8 +258,6 @@ public class JSObject: Equatable, ExpressibleByDictionaryLiteral { return nil case .object(let object): return object as? Self - case .function(let function): - return function as? Self case .symbol(let symbol): return symbol as? Self case .bigInt(let bigInt): diff --git a/Sources/JavaScriptKit/FundamentalObjects/JSSymbol.swift b/Sources/JavaScriptKit/FundamentalObjects/JSSymbol.swift index a9461317..dbf80175 100644 --- a/Sources/JavaScriptKit/FundamentalObjects/JSSymbol.swift +++ b/Sources/JavaScriptKit/FundamentalObjects/JSSymbol.swift @@ -1,7 +1,7 @@ import _CJavaScriptKit -private let _Symbol = LazyThreadLocal(initialize: { JSObject.global.Symbol.function! }) -private var Symbol: JSFunction { _Symbol.wrappedValue } +private let _Symbol = LazyThreadLocal(initialize: { JSObject.global.Symbol.object! }) +private var Symbol: JSObject { _Symbol.wrappedValue } /// A wrapper around [the JavaScript `Symbol` /// class](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Symbol) diff --git a/Sources/JavaScriptKit/FundamentalObjects/JSThrowingFunction.swift b/Sources/JavaScriptKit/FundamentalObjects/JSThrowingFunction.swift index aee17fd6..7c75ad55 100644 --- a/Sources/JavaScriptKit/FundamentalObjects/JSThrowingFunction.swift +++ b/Sources/JavaScriptKit/FundamentalObjects/JSThrowingFunction.swift @@ -4,8 +4,8 @@ import _CJavaScriptKit /// A `JSFunction` wrapper that enables throwing function calls. /// Exceptions produced by JavaScript functions will be thrown as `JSValue`. public class JSThrowingFunction { - private let base: JSFunction - public init(_ base: JSFunction) { + private let base: JSObject + public init(_ base: JSObject) { self.base = base } @@ -73,7 +73,7 @@ public class JSThrowingFunction { } private func invokeJSFunction( - _ jsFunc: JSFunction, + _ jsFunc: JSObject, arguments: [ConvertibleToJSValue], this: JSObject? ) throws -> JSValue { diff --git a/Sources/JavaScriptKit/JSBridgedType.swift b/Sources/JavaScriptKit/JSBridgedType.swift index ffa65f4a..8f5cf55a 100644 --- a/Sources/JavaScriptKit/JSBridgedType.swift +++ b/Sources/JavaScriptKit/JSBridgedType.swift @@ -29,7 +29,7 @@ public protocol _JSBridgedClass { /// Conform to this protocol when your Swift class wraps a JavaScript class. public protocol JSBridgedClass: JSBridgedType, _JSBridgedClass { /// The constructor function for the JavaScript class - static var constructor: JSFunction? { get } + static var constructor: JSObject? { get } /// The JavaScript object wrapped by this instance. /// You may assume that `jsObject instanceof Self.constructor == true` diff --git a/Sources/JavaScriptKit/JSValue.swift b/Sources/JavaScriptKit/JSValue.swift index b9f8dd4a..f469a2f1 100644 --- a/Sources/JavaScriptKit/JSValue.swift +++ b/Sources/JavaScriptKit/JSValue.swift @@ -9,7 +9,6 @@ public enum JSValue: Equatable { case object(JSObject) case null case undefined - case function(JSFunction) case symbol(JSSymbol) case bigInt(JSBigInt) @@ -60,14 +59,8 @@ public enum JSValue: Equatable { } } - /// Returns the `JSFunction` of this JS value if its type is function. - /// If not, returns `nil`. - public var function: JSFunction? { - switch self { - case .function(let function): return function - default: return nil - } - } + // @available(*, deprecated, renamed: "object", message: "Use the .object property instead") + public var function: JSObject? { object } /// Returns the `JSSymbol` of this JS value if its type is function. /// If not, returns `nil`. @@ -180,6 +173,9 @@ extension JSValue { public static func function(_ closure: JSClosure) -> JSValue { .object(closure) } + + @available(*, deprecated, renamed: "object", message: "Use .object(function) instead") + public static func function(_ function: JSObject) -> JSValue { .object(function) } } extension JSValue: ExpressibleByStringLiteral { @@ -271,14 +267,12 @@ extension JSValue { /// Returns `false` for everything except objects and functions. /// - Parameter constructor: The constructor function to check. /// - Returns: The result of `instanceof` in the JavaScript environment. - public func isInstanceOf(_ constructor: JSFunction) -> Bool { + public func isInstanceOf(_ constructor: JSObject) -> Bool { switch self { case .boolean, .string, .number, .null, .undefined, .symbol, .bigInt: return false case .object(let ref): return ref.isInstanceOf(constructor) - case .function(let ref): - return ref.isInstanceOf(constructor) } } } @@ -287,7 +281,7 @@ extension JSValue: CustomStringConvertible { public var description: String { // per https://tc39.es/ecma262/multipage/text-processing.html#sec-string-constructor-string-value // this always returns a string - JSObject.global.String.function!(self).string! + JSObject.global.String.object!(self).string! } } diff --git a/Sources/_CJavaScriptKit/include/_CJavaScriptKit.h b/Sources/_CJavaScriptKit/include/_CJavaScriptKit.h index 7cb37e28..28e7b5e3 100644 --- a/Sources/_CJavaScriptKit/include/_CJavaScriptKit.h +++ b/Sources/_CJavaScriptKit/include/_CJavaScriptKit.h @@ -24,7 +24,6 @@ typedef enum __attribute__((enum_extensibility(closed))) { JavaScriptValueKindObject = 3, JavaScriptValueKindNull = 4, JavaScriptValueKindUndefined = 5, - JavaScriptValueKindFunction = 6, JavaScriptValueKindSymbol = 7, JavaScriptValueKindBigInt = 8, } JavaScriptValueKind; diff --git a/Tests/JavaScriptKitTests/JavaScriptKitTests.swift b/Tests/JavaScriptKitTests/JavaScriptKitTests.swift index ffab816a..0a6fc9ce 100644 --- a/Tests/JavaScriptKitTests/JavaScriptKitTests.swift +++ b/Tests/JavaScriptKitTests/JavaScriptKitTests.swift @@ -243,15 +243,9 @@ class JavaScriptKitTests: XCTestCase { let bigInt: JSValue = js.bi XCTAssertNotNil(JSObject.construct(from: object)) - XCTAssertEqual(JSObject.construct(from: function).map { $0 is JSFunction }, .some(true)) XCTAssertEqual(JSObject.construct(from: symbol).map { $0 is JSSymbol }, .some(true)) XCTAssertEqual(JSObject.construct(from: bigInt).map { $0 is JSBigInt }, .some(true)) - XCTAssertNil(JSFunction.construct(from: object)) - XCTAssertNotNil(JSFunction.construct(from: function)) - XCTAssertNil(JSFunction.construct(from: symbol)) - XCTAssertNil(JSFunction.construct(from: bigInt)) - XCTAssertNil(JSSymbol.construct(from: object)) XCTAssertNil(JSSymbol.construct(from: function)) XCTAssertNotNil(JSSymbol.construct(from: symbol))