aboutsummaryrefslogtreecommitdiff
path: root/src/bun.js
diff options
context:
space:
mode:
Diffstat (limited to 'src/bun.js')
-rw-r--r--src/bun.js/api/FFI.h27
-rw-r--r--src/bun.js/api/bun.zig44
-rw-r--r--src/bun.js/bindings/bindings.zig4
-rw-r--r--src/bun.js/bindings/headers-cpp.h2
-rw-r--r--src/bun.js/bindings/headers.h2
5 files changed, 46 insertions, 33 deletions
diff --git a/src/bun.js/api/FFI.h b/src/bun.js/api/FFI.h
index 468f9a0fc..a42228588 100644
--- a/src/bun.js/api/FFI.h
+++ b/src/bun.js/api/FFI.h
@@ -146,17 +146,31 @@ static bool JSVALUE_IS_NUMBER(EncodedJSValue val) {
}
+// JSValue numbers-as-pointers are represented as a 52-bit integer
+// Previously, the pointer was stored at the end of the 64-bit value
+// Now, they're stored at the beginning of the 64-bit value
+// This behavior change enables the JIT to handle it better
+// It also is better readability when console.log(myPtr)
static void* JSVALUE_TO_PTR(EncodedJSValue val) {
- // must be a double
- return val.asInt64 == TagValueNull ? 0 : (void*)(val.asInt64 - DoubleEncodeOffset);
+ val.asInt64 -= DoubleEncodeOffset;
+ size_t ptr = (size_t)val.asDouble;
+ return (void*)ptr;
}
static EncodedJSValue PTR_TO_JSVALUE(void* ptr) {
EncodedJSValue val;
- val.asInt64 = ptr == 0 ? TagValueNull : (int64_t)ptr + DoubleEncodeOffset;
+ val.asPtr = ptr;
+ val.asInt64 += DoubleEncodeOffset;
return val;
}
+static EncodedJSValue DOUBLE_TO_JSVALUE(double val) {
+ EncodedJSValue res;
+ res.asDouble = val;
+ res.asInt64 += DoubleEncodeOffset;
+ return res;
+}
+
static int32_t JSVALUE_TO_INT32(EncodedJSValue val) {
return val.asInt64;
}
@@ -168,12 +182,7 @@ static EncodedJSValue INT32_TO_JSVALUE(int32_t val) {
}
-static EncodedJSValue DOUBLE_TO_JSVALUE(double val) {
- EncodedJSValue res;
- res.asDouble = val;
- res.asInt64 += DoubleEncodeOffset;
- return res;
-}
+
static EncodedJSValue FLOAT_TO_JSVALUE(float val) {
return DOUBLE_TO_JSVALUE((double)val);
diff --git a/src/bun.js/api/bun.zig b/src/bun.js/api/bun.zig
index deefec225..c537a77ab 100644
--- a/src/bun.js/api/bun.zig
+++ b/src/bun.js/api/bun.zig
@@ -2330,7 +2330,7 @@ pub const FFI = struct {
_: JSValue,
arguments: []const JSValue,
) JSValue {
- const addr = arguments[0].asPtrAddress() + @intCast(usize, arguments[1].to(i32));
+ const addr = arguments[0].asPtrAddress() + if (arguments.len > 1) @intCast(usize, arguments[1].to(i32)) else @as(usize, 0);
const value = @intToPtr(*align(1) u8, addr).*;
return JSValue.jsNumber(value);
}
@@ -2339,7 +2339,7 @@ pub const FFI = struct {
_: JSValue,
arguments: []const JSValue,
) JSValue {
- const addr = arguments[0].asPtrAddress() + @intCast(usize, arguments[1].to(i32));
+ const addr = arguments[0].asPtrAddress() + if (arguments.len > 1) @intCast(usize, arguments[1].to(i32)) else @as(usize, 0);
const value = @intToPtr(*align(1) u16, addr).*;
return JSValue.jsNumber(value);
}
@@ -2348,7 +2348,7 @@ pub const FFI = struct {
_: JSValue,
arguments: []const JSValue,
) JSValue {
- const addr = arguments[0].asPtrAddress() + @intCast(usize, if (arguments.len > 1) arguments[1].to(i32) else @as(i32, 0));
+ const addr = arguments[0].asPtrAddress() + if (arguments.len > 1) @intCast(usize, arguments[1].to(i32)) else @as(usize, 0);
const value = @intToPtr(*align(1) u32, addr).*;
return JSValue.jsNumber(value);
}
@@ -2357,7 +2357,7 @@ pub const FFI = struct {
_: JSValue,
arguments: []const JSValue,
) JSValue {
- const addr = arguments[0].asPtrAddress() + @intCast(usize, if (arguments.len > 1) arguments[1].to(i32) else @as(i32, 0));
+ const addr = arguments[0].asPtrAddress() + if (arguments.len > 1) @intCast(usize, arguments[1].to(i32)) else @as(usize, 0);
const value = @intToPtr(*align(1) u64, addr).*;
return JSValue.jsNumber(value);
}
@@ -2366,7 +2366,7 @@ pub const FFI = struct {
_: JSValue,
arguments: []const JSValue,
) JSValue {
- const addr = arguments[0].asPtrAddress() + @intCast(usize, if (arguments.len > 1) arguments[1].to(i32) else @as(i32, 0));
+ const addr = arguments[0].asPtrAddress() + if (arguments.len > 1) @intCast(usize, arguments[1].to(i32)) else @as(usize, 0);
const value = @intToPtr(*align(1) i8, addr).*;
return JSValue.jsNumber(value);
}
@@ -2375,7 +2375,7 @@ pub const FFI = struct {
_: JSValue,
arguments: []const JSValue,
) JSValue {
- const addr = arguments[0].asPtrAddress() + @intCast(usize, if (arguments.len > 1) arguments[1].to(i32) else @as(i32, 0));
+ const addr = arguments[0].asPtrAddress() + if (arguments.len > 1) @intCast(usize, arguments[1].to(i32)) else @as(usize, 0);
const value = @intToPtr(*align(1) i16, addr).*;
return JSValue.jsNumber(value);
}
@@ -2384,7 +2384,7 @@ pub const FFI = struct {
_: JSValue,
arguments: []const JSValue,
) JSValue {
- const addr = arguments[0].asPtrAddress() + @intCast(usize, if (arguments.len > 1) arguments[1].to(i32) else @as(i32, 0));
+ const addr = arguments[0].asPtrAddress() + if (arguments.len > 1) @intCast(usize, arguments[1].to(i32)) else @as(usize, 0);
const value = @intToPtr(*align(1) i32, addr).*;
return JSValue.jsNumber(value);
}
@@ -2393,7 +2393,7 @@ pub const FFI = struct {
_: JSValue,
arguments: []const JSValue,
) JSValue {
- const addr = arguments[0].asPtrAddress() + @intCast(usize, if (arguments.len > 1) arguments[1].to(i32) else @as(i32, 0));
+ const addr = arguments[0].asPtrAddress() + if (arguments.len > 1) @intCast(usize, arguments[1].to(i32)) else @as(usize, 0);
const value = @intToPtr(*align(1) i64, addr).*;
return JSValue.jsNumber(value);
}
@@ -2404,7 +2404,7 @@ pub const FFI = struct {
raw_addr: i64,
offset: i32,
) callconv(.C) JSValue {
- const addr = @intCast(usize, raw_addr + @as(i64, offset));
+ const addr = @intCast(usize, raw_addr) + @intCast(usize, offset);
const value = @intToPtr(*align(1) u8, addr).*;
return JSValue.jsNumber(value);
}
@@ -2414,7 +2414,7 @@ pub const FFI = struct {
raw_addr: i64,
offset: i32,
) callconv(.C) JSValue {
- const addr = @intCast(usize, raw_addr + @as(i64, offset));
+ const addr = @intCast(usize, raw_addr) + @intCast(usize, offset);
const value = @intToPtr(*align(1) u16, addr).*;
return JSValue.jsNumber(value);
}
@@ -2424,7 +2424,7 @@ pub const FFI = struct {
raw_addr: i64,
offset: i32,
) callconv(.C) JSValue {
- const addr = @intCast(usize, raw_addr + @as(i64, offset));
+ const addr = @intCast(usize, raw_addr) + @intCast(usize, offset);
const value = @intToPtr(*align(1) u32, addr).*;
return JSValue.jsNumber(value);
}
@@ -2434,7 +2434,7 @@ pub const FFI = struct {
raw_addr: i64,
offset: i32,
) callconv(.C) JSValue {
- const addr = @intCast(usize, raw_addr + @as(i64, offset));
+ const addr = @intCast(usize, raw_addr) + @intCast(usize, offset);
const value = @intToPtr(*align(1) u64, addr).*;
return JSValue.jsNumber(value);
}
@@ -2444,7 +2444,7 @@ pub const FFI = struct {
raw_addr: i64,
offset: i32,
) callconv(.C) JSValue {
- const addr = @intCast(usize, raw_addr + @as(i64, offset));
+ const addr = @intCast(usize, raw_addr) + @intCast(usize, offset);
const value = @intToPtr(*align(1) i8, addr).*;
return JSValue.jsNumber(value);
}
@@ -2454,7 +2454,7 @@ pub const FFI = struct {
raw_addr: i64,
offset: i32,
) callconv(.C) JSValue {
- const addr = @intCast(usize, raw_addr + @as(i64, offset));
+ const addr = @intCast(usize, raw_addr) + @intCast(usize, offset);
const value = @intToPtr(*align(1) i16, addr).*;
return JSValue.jsNumber(value);
}
@@ -2464,7 +2464,7 @@ pub const FFI = struct {
raw_addr: i64,
offset: i32,
) callconv(.C) JSValue {
- const addr = @intCast(usize, raw_addr + @as(i64, offset));
+ const addr = @intCast(usize, raw_addr) + @intCast(usize, offset);
const value = @intToPtr(*align(1) i32, addr).*;
return JSValue.jsNumber(value);
}
@@ -2474,7 +2474,7 @@ pub const FFI = struct {
raw_addr: i64,
offset: i32,
) callconv(.C) JSValue {
- const addr = @intCast(usize, raw_addr + @as(i64, offset));
+ const addr = @intCast(usize, raw_addr) + @intCast(usize, offset);
const value = @intToPtr(*align(1) i64, addr).*;
return JSValue.jsNumber(value);
}
@@ -2574,6 +2574,10 @@ pub const FFI = struct {
return JSC.toInvalidArguments("ptr to invalid memory, that would segfault Bun :(", .{}, globalThis.ref());
}
+ if (comptime Environment.allow_assert) {
+ std.debug.assert(JSC.JSValue.fromPtrAddress(addr).asPtrAddress() == addr);
+ }
+
return JSC.JSValue.fromPtrAddress(addr);
}
@@ -2587,14 +2591,14 @@ pub const FFI = struct {
return .{ .err = JSC.toInvalidArguments("ptr must be a number.", .{}, globalThis.ref()) };
}
- const num = value.asNumber();
+ const num = value.asPtrAddress();
if (num == 0) {
return .{ .err = JSC.toInvalidArguments("ptr cannot be zero, that would segfault Bun :(", .{}, globalThis.ref()) };
}
- if (!std.math.isFinite(num)) {
- return .{ .err = JSC.toInvalidArguments("ptr must be a finite number.", .{}, globalThis.ref()) };
- }
+ // if (!std.math.isFinite(num)) {
+ // return .{ .err = JSC.toInvalidArguments("ptr must be a finite number.", .{}, globalThis.ref()) };
+ // }
var addr = @bitCast(usize, num);
diff --git a/src/bun.js/bindings/bindings.zig b/src/bun.js/bindings/bindings.zig
index 84d3c2bc2..c8128e729 100644
--- a/src/bun.js/bindings/bindings.zig
+++ b/src/bun.js/bindings/bindings.zig
@@ -3214,11 +3214,11 @@ pub const JSValue = enum(JSValueReprInt) {
}
pub fn fromPtrAddress(addr: anytype) JSValue {
- return jsNumber(@bitCast(f64, @as(usize, addr)));
+ return jsNumber(@intToFloat(f64, @bitCast(usize, @as(usize, addr))));
}
pub fn asPtrAddress(this: JSValue) usize {
- return @bitCast(usize, this.asDouble());
+ return @bitCast(usize, @floatToInt(usize, this.asDouble()));
}
pub fn fromPtr(addr: anytype) JSValue {
diff --git a/src/bun.js/bindings/headers-cpp.h b/src/bun.js/bindings/headers-cpp.h
index fa856aeb1..b956eeb97 100644
--- a/src/bun.js/bindings/headers-cpp.h
+++ b/src/bun.js/bindings/headers-cpp.h
@@ -1,4 +1,4 @@
-//-- AUTOGENERATED FILE -- 1662704581
+//-- AUTOGENERATED FILE -- 1662716176
// clang-format off
#pragma once
diff --git a/src/bun.js/bindings/headers.h b/src/bun.js/bindings/headers.h
index d5011fc76..e220b5c35 100644
--- a/src/bun.js/bindings/headers.h
+++ b/src/bun.js/bindings/headers.h
@@ -1,5 +1,5 @@
// clang-format off
-//-- AUTOGENERATED FILE -- 1662704581
+//-- AUTOGENERATED FILE -- 1662716176
#pragma once
#include <stddef.h>