aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar dave caruso <me@paperdave.net> 2023-09-21 20:52:13 -0700
committerGravatar dave caruso <me@paperdave.net> 2023-09-21 20:52:13 -0700
commit3bcf1ae20818357ad9353221fe0d9d28cb7b485b (patch)
treed37a54181cbe72c28029af0a12f2ce3762c3d484
parent030407c52e0be488027762dc2351865b01c83833 (diff)
downloadbun-dave/assert-double-is-valid.tar.gz
bun-dave/assert-double-is-valid.tar.zst
bun-dave/assert-double-is-valid.zip
-rw-r--r--src/bun.js/bindings/FFI.zig14
-rw-r--r--src/bun.js/bindings/bindings.cpp4
-rw-r--r--src/bun.js/bindings/bindings.zig5
-rw-r--r--src/bun.js/bindings/headers.h1
-rw-r--r--src/bun.js/bindings/headers.zig1
5 files changed, 14 insertions, 11 deletions
diff --git a/src/bun.js/bindings/FFI.zig b/src/bun.js/bindings/FFI.zig
index 9d16bd78e..40a9ba40e 100644
--- a/src/bun.js/bindings/FFI.zig
+++ b/src/bun.js/bindings/FFI.zig
@@ -85,7 +85,21 @@ pub inline fn INT64_TO_JSVALUE(arg_globalObject: ?*anyopaque, arg_val: i64) Enco
pub inline fn INT32_TO_JSVALUE(arg_val: i32) EncodedJSValue {
return .{ .asInt64 = @as(i64, @bitCast(@as(c_ulonglong, 18446181123756130304) | @as(c_ulonglong, @bitCast(@as(c_ulonglong, @as(u32, @bitCast(arg_val))))))) };
}
+// See PureNaN.h in JavaScriptCore
+const pure_nan: u64 = 0x7ff8000000000000;
+const bun = @import("root").bun;
+
+inline fn isImpureNaN(arg_val: f64) bool {
+ return @as(u64, @bitCast(arg_val)) > 0xfffe000000000000;
+}
+
pub inline fn DOUBLE_TO_JSVALUE(arg_val: f64) EncodedJSValue {
+ if (bun.Environment.allow_assert) {
+ if (isImpureNaN(arg_val)) {
+ @panic("An impure NaN value was passed to DOUBLE_TO_JSVALUE");
+ }
+ }
+
var res: EncodedJSValue = .{ .asDouble = arg_val };
res.asInt64 += @as(c_longlong, 1) << @as(@import("std").math.Log2Int(c_longlong), @intCast(49));
return res;
diff --git a/src/bun.js/bindings/bindings.cpp b/src/bun.js/bindings/bindings.cpp
index bff5640ef..e0f041df2 100644
--- a/src/bun.js/bindings/bindings.cpp
+++ b/src/bun.js/bindings/bindings.cpp
@@ -3029,10 +3029,6 @@ JSC__JSValue JSC__JSValue__jsBoolean(bool arg0)
{
return JSC::JSValue::encode(JSC::jsBoolean(arg0));
};
-JSC__JSValue JSC__JSValue__jsDoubleNumber(double arg0)
-{
- return JSC::JSValue::encode(JSC::jsNumber(arg0));
-}
JSC__JSValue JSC__JSValue__jsNull() { return JSC::JSValue::encode(JSC::jsNull()); };
JSC__JSValue JSC__JSValue__jsNumberFromChar(unsigned char arg0)
{
diff --git a/src/bun.js/bindings/bindings.zig b/src/bun.js/bindings/bindings.zig
index 3a0b369e9..2c10b665c 100644
--- a/src/bun.js/bindings/bindings.zig
+++ b/src/bun.js/bindings/bindings.zig
@@ -3840,10 +3840,6 @@ pub const JSValue = enum(JSValueReprInt) {
return cppFn("jsTDZValue", .{});
}
- pub fn jsDoubleNumber(i: f64) JSValue {
- return cppFn("jsDoubleNumber", .{i});
- }
-
pub fn className(this: JSValue, globalThis: *JSGlobalObject) ZigString {
var str = ZigString.init("");
this.getClassName(globalThis, &str);
@@ -4866,7 +4862,6 @@ pub const JSValue = enum(JSValueReprInt) {
"isTerminationException",
"isUInt32AsAnyInt",
"jsBoolean",
- "jsDoubleNumber",
"jsNull",
"jsNumberFromChar",
"jsNumberFromDouble",
diff --git a/src/bun.js/bindings/headers.h b/src/bun.js/bindings/headers.h
index cffb9f0c9..62cf6e02e 100644
--- a/src/bun.js/bindings/headers.h
+++ b/src/bun.js/bindings/headers.h
@@ -369,7 +369,6 @@ CPP_DECL bool JSC__JSValue__jestDeepEquals(JSC__JSValue JSValue0, JSC__JSValue J
CPP_DECL bool JSC__JSValue__jestDeepMatch(JSC__JSValue JSValue0, JSC__JSValue JSValue1, JSC__JSGlobalObject* arg2, bool arg3);
CPP_DECL bool JSC__JSValue__jestStrictDeepEquals(JSC__JSValue JSValue0, JSC__JSValue JSValue1, JSC__JSGlobalObject* arg2);
CPP_DECL JSC__JSValue JSC__JSValue__jsBoolean(bool arg0);
-CPP_DECL JSC__JSValue JSC__JSValue__jsDoubleNumber(double arg0);
CPP_DECL JSC__JSValue JSC__JSValue__jsNull();
CPP_DECL JSC__JSValue JSC__JSValue__jsNumberFromChar(unsigned char arg0);
CPP_DECL JSC__JSValue JSC__JSValue__jsNumberFromDouble(double arg0);
diff --git a/src/bun.js/bindings/headers.zig b/src/bun.js/bindings/headers.zig
index a696e86b1..266bf05cf 100644
--- a/src/bun.js/bindings/headers.zig
+++ b/src/bun.js/bindings/headers.zig
@@ -271,7 +271,6 @@ pub extern fn JSC__JSValue__jestDeepEquals(JSValue0: JSC__JSValue, JSValue1: JSC
pub extern fn JSC__JSValue__jestDeepMatch(JSValue0: JSC__JSValue, JSValue1: JSC__JSValue, arg2: *bindings.JSGlobalObject, arg3: bool) bool;
pub extern fn JSC__JSValue__jestStrictDeepEquals(JSValue0: JSC__JSValue, JSValue1: JSC__JSValue, arg2: *bindings.JSGlobalObject) bool;
pub extern fn JSC__JSValue__jsBoolean(arg0: bool) JSC__JSValue;
-pub extern fn JSC__JSValue__jsDoubleNumber(arg0: f64) JSC__JSValue;
pub extern fn JSC__JSValue__jsNull(...) JSC__JSValue;
pub extern fn JSC__JSValue__jsNumberFromChar(arg0: u8) JSC__JSValue;
pub extern fn JSC__JSValue__jsNumberFromDouble(arg0: f64) JSC__JSValue;