Skip to content

Commit 3f7bba2

Browse files
mjburghardj-f1
authored andcommitted
Changes related to WebIDL support.
1 parent 922cbb5 commit 3f7bba2

File tree

6 files changed

+541
-82
lines changed

6 files changed

+541
-82
lines changed

IntegrationTests/TestSuites/Sources/PrimaryTests/main.swift

Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -270,32 +270,32 @@ Call_Function_With_This: do {
270270
}
271271

272272
Object_Conversion: do {
273-
// let array1 = [1, 2, 3]
274-
// let jsArray1 = JSValue(from: array1).object!
275-
// try expectEqual(jsArray1.length, .number(3))
276-
// try expectEqual(jsArray1[0], .number(1))
277-
// try expectEqual(jsArray1[1], .number(2))
278-
// try expectEqual(jsArray1[2], .number(3))
279-
280-
let array2: [JSValueConvertible] = [1, "str", false]
281-
let jsArray2 = JSValue(from: array2).object!
282-
try expectEqual(jsArray2.length, .number(3))
283-
try expectEqual(jsArray2[0], .number(1))
284-
try expectEqual(jsArray2[1], .string("str"))
285-
try expectEqual(jsArray2[2], .boolean(false))
286-
_ = jsArray2.push!(5)
287-
try expectEqual(jsArray2.length, .number(4))
273+
let array1 = [1, 2, 3]
274+
let jsArray1 = JSValue(from: array1).object!
275+
try expectEqual(jsArray1.length, .number(3))
276+
try expectEqual(jsArray1[0], .number(1))
277+
try expectEqual(jsArray1[1], .number(2))
278+
try expectEqual(jsArray1[2], .number(3))
279+
280+
// let array2: [JSValueEncodable] = [1, "str", false]
281+
// let jsArray2 = JSValue(from: array2).object!
282+
// try expectEqual(jsArray2.length, .number(3))
283+
// try expectEqual(jsArray2[0], .number(1))
284+
// try expectEqual(jsArray2[1], .string("str"))
285+
// try expectEqual(jsArray2[2], .boolean(false))
286+
// _ = jsArray2.push!(5)
287+
// try expectEqual(jsArray2.length, .number(4))
288288
// _ = jsArray2.push!(jsArray1)
289289

290290
// try expectEqual(jsArray2[4], .object(jsArray1))
291291

292-
let dict1: [String: JSValueConvertible] = [
293-
"prop1": 1,
294-
"prop2": "foo",
295-
]
296-
let jsDict1 = JSValue(from: dict1).object!
297-
try expectEqual(jsDict1.prop1, .number(1))
298-
try expectEqual(jsDict1.prop2, .string("foo"))
292+
// let dict1: [String: JSValueEncodable] = [
293+
// "prop1": 1,
294+
// "prop2": "foo",
295+
// ]
296+
// let jsDict1 = JSValue(from: dict1).object!
297+
// try expectEqual(jsDict1.prop1, .number(1))
298+
// try expectEqual(jsDict1.prop2, .string("foo"))
299299
} catch {
300300
print(error)
301301
}

Sources/JavaScriptKit/JSFunction.swift

Lines changed: 24 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,13 @@ public enum _JSFunctionConstructorSymbol {
55
}
66

77
public class JSFunctionRef: JSObjectRef {
8+
9+
public override class func canDecode(from jsValue: JSValue) -> Bool {
10+
return jsValue.isFunction
11+
}
12+
813
@discardableResult
9-
func callAsFunction(this: JSObjectRef? = nil, args: [JSValueConvertible]) -> JSValue {
14+
func callAsFunction(this: JSObjectRef? = nil, args: [JSValueEncodable]) -> JSValue {
1015
let result = args.withRawJSValues { rawValues in
1116
rawValues.withUnsafeBufferPointer { bufferPointer -> RawJSValue in
1217
let argv = bufferPointer.baseAddress
@@ -29,24 +34,21 @@ public class JSFunctionRef: JSObjectRef {
2934
}
3035

3136
@discardableResult
32-
public func callAsFunction(this: JSObjectRef? = nil, _ args: JSValueConvertible...) -> JSValue {
37+
public func callAsFunction(this: JSObjectRef? = nil, _ args: JSValueEncodable...) -> JSValue {
3338
self(this: this, args: args)
3439
}
3540

36-
public func callAsFunction(new args: JSValueConvertible...) -> JSObjectRef {
41+
public func callAsFunction(new args: JSValueEncodable...) -> JSObjectRef {
3742
self(.new, args: args)
3843
}
3944

40-
public func callAsFunction(_: _JSFunctionConstructorSymbol, args: [JSValueConvertible] = []) -> JSObjectRef {
45+
public func callAsFunction(_: _JSFunctionConstructorSymbol, args: [JSValueEncodable] = []) -> JSObjectRef {
4146
args.withRawJSValues { rawValues in
4247
rawValues.withUnsafeBufferPointer { bufferPointer in
4348
let argv = bufferPointer.baseAddress
4449
let argc = bufferPointer.count
4550
var resultObj = JavaScriptObjectRef()
46-
_call_new(
47-
self.id, argv, Int32(argc),
48-
&resultObj
49-
)
51+
_call_new(self.id, argv, Int32(argc), &resultObj)
5052
return JSObjectRef(id: resultObj)
5153
}
5254
}
@@ -57,6 +59,15 @@ public class JSFunctionRef: JSObjectRef {
5759
fatalError("unavailable")
5860
}
5961

62+
public convenience required init(jsValue: JSValue) {
63+
switch jsValue {
64+
case .function(let value):
65+
self.init(id: value.id)
66+
default:
67+
fatalError()
68+
}
69+
}
70+
6071
public override subscript(jsValue _: ()) -> JSValue {
6172
.function(self)
6273
}
@@ -80,6 +91,11 @@ public class JSClosure: JSFunctionRef {
8091
id = objectRef
8192
}
8293

94+
public convenience required init(jsValue: JSValue) {
95+
let fun = JSFunctionRef(jsValue: jsValue)
96+
self.init { fun(args: $0) }
97+
}
98+
8399
public func release() {
84100
Self.sharedFunctions[hostFuncRef] = nil
85101
}

Sources/JavaScriptKit/JSObject.swift

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,20 @@ import _CJavaScriptKit
22

33
@dynamicMemberLookup
44
public class JSObjectRef: Equatable {
5+
public class func canDecode(from jsValue: JSValue) -> Bool {
6+
return jsValue.isObject
7+
}
8+
59
internal var id: UInt32
610
init(id: UInt32) {
711
self.id = id
812
}
913

1014
@_disfavoredOverload
11-
public subscript(dynamicMember name: String) -> ((JSValueConvertible...) -> JSValue)? {
15+
public subscript(dynamicMember name: String) -> ((JSValueEncodable...) -> JSValue)? {
1216
guard let function = self[name].function else { return nil }
13-
return { (arguments: JSValueConvertible...) in
14-
function(this: self, arguments)
17+
return { (arguments: JSValueEncodable...) in
18+
function(this: self, args: arguments)
1519
}
1620
}
1721

@@ -43,6 +47,15 @@ public class JSObjectRef: Equatable {
4347
return lhs.id == rhs.id
4448
}
4549

50+
public convenience required init(jsValue: JSValue) {
51+
switch jsValue {
52+
case .object(let value):
53+
self.init(id: value.id)
54+
default:
55+
fatalError()
56+
}
57+
}
58+
4659
public subscript(jsValue _: ()) -> JSValue {
4760
.object(self)
4861
}

Sources/JavaScriptKit/JSValue.swift

Lines changed: 63 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -41,14 +41,51 @@ public enum JSValue: Equatable {
4141
object.flatMap { JSArrayRef($0) }
4242
}
4343

44-
public var isNull: Bool { return self == .null }
45-
public var isUndefined: Bool { return self == .undefined }
4644
public var function: JSFunctionRef? {
4745
switch self {
4846
case let .function(function): return function
4947
default: return nil
5048
}
5149
}
50+
51+
public var isBoolean: Bool {
52+
guard case .boolean = self else { return false }
53+
return true
54+
}
55+
56+
public var isString: Bool {
57+
guard case .string = self else { return false }
58+
return true
59+
}
60+
61+
public var isNumber: Bool {
62+
guard case .number = self else { return false }
63+
return true
64+
}
65+
66+
public var isObject: Bool {
67+
guard case .object = self else { return false }
68+
return true
69+
}
70+
71+
public var isNull: Bool {
72+
return self == .null
73+
}
74+
75+
public var isUndefined: Bool {
76+
return self == .undefined
77+
}
78+
79+
public var isFunction: Bool {
80+
guard case .function = self else { return false }
81+
return true
82+
}
83+
}
84+
85+
extension JSValue {
86+
public func fromJSValue<Type>() -> Type where Type: JSValueDecodable {
87+
return Type(jsValue: self)
88+
}
5289
}
5390

5491
extension JSValue {
@@ -64,7 +101,13 @@ extension JSValue: ExpressibleByStringLiteral {
64101
}
65102

66103
extension JSValue: ExpressibleByIntegerLiteral {
67-
public init(integerLiteral value: Double) {
104+
public init(integerLiteral value: Int32) {
105+
self = .number(Double(value))
106+
}
107+
}
108+
109+
extension JSValue: ExpressibleByFloatLiteral {
110+
public init(floatLiteral value: Double) {
68111
self = .number(value)
69112
}
70113
}
@@ -98,3 +141,20 @@ public func setJSValue(this: JSObjectRef, index: Int32, value: JSValue) {
98141
rawValue.payload1, rawValue.payload2, rawValue.payload3)
99142
}
100143
}
144+
145+
extension JSValue {
146+
147+
public func instanceof(_ constructor: String) -> Bool {
148+
149+
switch self {
150+
case .boolean, .string, .number:
151+
return false
152+
case .object(let ref):
153+
return true // ref.instanceof(constructor)
154+
case .function(let ref):
155+
return true // ref.instanceof(constructor)
156+
case .null, .undefined:
157+
fatalError()
158+
}
159+
}
160+
}

0 commit comments

Comments
 (0)