Skip to content

Commit c29cc45

Browse files
Support Number interpolation
1 parent 9349cad commit c29cc45

File tree

4 files changed

+70
-35
lines changed

4 files changed

+70
-35
lines changed

src/swift/Sources/JavaScriptKit/JSValue.swift

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ public class JSRef: Equatable {
1919
public enum JSValue: Equatable {
2020
case boolean(Bool)
2121
case string(String)
22+
case number(Int32)
2223
case object(JSRef)
2324
}
2425

@@ -44,6 +45,8 @@ public func getJSValue(this: JSRef, name: String) -> JSValue {
4445
fatalError()
4546
case JavaScriptValueKind_Boolean:
4647
return .boolean(payload1 != 0)
48+
case JavaScriptValueKind_Number:
49+
return .number(Int32(bitPattern: payload1))
4750
case JavaScriptValueKind_String:
4851
let buffer = malloc(Int(payload2))!.assumingMemoryBound(to: UInt8.self)
4952
_load_string(payload1 as JavaScriptValueId, buffer)
@@ -66,6 +69,10 @@ public func setJSValue(this: JSRef, name: String, value: JSValue) {
6669
kind = JavaScriptValueKind_Boolean
6770
payload1 = boolValue ? 1 : 0
6871
payload2 = 0
72+
case let .number(numberValue):
73+
kind = JavaScriptValueKind_Number
74+
payload1 = JavaScriptPayload(bitPattern: numberValue)
75+
payload2 = 0
6976
case var .string(stringValue):
7077
kind = JavaScriptValueKind_String
7178
stringValue.withUTF8 { bufferPtr in

src/web/src/index.ts

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -75,10 +75,10 @@ export class SwiftRuntime {
7575

7676
const writeUint32 = (ptr: pointer, value: number) => {
7777
const uint8Memory = new Uint8Array(memory().buffer);
78-
uint8Memory[ptr + 0] = value & 0x000000ff
79-
uint8Memory[ptr + 1] = value & 0x0000ff00
80-
uint8Memory[ptr + 2] = value & 0x00ff0000
81-
uint8Memory[ptr + 3] = value & 0xff000000
78+
uint8Memory[ptr + 0] = (value & 0x000000ff) >> 0
79+
uint8Memory[ptr + 1] = (value & 0x0000ff00) >> 8
80+
uint8Memory[ptr + 2] = (value & 0x00ff0000) >> 16
81+
uint8Memory[ptr + 3] = (value & 0xff000000) >> 24
8282
}
8383

8484
const decodeValue = (
@@ -92,6 +92,9 @@ export class SwiftRuntime {
9292
case 1: return true
9393
}
9494
}
95+
case JavaScriptValueKind.Number: {
96+
return payload1
97+
}
9598
case JavaScriptValueKind.String: {
9699
return readString(payload1, payload2)
97100
}
@@ -105,12 +108,20 @@ export class SwiftRuntime {
105108

106109
const encodeValue = (value: any) => {
107110
switch (typeof value) {
108-
case "boolean":
111+
case "boolean": {
109112
return {
110113
kind: JavaScriptValueKind.Boolean,
111114
payload1: value ? 1 : 0,
112115
payload2: 0,
113116
}
117+
}
118+
case "number": {
119+
return {
120+
kind: JavaScriptValueKind.Number,
121+
payload1: value,
122+
payload2: 0,
123+
}
124+
}
114125
case "string": {
115126
return {
116127
kind: JavaScriptValueKind.String,
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
import JavaScriptKit
2+
3+
struct MessageError: Error {
4+
let message: String
5+
init(_ message: String) {
6+
self.message = message
7+
}
8+
}
9+
10+
func expectEqual<T: Equatable>(_ lhs: T, _ rhs: T) throws {
11+
if lhs != rhs {
12+
throw MessageError("Expect to be equal \"\(lhs)\" and \"\(rhs)\"")
13+
}
14+
}
15+
16+
func expectObject(_ value: JSValue) throws -> JSRef {
17+
switch value {
18+
case .object(let ref): return ref
19+
default:
20+
throw MessageError("Type of \(value) should be \"object\"")
21+
}
22+
}
23+
24+
func expectBoolean(_ value: JSValue) throws -> Bool {
25+
switch value {
26+
case .boolean(let bool): return bool
27+
default:
28+
throw MessageError("Type of \(value) should be \"boolean\"")
29+
}
30+
}
31+
32+
func expectNumber(_ value: JSValue) throws -> Int32 {
33+
switch value {
34+
case .number(let number): return number
35+
default:
36+
throw MessageError("Type of \(value) should be \"boolean\"")
37+
}
38+
}

test/JavaScriptKitExec/Sources/JavaScriptKitExec/main.swift

Lines changed: 9 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,40 +1,14 @@
11
import JavaScriptKit
22

3-
struct MessageError: Error {
4-
let message: String
5-
init(_ message: String) {
6-
self.message = message
7-
}
8-
}
9-
10-
func expectEqual<T: Equatable>(_ lhs: T, _ rhs: T) throws {
11-
if lhs != rhs {
12-
throw MessageError("Expect to be equal \"\(lhs)\" and \"\(rhs)\"")
13-
}
14-
}
15-
16-
func expectObject(_ value: JSValue) throws -> JSRef {
17-
switch value {
18-
case .object(let ref): return ref
19-
default:
20-
throw MessageError("Type of \(value) should be \"object\"")
21-
}
22-
}
23-
24-
func expectBoolean(_ value: JSValue) throws -> Bool {
25-
switch value {
26-
case .boolean(let bool): return bool
27-
default:
28-
throw MessageError("Type of \(value) should be \"boolean\"")
29-
}
30-
}
31-
323
Literal_Conversion: do {
334
let global = JSRef.global()
345
let inputs: [JSValue] = [
356
.boolean(true),
367
.boolean(false),
378
.string("foobar"),
9+
.number(0),
10+
.number(.max),
11+
.number(.min),
3812
]
3913
for (index, input) in inputs.enumerated() {
4014
let prop = "prop_\(index)"
@@ -62,7 +36,12 @@ Object_Conversion: do {
6236

6337
let globalObject1 = getJSValue(this: .global(), name: "globalObject1")
6438
let globalObject1Ref = try expectObject(globalObject1)
65-
_ = try expectObject(getJSValue(this: globalObject1Ref, name: "prop_1"))
39+
let prop_1 = getJSValue(this: globalObject1Ref, name: "prop_1")
40+
let prop_1Ref = try expectObject(prop_1)
41+
let nested_prop = getJSValue(this: prop_1Ref, name: "nested_prop")
42+
try expectEqual(nested_prop, .number(1))
43+
let prop_2 = getJSValue(this: globalObject1Ref, name: "prop_2")
44+
try expectEqual(prop_2, .number(2))
6645
let prop_3 = getJSValue(this: globalObject1Ref, name: "prop_3")
6746
try expectEqual(prop_3, .boolean(true))
6847
} catch {

0 commit comments

Comments
 (0)