Skip to content

Webidl support #22

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 3 commits into from
Closed
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Next Next commit
- 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.
  • Loading branch information
mjburghard committed Jun 7, 2020
commit 8f0a15464238781a90141b93558d79c14d101bd5
237 changes: 114 additions & 123 deletions Runtime/src/index.ts

Large diffs are not rendered by default.

12 changes: 6 additions & 6 deletions Sources/JavaScriptKit/JSFunction.swift
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,8 @@ public class JSFunctionRef: JSObjectRef {
let argc = bufferPointer.count
var result = RawJSValue()
_call_function(
self.id, argv, Int32(argc),
&result.kind, &result.payload1, &result.payload2
self._id, argv, Int32(argc),
&result
)
return result
}
Expand All @@ -29,9 +29,9 @@ public class JSFunctionRef: JSObjectRef {
let argv = bufferPointer.baseAddress
let argc = bufferPointer.count
var result = RawJSValue()
_call_function_with_this(this.id,
self.id, argv, Int32(argc),
&result.kind, &result.payload1, &result.payload2
_call_function_with_this(this._id,
self._id, argv, Int32(argc),
&result
)
return result
}
Expand All @@ -46,7 +46,7 @@ public class JSFunctionRef: JSObjectRef {
let argc = bufferPointer.count
var resultObj = JavaScriptPayload()
_call_new(
self.id, argv, Int32(argc),
self._id, argv, Int32(argc),
&resultObj
)
return JSObjectRef(id: resultObj)
Expand Down
49 changes: 36 additions & 13 deletions Sources/JavaScriptKit/JSObject.swift
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@ import _CJavaScriptKit

@dynamicMemberLookup
public class JSObjectRef: Equatable {
let id: UInt32
init(id: UInt32) {
self.id = id
public let _id: UInt32
public init(id: UInt32) {
self._id = id
}

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

public subscript(dynamicMember name: String) -> JSValue {
get { get(name) }
set { set(name, newValue) }
get { js_get(name) }
set { js_set(name, newValue) }
}

public func get(_ name: String) -> JSValue {
public subscript<Type: JSValueEncodable & JSValueDecodable>(dynamicMember name: String) -> Type {
get { js_get(name).fromJSValue() }
set { js_set(name, newValue.jsValue()) }
}

func js_get(_ name: String) -> JSValue {
getJSValue(this: self, name: name)
}

public func set(_ name: String, _ value: JSValue) {
func js_set(_ name: String, _ value: JSValue) {
setJSValue(this: self, name: name, value: value)
}

public func get(_ index: Int) -> JSValue {
func js_get(_ index: Int) -> JSValue {
getJSValue(this: self, index: Int32(index))
}

public subscript(_ index: Int) -> JSValue {
get { get(index) }
set { set(index, newValue) }
get { js_get(index) }
set { js_set(index, newValue) }
}

public func set(_ index: Int, _ value: JSValue) {
func js_set(_ index: Int, _ value: JSValue) {
setJSValue(this: self, index: Int32(index), value: value)
}

public func instanceOf(_ constructor: String) -> Bool {
var result = RawJSValue()
_instance_of(_id, constructor, Int32(constructor.count), &result)

return result.jsValue().fromJSValue()
}

public static let global = JSObjectRef(id: _JS_Predef_Value_Global)

deinit { _destroy_ref(id) }
deinit { _destroy_ref(_id) }

public static func == (lhs: JSObjectRef, rhs: JSObjectRef) -> Bool {
return lhs.id == rhs.id
return lhs._id == rhs._id
}
}

public func jsValue() -> JSValue {
.object(self)
}
}

extension JSObjectRef {

public func copyTypedArrayContent<Type>(_ array: [Type]) {

array.withUnsafeBufferPointer { (ptr) in
_copy_typed_array_content(_id, ptr.baseAddress, Int32(array.count))
}
}
}
21 changes: 8 additions & 13 deletions Sources/JavaScriptKit/JSValue.swift
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import _CJavaScriptKit
public enum JSValue: Equatable {
case boolean(Bool)
case string(String)
case number(Int32)
case number(Double)
case object(JSObjectRef)
case null
case undefined
Expand All @@ -22,7 +22,7 @@ public enum JSValue: Equatable {
default: return nil
}
}
public var number: Int32? {
public var number: Double? {
switch self {
case let .number(number): return number
default: return nil
Expand Down Expand Up @@ -58,33 +58,28 @@ extension JSValue: ExpressibleByIntegerLiteral {

public func getJSValue(this: JSObjectRef, name: String) -> JSValue {
var rawValue = RawJSValue()
_get_prop(this.id, name, Int32(name.count),
&rawValue.kind,
&rawValue.payload1, &rawValue.payload2)
_get_prop(this._id, name, Int32(name.count), &rawValue)
return rawValue.jsValue()
}

public func setJSValue(this: JSObjectRef, name: String, value: JSValue) {
value.withRawJSValue { rawValue in
_set_prop(this.id, name, Int32(name.count), rawValue.kind, rawValue.payload1, rawValue.payload2)
_set_prop(this._id, name, Int32(name.count), &rawValue)
}
}


public func getJSValue(this: JSObjectRef, index: Int32) -> JSValue {
var rawValue = RawJSValue()
_get_subscript(this.id, index,
&rawValue.kind,
&rawValue.payload1, &rawValue.payload2)
_get_subscript(this._id, index, &rawValue)
return rawValue.jsValue()
}


public func setJSValue(this: JSObjectRef, index: Int32, value: JSValue) {
value.withRawJSValue { rawValue in
_set_subscript(this.id, index,
rawValue.kind,
rawValue.payload1, rawValue.payload2)
_set_subscript(this._id, index, &rawValue)
}
}
}
}

20 changes: 10 additions & 10 deletions Sources/JavaScriptKit/JSValueConvertible.swift
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@ extension RawJSValue: JSValueConvertible {
case JavaScriptValueKind_Boolean:
return .boolean(payload1 != 0)
case JavaScriptValueKind_Number:
return .number(Int32(bitPattern: payload1))
return .number(Double(bitPattern: UInt64(payload1) | (UInt64(payload2) << 32)))
case JavaScriptValueKind_String:
// +1 for null terminator
let buffer = malloc(Int(payload2 + 1))!.assumingMemoryBound(to: UInt8.self)
Expand All @@ -93,7 +93,7 @@ extension RawJSValue: JSValueConvertible {
}

extension JSValue {
func withRawJSValue<T>(_ body: (RawJSValue) -> T) -> T {
func withRawJSValue<T>(_ body: (inout RawJSValue) -> T) -> T {
let kind: JavaScriptValueKind
let payload1: JavaScriptPayload
let payload2: JavaScriptPayload
Expand All @@ -104,18 +104,18 @@ extension JSValue {
payload2 = 0
case let .number(numberValue):
kind = JavaScriptValueKind_Number
payload1 = JavaScriptPayload(bitPattern: numberValue)
payload2 = 0
payload1 = UInt32(numberValue.bitPattern & 0x00000000ffffffff)
payload2 = UInt32((numberValue.bitPattern & 0xffffffff00000000) >> 32)
case var .string(stringValue):
kind = JavaScriptValueKind_String
return stringValue.withUTF8 { bufferPtr in
let ptrValue = UInt32(UInt(bitPattern: bufferPtr.baseAddress!))
let rawValue = RawJSValue(kind: kind, payload1: ptrValue, payload2: JavaScriptPayload(bufferPtr.count))
return body(rawValue)
var rawValue = RawJSValue(kind: kind, payload1: ptrValue, payload2: JavaScriptPayload(bufferPtr.count))
return body(&rawValue)
}
case let .object(ref):
kind = JavaScriptValueKind_Object
payload1 = ref.id
payload1 = ref._id
payload2 = 0
case .null:
kind = JavaScriptValueKind_Null
Expand All @@ -127,11 +127,11 @@ extension JSValue {
payload2 = 0
case let .function(functionRef):
kind = JavaScriptValueKind_Function
payload1 = functionRef.id
payload1 = functionRef._id
payload2 = 0
}
let rawValue = RawJSValue(kind: kind, payload1: payload1, payload2: payload2)
return body(rawValue)
var rawValue = RawJSValue(kind: kind, payload1: payload1, payload2: payload2)
return body(&rawValue)
}
}

Expand Down
21 changes: 9 additions & 12 deletions Sources/JavaScriptKit/XcodeSupport.swift
Original file line number Diff line number Diff line change
Expand Up @@ -9,27 +9,19 @@ import _CJavaScriptKit
func _set_prop(
_ _this: JavaScriptObjectRef,
_ prop: UnsafePointer<Int8>!, _ length: Int32,
_ kind: JavaScriptValueKind,
_ payload1: JavaScriptPayload,
_ payload2: JavaScriptPayload) { fatalError() }
_ rawJSValue: UnsafePointer<RawJSValue>!) { fatalError() }
func _get_prop(
_ _this: JavaScriptObjectRef,
_ prop: UnsafePointer<Int8>!, _ length: Int32,
_ kind: UnsafeMutablePointer<JavaScriptValueKind>!,
_ payload1: UnsafeMutablePointer<JavaScriptPayload>!,
_ payload2: UnsafeMutablePointer<JavaScriptPayload>!) { fatalError() }
_ rawJSValue: UnsafeMutablePointer<RawJSValue>!) { fatalError() }
func _set_subscript(
_ _this: JavaScriptObjectRef,
_ index: Int32,
_ kind: JavaScriptValueKind,
_ payload1: JavaScriptPayload,
_ payload2: JavaScriptPayload) { fatalError() }
_ rawJSValue: UnsafePointer<RawJSValue>!) { fatalError() }
func _get_subscript(
_ _this: JavaScriptObjectRef,
_ index: Int32,
_ kind: UnsafeMutablePointer<JavaScriptValueKind>!,
_ payload1: UnsafeMutablePointer<JavaScriptPayload>!,
_ payload2: UnsafeMutablePointer<JavaScriptPayload>!) { fatalError() }
_ rawJSValue: UnsafeMutablePointer<RawJSValue>!) { fatalError() }
func _load_string(
_ ref: JavaScriptObjectRef,
_ buffer: UnsafeMutablePointer<UInt8>!) { fatalError() }
Expand All @@ -54,4 +46,9 @@ func _create_function(
_ host_func_id: JavaScriptHostFuncRef,
_ func_ref_ptr: UnsafePointer<JavaScriptObjectRef>!) { fatalError() }
func _destroy_ref(_ ref: JavaScriptObjectRef) { fatalError() }
func _instance_of(
_ ref: JavaScriptObjectRef,
_ constructorName: UnsafePointer<Int8>!,
_ constructorLength: Int32,
_ rawJSValue: UnsafeMutablePointer<RawJSValue>!) { fatalError() }
#endif
1 change: 1 addition & 0 deletions Sources/_CJavaScriptKit/dummy.c
Original file line number Diff line number Diff line change
@@ -1 +1,2 @@

const unsigned int _JS_Predef_Value_Global = 0;
46 changes: 27 additions & 19 deletions Sources/_CJavaScriptKit/include/_CJavaScriptKit.h
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ typedef struct {
} RawJSValue;


const unsigned int _JS_Predef_Value_Global = 0;
extern const unsigned int _JS_Predef_Value_Global;

__attribute__((
__import_module__("javascript_kit"),
Expand All @@ -35,9 +35,7 @@ __attribute__((
extern void _set_prop(
const JavaScriptObjectRef _this,
const char *prop, const int length,
const JavaScriptValueKind kind,
const JavaScriptPayload payload1,
const JavaScriptPayload payload2
const RawJSValue *rawJSValue
);

__attribute__((
Expand All @@ -47,9 +45,7 @@ __attribute__((
extern void _get_prop(
const JavaScriptObjectRef _this,
const char *prop, const int length,
JavaScriptValueKind *kind,
JavaScriptPayload *payload1,
JavaScriptPayload *payload2
RawJSValue *rawJSValue
);

__attribute__((
Expand All @@ -59,9 +55,7 @@ __attribute__((
extern void _set_subscript(
const JavaScriptObjectRef _this,
const int length,
const JavaScriptValueKind kind,
const JavaScriptPayload payload1,
const JavaScriptPayload payload2
const RawJSValue *rawJSValue
);

__attribute__((
Expand All @@ -71,9 +65,7 @@ __attribute__((
extern void _get_subscript(
const JavaScriptObjectRef _this,
const int length,
JavaScriptValueKind *kind,
JavaScriptPayload *payload1,
JavaScriptPayload *payload2
RawJSValue *rawJSValue
);

__attribute__((
Expand All @@ -92,9 +84,7 @@ __attribute__((
extern void _call_function(
const JavaScriptObjectRef ref,
const RawJSValue *argv, const int argc,
JavaScriptValueKind *result_kind,
JavaScriptPayload *result_payload1,
JavaScriptPayload *result_payload2
RawJSValue *rawJSValue
);

__attribute__((
Expand All @@ -105,9 +95,7 @@ extern void _call_function_with_this(
const JavaScriptObjectRef _this,
const JavaScriptObjectRef func_ref,
const RawJSValue *argv, const int argc,
JavaScriptValueKind *result_kind,
JavaScriptPayload *result_payload1,
JavaScriptPayload *result_payload2
RawJSValue *rawJSValue
);

__attribute__((
Expand Down Expand Up @@ -137,4 +125,24 @@ extern void _destroy_ref(
const JavaScriptObjectRef ref
);

__attribute__((
__import_module__("javascript_kit"),
__import_name__("swjs_instance_of")
))
extern void _instance_of(
const JavaScriptObjectRef _this,
const char *constructor, const int length,
RawJSValue *rawJSValue

);

__attribute__((
__import_module__("javascript_kit"),
__import_name__("swjs_copy_typed_array_content")
))
extern void _copy_typed_array_content(
const JavaScriptObjectRef _this,
const void *elementsPtr, const int length
);

#endif /* _CJavaScriptKit_h */