diff options
Diffstat (limited to 'src/libzisp/value/ptr.zig')
| -rw-r--r-- | src/libzisp/value/ptr.zig | 20 |
1 files changed, 11 insertions, 9 deletions
diff --git a/src/libzisp/value/ptr.zig b/src/libzisp/value/ptr.zig index b07acc4..2ed3765 100644 --- a/src/libzisp/value/ptr.zig +++ b/src/libzisp/value/ptr.zig @@ -1,9 +1,11 @@ const std = @import("std"); -const value = @import("../value.zig"); + const gc = @import("../gc.zig"); +const value = @import("../value.zig"); + +const Hval = gc.Hval; const Value = value.Value; -const Hval = value.Hval; // Zig API @@ -86,23 +88,23 @@ pub fn assertStrong(v: Value) void { } } -pub fn packZisp(ptr: [*]Hval, tag: Tag, is_weak: bool) Value { +pub fn packZisp(ptr: *Hval, tag: Tag, is_weak: bool) Value { return .{ .zptr = .{ .tagged_value = tagPtr(ptr, tag), .is_weak = is_weak, } }; } -pub fn pack(ptr: [*]Hval, tag: Tag) Value { +pub fn pack(ptr: *Hval, tag: Tag) Value { return packZisp(ptr, tag, false); } -pub fn packWeak(ptr: [*]Hval, tag: Tag) Value { +pub fn packWeak(ptr: *Hval, tag: Tag) Value { return packZisp(ptr, tag, true); } // Unpacks weak as well; no need for a separate fn. -pub fn unpack(v: Value) struct { [*]Hval, Tag } { +pub fn unpack(v: Value) struct { *Hval, Tag } { assertZisp(v); return untagPtr(v.zptr.tagged_value); } @@ -117,15 +119,15 @@ pub fn isWeakNull(v: Value) bool { return v.zptr.tagged_value == 0; } -fn tagPtr(ptr: [*]Hval, tag: Tag) u48 { +fn tagPtr(ptr: *Hval, tag: Tag) u48 { const int: usize = @intFromPtr(ptr); const untagged: u48 = @intCast(int); return untagged | @intFromEnum(tag); } -fn untagPtr(tagged: u48) struct { [*]Hval, Tag } { +fn untagPtr(tagged: u48) struct { *Hval, Tag } { const untagged: u48 = tagged & 0xfffffffffff8; - const ptr: [*]Hval = @ptrFromInt(untagged); + const ptr: *Hval = @ptrFromInt(untagged); const int: u3 = @truncate(tagged); const tag: Tag = @enumFromInt(int); return .{ ptr, tag }; |
