Skip to content

Commit d342639

Browse files
WIP
1 parent dadfc3d commit d342639

File tree

10 files changed

+74
-60
lines changed

10 files changed

+74
-60
lines changed

Diff for: IntegrationTests/JavaScriptKitExec/Sources/JavaScriptKitExec/UnitTestUtils.swift

+1-1
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ func expectBoolean(_ value: JSValue, file: StaticString = #file, line: UInt = #l
4646
}
4747
}
4848

49-
func expectNumber(_ value: JSValue, file: StaticString = #file, line: UInt = #line, column: UInt = #column) throws -> Int32 {
49+
func expectNumber(_ value: JSValue, file: StaticString = #file, line: UInt = #line, column: UInt = #column) throws -> Double {
5050
switch value {
5151
case .number(let number): return number
5252
default:

Diff for: IntegrationTests/JavaScriptKitExec/Sources/JavaScriptKitExec/main.swift

+2-2
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@ Literal_Conversion: do {
88
.string("foobar"),
99
.string("👨‍👩‍👧‍👧 Family Emoji"),
1010
.number(0),
11-
.number(.max),
12-
.number(.min),
11+
.number(Double(Int32.max)),
12+
.number(Double(Int32.min)),
1313
.null,
1414
.undefined,
1515
]

Diff for: Runtime/src/index.ts

+22-20
Original file line numberDiff line numberDiff line change
@@ -102,8 +102,8 @@ export class SwiftRuntime {
102102
const argv = exports.swjs_prepare_host_function_call(argc)
103103
for (let index = 0; index < args.length; index++) {
104104
const argument = args[index]
105-
const base = argv + 16 * index
106-
writeValue(argument, base, base + 4, base + 12)
105+
const base = argv + 20 * index
106+
writeValue(argument, base, base + 4, base + 8, base + 12)
107107
}
108108
let output: any;
109109
const callback_func_ref = this.heap.allocHeap(function (result: any) {
@@ -159,7 +159,7 @@ export class SwiftRuntime {
159159

160160
const decodeValue = (
161161
kind: JavaScriptValueKind,
162-
payload1_ptr: pointer, payload2_ptr: pointer
162+
payload1_ptr: pointer, payload2_ptr: pointer, payload3_ptr: pointer
163163
) => {
164164
switch (kind) {
165165
case JavaScriptValueKind.Boolean: {
@@ -169,7 +169,7 @@ export class SwiftRuntime {
169169
}
170170
}
171171
case JavaScriptValueKind.Number: {
172-
return readFloat64(payload1_ptr);
172+
return readFloat64(payload3_ptr);
173173
}
174174
case JavaScriptValueKind.String: {
175175
return readString(readUInt32(payload1_ptr), readUInt32(payload2_ptr))
@@ -193,7 +193,7 @@ export class SwiftRuntime {
193193

194194
const writeValue = (
195195
value: any, kind_ptr: pointer,
196-
payload1_ptr: pointer, payload2_ptr: pointer
196+
payload1_ptr: pointer, payload2_ptr: pointer, payload3_ptr: pointer
197197
) => {
198198
if (value === null) {
199199
writeUint32(kind_ptr, JavaScriptValueKind.Null);
@@ -209,8 +209,9 @@ export class SwiftRuntime {
209209
}
210210
case "number": {
211211
writeUint32(kind_ptr, JavaScriptValueKind.Number);
212-
writeFloat64(payload1_ptr, value);
212+
writeUint32(payload1_ptr, 0);
213213
writeUint32(payload2_ptr, 0);
214+
writeFloat64(payload3_ptr, value);
214215
break;
215216
}
216217
case "string": {
@@ -253,8 +254,9 @@ export class SwiftRuntime {
253254
const base = ptr + 16 * index
254255
const kind = readUInt32(base)
255256
const payload1 = readFloat64(base + 4)
256-
const payload2 = readUInt32(base + 12)
257-
result.push(decodeValue(kind, payload1, payload2))
257+
const payload2 = readUInt32(base + 8)
258+
const payload3 = readUInt32(base + 12)
259+
result.push(decodeValue(kind, payload1, payload2, payload3))
258260
}
259261
return result
260262
}
@@ -263,36 +265,36 @@ export class SwiftRuntime {
263265
swjs_set_prop: (
264266
ref: ref, name: pointer, length: number,
265267
kind: JavaScriptValueKind,
266-
payload1: number, payload2: number
268+
payload1: number, payload2: number, payload3: number
267269
) => {
268270
const obj = this.heap.referenceHeap(ref);
269-
Reflect.set(obj, readString(name, length), decodeValue(kind, payload1, payload2))
271+
Reflect.set(obj, readString(name, length), decodeValue(kind, payload1, payload2, payload3))
270272
},
271273
swjs_get_prop: (
272274
ref: ref, name: pointer, length: number,
273275
kind_ptr: pointer,
274-
payload1_ptr: pointer, payload2_ptr: pointer
276+
payload1_ptr: pointer, payload2_ptr: pointer, payload3_ptr: number
275277
) => {
276278
const obj = this.heap.referenceHeap(ref);
277279
const result = Reflect.get(obj, readString(name, length));
278-
writeValue(result, kind_ptr, payload1_ptr, payload2_ptr);
280+
writeValue(result, kind_ptr, payload1_ptr, payload2_ptr, payload3_ptr);
279281
},
280282
swjs_set_subscript: (
281283
ref: ref, index: number,
282284
kind: JavaScriptValueKind,
283-
payload1: number, payload2: number
285+
payload1: number, payload2: number, payload3: number
284286
) => {
285287
const obj = this.heap.referenceHeap(ref);
286-
Reflect.set(obj, index, decodeValue(kind, payload1, payload2))
288+
Reflect.set(obj, index, decodeValue(kind, payload1, payload2, payload3))
287289
},
288290
swjs_get_subscript: (
289291
ref: ref, index: number,
290292
kind_ptr: pointer,
291-
payload1_ptr: pointer, payload2_ptr: pointer
293+
payload1_ptr: pointer, payload2_ptr: pointer, payload3_ptr: pointer
292294
) => {
293295
const obj = this.heap.referenceHeap(ref);
294296
const result = Reflect.get(obj, index);
295-
writeValue(result, kind_ptr, payload1_ptr, payload2_ptr);
297+
writeValue(result, kind_ptr, payload1_ptr, payload2_ptr, payload3_ptr);
296298
},
297299
swjs_load_string: (ref: ref, buffer: pointer) => {
298300
const string = this.heap.referenceHeap(ref);
@@ -301,22 +303,22 @@ export class SwiftRuntime {
301303
swjs_call_function: (
302304
ref: ref, argv: pointer, argc: number,
303305
kind_ptr: pointer,
304-
payload1_ptr: pointer, payload2_ptr: pointer
306+
payload1_ptr: pointer, payload2_ptr: pointer, payload3_ptr: pointer
305307
) => {
306308
const func = this.heap.referenceHeap(ref)
307309
const result = Reflect.apply(func, undefined, decodeValues(argv, argc))
308-
writeValue(result, kind_ptr, payload1_ptr, payload2_ptr);
310+
writeValue(result, kind_ptr, payload1_ptr, payload2_ptr, payload3_ptr);
309311
},
310312
swjs_call_function_with_this: (
311313
obj_ref: ref, func_ref: ref,
312314
argv: pointer, argc: number,
313315
kind_ptr: pointer,
314-
payload1_ptr: pointer, payload2_ptr: pointer
316+
payload1_ptr: pointer, payload2_ptr: pointer, payload3_ptr: pointer
315317
) => {
316318
const obj = this.heap.referenceHeap(obj_ref)
317319
const func = this.heap.referenceHeap(func_ref)
318320
const result = Reflect.apply(func, obj, decodeValues(argv, argc))
319-
writeValue(result, kind_ptr, payload1_ptr, payload2_ptr);
321+
writeValue(result, kind_ptr, payload1_ptr, payload2_ptr, payload3_ptr);
320322
},
321323
swjs_create_function: (
322324
host_func_id: number,

Diff for: Sources/JavaScriptKit/JSArray.swift

+1-1
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ extension JSArray: Sequence {
3131
}
3232
public func next() -> Element? {
3333
defer { index += 1 }
34-
guard index < ref.length.number! else {
34+
guard index < Int(ref.length.number!) else {
3535
return nil
3636
}
3737
let value = ref.get(index)

Diff for: Sources/JavaScriptKit/JSFunction.swift

+2-2
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ public class JSFunctionRef: JSObjectRef {
1212
var result = RawJSValue()
1313
_call_function(
1414
self.id, argv, Int32(argc),
15-
&result.kind, &result.payload1, &result.payload2
15+
&result.kind, &result.payload1, &result.payload2, &result.payload3
1616
)
1717
return result
1818
}
@@ -31,7 +31,7 @@ public class JSFunctionRef: JSObjectRef {
3131
var result = RawJSValue()
3232
_call_function_with_this(this.id,
3333
self.id, argv, Int32(argc),
34-
&result.kind, &result.payload1, &result.payload2
34+
&result.kind, &result.payload1, &result.payload2, &result.payload3
3535
)
3636
return result
3737
}

Diff for: Sources/JavaScriptKit/JSValue.swift

+7-7
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import _CJavaScriptKit
33
public enum JSValue: Equatable {
44
case boolean(Bool)
55
case string(String)
6-
case number(Int32)
6+
case number(Double)
77
case object(JSObjectRef)
88
case null
99
case undefined
@@ -22,7 +22,7 @@ public enum JSValue: Equatable {
2222
default: return nil
2323
}
2424
}
25-
public var number: Int32? {
25+
public var number: Double? {
2626
switch self {
2727
case let .number(number): return number
2828
default: return nil
@@ -60,7 +60,7 @@ extension JSValue: ExpressibleByStringLiteral {
6060
}
6161

6262
extension JSValue: ExpressibleByIntegerLiteral {
63-
public init(integerLiteral value: Int32) {
63+
public init(integerLiteral value: Double) {
6464
self = .number(value)
6565
}
6666
}
@@ -69,13 +69,13 @@ public func getJSValue(this: JSObjectRef, name: String) -> JSValue {
6969
var rawValue = RawJSValue()
7070
_get_prop(this.id, name, Int32(name.count),
7171
&rawValue.kind,
72-
&rawValue.payload1, &rawValue.payload2)
72+
&rawValue.payload1, &rawValue.payload2, &rawValue.payload3)
7373
return rawValue.jsValue()
7474
}
7575

7676
public func setJSValue(this: JSObjectRef, name: String, value: JSValue) {
7777
value.withRawJSValue { rawValue in
78-
_set_prop(this.id, name, Int32(name.count), rawValue.kind, rawValue.payload1, rawValue.payload2)
78+
_set_prop(this.id, name, Int32(name.count), rawValue.kind, rawValue.payload1, rawValue.payload2, rawValue.payload3)
7979
}
8080
}
8181

@@ -84,7 +84,7 @@ public func getJSValue(this: JSObjectRef, index: Int32) -> JSValue {
8484
var rawValue = RawJSValue()
8585
_get_subscript(this.id, index,
8686
&rawValue.kind,
87-
&rawValue.payload1, &rawValue.payload2)
87+
&rawValue.payload1, &rawValue.payload2, &rawValue.payload3)
8888
return rawValue.jsValue()
8989
}
9090

@@ -93,7 +93,7 @@ public func setJSValue(this: JSObjectRef, index: Int32, value: JSValue) {
9393
value.withRawJSValue { rawValue in
9494
_set_subscript(this.id, index,
9595
rawValue.kind,
96-
rawValue.payload1, rawValue.payload2)
96+
rawValue.payload1, rawValue.payload2, rawValue.payload3)
9797
}
9898
}
9999

Diff for: Sources/JavaScriptKit/JSValueConstructible.swift

+3-5
Original file line numberDiff line numberDiff line change
@@ -16,15 +16,13 @@ extension String: JSValueConstructible {
1616

1717
extension Double: JSValueConstructible {
1818
public static func construct(from value: JSValue) -> Double? {
19-
guard let rawNumber: Int32 = value.number else { return nil }
20-
return Double(bitPattern: UInt64(bitPattern: Int64(rawNumber)))
19+
return value.number
2120
}
2221
}
2322

2423
extension Float: JSValueConstructible {
2524
public static func construct(from value: JSValue) -> Float? {
26-
guard let rawNumber: Int32 = value.number else { return nil }
27-
return Float(bitPattern: UInt32(bitPattern: rawNumber))
25+
return value.number.map(Float.init)
2826
}
2927
}
3028

@@ -48,7 +46,7 @@ extension Int16: JSValueConstructible {
4846

4947
extension Int32: JSValueConstructible {
5048
public static func construct(from value: JSValue) -> Self? {
51-
value.number
49+
value.number.map(Self.init)
5250
}
5351
}
5452

Diff for: Sources/JavaScriptKit/JSValueConvertible.swift

+9-9
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ extension Bool: JSValueConvertible {
1313
}
1414

1515
extension Int: JSValueConvertible {
16-
public func jsValue() -> JSValue { .number(Int32(self)) }
16+
public func jsValue() -> JSValue { .number(Double(self)) }
1717
}
1818

1919
extension String: JSValueConvertible {
@@ -69,8 +69,7 @@ extension RawJSValue: JSValueConvertible {
6969
case JavaScriptValueKind_Boolean:
7070
return .boolean(payload1 != 0)
7171
case JavaScriptValueKind_Number:
72-
fatalError("unimplemented yet")
73-
// return .number(Int32(bitPattern: payload1))
72+
return .number(payload3)
7473
case JavaScriptValueKind_String:
7574
// +1 for null terminator
7675
let buffer = malloc(Int(payload2 + 1))!.assumingMemoryBound(to: UInt8.self)
@@ -98,21 +97,22 @@ extension JSValue {
9897
let kind: JavaScriptValueKind
9998
let payload1: JavaScriptPayload1
10099
let payload2: JavaScriptPayload2
100+
var payload3: JavaScriptPayload3 = 0
101101
switch self {
102102
case let .boolean(boolValue):
103103
kind = JavaScriptValueKind_Boolean
104104
payload1 = boolValue ? 1 : 0
105105
payload2 = 0
106106
case let .number(numberValue):
107-
fatalError("unimplemented yet")
108-
// kind = JavaScriptValueKind_Number
109-
// payload1 = JavaScriptPayload1(bitPattern: numberValue)
110-
// payload2 = 0
107+
kind = JavaScriptValueKind_Number
108+
payload1 = 0
109+
payload2 = 0
110+
payload3 = numberValue
111111
case var .string(stringValue):
112112
kind = JavaScriptValueKind_String
113113
return stringValue.withUTF8 { bufferPtr in
114114
let ptrValue = UInt32(UInt(bitPattern: bufferPtr.baseAddress!))
115-
let rawValue = RawJSValue(kind: kind, payload1: JavaScriptPayload1(ptrValue), payload2: JavaScriptPayload2(bufferPtr.count))
115+
let rawValue = RawJSValue(kind: kind, payload1: JavaScriptPayload1(ptrValue), payload2: JavaScriptPayload2(bufferPtr.count), payload3: 0)
116116
return body(rawValue)
117117
}
118118
case let .object(ref):
@@ -132,7 +132,7 @@ extension JSValue {
132132
payload1 = JavaScriptPayload1(functionRef.id)
133133
payload2 = 0
134134
}
135-
let rawValue = RawJSValue(kind: kind, payload1: payload1, payload2: payload2)
135+
let rawValue = RawJSValue(kind: kind, payload1: payload1, payload2: payload2, payload3: payload3)
136136
return body(rawValue)
137137
}
138138
}

Diff for: Sources/JavaScriptKit/XcodeSupport.swift

+12-6
Original file line numberDiff line numberDiff line change
@@ -11,25 +11,29 @@ func _set_prop(
1111
_ prop: UnsafePointer<Int8>!, _ length: Int32,
1212
_ kind: JavaScriptValueKind,
1313
_ payload1: JavaScriptPayload1,
14-
_ payload2: JavaScriptPayload2) { fatalError() }
14+
_ payload2: JavaScriptPayload2,
15+
_ payload3: JavaScriptPayload3) { fatalError() }
1516
func _get_prop(
1617
_ _this: JavaScriptObjectRef,
1718
_ prop: UnsafePointer<Int8>!, _ length: Int32,
1819
_ kind: UnsafeMutablePointer<JavaScriptValueKind>!,
1920
_ payload1: UnsafeMutablePointer<JavaScriptPayload1>!,
20-
_ payload2: UnsafeMutablePointer<JavaScriptPayload2>!) { fatalError() }
21+
_ payload2: UnsafeMutablePointer<JavaScriptPayload2>!,
22+
_ payload3: UnsafeMutablePointer<JavaScriptPayload3>!) { fatalError() }
2123
func _set_subscript(
2224
_ _this: JavaScriptObjectRef,
2325
_ index: Int32,
2426
_ kind: JavaScriptValueKind,
2527
_ payload1: JavaScriptPayload1,
26-
_ payload2: JavaScriptPayload2) { fatalError() }
28+
_ payload2: JavaScriptPayload2,
29+
_ payload3: JavaScriptPayload3) { fatalError() }
2730
func _get_subscript(
2831
_ _this: JavaScriptObjectRef,
2932
_ index: Int32,
3033
_ kind: UnsafeMutablePointer<JavaScriptValueKind>!,
3134
_ payload1: UnsafeMutablePointer<JavaScriptPayload1>!,
32-
_ payload2: UnsafeMutablePointer<JavaScriptPayload2>!) { fatalError() }
35+
_ payload2: UnsafeMutablePointer<JavaScriptPayload2>!,
36+
_ payload3: UnsafeMutablePointer<JavaScriptPayload3>!) { fatalError() }
3337
func _load_string(
3438
_ ref: JavaScriptObjectRef,
3539
_ buffer: UnsafeMutablePointer<UInt8>!) { fatalError() }
@@ -38,14 +42,16 @@ func _call_function(
3842
_ argv: UnsafePointer<RawJSValue>!, _ argc: Int32,
3943
_ result_kind: UnsafeMutablePointer<JavaScriptValueKind>!,
4044
_ result_payload1: UnsafeMutablePointer<JavaScriptPayload1>!,
41-
_ result_payload2: UnsafeMutablePointer<JavaScriptPayload2>!) { fatalError() }
45+
_ result_payload2: UnsafeMutablePointer<JavaScriptPayload2>!,
46+
_ result_payload3: UnsafeMutablePointer<JavaScriptPayload3>!) { fatalError() }
4247
func _call_function_with_this(
4348
_ _this: JavaScriptObjectRef,
4449
_ func_ref: JavaScriptObjectRef,
4550
_ argv: UnsafePointer<RawJSValue>!, _ argc: Int32,
4651
_ result_kind: UnsafeMutablePointer<JavaScriptValueKind>!,
4752
_ result_payload1: UnsafeMutablePointer<JavaScriptPayload1>!,
48-
_ result_payload2: UnsafeMutablePointer<JavaScriptPayload2>!) { fatalError() }
53+
_ result_payload2: UnsafeMutablePointer<JavaScriptPayload2>!,
54+
_ result_payload3: UnsafeMutablePointer<JavaScriptPayload3>!) { fatalError() }
4955
func _call_new(
5056
_ ref: JavaScriptObjectRef,
5157
_ argv: UnsafePointer<RawJSValue>!, _ argc: Int32,

0 commit comments

Comments
 (0)