1+ import _CJavaScriptKit
2+
13public 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 {
1921public 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-
13343public 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
0 commit comments