Thanks to visit codestin.com
Credit goes to github.com

Skip to content
Merged
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
Prev Previous commit
Next Next commit
[not working] attempt at new JSValueConvertible with no instance methods
  • Loading branch information
j-f1 committed Aug 3, 2020
commit c4d2e12dc251a2449deba568153262426febc69e
82 changes: 38 additions & 44 deletions Sources/JavaScriptKit/JSValueConvertible.swift
Original file line number Diff line number Diff line change
@@ -1,55 +1,61 @@
import _CJavaScriptKit

public protocol JSValueConvertible {
func jsValue() -> JSValue
static func jsValue(from: Self) -> JSValue
}

extension JSValue {
public init<T: JSValueConvertible>(from jsValue: T) {
self = T.jsValue(from: jsValue)
}
}

extension JSValue: JSValueConvertible {
public func jsValue() -> JSValue { self }
public static func jsValue(from jsValue: Self) -> JSValue { jsValue }
}

extension Bool: JSValueConvertible {
public func jsValue() -> JSValue { .boolean(self) }
public static func jsValue(from bool: Self) -> JSValue { .boolean(bool) }
}

extension Int: JSValueConvertible {
public func jsValue() -> JSValue { .number(Double(self)) }
public static func jsValue(from int: Self) -> JSValue { .number(Double(int)) }
}

extension Int8: JSValueConvertible {
public func jsValue() -> JSValue { .number(Double(self)) }
public static func jsValue(from int8: Self) -> JSValue { .number(Double(int8)) }
}

extension Int16: JSValueConvertible {
public func jsValue() -> JSValue { .number(Double(self)) }
public static func jsValue(from int16: Self) -> JSValue { .number(Double(int16)) }
}

extension Int32: JSValueConvertible {
public func jsValue() -> JSValue { .number(Double(self)) }
public static func jsValue(from int32: Self) -> JSValue { .number(Double(int32)) }
}

extension UInt: JSValueConvertible {
public func jsValue() -> JSValue { .number(Double(self)) }
public static func jsValue(from uint: Self) -> JSValue { .number(Double(uint)) }
}

extension UInt8: JSValueConvertible {
public func jsValue() -> JSValue { .number(Double(self)) }
public static func jsValue(from uint8: Self) -> JSValue { .number(Double(uint8)) }
}

extension UInt16: JSValueConvertible {
public func jsValue() -> JSValue { .number(Double(self)) }
public static func jsValue(from uint16: Self) -> JSValue { .number(Double(uint16)) }
}

extension Float: JSValueConvertible {
public func jsValue() -> JSValue { .number(Double(self)) }
public static func jsValue(from float: Self) -> JSValue { .number(Double(float)) }
}

extension Double: JSValueConvertible {
public func jsValue() -> JSValue { .number(self) }
public static func jsValue(from double: Self) -> JSValue { .number(double) }
}

extension String: JSValueConvertible {
public func jsValue() -> JSValue { .string(self) }
public static func jsValue(from string: Self) -> JSValue { .string(string) }
}

extension JSObjectRef: JSValueConvertible {
Expand All @@ -59,65 +65,53 @@ extension JSObjectRef: JSValueConvertible {

private let Object = JSObjectRef.global.Object.function!

extension Dictionary where Value: JSValueConvertible, Key == String {
public func jsValue() -> JSValue {
Swift.Dictionary<Key, JSValueConvertible>.jsValue(self)()
}
}

extension Dictionary: JSValueConvertible where Value == JSValueConvertible, Key == String {
public func jsValue() -> JSValue {
extension Dictionary: JSValueConvertible where Value: JSValueConvertible, Key == String {
public static func jsValue(from dict: Self) -> JSValue {
let object = Object.new()
for (key, value) in self {
object[key] = value.jsValue()
for (key, value) in dict {
object[key] = JSValue(from: value)
}
return .object(object)
}
}

private let Array = JSObjectRef.global.Array.function!

extension Array where Element: JSValueConvertible {
public func jsValue() -> JSValue {
Swift.Array<JSValueConvertible>.jsValue(self)()
}
}

extension Array: JSValueConvertible where Element == JSValueConvertible {
public func jsValue() -> JSValue {
let array = Array.new(count)
for (index, element) in enumerated() {
array[index] = element.jsValue()
extension Array: JSValueConvertible where Element: JSValueConvertible {
public static func jsValue(from array: Self) -> JSValue {
let jsArray = Array.new(array.count)
for (index, element) in array.enumerated() {
jsArray[index] = JSValue(from: element)
}
return .object(array)
return .object(jsArray)
}
}

extension RawJSValue: JSValueConvertible {
public func jsValue() -> JSValue {
switch kind {
public static func jsValue(from rawJSValue: Self) -> JSValue {
switch rawJSValue.kind {
case .invalid:
fatalError()
case .boolean:
return .boolean(payload1 != 0)
return .boolean(rawJSValue.payload1 != 0)
case .number:
return .number(payload3)
return .number(rawJSValue.payload3)
case .string:
// +1 for null terminator
let buffer = malloc(Int(payload2 + 1))!.assumingMemoryBound(to: UInt8.self)
let buffer = malloc(Int(rawJSValue.payload2 + 1))!.assumingMemoryBound(to: UInt8.self)
defer { free(buffer) }
_load_string(JavaScriptObjectRef(payload1), buffer)
buffer[Int(payload2)] = 0
_load_string(JavaScriptObjectRef(rawJSValue.payload1), buffer)
buffer[Int(rawJSValue.payload2)] = 0
let string = String(decodingCString: UnsafePointer(buffer), as: UTF8.self)
return .string(string)
case .object:
return .object(JSObjectRef(id: UInt32(payload1)))
return .object(JSObjectRef(id: UInt32(rawJSValue.payload1)))
case .null:
return .null
case .undefined:
return .undefined
case .function:
return .function(JSFunctionRef(id: UInt32(payload1)))
return .function(JSFunctionRef(id: UInt32(rawJSValue.payload1)))
default:
fatalError("unreachable")
}
Expand Down