Skip to content

Commit 44991c2

Browse files
Support null and undefined interpolation
1 parent bc11c12 commit 44991c2

File tree

4 files changed

+47
-10
lines changed

4 files changed

+47
-10
lines changed

Diff for: src/swift/Sources/JavaScriptKit/JSValue.swift

+14
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ public enum JSValue: Equatable {
2121
case string(String)
2222
case number(Int32)
2323
case object(JSObjectRef)
24+
case null
25+
case undefined
2426
}
2527

2628
protocol JSValueConvertible {
@@ -60,6 +62,10 @@ extension RawJSValue: JSValueConvertible {
6062
return .string(string)
6163
case JavaScriptValueKind_Object:
6264
return .object(JSObjectRef(id: payload1))
65+
case JavaScriptValueKind_Null:
66+
return .null
67+
case JavaScriptValueKind_Undefined:
68+
return .undefined
6369
default:
6470
fatalError("unreachable")
6571
}
@@ -91,6 +97,14 @@ extension JSValue {
9197
kind = JavaScriptValueKind_Object
9298
payload1 = ref.id
9399
payload2 = 0
100+
case .null:
101+
kind = JavaScriptValueKind_Null
102+
payload1 = 0
103+
payload2 = 0
104+
case .undefined:
105+
kind = JavaScriptValueKind_Undefined
106+
payload1 = 0
107+
payload2 = 0
94108
}
95109
let rawValue = RawJSValue(kind: kind, payload1: payload1, payload2: payload2)
96110
return body(rawValue)

Diff for: src/swift/Sources/_CJavaScriptKit/include/_CJavaScriptKit.h

+8-7
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,14 @@
66
typedef unsigned int JavaScriptValueId;
77

88
typedef enum {
9-
JavaScriptValueKind_Invalid = -1,
10-
JavaScriptValueKind_Boolean = 0,
11-
JavaScriptValueKind_String = 1,
12-
JavaScriptValueKind_Number = 2,
13-
JavaScriptValueKind_Object = 3,
14-
JavaScriptValueKind_Null = 4,
15-
JavaScriptValueKind_Function = 5,
9+
JavaScriptValueKind_Invalid = -1,
10+
JavaScriptValueKind_Boolean = 0,
11+
JavaScriptValueKind_String = 1,
12+
JavaScriptValueKind_Number = 2,
13+
JavaScriptValueKind_Object = 3,
14+
JavaScriptValueKind_Null = 4,
15+
JavaScriptValueKind_Undefined = 5,
16+
JavaScriptValueKind_Function = 6,
1617
} JavaScriptValueKind;
1718

1819
typedef unsigned JavaScriptPayload;

Diff for: src/web/src/index.ts

+22-2
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,8 @@ enum JavaScriptValueKind {
1616
String = 1,
1717
Number = 2,
1818
Object = 3,
19-
Array = 4,
20-
Null = 5,
19+
Null = 4,
20+
Undefined = 5,
2121
Function = 6,
2222
}
2323

@@ -101,12 +101,25 @@ export class SwiftRuntime {
101101
case JavaScriptValueKind.Object: {
102102
return this._heapValues[payload1]
103103
}
104+
case JavaScriptValueKind.Null: {
105+
return null
106+
}
107+
case JavaScriptValueKind.Undefined: {
108+
return undefined
109+
}
104110
default:
105111
throw new Error(`Type kind "${kind}" is not supported`)
106112
}
107113
}
108114

109115
const encodeValue = (value: any) => {
116+
if (value === null) {
117+
return {
118+
kind: JavaScriptValueKind.Null,
119+
payload1: 0,
120+
payload2: 0,
121+
}
122+
}
110123
switch (typeof value) {
111124
case "boolean": {
112125
return {
@@ -129,6 +142,13 @@ export class SwiftRuntime {
129142
payload2: value.length,
130143
}
131144
}
145+
case "undefined": {
146+
return {
147+
kind: JavaScriptValueKind.Undefined,
148+
payload1: 0,
149+
payload2: 0,
150+
}
151+
}
132152
case "object": {
133153
return {
134154
kind: JavaScriptValueKind.Object,

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

+3-1
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,14 @@ Literal_Conversion: do {
99
.number(0),
1010
.number(.max),
1111
.number(.min),
12+
.null,
13+
.undefined,
1214
]
1315
for (index, input) in inputs.enumerated() {
1416
let prop = "prop_\(index)"
1517
setJSValue(this: global, name: prop, value: input)
1618
let got = getJSValue(this: global, name: prop)
17-
try expectEqual(input, got)
19+
try expectEqual(got, input)
1820
}
1921
} catch {
2022
print(error)

0 commit comments

Comments
 (0)