From d72a4a8904bbcd2165f143fabcd600aea30bb9e0 Mon Sep 17 00:00:00 2001 From: Jed Fox Date: Sun, 2 Aug 2020 09:10:32 -0400 Subject: [PATCH 1/4] Pass around a DataView on the JS side; cha nge memory layout for numbers The use of a DataView reduces function paramater count. There are now only two payload slots. Numbers use them as a single Double, while every other type just uses them as two UInt32s Co-Authored-By: Manuel --- Runtime/src/index.ts | 146 +++++++++--------- Sources/JavaScriptKit/JSFunction.swift | 9 +- Sources/JavaScriptKit/JSValue.swift | 14 +- .../JavaScriptKit/JSValueConvertible.swift | 18 +-- Sources/JavaScriptKit/XcodeSupport.swift | 30 +--- .../_CJavaScriptKit/include/_CJavaScriptKit.h | 25 +-- 6 files changed, 95 insertions(+), 147 deletions(-) diff --git a/Runtime/src/index.ts b/Runtime/src/index.ts index b126b3e4f..d5c48fe05 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 @@ -124,10 +124,12 @@ export class SwiftRuntime { const exports = this.instance.exports as any as SwiftRuntimeExportedFunctions; const argc = args.length const argv = exports.swjs_prepare_host_function_call(argc) + const uint32Memory = new Uint32Array(memory().buffer, argv, args.length * 3) for (let index = 0; index < args.length; index++) { const argument = args[index] - const base = argv + 24 * index - writeValue(argument, base, base + 4, base + 8, base + 16) + const offset = 12 * index + const dataView = new DataView(memory().buffer, argv + offset, 12); + writeValue(argument, dataView) } let output: any; const callback_func_ref = this.heap.allocHeap(function (result: any) { @@ -142,24 +144,20 @@ export class SwiftRuntime { const textEncoder = new TextEncoder(); // Only support utf-8 const readString = (ptr: pointer, len: number) => { - const uint8Memory = new Uint8Array(memory().buffer); - return textDecoder.decode(uint8Memory.subarray(ptr, ptr + len)); + const uint8Memory = new Uint8Array(memory().buffer, ptr, len); + return textDecoder.decode(uint8Memory); } const writeString = (ptr: pointer, bytes: Uint8Array) => { - const uint8Memory = new Uint8Array(memory().buffer); + const uint8Memory = new Uint8Array(memory().buffer, ptr); for (const [index, byte] of bytes.entries()) { - uint8Memory[ptr + index] = byte + uint8Memory[index] = byte } - uint8Memory[ptr] } const readUInt32 = (ptr: pointer) => { - const uint8Memory = new Uint8Array(memory().buffer); - return uint8Memory[ptr + 0] - + (uint8Memory[ptr + 1] << 8) - + (uint8Memory[ptr + 2] << 16) - + (uint8Memory[ptr + 3] << 24) + const uint32Memory = new Uint32Array(memory().buffer, ptr, 1); + return uint32Memory[0]; } const readFloat64 = (ptr: pointer) => { @@ -168,11 +166,8 @@ export class SwiftRuntime { } const writeUint32 = (ptr: pointer, value: number) => { - const uint8Memory = new Uint8Array(memory().buffer); - uint8Memory[ptr + 0] = (value & 0x000000ff) >> 0 - uint8Memory[ptr + 1] = (value & 0x0000ff00) >> 8 - uint8Memory[ptr + 2] = (value & 0x00ff0000) >> 16 - uint8Memory[ptr + 3] = (value & 0xff000000) >> 24 + const uint32Memory = new Uint32Array(memory().buffer, ptr); + uint32Memory[0] = (value & 0xffffffff); } const writeFloat64 = (ptr: pointer, value: number) => { @@ -180,25 +175,28 @@ export class SwiftRuntime { dataView.setFloat64(ptr, value, true); } - const decodeValue = ( - kind: JavaScriptValueKind, - payload1: number, payload2: number, payload3: number - ) => { + const decodeValue = (dataView: DataView) => { + const kind = dataView.getUint32(0, true); + const payload1_ptr = Uint32Array.BYTES_PER_ELEMENT + const payload2_ptr = 2 * Uint32Array.BYTES_PER_ELEMENT switch (kind) { case JavaScriptValueKind.Boolean: { - switch (payload1) { + switch (dataView.getUint32(payload1_ptr, true)) { case 0: return false case 1: return true } } case JavaScriptValueKind.Number: { - return payload3; + return dataView.getFloat64(payload1_ptr, true); } case JavaScriptValueKind.String: { - return readString(payload1, payload2) + return readString( + dataView.getUint32(payload1_ptr, true), + dataView.getUint32(payload2_ptr, true) + ); } case JavaScriptValueKind.Object: { - return this.heap.referenceHeap(payload1) + return this.heap.referenceHeap(dataView.getUint32(payload1_ptr, true)) } case JavaScriptValueKind.Null: { return null @@ -207,60 +205,57 @@ export class SwiftRuntime { return undefined } case JavaScriptValueKind.Function: { - return this.heap.referenceHeap(payload1) + return this.heap.referenceHeap(dataView.getUint32(payload1_ptr, true)) } default: throw new Error(`Type kind "${kind}" is not supported`) } } - const writeValue = ( - value: any, kind_ptr: pointer, - payload1_ptr: pointer, payload2_ptr: pointer, payload3_ptr: pointer - ) => { + const writeValue = (value: any, dataView: DataView) => { + const payload1_ptr = Uint32Array.BYTES_PER_ELEMENT + const payload2_ptr = 2 * Uint32Array.BYTES_PER_ELEMENT if (value === null) { - writeUint32(kind_ptr, JavaScriptValueKind.Null); - writeUint32(payload1_ptr, 0); - writeUint32(payload2_ptr, 0); + dataView.setUint32(0, JavaScriptValueKind.Null, true); + dataView.setUint32(payload1_ptr, 0, true); + dataView.setUint32(payload2_ptr, 0, true); return; } switch (typeof value) { case "boolean": { - writeUint32(kind_ptr, JavaScriptValueKind.Boolean); - writeUint32(payload1_ptr, value ? 1 : 0); - writeUint32(payload2_ptr, 0); + dataView.setUint32(0, JavaScriptValueKind.Boolean, true); + dataView.setUint32(payload1_ptr, value ? 1 : 0, true); + dataView.setUint32(payload2_ptr, 0, true); break; } case "number": { - writeUint32(kind_ptr, JavaScriptValueKind.Number); - writeUint32(payload1_ptr, 0); - writeUint32(payload2_ptr, 0); - writeFloat64(payload3_ptr, value); + dataView.setUint32(0, JavaScriptValueKind.Number, true); + dataView.setFloat64(payload1_ptr, value, true); break; } case "string": { const bytes = textEncoder.encode(value); - writeUint32(kind_ptr, JavaScriptValueKind.String); - writeUint32(payload1_ptr, this.heap.allocHeap(bytes)); - writeUint32(payload2_ptr, bytes.length); + dataView.setUint32(0, JavaScriptValueKind.String, true); + dataView.setUint32(payload1_ptr, this.heap.allocHeap(bytes), true); + dataView.setUint32(payload2_ptr, bytes.length, true); break; } case "undefined": { - writeUint32(kind_ptr, JavaScriptValueKind.Undefined); - writeUint32(payload1_ptr, 0); - writeUint32(payload2_ptr, 0); + dataView.setUint32(0, JavaScriptValueKind.Undefined, true); + dataView.setUint32(payload1_ptr, 0, true); + dataView.setUint32(payload2_ptr, 0, true); break; } case "object": { - writeUint32(kind_ptr, JavaScriptValueKind.Object); - writeUint32(payload1_ptr, this.heap.allocHeap(value)); - writeUint32(payload2_ptr, 0); + dataView.setUint32(0, JavaScriptValueKind.Object, true); + dataView.setUint32(payload1_ptr, this.heap.allocHeap(value), true); + dataView.setUint32(payload2_ptr, 0, true); break; } case "function": { - writeUint32(kind_ptr, JavaScriptValueKind.Function); - writeUint32(payload1_ptr, this.heap.allocHeap(value)); - writeUint32(payload2_ptr, 0); + dataView.setUint32(0, JavaScriptValueKind.Function, true); + dataView.setUint32(payload1_ptr, this.heap.allocHeap(value), true); + dataView.setUint32(payload2_ptr, 0, true); break; } default: @@ -274,12 +269,9 @@ export class SwiftRuntime { const decodeValues = (ptr: pointer, length: number) => { let result = [] for (let index = 0; index < length; index++) { - const base = ptr + 24 * index - const kind = readUInt32(base) - const payload1 = readUInt32(base + 4) - const payload2 = readUInt32(base + 8) - const payload3 = readFloat64(base + 16) - result.push(decodeValue(kind, payload1, payload2, payload3)) + const offset = 12 * index + const dataView = new DataView(memory().buffer, ptr + offset, 12); + result.push(decodeValue(dataView)) } return result } @@ -287,37 +279,37 @@ export class SwiftRuntime { return { swjs_set_prop: ( ref: ref, name: pointer, length: number, - kind: JavaScriptValueKind, - payload1: number, payload2: number, payload3: number + rawJSValuePtr: pointer ) => { const obj = this.heap.referenceHeap(ref); - Reflect.set(obj, readString(name, length), decodeValue(kind, payload1, payload2, payload3)) + const dataView = new DataView(memory().buffer, rawJSValuePtr, 12); + Reflect.set(obj, readString(name, length), decodeValue(dataView)) }, swjs_get_prop: ( ref: ref, name: pointer, length: number, - kind_ptr: pointer, - payload1_ptr: pointer, payload2_ptr: pointer, payload3_ptr: number + rawJSValuePtr: pointer ) => { const obj = this.heap.referenceHeap(ref); const result = Reflect.get(obj, readString(name, length)); - writeValue(result, kind_ptr, payload1_ptr, payload2_ptr, payload3_ptr); + const dataView = new DataView(memory().buffer, rawJSValuePtr, 12); + writeValue(result, dataView); }, swjs_set_subscript: ( ref: ref, index: number, - kind: JavaScriptValueKind, - payload1: number, payload2: number, payload3: number + rawJSValuePtr: pointer ) => { const obj = this.heap.referenceHeap(ref); - Reflect.set(obj, index, decodeValue(kind, payload1, payload2, payload3)) + const dataView = new DataView(memory().buffer, rawJSValuePtr, 12); + Reflect.set(obj, index, decodeValue(dataView)) }, swjs_get_subscript: ( ref: ref, index: number, - kind_ptr: pointer, - payload1_ptr: pointer, payload2_ptr: pointer, payload3_ptr: pointer + rawJSValuePtr: pointer ) => { const obj = this.heap.referenceHeap(ref); const result = Reflect.get(obj, index); - writeValue(result, kind_ptr, payload1_ptr, payload2_ptr, payload3_ptr); + const dataView = new DataView(memory().buffer, rawJSValuePtr, 12); + writeValue(result, dataView); }, swjs_load_string: (ref: ref, buffer: pointer) => { const bytes = this.heap.referenceHeap(ref); @@ -325,23 +317,23 @@ export class SwiftRuntime { }, swjs_call_function: ( ref: ref, argv: pointer, argc: number, - kind_ptr: pointer, - payload1_ptr: pointer, payload2_ptr: pointer, payload3_ptr: pointer + rawJSValuePtr: pointer ) => { const func = this.heap.referenceHeap(ref) const result = Reflect.apply(func, undefined, decodeValues(argv, argc)) - writeValue(result, kind_ptr, payload1_ptr, payload2_ptr, payload3_ptr); + const dataView = new DataView(memory().buffer, rawJSValuePtr, 12); + writeValue(result, dataView); }, swjs_call_function_with_this: ( obj_ref: ref, func_ref: ref, argv: pointer, argc: number, - kind_ptr: pointer, - payload1_ptr: pointer, payload2_ptr: pointer, payload3_ptr: pointer + rawJSValuePtr: pointer ) => { const obj = this.heap.referenceHeap(obj_ref) const func = this.heap.referenceHeap(func_ref) const result = Reflect.apply(func, obj, decodeValues(argv, argc)) - writeValue(result, kind_ptr, payload1_ptr, payload2_ptr, payload3_ptr); + const dataView = new DataView(memory().buffer, rawJSValuePtr, 12); + writeValue(result, dataView); }, swjs_create_function: ( host_func_id: number, diff --git a/Sources/JavaScriptKit/JSFunction.swift b/Sources/JavaScriptKit/JSFunction.swift index 09586c6cb..5c8ff282e 100644 --- a/Sources/JavaScriptKit/JSFunction.swift +++ b/Sources/JavaScriptKit/JSFunction.swift @@ -9,10 +9,7 @@ public class JSFunctionRef: JSObjectRef { let argv = bufferPointer.baseAddress let argc = bufferPointer.count var result = RawJSValue() - _call_function( - self.id, argv, Int32(argc), - &result.kind, &result.payload1, &result.payload2, &result.payload3 - ) + _call_function(self.id, argv, Int32(argc), &result) return result } } @@ -29,9 +26,7 @@ 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, &result.payload3) + _call_function_with_this(this.id, self.id, argv, Int32(argc), &result) return result } } diff --git a/Sources/JavaScriptKit/JSValue.swift b/Sources/JavaScriptKit/JSValue.swift index 14434130f..323a32505 100644 --- a/Sources/JavaScriptKit/JSValue.swift +++ b/Sources/JavaScriptKit/JSValue.swift @@ -71,30 +71,24 @@ 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, &rawValue.payload3) + _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, rawValue.payload3) + _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, &rawValue.payload3) + _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, rawValue.payload3) + _set_subscript(this.id, index, &rawValue) } } diff --git a/Sources/JavaScriptKit/JSValueConvertible.swift b/Sources/JavaScriptKit/JSValueConvertible.swift index 06d62d22b..ea05b73be 100644 --- a/Sources/JavaScriptKit/JSValueConvertible.swift +++ b/Sources/JavaScriptKit/JSValueConvertible.swift @@ -101,7 +101,7 @@ extension RawJSValue: JSValueConvertible { case .boolean: return .boolean(payload1 != 0) case .number: - return .number(payload3) + return .number(Double(bitPattern: UInt64(payload1) | (UInt64(payload2) << 32))) case .string: // +1 for null terminator let buffer = malloc(Int(payload2 + 1))!.assumingMemoryBound(to: UInt8.self) @@ -125,11 +125,10 @@ extension RawJSValue: JSValueConvertible { } extension JSValue { - func withRawJSValue(_ body: (RawJSValue) -> T) -> T { + func withRawJSValue(_ body: (inout RawJSValue) -> T) -> T { let kind: JavaScriptValueKind let payload1: JavaScriptPayload1 let payload2: JavaScriptPayload2 - var payload3: JavaScriptPayload3 = 0 switch self { case let .boolean(boolValue): kind = .boolean @@ -137,15 +136,14 @@ extension JSValue { payload2 = 0 case let .number(numberValue): kind = .number - payload1 = 0 - payload2 = 0 - payload3 = numberValue + payload1 = UInt32(numberValue.bitPattern & 0x00000000ffffffff) + payload2 = UInt32((numberValue.bitPattern & 0xffffffff00000000) >> 32) case var .string(stringValue): kind = .string return stringValue.withUTF8 { bufferPtr in let ptrValue = UInt32(UInt(bitPattern: bufferPtr.baseAddress!)) - let rawValue = RawJSValue(kind: kind, payload1: JavaScriptPayload1(ptrValue), payload2: JavaScriptPayload2(bufferPtr.count), payload3: 0) - return body(rawValue) + var rawValue = RawJSValue(kind: kind, payload1: JavaScriptPayload1(ptrValue), payload2: JavaScriptPayload2(bufferPtr.count)) + return body(&rawValue) } case let .object(ref): kind = .object @@ -164,8 +162,8 @@ extension JSValue { payload1 = JavaScriptPayload1(functionRef.id) payload2 = 0 } - let rawValue = RawJSValue(kind: kind, payload1: payload1, payload2: payload2, payload3: payload3) - return body(rawValue) + var rawValue = RawJSValue(kind: kind, payload1: payload1, payload2: payload2) + return body(&rawValue) } } diff --git a/Sources/JavaScriptKit/XcodeSupport.swift b/Sources/JavaScriptKit/XcodeSupport.swift index b75972444..e3f3a3d3c 100644 --- a/Sources/JavaScriptKit/XcodeSupport.swift +++ b/Sources/JavaScriptKit/XcodeSupport.swift @@ -9,34 +9,22 @@ import _CJavaScriptKit func _set_prop( _: JavaScriptObjectRef, _: UnsafePointer!, _: Int32, - _: JavaScriptValueKind, - _: JavaScriptPayload1, - _: JavaScriptPayload2, - _: JavaScriptPayload3 + _: UnsafePointer! ) { fatalError() } func _get_prop( _: JavaScriptObjectRef, _: UnsafePointer!, _: Int32, - _: UnsafeMutablePointer!, - _: UnsafeMutablePointer!, - _: UnsafeMutablePointer!, - _: UnsafeMutablePointer! + _: UnsafePointer! ) { fatalError() } func _set_subscript( _: JavaScriptObjectRef, _: Int32, - _: JavaScriptValueKind, - _: JavaScriptPayload1, - _: JavaScriptPayload2, - _: JavaScriptPayload3 + _: UnsafePointer! ) { fatalError() } func _get_subscript( _: JavaScriptObjectRef, _: Int32, - _: UnsafeMutablePointer!, - _: UnsafeMutablePointer!, - _: UnsafeMutablePointer!, - _: UnsafeMutablePointer! + _: UnsafePointer! ) { fatalError() } func _load_string( _: JavaScriptObjectRef, @@ -45,19 +33,13 @@ import _CJavaScriptKit func _call_function( _: JavaScriptObjectRef, _: UnsafePointer!, _: Int32, - _: UnsafeMutablePointer!, - _: UnsafeMutablePointer!, - _: UnsafeMutablePointer!, - _: UnsafeMutablePointer! + _: UnsafePointer! ) { fatalError() } func _call_function_with_this( _: JavaScriptObjectRef, _: JavaScriptObjectRef, _: UnsafePointer!, _: Int32, - _: UnsafeMutablePointer!, - _: UnsafeMutablePointer!, - _: UnsafeMutablePointer!, - _: UnsafeMutablePointer! + _: UnsafePointer! ) { fatalError() } func _call_new( _: JavaScriptObjectRef, diff --git a/Sources/_CJavaScriptKit/include/_CJavaScriptKit.h b/Sources/_CJavaScriptKit/include/_CJavaScriptKit.h index bc54ba345..38906388e 100644 --- a/Sources/_CJavaScriptKit/include/_CJavaScriptKit.h +++ b/Sources/_CJavaScriptKit/include/_CJavaScriptKit.h @@ -25,35 +25,28 @@ typedef struct { JavaScriptValueKind kind; JavaScriptPayload1 payload1; JavaScriptPayload2 payload2; - JavaScriptPayload3 payload3; } RawJSValue; #if __wasm32__ __attribute__((__import_module__("javascript_kit"), __import_name__("swjs_set_prop"))) extern void _set_prop(const JavaScriptObjectRef _this, const char *prop, const int length, - const JavaScriptValueKind kind, const JavaScriptPayload1 payload1, - const JavaScriptPayload2 payload2, const JavaScriptPayload3 payload3); + const RawJSValue *rawJSValue); __attribute__((__import_module__("javascript_kit"), __import_name__("swjs_get_prop"))) extern void _get_prop(const JavaScriptObjectRef _this, const char *prop, const int length, - JavaScriptValueKind *kind, JavaScriptPayload1 *payload1, - JavaScriptPayload2 *payload2, JavaScriptPayload3 *payload3); + const RawJSValue *rawJSValue); __attribute__((__import_module__("javascript_kit"), __import_name__("swjs_set_subscript"))) extern void _set_subscript(const JavaScriptObjectRef _this, const int length, - const JavaScriptValueKind kind, - const JavaScriptPayload1 payload1, - const JavaScriptPayload2 payload2, - const JavaScriptPayload3 payload3); + const RawJSValue *rawJSValue); __attribute__((__import_module__("javascript_kit"), __import_name__("swjs_get_subscript"))) extern void _get_subscript(const JavaScriptObjectRef _this, const int length, - JavaScriptValueKind *kind, JavaScriptPayload1 *payload1, - JavaScriptPayload2 *payload2, JavaScriptPayload3 *payload3); + const RawJSValue *rawJSValue); __attribute__((__import_module__("javascript_kit"), __import_name__("swjs_load_string"))) extern void @@ -62,20 +55,14 @@ _load_string(const JavaScriptObjectRef ref, unsigned char *buffer); __attribute__((__import_module__("javascript_kit"), __import_name__("swjs_call_function"))) extern void _call_function(const JavaScriptObjectRef ref, const RawJSValue *argv, - const int argc, JavaScriptValueKind *result_kind, - JavaScriptPayload1 *result_payload1, - JavaScriptPayload2 *result_payload2, - JavaScriptPayload3 *result_payload3); + const int argc, const RawJSValue *rawJSValue); __attribute__((__import_module__("javascript_kit"), __import_name__("swjs_call_function_with_this"))) extern void _call_function_with_this(const JavaScriptObjectRef _this, const JavaScriptObjectRef func_ref, const RawJSValue *argv, const int argc, - JavaScriptValueKind *result_kind, - JavaScriptPayload1 *result_payload1, - JavaScriptPayload2 *result_payload2, - JavaScriptPayload3 *result_payload3); + const RawJSValue *rawJSValue); __attribute__((__import_module__("javascript_kit"), __import_name__("swjs_call_new"))) extern void From 27e7b244d77ecfcd95ead6e6c9f4d693791e17b7 Mon Sep 17 00:00:00 2001 From: Jed Fox Date: Sun, 2 Aug 2020 09:15:03 -0400 Subject: [PATCH 2/4] Remove unused functions --- Runtime/src/index.ts | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/Runtime/src/index.ts b/Runtime/src/index.ts index d5c48fe05..ac144907c 100644 --- a/Runtime/src/index.ts +++ b/Runtime/src/index.ts @@ -155,26 +155,11 @@ export class SwiftRuntime { } } - const readUInt32 = (ptr: pointer) => { - const uint32Memory = new Uint32Array(memory().buffer, ptr, 1); - return uint32Memory[0]; - } - - const readFloat64 = (ptr: pointer) => { - const dataView = new DataView(memory().buffer); - return dataView.getFloat64(ptr, true); - } - const writeUint32 = (ptr: pointer, value: number) => { const uint32Memory = new Uint32Array(memory().buffer, ptr); uint32Memory[0] = (value & 0xffffffff); } - const writeFloat64 = (ptr: pointer, value: number) => { - const dataView = new DataView(memory().buffer); - dataView.setFloat64(ptr, value, true); - } - const decodeValue = (dataView: DataView) => { const kind = dataView.getUint32(0, true); const payload1_ptr = Uint32Array.BYTES_PER_ELEMENT From 34c6d86d2a077ef99880f897cc6e6b3cef1bcddd Mon Sep 17 00:00:00 2001 From: Jed Fox Date: Sun, 2 Aug 2020 09:15:54 -0400 Subject: [PATCH 3/4] Add a switch fallthrough to reduce duplicated code --- Runtime/src/index.ts | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/Runtime/src/index.ts b/Runtime/src/index.ts index ac144907c..4fff8eb52 100644 --- a/Runtime/src/index.ts +++ b/Runtime/src/index.ts @@ -180,7 +180,8 @@ export class SwiftRuntime { dataView.getUint32(payload2_ptr, true) ); } - case JavaScriptValueKind.Object: { + case JavaScriptValueKind.Object: + case JavaScriptValueKind.Function: { return this.heap.referenceHeap(dataView.getUint32(payload1_ptr, true)) } case JavaScriptValueKind.Null: { @@ -189,9 +190,6 @@ export class SwiftRuntime { case JavaScriptValueKind.Undefined: { return undefined } - case JavaScriptValueKind.Function: { - return this.heap.referenceHeap(dataView.getUint32(payload1_ptr, true)) - } default: throw new Error(`Type kind "${kind}" is not supported`) } From a1cebd0a9511f960940326f5fd02e02d0aa4c57c Mon Sep 17 00:00:00 2001 From: Jed Fox Date: Sun, 2 Aug 2020 09:17:06 -0400 Subject: [PATCH 4/4] Fix docstring --- Runtime/src/index.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Runtime/src/index.ts b/Runtime/src/index.ts index 4fff8eb52..20bcf614e 100644 --- a/Runtime/src/index.ts +++ b/Runtime/src/index.ts @@ -247,8 +247,7 @@ export class SwiftRuntime { } // Note: - // `decodeValues` assumes that the size of RawJSValue is 24 - // and the alignment of it is 8 + // `decodeValues` assumes that the size of RawJSValue is 12 const decodeValues = (ptr: pointer, length: number) => { let result = [] for (let index = 0; index < length; index++) {