Skip to content

Commit 1719b8d

Browse files
Split files
1 parent 738d569 commit 1719b8d

File tree

3 files changed

+131
-124
lines changed

3 files changed

+131
-124
lines changed
Lines changed: 4 additions & 124 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
1+
import _CJavaScriptKit
2+
13
public class JSObjectRef: Equatable {
24
let id: UInt32
3-
fileprivate init(id: UInt32) {
5+
init(id: UInt32) {
46
self.id = id
57
}
68
public static func global() -> JSObjectRef {
@@ -19,7 +21,7 @@ public class JSObjectRef: Equatable {
1921
public class JSFunctionRef: Equatable {
2022
let id: UInt32
2123

22-
fileprivate init(id: UInt32) {
24+
init(id: UInt32) {
2325
self.id = id
2426
}
2527

@@ -38,98 +40,6 @@ public enum JSValue: Equatable {
3840
case function(JSFunctionRef)
3941
}
4042

41-
protocol JSValueConvertible {
42-
func jsValue() -> JSValue
43-
}
44-
45-
extension Bool: JSValueConvertible {
46-
func jsValue() -> JSValue {
47-
.boolean(self)
48-
}
49-
}
50-
51-
import _CJavaScriptKit
52-
53-
struct RawJSValue {
54-
var kind: JavaScriptValueKind = JavaScriptValueKind_Invalid
55-
var payload1: JavaScriptPayload = 0
56-
var payload2: JavaScriptPayload = 0
57-
}
58-
59-
extension RawJSValue: JSValueConvertible {
60-
func jsValue() -> JSValue {
61-
switch kind {
62-
case JavaScriptValueKind_Invalid:
63-
fatalError()
64-
case JavaScriptValueKind_Boolean:
65-
return .boolean(payload1 != 0)
66-
case JavaScriptValueKind_Number:
67-
return .number(Int32(bitPattern: payload1))
68-
case JavaScriptValueKind_String:
69-
// +1 for null terminator
70-
let buffer = malloc(Int(payload2 + 1))!.assumingMemoryBound(to: UInt8.self)
71-
defer { free(buffer) }
72-
_load_string(payload1 as JavaScriptValueId, buffer)
73-
buffer[Int(payload2)] = 0
74-
let string = String(decodingCString: UnsafePointer(buffer), as: UTF8.self)
75-
return .string(string)
76-
case JavaScriptValueKind_Object:
77-
return .object(JSObjectRef(id: payload1))
78-
case JavaScriptValueKind_Null:
79-
return .null
80-
case JavaScriptValueKind_Undefined:
81-
return .undefined
82-
case JavaScriptValueKind_Function:
83-
return .function(JSFunctionRef(id: payload1))
84-
default:
85-
fatalError("unreachable")
86-
}
87-
}
88-
}
89-
90-
extension JSValue {
91-
func withRawJSValue<T>(_ body: (RawJSValue) -> T) -> T {
92-
let kind: JavaScriptValueKind
93-
let payload1: JavaScriptPayload
94-
let payload2: JavaScriptPayload
95-
switch self {
96-
case let .boolean(boolValue):
97-
kind = JavaScriptValueKind_Boolean
98-
payload1 = boolValue ? 1 : 0
99-
payload2 = 0
100-
case let .number(numberValue):
101-
kind = JavaScriptValueKind_Number
102-
payload1 = JavaScriptPayload(bitPattern: numberValue)
103-
payload2 = 0
104-
case var .string(stringValue):
105-
kind = JavaScriptValueKind_String
106-
return stringValue.withUTF8 { bufferPtr in
107-
let ptrValue = UInt32(UInt(bitPattern: bufferPtr.baseAddress!))
108-
let rawValue = RawJSValue(kind: kind, payload1: ptrValue, payload2: JavaScriptPayload(bufferPtr.count))
109-
return body(rawValue)
110-
}
111-
case let .object(ref):
112-
kind = JavaScriptValueKind_Object
113-
payload1 = ref.id
114-
payload2 = 0
115-
case .null:
116-
kind = JavaScriptValueKind_Null
117-
payload1 = 0
118-
payload2 = 0
119-
case .undefined:
120-
kind = JavaScriptValueKind_Undefined
121-
payload1 = 0
122-
payload2 = 0
123-
case let .function(functionRef):
124-
kind = JavaScriptValueKind_Function
125-
payload1 = functionRef.id
126-
payload2 = 0
127-
}
128-
let rawValue = RawJSValue(kind: kind, payload1: payload1, payload2: payload2)
129-
return body(rawValue)
130-
}
131-
}
132-
13343
public func getJSValue(this: JSObjectRef, name: String) -> JSValue {
13444
var rawValue = RawJSValue()
13545
_get_prop(this.id, name, Int32(name.count),
@@ -162,33 +72,3 @@ public func setJSValue(this: JSObjectRef, index: Int32, value: JSValue) {
16272
}
16373
}
16474

165-
166-
#if Xcode
167-
func _set_prop(
168-
_ _this: JavaScriptValueId,
169-
_ prop: UnsafePointer<Int8>!, _ length: Int32,
170-
_ kind: JavaScriptValueKind,
171-
_ payload1: JavaScriptPayload,
172-
_ payload2: JavaScriptPayload) { fatalError() }
173-
func _get_prop(
174-
_ _this: JavaScriptValueId,
175-
_ prop: UnsafePointer<Int8>!, _ length: Int32,
176-
_ kind: UnsafeMutablePointer<JavaScriptValueKind>!,
177-
_ payload1: UnsafeMutablePointer<JavaScriptPayload>!,
178-
_ payload2: UnsafeMutablePointer<JavaScriptPayload>!) { fatalError() }
179-
func _set_subscript(
180-
_ _this: JavaScriptValueId,
181-
_ index: Int32,
182-
_ kind: JavaScriptValueKind,
183-
_ payload1: JavaScriptPayload,
184-
_ payload2: JavaScriptPayload) { fatalError() }
185-
func _get_subscript(
186-
_ _this: JavaScriptValueId,
187-
_ index: Int32,
188-
_ kind: UnsafeMutablePointer<JavaScriptValueKind>!,
189-
_ payload1: UnsafeMutablePointer<JavaScriptPayload>!,
190-
_ payload2: UnsafeMutablePointer<JavaScriptPayload>!) { fatalError() }
191-
func _load_string(
192-
_ ref: JavaScriptValueId,
193-
_ buffer: UnsafeMutablePointer<UInt8>!) { fatalError() }
194-
#endif
Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
import _CJavaScriptKit
2+
3+
protocol JSValueConvertible {
4+
func jsValue() -> JSValue
5+
}
6+
7+
extension Bool: JSValueConvertible {
8+
func jsValue() -> JSValue {
9+
.boolean(self)
10+
}
11+
}
12+
13+
struct RawJSValue {
14+
var kind: JavaScriptValueKind = JavaScriptValueKind_Invalid
15+
var payload1: JavaScriptPayload = 0
16+
var payload2: JavaScriptPayload = 0
17+
}
18+
19+
extension RawJSValue: JSValueConvertible {
20+
func jsValue() -> JSValue {
21+
switch kind {
22+
case JavaScriptValueKind_Invalid:
23+
fatalError()
24+
case JavaScriptValueKind_Boolean:
25+
return .boolean(payload1 != 0)
26+
case JavaScriptValueKind_Number:
27+
return .number(Int32(bitPattern: payload1))
28+
case JavaScriptValueKind_String:
29+
// +1 for null terminator
30+
let buffer = malloc(Int(payload2 + 1))!.assumingMemoryBound(to: UInt8.self)
31+
defer { free(buffer) }
32+
_load_string(payload1 as JavaScriptValueId, buffer)
33+
buffer[Int(payload2)] = 0
34+
let string = String(decodingCString: UnsafePointer(buffer), as: UTF8.self)
35+
return .string(string)
36+
case JavaScriptValueKind_Object:
37+
return .object(JSObjectRef(id: payload1))
38+
case JavaScriptValueKind_Null:
39+
return .null
40+
case JavaScriptValueKind_Undefined:
41+
return .undefined
42+
case JavaScriptValueKind_Function:
43+
return .function(JSFunctionRef(id: payload1))
44+
default:
45+
fatalError("unreachable")
46+
}
47+
}
48+
}
49+
50+
extension JSValue {
51+
func withRawJSValue<T>(_ body: (RawJSValue) -> T) -> T {
52+
let kind: JavaScriptValueKind
53+
let payload1: JavaScriptPayload
54+
let payload2: JavaScriptPayload
55+
switch self {
56+
case let .boolean(boolValue):
57+
kind = JavaScriptValueKind_Boolean
58+
payload1 = boolValue ? 1 : 0
59+
payload2 = 0
60+
case let .number(numberValue):
61+
kind = JavaScriptValueKind_Number
62+
payload1 = JavaScriptPayload(bitPattern: numberValue)
63+
payload2 = 0
64+
case var .string(stringValue):
65+
kind = JavaScriptValueKind_String
66+
return stringValue.withUTF8 { bufferPtr in
67+
let ptrValue = UInt32(UInt(bitPattern: bufferPtr.baseAddress!))
68+
let rawValue = RawJSValue(kind: kind, payload1: ptrValue, payload2: JavaScriptPayload(bufferPtr.count))
69+
return body(rawValue)
70+
}
71+
case let .object(ref):
72+
kind = JavaScriptValueKind_Object
73+
payload1 = ref.id
74+
payload2 = 0
75+
case .null:
76+
kind = JavaScriptValueKind_Null
77+
payload1 = 0
78+
payload2 = 0
79+
case .undefined:
80+
kind = JavaScriptValueKind_Undefined
81+
payload1 = 0
82+
payload2 = 0
83+
case let .function(functionRef):
84+
kind = JavaScriptValueKind_Function
85+
payload1 = functionRef.id
86+
payload2 = 0
87+
}
88+
let rawValue = RawJSValue(kind: kind, payload1: payload1, payload2: payload2)
89+
return body(rawValue)
90+
}
91+
}
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
import _CJavaScriptKit
2+
3+
/// Note:
4+
/// Define all runtime functions stub which are imported from JavaScript environment.
5+
/// SwiftPM doesn't support WebAssembly target yet, so we need to define them to
6+
/// avoid link failure.
7+
/// When running with JavaScript runtime library, they are ignored completely.
8+
#if Xcode
9+
func _set_prop(
10+
_ _this: JavaScriptValueId,
11+
_ prop: UnsafePointer<Int8>!, _ length: Int32,
12+
_ kind: JavaScriptValueKind,
13+
_ payload1: JavaScriptPayload,
14+
_ payload2: JavaScriptPayload) { fatalError() }
15+
func _get_prop(
16+
_ _this: JavaScriptValueId,
17+
_ prop: UnsafePointer<Int8>!, _ length: Int32,
18+
_ kind: UnsafeMutablePointer<JavaScriptValueKind>!,
19+
_ payload1: UnsafeMutablePointer<JavaScriptPayload>!,
20+
_ payload2: UnsafeMutablePointer<JavaScriptPayload>!) { fatalError() }
21+
func _set_subscript(
22+
_ _this: JavaScriptValueId,
23+
_ index: Int32,
24+
_ kind: JavaScriptValueKind,
25+
_ payload1: JavaScriptPayload,
26+
_ payload2: JavaScriptPayload) { fatalError() }
27+
func _get_subscript(
28+
_ _this: JavaScriptValueId,
29+
_ index: Int32,
30+
_ kind: UnsafeMutablePointer<JavaScriptValueKind>!,
31+
_ payload1: UnsafeMutablePointer<JavaScriptPayload>!,
32+
_ payload2: UnsafeMutablePointer<JavaScriptPayload>!) { fatalError() }
33+
func _load_string(
34+
_ ref: JavaScriptValueId,
35+
_ buffer: UnsafeMutablePointer<UInt8>!) { fatalError() }
36+
#endif

0 commit comments

Comments
 (0)