Skip to content

Commit 8ef8f68

Browse files
Unify JSFunction with JSObject
1 parent 250af4d commit 8ef8f68

File tree

17 files changed

+63
-92
lines changed

17 files changed

+63
-92
lines changed
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
import JavaScriptKit
22

33
extension UInt64: JavaScriptKit.ConvertibleToJSValue, JavaScriptKit.TypedArrayElement {
4-
public static var typedArrayClass: JSFunction { JSObject.global.BigUint64Array.function! }
4+
public static var typedArrayClass: JSObject { JSObject.global.BigUint64Array.object! }
55

66
public var jsValue: JSValue { .bigInt(JSBigInt(unsigned: self)) }
77
}
88

99
extension Int64: JavaScriptKit.ConvertibleToJSValue, JavaScriptKit.TypedArrayElement {
10-
public static var typedArrayClass: JSFunction { JSObject.global.BigInt64Array.function! }
10+
public static var typedArrayClass: JSObject { JSObject.global.BigInt64Array.object! }
1111

1212
public var jsValue: JSValue { .bigInt(JSBigInt(self)) }
1313
}

Sources/JavaScriptKit/BasicObjects/JSArray.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@
22
/// class](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)
33
/// that exposes its properties in a type-safe and Swifty way.
44
public class JSArray: JSBridgedClass {
5-
public static var constructor: JSFunction? { _constructor.wrappedValue }
6-
private static let _constructor = LazyThreadLocal(initialize: { JSObject.global.Array.function })
5+
public static var constructor: JSObject? { _constructor.wrappedValue }
6+
private static let _constructor = LazyThreadLocal(initialize: { JSObject.global.Array.object })
77

88
static func isArray(_ object: JSObject) -> Bool {
99
constructor!.isArray!(object).boolean!

Sources/JavaScriptKit/BasicObjects/JSDate.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@
77
/// property if you need those.
88
public final class JSDate: JSBridgedClass {
99
/// The constructor function used to create new `Date` objects.
10-
public static var constructor: JSFunction? { _constructor.wrappedValue }
11-
private static let _constructor = LazyThreadLocal(initialize: { JSObject.global.Date.function })
10+
public static var constructor: JSObject? { _constructor.wrappedValue }
11+
private static let _constructor = LazyThreadLocal(initialize: { JSObject.global.Date.object })
1212

1313
/// The underlying JavaScript `Date` object.
1414
public let jsObject: JSObject

Sources/JavaScriptKit/BasicObjects/JSError.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@
33
/// exposes its properties in a type-safe way.
44
public final class JSError: JSBridgedClass {
55
/// The constructor function used to create new JavaScript `Error` objects.
6-
public static var constructor: JSFunction? { _constructor.wrappedValue }
7-
private static let _constructor = LazyThreadLocal(initialize: { JSObject.global.Error.function })
6+
public static var constructor: JSObject? { _constructor.wrappedValue }
7+
private static let _constructor = LazyThreadLocal(initialize: { JSObject.global.Error.object })
88

99
/// The underlying JavaScript `Error` object.
1010
public let jsObject: JSObject

Sources/JavaScriptKit/BasicObjects/JSPromise.swift

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@ public final class JSPromise: JSBridgedClass {
1212
.object(jsObject)
1313
}
1414

15-
public static var constructor: JSFunction? {
16-
JSObject.global.Promise.function!
15+
public static var constructor: JSObject? {
16+
JSObject.global.Promise.object!
1717
}
1818

1919
/// This private initializer assumes that the passed object is a JavaScript `Promise`
@@ -54,8 +54,8 @@ public final class JSPromise: JSBridgedClass {
5454
let closure = JSOneshotClosure { arguments in
5555
// The arguments are always coming from the `Promise` constructor, so we should be
5656
// safe to assume their type here
57-
let resolve = arguments[0].function!
58-
let reject = arguments[1].function!
57+
let resolve = arguments[0].object!
58+
let reject = arguments[1].object!
5959

6060
resolver {
6161
switch $0 {

Sources/JavaScriptKit/BasicObjects/JSTypedArray.swift

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -7,15 +7,15 @@ import _CJavaScriptKit
77
public protocol TypedArrayElement {
88
associatedtype Element: ConvertibleToJSValue, ConstructibleFromJSValue = Self
99
/// The constructor function for the TypedArray class for this particular kind of number
10-
static var typedArrayClass: JSFunction { get }
10+
static var typedArrayClass: JSObject { get }
1111
}
1212

1313
/// A wrapper around all [JavaScript `TypedArray`
1414
/// classes](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/TypedArray)
1515
/// that exposes their properties in a type-safe way.
1616
public final class JSTypedArray<Traits>: JSBridgedClass, ExpressibleByArrayLiteral where Traits: TypedArrayElement {
1717
public typealias Element = Traits.Element
18-
public class var constructor: JSFunction? { Traits.typedArrayClass }
18+
public class var constructor: JSObject? { Traits.typedArrayClass }
1919
public var jsObject: JSObject
2020

2121
public subscript(_ index: Int) -> Element {
@@ -141,64 +141,64 @@ public final class JSTypedArray<Traits>: JSBridgedClass, ExpressibleByArrayLiter
141141
}
142142

143143
extension Int: TypedArrayElement {
144-
public static var typedArrayClass: JSFunction {
144+
public static var typedArrayClass: JSObject {
145145
#if _pointerBitWidth(_32)
146-
return JSObject.global.Int32Array.function!
146+
return JSObject.global.Int32Array.object!
147147
#elseif _pointerBitWidth(_64)
148-
return JSObject.global.Int64Array.function!
148+
return JSObject.global.Int64Array.object!
149149
#else
150150
#error("Unsupported pointer width")
151151
#endif
152152
}
153153
}
154154

155155
extension UInt: TypedArrayElement {
156-
public static var typedArrayClass: JSFunction {
156+
public static var typedArrayClass: JSObject {
157157
#if _pointerBitWidth(_32)
158-
return JSObject.global.Uint32Array.function!
158+
return JSObject.global.Uint32Array.object!
159159
#elseif _pointerBitWidth(_64)
160-
return JSObject.global.Uint64Array.function!
160+
return JSObject.global.Uint64Array.object!
161161
#else
162162
#error("Unsupported pointer width")
163163
#endif
164164
}
165165
}
166166

167167
extension Int8: TypedArrayElement {
168-
public static var typedArrayClass: JSFunction { JSObject.global.Int8Array.function! }
168+
public static var typedArrayClass: JSObject { JSObject.global.Int8Array.object! }
169169
}
170170

171171
extension UInt8: TypedArrayElement {
172-
public static var typedArrayClass: JSFunction { JSObject.global.Uint8Array.function! }
172+
public static var typedArrayClass: JSObject { JSObject.global.Uint8Array.object! }
173173
}
174174

175175
extension Int16: TypedArrayElement {
176-
public static var typedArrayClass: JSFunction { JSObject.global.Int16Array.function! }
176+
public static var typedArrayClass: JSObject { JSObject.global.Int16Array.object! }
177177
}
178178

179179
extension UInt16: TypedArrayElement {
180-
public static var typedArrayClass: JSFunction { JSObject.global.Uint16Array.function! }
180+
public static var typedArrayClass: JSObject { JSObject.global.Uint16Array.object! }
181181
}
182182

183183
extension Int32: TypedArrayElement {
184-
public static var typedArrayClass: JSFunction { JSObject.global.Int32Array.function! }
184+
public static var typedArrayClass: JSObject { JSObject.global.Int32Array.object! }
185185
}
186186

187187
extension UInt32: TypedArrayElement {
188-
public static var typedArrayClass: JSFunction { JSObject.global.Uint32Array.function! }
188+
public static var typedArrayClass: JSObject { JSObject.global.Uint32Array.object! }
189189
}
190190

191191
extension Float32: TypedArrayElement {
192-
public static var typedArrayClass: JSFunction { JSObject.global.Float32Array.function! }
192+
public static var typedArrayClass: JSObject { JSObject.global.Float32Array.object! }
193193
}
194194

195195
extension Float64: TypedArrayElement {
196-
public static var typedArrayClass: JSFunction { JSObject.global.Float64Array.function! }
196+
public static var typedArrayClass: JSObject { JSObject.global.Float64Array.object! }
197197
}
198198

199199
public enum JSUInt8Clamped: TypedArrayElement {
200200
public typealias Element = UInt8
201-
public static var typedArrayClass: JSFunction { JSObject.global.Uint8ClampedArray.function! }
201+
public static var typedArrayClass: JSObject { JSObject.global.Uint8ClampedArray.object! }
202202
}
203203

204204
public typealias JSUInt8ClampedArray = JSTypedArray<JSUInt8Clamped>

Sources/JavaScriptKit/ConvertibleToJSValue.swift

Lines changed: 6 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -79,15 +79,12 @@ extension JSString: ConvertibleToJSValue {
7979
public var jsValue: JSValue { .string(self) }
8080
}
8181

82-
extension JSObject: JSValueCompatible {
83-
// `JSObject.jsValue` is defined in JSObject.swift to be able to overridden
84-
// from `JSFunction`
85-
}
82+
extension JSObject: JSValueCompatible {}
8683

87-
private let _objectConstructor = LazyThreadLocal(initialize: { JSObject.global.Object.function! })
88-
private var objectConstructor: JSFunction { _objectConstructor.wrappedValue }
89-
private let _arrayConstructor = LazyThreadLocal(initialize: { JSObject.global.Array.function! })
90-
private var arrayConstructor: JSFunction { _arrayConstructor.wrappedValue }
84+
private let _objectConstructor = LazyThreadLocal(initialize: { JSObject.global.Object.object! })
85+
private var objectConstructor: JSObject { _objectConstructor.wrappedValue }
86+
private let _arrayConstructor = LazyThreadLocal(initialize: { JSObject.global.Array.object! })
87+
private var arrayConstructor: JSObject { _arrayConstructor.wrappedValue }
9188

9289
#if !hasFeature(Embedded)
9390
extension Dictionary where Value == ConvertibleToJSValue, Key == String {
@@ -177,7 +174,7 @@ extension Array: ConstructibleFromJSValue where Element: ConstructibleFromJSValu
177174
public static func construct(from value: JSValue) -> [Element]? {
178175
guard
179176
let objectRef = value.object,
180-
objectRef.isInstanceOf(JSObject.global.Array.function!)
177+
objectRef.isInstanceOf(JSObject.global.Array.object!)
181178
else { return nil }
182179

183180
let count: Int = objectRef.length.fromJSValue()!
@@ -208,8 +205,6 @@ extension RawJSValue: ConvertibleToJSValue {
208205
return .null
209206
case .undefined:
210207
return .undefined
211-
case .function:
212-
return .function(JSFunction(id: UInt32(payload1)))
213208
case .symbol:
214209
return .symbol(JSSymbol(id: UInt32(payload1)))
215210
case .bigInt:
@@ -248,9 +243,6 @@ extension JSValue {
248243
case .undefined:
249244
kind = .undefined
250245
payload1 = 0
251-
case .function(let functionRef):
252-
kind = .function
253-
payload1 = JavaScriptPayload1(functionRef.id)
254246
case .symbol(let symbolRef):
255247
kind = .symbol
256248
payload1 = JavaScriptPayload1(symbolRef.id)

Sources/JavaScriptKit/FundamentalObjects/JSBigInt.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import _CJavaScriptKit
22

3-
private var constructor: JSFunction { JSObject.global.BigInt.function! }
3+
private var constructor: JSObject { JSObject.global.BigInt.object! }
44

55
/// A wrapper around [the JavaScript `BigInt`
66
/// class](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)

Sources/JavaScriptKit/FundamentalObjects/JSClosure.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ public class JSOneshotClosure: JSObject, JSClosureProtocol {
103103
/// button.removeEventListener!("click", JSValue.function(eventListener))
104104
/// ```
105105
///
106-
public class JSClosure: JSFunction, JSClosureProtocol {
106+
public class JSClosure: JSObject, JSClosureProtocol {
107107

108108
class SharedJSClosure {
109109
// Note: 6.0 compilers built with assertions enabled crash when calling
@@ -317,7 +317,7 @@ func _call_host_function_impl(
317317
arguments.append(argv[i].jsValue)
318318
}
319319
let result = hostFunc(arguments)
320-
let callbackFuncRef = JSFunction(id: callbackFuncRef)
320+
let callbackFuncRef = JSObject(id: callbackFuncRef)
321321
_ = callbackFuncRef(result)
322322
return false
323323
}

Sources/JavaScriptKit/FundamentalObjects/JSFunction.swift renamed to Sources/JavaScriptKit/FundamentalObjects/JSObject+CallAsFunction.swift

Lines changed: 9 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,14 @@
11
import _CJavaScriptKit
22

3-
/// `JSFunction` represents a function in JavaScript and supports new object instantiation.
4-
/// This type can be callable as a function using `callAsFunction`.
5-
///
6-
/// e.g.
7-
/// ```swift
8-
/// let alert: JSFunction = JSObject.global.alert.function!
9-
/// // Call `JSFunction` as a function
10-
/// alert("Hello, world")
11-
/// ```
12-
///
13-
public class JSFunction: JSObject {
3+
@available(
4+
*,
5+
deprecated,
6+
renamed: "JSObject",
7+
message: "Please use JSObject instead. JSFunction is unified with JSObject"
8+
)
9+
public typealias JSFunction = JSObject
10+
11+
extension JSObject {
1412
#if !hasFeature(Embedded)
1513
/// Call this function with given `arguments` and binding given `this` as context.
1614
/// - Parameters:
@@ -104,10 +102,6 @@ public class JSFunction: JSObject {
104102
fatalError("unavailable")
105103
}
106104

107-
override public var jsValue: JSValue {
108-
.function(self)
109-
}
110-
111105
final func invokeNonThrowingJSFunction(arguments: [JSValue]) -> RawJSValue {
112106
arguments.withRawJSValues { invokeNonThrowingJSFunction(rawValues: $0) }
113107
}

0 commit comments

Comments
 (0)