From 1f5486e9c4ce0f646111cbbd394a746887bc968d Mon Sep 17 00:00:00 2001 From: Jed Fox Date: Sun, 2 Aug 2020 09:53:31 -0400 Subject: [PATCH 1/4] Add instanceof support --- .../TestSuites/Sources/PrimaryTests/main.swift | 2 ++ Runtime/src/index.ts | 9 +++++++++ Sources/JavaScriptKit/JSObject.swift | 10 ++++++++++ Sources/JavaScriptKit/XcodeSupport.swift | 5 +++++ Sources/_CJavaScriptKit/include/_CJavaScriptKit.h | 7 +++++++ 5 files changed, 33 insertions(+) diff --git a/IntegrationTests/TestSuites/Sources/PrimaryTests/main.swift b/IntegrationTests/TestSuites/Sources/PrimaryTests/main.swift index b58b037e7..140cc0bd3 100644 --- a/IntegrationTests/TestSuites/Sources/PrimaryTests/main.swift +++ b/IntegrationTests/TestSuites/Sources/PrimaryTests/main.swift @@ -228,6 +228,8 @@ New_Object_Construction: do { let cat1 = objectConstructor.new("Tama", 3, true) try expectEqual(getJSValue(this: cat1, name: "name"), .string("Tama")) try expectEqual(getJSValue(this: cat1, name: "age"), .number(3)) + try expectEqual(cat1.instanceof(objectConstructor), true) + try expectEqual(cat1.instanceof(try expectFunction(getJSValue(this: .global, name: "Array"))), false) let cat1Bark = try expectFunction(getJSValue(this: cat1, name: "bark")) try expectEqual(cat1Bark(), .string("nyan")) diff --git a/Runtime/src/index.ts b/Runtime/src/index.ts index b126b3e4f..fd55186a8 100644 --- a/Runtime/src/index.ts +++ b/Runtime/src/index.ts @@ -362,6 +362,15 @@ export class SwiftRuntime { throw Error(`Invalid result type of object constructor of "${obj}": "${result}"`) writeUint32(result_obj, this.heap.allocHeap(result)); }, + swjs_instanceof: ( + obj_ref: ref, constructor_ref: ref, + result_ptr: pointer + ) => { + const obj = this.heap.referenceHeap(obj_ref) + const constructor = this.heap.referenceHeap(constructor_ref) + const result = obj instanceof constructor + writeUint32(result_ptr, Number(result)) + }, swjs_destroy_ref: (ref: ref) => { this.heap.freeHeap(ref) } diff --git a/Sources/JavaScriptKit/JSObject.swift b/Sources/JavaScriptKit/JSObject.swift index 2253d9775..4ca77372f 100644 --- a/Sources/JavaScriptKit/JSObject.swift +++ b/Sources/JavaScriptKit/JSObject.swift @@ -32,6 +32,16 @@ public class JSObjectRef: Equatable { getJSValue(this: self, index: Int32(index)) } + public func instanceof(_ constructor: JSValue) -> Bool { + instanceof(constructor.function!) + } + + public func instanceof(_ constructor: JSFunctionRef) -> Bool { + var result: Bool = false + _instanceof(self.id, constructor.id, &result) + return result + } + public subscript(_ index: Int) -> JSValue { get { get(index) } set { set(index, newValue) } diff --git a/Sources/JavaScriptKit/XcodeSupport.swift b/Sources/JavaScriptKit/XcodeSupport.swift index b75972444..4d4d69e31 100644 --- a/Sources/JavaScriptKit/XcodeSupport.swift +++ b/Sources/JavaScriptKit/XcodeSupport.swift @@ -64,6 +64,11 @@ import _CJavaScriptKit _: UnsafePointer!, _: Int32, _: UnsafeMutablePointer! ) { fatalError() } + func _instanceof( + _: JavaScriptObjectRef, + _: JavaScriptObjectRef, + _: UnsafeMutablePointer! + ) { fatalError() } func _create_function( _: JavaScriptHostFuncRef, _: UnsafePointer! diff --git a/Sources/_CJavaScriptKit/include/_CJavaScriptKit.h b/Sources/_CJavaScriptKit/include/_CJavaScriptKit.h index bc54ba345..2c646cb81 100644 --- a/Sources/_CJavaScriptKit/include/_CJavaScriptKit.h +++ b/Sources/_CJavaScriptKit/include/_CJavaScriptKit.h @@ -2,6 +2,7 @@ #define _CJavaScriptKit_h #include +#include typedef unsigned int JavaScriptObjectRef; typedef unsigned int JavaScriptHostFuncRef; @@ -82,6 +83,12 @@ __attribute__((__import_module__("javascript_kit"), _call_new(const JavaScriptObjectRef ref, const RawJSValue *argv, const int argc, JavaScriptObjectRef *result_obj); +__attribute__((__import_module__("javascript_kit"), + __import_name__("swjs_instanceof"))) extern void +_instanceof(const JavaScriptObjectRef obj, + const JavaScriptObjectRef constructor, + bool *result); + __attribute__((__import_module__("javascript_kit"), __import_name__("swjs_create_function"))) extern void _create_function(const JavaScriptHostFuncRef host_func_id, From bb7d7f71ef13314a9316cec22f4ba298d0d377ff Mon Sep 17 00:00:00 2001 From: Jed Fox Date: Sun, 2 Aug 2020 22:12:31 -0400 Subject: [PATCH 2/4] Make instanceof safe --- Sources/JavaScriptKit/JSObject.swift | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Sources/JavaScriptKit/JSObject.swift b/Sources/JavaScriptKit/JSObject.swift index 4ca77372f..9ed27b75c 100644 --- a/Sources/JavaScriptKit/JSObject.swift +++ b/Sources/JavaScriptKit/JSObject.swift @@ -33,7 +33,8 @@ public class JSObjectRef: Equatable { } public func instanceof(_ constructor: JSValue) -> Bool { - instanceof(constructor.function!) + guard let `func` = constructor.function else { return false } + return instanceof(`func`) } public func instanceof(_ constructor: JSFunctionRef) -> Bool { From 0016817cb13d5cacd050f45de1d0286c93ebeec9 Mon Sep 17 00:00:00 2001 From: Jed Fox Date: Sun, 2 Aug 2020 22:13:00 -0400 Subject: [PATCH 3/4] Directly return the result of instanceof --- Runtime/src/index.ts | 5 ++--- Sources/JavaScriptKit/JSObject.swift | 4 +--- Sources/JavaScriptKit/XcodeSupport.swift | 5 ++--- Sources/_CJavaScriptKit/include/_CJavaScriptKit.h | 5 ++--- 4 files changed, 7 insertions(+), 12 deletions(-) diff --git a/Runtime/src/index.ts b/Runtime/src/index.ts index fd55186a8..94e436aed 100644 --- a/Runtime/src/index.ts +++ b/Runtime/src/index.ts @@ -59,7 +59,7 @@ class SwiftRuntimeHeap { allocHeap(value: any) { const isObject = typeof value == "object"; - const entry = this._heapEntryByValue.get(value); + const entry = this._heapEntryByValue.get(value); if (isObject && entry) { entry.rc++ return entry.id @@ -368,8 +368,7 @@ export class SwiftRuntime { ) => { const obj = this.heap.referenceHeap(obj_ref) const constructor = this.heap.referenceHeap(constructor_ref) - const result = obj instanceof constructor - writeUint32(result_ptr, Number(result)) + return obj instanceof constructor }, swjs_destroy_ref: (ref: ref) => { this.heap.freeHeap(ref) diff --git a/Sources/JavaScriptKit/JSObject.swift b/Sources/JavaScriptKit/JSObject.swift index 9ed27b75c..983d651b6 100644 --- a/Sources/JavaScriptKit/JSObject.swift +++ b/Sources/JavaScriptKit/JSObject.swift @@ -38,9 +38,7 @@ public class JSObjectRef: Equatable { } public func instanceof(_ constructor: JSFunctionRef) -> Bool { - var result: Bool = false - _instanceof(self.id, constructor.id, &result) - return result + _instanceof(self.id, constructor.id) } public subscript(_ index: Int) -> JSValue { diff --git a/Sources/JavaScriptKit/XcodeSupport.swift b/Sources/JavaScriptKit/XcodeSupport.swift index 4d4d69e31..180072ebf 100644 --- a/Sources/JavaScriptKit/XcodeSupport.swift +++ b/Sources/JavaScriptKit/XcodeSupport.swift @@ -66,9 +66,8 @@ import _CJavaScriptKit ) { fatalError() } func _instanceof( _: JavaScriptObjectRef, - _: JavaScriptObjectRef, - _: UnsafeMutablePointer! - ) { fatalError() } + _: JavaScriptObjectRef + ) -> Bool { fatalError() } func _create_function( _: JavaScriptHostFuncRef, _: UnsafePointer! diff --git a/Sources/_CJavaScriptKit/include/_CJavaScriptKit.h b/Sources/_CJavaScriptKit/include/_CJavaScriptKit.h index 2c646cb81..61789e16c 100644 --- a/Sources/_CJavaScriptKit/include/_CJavaScriptKit.h +++ b/Sources/_CJavaScriptKit/include/_CJavaScriptKit.h @@ -84,10 +84,9 @@ _call_new(const JavaScriptObjectRef ref, const RawJSValue *argv, const int argc, JavaScriptObjectRef *result_obj); __attribute__((__import_module__("javascript_kit"), - __import_name__("swjs_instanceof"))) extern void + __import_name__("swjs_instanceof"))) extern bool _instanceof(const JavaScriptObjectRef obj, - const JavaScriptObjectRef constructor, - bool *result); + const JavaScriptObjectRef constructor); __attribute__((__import_module__("javascript_kit"), __import_name__("swjs_create_function"))) extern void From b0c28acb4ecf9ce4c3f9056bbc4306380f06d844 Mon Sep 17 00:00:00 2001 From: Jed Fox Date: Mon, 3 Aug 2020 08:11:57 -0400 Subject: [PATCH 4/4] Remove instanceof(JSValue) --- Sources/JavaScriptKit/JSObject.swift | 5 ----- 1 file changed, 5 deletions(-) diff --git a/Sources/JavaScriptKit/JSObject.swift b/Sources/JavaScriptKit/JSObject.swift index 983d651b6..47ae2b4a6 100644 --- a/Sources/JavaScriptKit/JSObject.swift +++ b/Sources/JavaScriptKit/JSObject.swift @@ -32,11 +32,6 @@ public class JSObjectRef: Equatable { getJSValue(this: self, index: Int32(index)) } - public func instanceof(_ constructor: JSValue) -> Bool { - guard let `func` = constructor.function else { return false } - return instanceof(`func`) - } - public func instanceof(_ constructor: JSFunctionRef) -> Bool { _instanceof(self.id, constructor.id) }