diff options
Diffstat (limited to 'src/bun.js')
-rw-r--r-- | src/bun.js/api/FFI.h | 27 | ||||
-rw-r--r-- | src/bun.js/api/bun.zig | 44 | ||||
-rw-r--r-- | src/bun.js/bindings/bindings.zig | 4 | ||||
-rw-r--r-- | src/bun.js/bindings/headers-cpp.h | 2 | ||||
-rw-r--r-- | src/bun.js/bindings/headers.h | 2 |
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> |