diff --git a/js-runtime/src/js-runtime.js b/js-runtime/src/js-runtime.js index 9b0096cf..b11e2c81 100644 --- a/js-runtime/src/js-runtime.js +++ b/js-runtime/src/js-runtime.js @@ -268,6 +268,13 @@ const zig = { memory.setString(ptr, values[value_map[val_id]]); }, + zigValueEqual(val, other) { + let memory = new MemoryBlock(zig.wasm.exports.memory.buffer); + const val_js = zig.readObject(memory.slice(val), memory); + const other_js = zig.readObject(memory.slice(other), memory); + return val_js === other_js; + }, + functionCall(func, this_param, args, args_len, ret_ptr) { let memory = new MemoryBlock(zig.wasm.exports.memory.buffer); let argv = []; diff --git a/js-runtime/src/main.zig b/js-runtime/src/main.zig index 420cc3a0..53d75ad4 100644 --- a/js-runtime/src/main.zig +++ b/js-runtime/src/main.zig @@ -14,6 +14,7 @@ const js = struct { extern fn zigSetIndex(id: u64, index: u32, set_ptr: *const anyopaque) void; extern fn zigGetString(val_id: u64, ptr: [*]const u8) void; extern fn zigGetStringLength(val_id: u64) u32; + extern fn zigValueEqual(val: *const anyopaque, other: *const anyopaque) bool; extern fn zigDeleteIndex(id: u64, index: u32) void; extern fn zigFunctionCall(id: u64, name: [*]const u8, len: u32, args: ?*const anyopaque, args_len: u32, ret_ptr: *anyopaque) void; extern fn zigFunctionInvoke(id: u64, args: ?*const anyopaque, args_len: u32, ret_ptr: *anyopaque) void; @@ -79,6 +80,18 @@ pub const Value = extern struct { else => unreachable, }; } + + pub fn eql(val: *const Value, other: Value) bool { + if (val.tag != other.tag) + return false; + + return switch (val.tag) { + .num => val.val.num == other.val.num, + .bool => val.val.bool == other.val.bool, + // Using JS equality (===) is better here since lets say a ref can be dangling + else => js.zigValueEqual(val, &other), + }; + } }; pub const Object = struct {