Skip to content

Commit 17af647

Browse files
Unify JavaScriptValueKindAndFlags type across non-/Embedded builds
1 parent a4636bb commit 17af647

File tree

3 files changed

+16
-33
lines changed

3 files changed

+16
-33
lines changed

Sources/JavaScriptKit/FundamentalObjects/JSFunction.swift

+7-17
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,7 @@ public class JSFunction: JSObject, _JSFunctionProtocol {
136136
id, argv, Int32(argc),
137137
&payload1, &payload2
138138
)
139-
let kindAndFlags = valueKindAndFlagsFromBits(resultBitPattern)
139+
let kindAndFlags = JavaScriptValueKindAndFlags(bitPattern: resultBitPattern)
140140
assert(!kindAndFlags.isException)
141141
let result = RawJSValue(kind: kindAndFlags.kind, payload1: payload1, payload2: payload2)
142142
return result
@@ -153,7 +153,7 @@ public class JSFunction: JSObject, _JSFunctionProtocol {
153153
id, argv, Int32(argc),
154154
&payload1, &payload2
155155
)
156-
let kindAndFlags = valueKindAndFlagsFromBits(resultBitPattern)
156+
let kindAndFlags = JavaScriptValueKindAndFlags(bitPattern: resultBitPattern)
157157
#if !hasFeature(Embedded)
158158
assert(!kindAndFlags.isException)
159159
#endif
@@ -241,25 +241,15 @@ public extension _JSFunctionProtocol {
241241
new(arguments: [arg0.jsValue, arg1.jsValue, arg2.jsValue, arg3.jsValue, arg4.jsValue, arg5.jsValue, arg6.jsValue])
242242
}
243243
}
244+
#endif
244245

245-
// C bit fields seem to not work with Embedded
246-
// in "normal mode" this is defined as a C struct
247-
private struct JavaScriptValueKindAndFlags {
248-
let errorBit: UInt32 = 1 << 32
246+
internal struct JavaScriptValueKindAndFlags {
247+
static var errorBit: UInt32 { 1 << 31 }
249248
let kind: JavaScriptValueKind
250249
let isException: Bool
251250

252251
init(bitPattern: UInt32) {
253-
self.kind = JavaScriptValueKind(rawValue: bitPattern & ~errorBit)!
254-
self.isException = (bitPattern & errorBit) != 0
252+
self.kind = JavaScriptValueKind(rawValue: bitPattern & ~Self.errorBit)!
253+
self.isException = (bitPattern & Self.errorBit) != 0
255254
}
256255
}
257-
#endif
258-
259-
private func valueKindAndFlagsFromBits(_ bits: UInt32) -> JavaScriptValueKindAndFlags {
260-
#if hasFeature(Embedded)
261-
JavaScriptValueKindAndFlags(bitPattern: bits)
262-
#else
263-
unsafeBitCast(bits, to: JavaScriptValueKindAndFlags.self)
264-
#endif
265-
}

Sources/JavaScriptKit/FundamentalObjects/JSThrowingFunction.swift

+7-6
Original file line numberDiff line numberDiff line change
@@ -42,13 +42,14 @@ public class JSThrowingFunction {
4242
let argv = bufferPointer.baseAddress
4343
let argc = bufferPointer.count
4444

45-
var exceptionKind = JavaScriptValueKindAndFlags()
45+
var exceptionRawKind = JavaScriptRawValueKindAndFlags()
4646
var exceptionPayload1 = JavaScriptPayload1()
4747
var exceptionPayload2 = JavaScriptPayload2()
4848
let resultObj = swjs_call_throwing_new(
4949
self.base.id, argv, Int32(argc),
50-
&exceptionKind, &exceptionPayload1, &exceptionPayload2
50+
&exceptionRawKind, &exceptionPayload1, &exceptionPayload2
5151
)
52+
let exceptionKind = JavaScriptValueKindAndFlags(bitPattern: exceptionRawKind)
5253
if exceptionKind.isException {
5354
let exception = RawJSValue(kind: exceptionKind.kind, payload1: exceptionPayload1, payload2: exceptionPayload2)
5455
return .failure(exception.jsValue)
@@ -70,21 +71,21 @@ private func invokeJSFunction(_ jsFunc: JSFunction, arguments: [ConvertibleToJSV
7071
rawValues.withUnsafeBufferPointer { bufferPointer -> (JSValue, Bool) in
7172
let argv = bufferPointer.baseAddress
7273
let argc = bufferPointer.count
73-
var kindAndFlags = JavaScriptValueKindAndFlags()
74+
let kindAndFlags: JavaScriptValueKindAndFlags
7475
var payload1 = JavaScriptPayload1()
7576
var payload2 = JavaScriptPayload2()
7677
if let thisId = this?.id {
7778
let resultBitPattern = swjs_call_function_with_this(
7879
thisId, id, argv, Int32(argc),
7980
&payload1, &payload2
8081
)
81-
kindAndFlags = unsafeBitCast(resultBitPattern, to: JavaScriptValueKindAndFlags.self)
82+
kindAndFlags = JavaScriptValueKindAndFlags(bitPattern: resultBitPattern)
8283
} else {
8384
let resultBitPattern = swjs_call_function(
8485
id, argv, Int32(argc),
8586
&payload1, &payload2
8687
)
87-
kindAndFlags = unsafeBitCast(resultBitPattern, to: JavaScriptValueKindAndFlags.self)
88+
kindAndFlags = JavaScriptValueKindAndFlags(bitPattern: resultBitPattern)
8889
}
8990
let result = RawJSValue(kind: kindAndFlags.kind, payload1: payload1, payload2: payload2)
9091
return (result.jsValue, kindAndFlags.isException)
@@ -95,4 +96,4 @@ private func invokeJSFunction(_ jsFunc: JSFunction, arguments: [ConvertibleToJSV
9596
}
9697
return result
9798
}
98-
#endif
99+
#endif

Sources/_CJavaScriptKit/include/_CJavaScriptKit.h

+2-10
Original file line numberDiff line numberDiff line change
@@ -29,15 +29,7 @@ typedef enum __attribute__((enum_extensibility(closed))) {
2929
JavaScriptValueKindBigInt = 8,
3030
} JavaScriptValueKind;
3131

32-
#if __Embedded
33-
// something about the bit field widths is not working with embedded
34-
typedef unsigned short JavaScriptValueKindAndFlags;
35-
#else
36-
typedef struct {
37-
JavaScriptValueKind kind: 31;
38-
bool isException: 1;
39-
} JavaScriptValueKindAndFlags;
40-
#endif
32+
typedef uint32_t JavaScriptRawValueKindAndFlags;
4133

4234
typedef unsigned JavaScriptPayload1;
4335
typedef double JavaScriptPayload2;
@@ -253,7 +245,7 @@ IMPORT_JS_FUNCTION(swjs_call_new, JavaScriptObjectRef, (const JavaScriptObjectRe
253245
IMPORT_JS_FUNCTION(swjs_call_throwing_new, JavaScriptObjectRef, (const JavaScriptObjectRef ref,
254246
const RawJSValue *argv,
255247
const int argc,
256-
JavaScriptValueKindAndFlags *exception_kind,
248+
JavaScriptRawValueKindAndFlags *exception_kind,
257249
JavaScriptPayload1 *exception_payload1,
258250
JavaScriptPayload2 *exception_payload2))
259251

0 commit comments

Comments
 (0)