Skip to content

Commit 8f0a154

Browse files
committed
- Defined _JS_Predef_Value_Global as an external symbol.
- Switched to passing a RawJSValue pointers. - Added _instance_of function. - Added _copy_typed_array_content function. - Switched to using DataView to write memory. - Switched to using Double instead of Int32 in JSValue.
1 parent 4df1d54 commit 8f0a154

File tree

8 files changed

+211
-196
lines changed

8 files changed

+211
-196
lines changed

Runtime/src/index.ts

+114-123
Large diffs are not rendered by default.

Sources/JavaScriptKit/JSFunction.swift

+6-6
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@ public class JSFunctionRef: JSObjectRef {
1111
let argc = bufferPointer.count
1212
var result = RawJSValue()
1313
_call_function(
14-
self.id, argv, Int32(argc),
15-
&result.kind, &result.payload1, &result.payload2
14+
self._id, argv, Int32(argc),
15+
&result
1616
)
1717
return result
1818
}
@@ -29,9 +29,9 @@ public class JSFunctionRef: JSObjectRef {
2929
let argv = bufferPointer.baseAddress
3030
let argc = bufferPointer.count
3131
var result = RawJSValue()
32-
_call_function_with_this(this.id,
33-
self.id, argv, Int32(argc),
34-
&result.kind, &result.payload1, &result.payload2
32+
_call_function_with_this(this._id,
33+
self._id, argv, Int32(argc),
34+
&result
3535
)
3636
return result
3737
}
@@ -46,7 +46,7 @@ public class JSFunctionRef: JSObjectRef {
4646
let argc = bufferPointer.count
4747
var resultObj = JavaScriptPayload()
4848
_call_new(
49-
self.id, argv, Int32(argc),
49+
self._id, argv, Int32(argc),
5050
&resultObj
5151
)
5252
return JSObjectRef(id: resultObj)

Sources/JavaScriptKit/JSObject.swift

+36-13
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@ import _CJavaScriptKit
22

33
@dynamicMemberLookup
44
public class JSObjectRef: Equatable {
5-
let id: UInt32
6-
init(id: UInt32) {
7-
self.id = id
5+
public let _id: UInt32
6+
public init(id: UInt32) {
7+
self._id = id
88
}
99

1010
public subscript(dynamicMember name: String) -> ((JSValueConvertible...) -> JSValue)? {
@@ -17,40 +17,63 @@ public class JSObjectRef: Equatable {
1717
}
1818

1919
public subscript(dynamicMember name: String) -> JSValue {
20-
get { get(name) }
21-
set { set(name, newValue) }
20+
get { js_get(name) }
21+
set { js_set(name, newValue) }
2222
}
2323

24-
public func get(_ name: String) -> JSValue {
24+
public subscript<Type: JSValueEncodable & JSValueDecodable>(dynamicMember name: String) -> Type {
25+
get { js_get(name).fromJSValue() }
26+
set { js_set(name, newValue.jsValue()) }
27+
}
28+
29+
func js_get(_ name: String) -> JSValue {
2530
getJSValue(this: self, name: name)
2631
}
2732

28-
public func set(_ name: String, _ value: JSValue) {
33+
func js_set(_ name: String, _ value: JSValue) {
2934
setJSValue(this: self, name: name, value: value)
3035
}
3136

32-
public func get(_ index: Int) -> JSValue {
37+
func js_get(_ index: Int) -> JSValue {
3338
getJSValue(this: self, index: Int32(index))
3439
}
3540

3641
public subscript(_ index: Int) -> JSValue {
37-
get { get(index) }
38-
set { set(index, newValue) }
42+
get { js_get(index) }
43+
set { js_set(index, newValue) }
3944
}
4045

41-
public func set(_ index: Int, _ value: JSValue) {
46+
func js_set(_ index: Int, _ value: JSValue) {
4247
setJSValue(this: self, index: Int32(index), value: value)
4348
}
4449

50+
public func instanceOf(_ constructor: String) -> Bool {
51+
var result = RawJSValue()
52+
_instance_of(_id, constructor, Int32(constructor.count), &result)
53+
54+
return result.jsValue().fromJSValue()
55+
}
56+
4557
public static let global = JSObjectRef(id: _JS_Predef_Value_Global)
4658

47-
deinit { _destroy_ref(id) }
59+
deinit { _destroy_ref(_id) }
4860

4961
public static func == (lhs: JSObjectRef, rhs: JSObjectRef) -> Bool {
50-
return lhs.id == rhs.id
62+
return lhs._id == rhs._id
63+
}
5164
}
5265

5366
public func jsValue() -> JSValue {
5467
.object(self)
5568
}
5669
}
70+
71+
extension JSObjectRef {
72+
73+
public func copyTypedArrayContent<Type>(_ array: [Type]) {
74+
75+
array.withUnsafeBufferPointer { (ptr) in
76+
_copy_typed_array_content(_id, ptr.baseAddress, Int32(array.count))
77+
}
78+
}
79+
}

Sources/JavaScriptKit/JSValue.swift

+8-13
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
@@ -58,33 +58,28 @@ extension JSValue: ExpressibleByIntegerLiteral {
5858

5959
public func getJSValue(this: JSObjectRef, name: String) -> JSValue {
6060
var rawValue = RawJSValue()
61-
_get_prop(this.id, name, Int32(name.count),
62-
&rawValue.kind,
63-
&rawValue.payload1, &rawValue.payload2)
61+
_get_prop(this._id, name, Int32(name.count), &rawValue)
6462
return rawValue.jsValue()
6563
}
6664

6765
public func setJSValue(this: JSObjectRef, name: String, value: JSValue) {
6866
value.withRawJSValue { rawValue in
69-
_set_prop(this.id, name, Int32(name.count), rawValue.kind, rawValue.payload1, rawValue.payload2)
67+
_set_prop(this._id, name, Int32(name.count), &rawValue)
7068
}
7169
}
7270

73-
7471
public func getJSValue(this: JSObjectRef, index: Int32) -> JSValue {
7572
var rawValue = RawJSValue()
76-
_get_subscript(this.id, index,
77-
&rawValue.kind,
78-
&rawValue.payload1, &rawValue.payload2)
73+
_get_subscript(this._id, index, &rawValue)
7974
return rawValue.jsValue()
8075
}
8176

8277

8378
public func setJSValue(this: JSObjectRef, index: Int32, value: JSValue) {
8479
value.withRawJSValue { rawValue in
85-
_set_subscript(this.id, index,
86-
rawValue.kind,
87-
rawValue.payload1, rawValue.payload2)
80+
_set_subscript(this._id, index, &rawValue)
81+
}
82+
}
8883
}
8984
}
9085

Sources/JavaScriptKit/JSValueConvertible.swift

+10-10
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ extension RawJSValue: JSValueConvertible {
6969
case JavaScriptValueKind_Boolean:
7070
return .boolean(payload1 != 0)
7171
case JavaScriptValueKind_Number:
72-
return .number(Int32(bitPattern: payload1))
72+
return .number(Double(bitPattern: UInt64(payload1) | (UInt64(payload2) << 32)))
7373
case JavaScriptValueKind_String:
7474
// +1 for null terminator
7575
let buffer = malloc(Int(payload2 + 1))!.assumingMemoryBound(to: UInt8.self)
@@ -93,7 +93,7 @@ extension RawJSValue: JSValueConvertible {
9393
}
9494

9595
extension JSValue {
96-
func withRawJSValue<T>(_ body: (RawJSValue) -> T) -> T {
96+
func withRawJSValue<T>(_ body: (inout RawJSValue) -> T) -> T {
9797
let kind: JavaScriptValueKind
9898
let payload1: JavaScriptPayload
9999
let payload2: JavaScriptPayload
@@ -104,18 +104,18 @@ extension JSValue {
104104
payload2 = 0
105105
case let .number(numberValue):
106106
kind = JavaScriptValueKind_Number
107-
payload1 = JavaScriptPayload(bitPattern: numberValue)
108-
payload2 = 0
107+
payload1 = UInt32(numberValue.bitPattern & 0x00000000ffffffff)
108+
payload2 = UInt32((numberValue.bitPattern & 0xffffffff00000000) >> 32)
109109
case var .string(stringValue):
110110
kind = JavaScriptValueKind_String
111111
return stringValue.withUTF8 { bufferPtr in
112112
let ptrValue = UInt32(UInt(bitPattern: bufferPtr.baseAddress!))
113-
let rawValue = RawJSValue(kind: kind, payload1: ptrValue, payload2: JavaScriptPayload(bufferPtr.count))
114-
return body(rawValue)
113+
var rawValue = RawJSValue(kind: kind, payload1: ptrValue, payload2: JavaScriptPayload(bufferPtr.count))
114+
return body(&rawValue)
115115
}
116116
case let .object(ref):
117117
kind = JavaScriptValueKind_Object
118-
payload1 = ref.id
118+
payload1 = ref._id
119119
payload2 = 0
120120
case .null:
121121
kind = JavaScriptValueKind_Null
@@ -127,11 +127,11 @@ extension JSValue {
127127
payload2 = 0
128128
case let .function(functionRef):
129129
kind = JavaScriptValueKind_Function
130-
payload1 = functionRef.id
130+
payload1 = functionRef._id
131131
payload2 = 0
132132
}
133-
let rawValue = RawJSValue(kind: kind, payload1: payload1, payload2: payload2)
134-
return body(rawValue)
133+
var rawValue = RawJSValue(kind: kind, payload1: payload1, payload2: payload2)
134+
return body(&rawValue)
135135
}
136136
}
137137

Sources/JavaScriptKit/XcodeSupport.swift

+9-12
Original file line numberDiff line numberDiff line change
@@ -9,27 +9,19 @@ import _CJavaScriptKit
99
func _set_prop(
1010
_ _this: JavaScriptObjectRef,
1111
_ prop: UnsafePointer<Int8>!, _ length: Int32,
12-
_ kind: JavaScriptValueKind,
13-
_ payload1: JavaScriptPayload,
14-
_ payload2: JavaScriptPayload) { fatalError() }
12+
_ rawJSValue: UnsafePointer<RawJSValue>!) { fatalError() }
1513
func _get_prop(
1614
_ _this: JavaScriptObjectRef,
1715
_ prop: UnsafePointer<Int8>!, _ length: Int32,
18-
_ kind: UnsafeMutablePointer<JavaScriptValueKind>!,
19-
_ payload1: UnsafeMutablePointer<JavaScriptPayload>!,
20-
_ payload2: UnsafeMutablePointer<JavaScriptPayload>!) { fatalError() }
16+
_ rawJSValue: UnsafeMutablePointer<RawJSValue>!) { fatalError() }
2117
func _set_subscript(
2218
_ _this: JavaScriptObjectRef,
2319
_ index: Int32,
24-
_ kind: JavaScriptValueKind,
25-
_ payload1: JavaScriptPayload,
26-
_ payload2: JavaScriptPayload) { fatalError() }
20+
_ rawJSValue: UnsafePointer<RawJSValue>!) { fatalError() }
2721
func _get_subscript(
2822
_ _this: JavaScriptObjectRef,
2923
_ index: Int32,
30-
_ kind: UnsafeMutablePointer<JavaScriptValueKind>!,
31-
_ payload1: UnsafeMutablePointer<JavaScriptPayload>!,
32-
_ payload2: UnsafeMutablePointer<JavaScriptPayload>!) { fatalError() }
24+
_ rawJSValue: UnsafeMutablePointer<RawJSValue>!) { fatalError() }
3325
func _load_string(
3426
_ ref: JavaScriptObjectRef,
3527
_ buffer: UnsafeMutablePointer<UInt8>!) { fatalError() }
@@ -54,4 +46,9 @@ func _create_function(
5446
_ host_func_id: JavaScriptHostFuncRef,
5547
_ func_ref_ptr: UnsafePointer<JavaScriptObjectRef>!) { fatalError() }
5648
func _destroy_ref(_ ref: JavaScriptObjectRef) { fatalError() }
49+
func _instance_of(
50+
_ ref: JavaScriptObjectRef,
51+
_ constructorName: UnsafePointer<Int8>!,
52+
_ constructorLength: Int32,
53+
_ rawJSValue: UnsafeMutablePointer<RawJSValue>!) { fatalError() }
5754
#endif

Sources/_CJavaScriptKit/dummy.c

+1
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
11

2+
const unsigned int _JS_Predef_Value_Global = 0;

Sources/_CJavaScriptKit/include/_CJavaScriptKit.h

+27-19
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ typedef struct {
2626
} RawJSValue;
2727

2828

29-
const unsigned int _JS_Predef_Value_Global = 0;
29+
extern const unsigned int _JS_Predef_Value_Global;
3030

3131
__attribute__((
3232
__import_module__("javascript_kit"),
@@ -35,9 +35,7 @@ __attribute__((
3535
extern void _set_prop(
3636
const JavaScriptObjectRef _this,
3737
const char *prop, const int length,
38-
const JavaScriptValueKind kind,
39-
const JavaScriptPayload payload1,
40-
const JavaScriptPayload payload2
38+
const RawJSValue *rawJSValue
4139
);
4240

4341
__attribute__((
@@ -47,9 +45,7 @@ __attribute__((
4745
extern void _get_prop(
4846
const JavaScriptObjectRef _this,
4947
const char *prop, const int length,
50-
JavaScriptValueKind *kind,
51-
JavaScriptPayload *payload1,
52-
JavaScriptPayload *payload2
48+
RawJSValue *rawJSValue
5349
);
5450

5551
__attribute__((
@@ -59,9 +55,7 @@ __attribute__((
5955
extern void _set_subscript(
6056
const JavaScriptObjectRef _this,
6157
const int length,
62-
const JavaScriptValueKind kind,
63-
const JavaScriptPayload payload1,
64-
const JavaScriptPayload payload2
58+
const RawJSValue *rawJSValue
6559
);
6660

6761
__attribute__((
@@ -71,9 +65,7 @@ __attribute__((
7165
extern void _get_subscript(
7266
const JavaScriptObjectRef _this,
7367
const int length,
74-
JavaScriptValueKind *kind,
75-
JavaScriptPayload *payload1,
76-
JavaScriptPayload *payload2
68+
RawJSValue *rawJSValue
7769
);
7870

7971
__attribute__((
@@ -92,9 +84,7 @@ __attribute__((
9284
extern void _call_function(
9385
const JavaScriptObjectRef ref,
9486
const RawJSValue *argv, const int argc,
95-
JavaScriptValueKind *result_kind,
96-
JavaScriptPayload *result_payload1,
97-
JavaScriptPayload *result_payload2
87+
RawJSValue *rawJSValue
9888
);
9989

10090
__attribute__((
@@ -105,9 +95,7 @@ extern void _call_function_with_this(
10595
const JavaScriptObjectRef _this,
10696
const JavaScriptObjectRef func_ref,
10797
const RawJSValue *argv, const int argc,
108-
JavaScriptValueKind *result_kind,
109-
JavaScriptPayload *result_payload1,
110-
JavaScriptPayload *result_payload2
98+
RawJSValue *rawJSValue
11199
);
112100

113101
__attribute__((
@@ -137,4 +125,24 @@ extern void _destroy_ref(
137125
const JavaScriptObjectRef ref
138126
);
139127

128+
__attribute__((
129+
__import_module__("javascript_kit"),
130+
__import_name__("swjs_instance_of")
131+
))
132+
extern void _instance_of(
133+
const JavaScriptObjectRef _this,
134+
const char *constructor, const int length,
135+
RawJSValue *rawJSValue
136+
137+
);
138+
139+
__attribute__((
140+
__import_module__("javascript_kit"),
141+
__import_name__("swjs_copy_typed_array_content")
142+
))
143+
extern void _copy_typed_array_content(
144+
const JavaScriptObjectRef _this,
145+
const void *elementsPtr, const int length
146+
);
147+
140148
#endif /* _CJavaScriptKit_h */

0 commit comments

Comments
 (0)