diff options
| author | Taylan Kammer <taylan.kammer@gmail.com> | 2025-02-28 14:38:57 +0100 |
|---|---|---|
| committer | Taylan Kammer <taylan.kammer@gmail.com> | 2025-02-28 14:38:57 +0100 |
| commit | 472f3e89a61ec51218cefe65305ec6f0a0d95fbf (patch) | |
| tree | a64ef16a6b23a822ab09e02b9d967f3b8bb3d17e /src/libzisp/value | |
| parent | 34de389fe744018e808f2c8b301648d504ab610d (diff) | |
update
Diffstat (limited to 'src/libzisp/value')
| -rw-r--r-- | src/libzisp/value/boole.zig | 5 | ||||
| -rw-r--r-- | src/libzisp/value/char.zig | 2 | ||||
| -rw-r--r-- | src/libzisp/value/eof.zig | 2 | ||||
| -rw-r--r-- | src/libzisp/value/istr.zig | 3 | ||||
| -rw-r--r-- | src/libzisp/value/misc.zig | 8 | ||||
| -rw-r--r-- | src/libzisp/value/nil.zig | 2 | ||||
| -rw-r--r-- | src/libzisp/value/pair.zig | 2 | ||||
| -rw-r--r-- | src/libzisp/value/ptr.zig | 54 | ||||
| -rw-r--r-- | src/libzisp/value/rune.zig | 13 | ||||
| -rw-r--r-- | src/libzisp/value/sstr.zig | 10 |
10 files changed, 43 insertions, 58 deletions
diff --git a/src/libzisp/value/boole.zig b/src/libzisp/value/boole.zig index 623dbc2..2e94e4d 100644 --- a/src/libzisp/value/boole.zig +++ b/src/libzisp/value/boole.zig @@ -1,8 +1,7 @@ const Value = @import("../value.zig").Value; -const misc = @import("misc.zig"); -pub const f = misc.f; -pub const t = misc.t; +pub const f = Value{ .misc = .{ .value = .f } }; +pub const t = Value{ .misc = .{ .value = .t } }; // Zig API diff --git a/src/libzisp/value/char.zig b/src/libzisp/value/char.zig index eb4bbc9..09a3034 100644 --- a/src/libzisp/value/char.zig +++ b/src/libzisp/value/char.zig @@ -5,7 +5,7 @@ const Value = value.Value; // Zig API pub fn check(v: Value) bool { - return v.isOther(.char); + return v.isOtherTag(.char); } pub fn assert(v: Value) void { diff --git a/src/libzisp/value/eof.zig b/src/libzisp/value/eof.zig index 367a86c..4b16669 100644 --- a/src/libzisp/value/eof.zig +++ b/src/libzisp/value/eof.zig @@ -2,7 +2,7 @@ const value = @import("../value.zig"); const Value = value.Value; -pub const eof = @import("misc.zig").eof; +pub const eof = Value{ .misc = .{ .value = .eof } }; // Zig API diff --git a/src/libzisp/value/istr.zig b/src/libzisp/value/istr.zig new file mode 100644 index 0000000..5937531 --- /dev/null +++ b/src/libzisp/value/istr.zig @@ -0,0 +1,3 @@ +const std = @import("std"); + +const value = @import("../value.zig"); diff --git a/src/libzisp/value/misc.zig b/src/libzisp/value/misc.zig deleted file mode 100644 index 30cbf84..0000000 --- a/src/libzisp/value/misc.zig +++ /dev/null @@ -1,8 +0,0 @@ -const Value = @import("../value.zig").Value; - -pub const f = Value{ .misc = .{ .value = 0 } }; -pub const t = Value{ .misc = .{ .value = 1 } }; -pub const nil = Value{ .misc = .{ .value = 2 } }; -pub const eof = Value{ .misc = .{ .value = 3 } }; - -pub const undef = Value{ .misc = .{ .value = 255 } }; diff --git a/src/libzisp/value/nil.zig b/src/libzisp/value/nil.zig index 14bd800..f95ecad 100644 --- a/src/libzisp/value/nil.zig +++ b/src/libzisp/value/nil.zig @@ -2,7 +2,7 @@ const value = @import("../value.zig"); const Value = value.Value; -pub const nil = @import("misc.zig").nil; +pub const nil = Value{ .misc = .{ .value = .nil } }; // Zig API diff --git a/src/libzisp/value/pair.zig b/src/libzisp/value/pair.zig index 541a5f5..1c34096 100644 --- a/src/libzisp/value/pair.zig +++ b/src/libzisp/value/pair.zig @@ -9,7 +9,7 @@ const Value = value.Value; // Zig API pub fn check(v: Value) bool { - return ptr.checkZisp(v, .pair); + return ptr.checkZispTag(v, .pair); } pub fn assert(v: Value) void { diff --git a/src/libzisp/value/ptr.zig b/src/libzisp/value/ptr.zig index e1fadf2..115cc2d 100644 --- a/src/libzisp/value/ptr.zig +++ b/src/libzisp/value/ptr.zig @@ -2,8 +2,8 @@ const std = @import("std"); const value = @import("../value.zig"); const gc = @import("../gc.zig"); -const Bucket = gc.Bucket; const Value = value.Value; +const Hval = value.Hval; // Zig API @@ -42,19 +42,19 @@ pub fn unpackForeign(v: Value) u50 { // Zisp Pointers -fn _checkZisp(v: Value) bool { +pub fn checkZisp(v: Value) bool { return check(v) and !v.ptr.is_foreign; } -fn _assertZisp(v: Value) void { - if (!_checkZisp(v)) { +pub fn assertZisp(v: Value) void { + if (!checkZisp(v)) { v.dump(); @panic("not zisp pointer"); } } pub fn checkWeak(v: Value) bool { - return _checkZisp(v) and v.zptr.is_weak; + return checkZisp(v) and v.zptr.is_weak; } pub fn assertWeak(v: Value) void { @@ -64,19 +64,19 @@ pub fn assertWeak(v: Value) void { } } -pub fn checkZisp(v: Value, tag: Tag) bool { - return _checkZisp(v) and unpack(v).@"1" == tag; +pub fn checkZispTag(v: Value, tag: Tag) bool { + return checkZisp(v) and unpack(v).@"1" == tag; } -pub fn assertZisp(v: Value, tag: Tag) void { - if (!checkZisp(v, tag)) { +pub fn assertZispTag(v: Value, tag: Tag) void { + if (!checkZispTag(v, tag)) { v.dump(); @panic("not zisp pointer or wrong tag"); } } pub fn checkStrong(v: Value) bool { - return _checkZisp(v) and !v.zptr.is_weak; + return checkZisp(v) and !v.zptr.is_weak; } pub fn assertStrong(v: Value) void { @@ -86,24 +86,24 @@ pub fn assertStrong(v: Value) void { } } -pub fn packZisp(ptr: [*]Bucket, 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: [*]Bucket, tag: Tag) Value { +pub fn pack(ptr: [*]Hval, tag: Tag) Value { return packZisp(ptr, tag, false); } -pub fn packWeak(ptr: [*]Bucket, 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 { [*]Bucket, Tag } { - _assertZisp(v); +pub fn unpack(v: Value) struct { [*]Hval, Tag } { + assertZisp(v); return untagPtr(v.zptr.tagged_value); } @@ -117,37 +117,27 @@ pub fn isWeakNull(v: Value) bool { return v.zptr.tagged_value == 0; } -fn tagPtr(ptr: [*]Bucket, 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 { [*]Bucket, Tag } { +fn untagPtr(tagged: u48) struct { [*]Hval, Tag } { const untagged: u48 = tagged & 0xfffffffffff8; - const ptr: [*]Bucket = @ptrFromInt(untagged); + const ptr: [*]Hval = @ptrFromInt(untagged); const int: u3 = @truncate(tagged); const tag: Tag = @enumFromInt(int); return .{ ptr, tag }; } pub const Tag = enum(u3) { - /// 0. Strings / Symbols - string, - /// 1. Bignums / Ratnums - number, - /// 2. Pairs ([2]Value) + /// *[2]Value pair, - /// 3. Collections: Vector, table, etc. - coll, - /// 4. OOP: Classes, instances, etc. - oop, - /// 5. String buffers - text, - /// 6. Procedures + /// Interned string (symbol) + istr, + /// Procedure proc, - /// 7. Others - other, }; // Zisp API diff --git a/src/libzisp/value/rune.zig b/src/libzisp/value/rune.zig index 3a4dc61..a6152b1 100644 --- a/src/libzisp/value/rune.zig +++ b/src/libzisp/value/rune.zig @@ -8,7 +8,7 @@ const Value = value.Value; // Zig API pub fn check(v: Value) bool { - return v.isOther(.rune); + return v.isOtherTag(.rune); } pub fn assert(v: Value) void { @@ -50,15 +50,12 @@ pub fn pack(s: []const u8) Value { } pub fn unpack(v: Value) ShortString { - var s = ShortString{ .buffer = @bitCast(v.sstr.string) }; + assert(v); + const s: [6]u8 = @bitCast(v.rune.name); inline for (0..6) |i| { - if (s.buffer[i] == 0) { - s.len = i; - return s; - } + if (s[i] == 0) return .{ .buffer = s, .len = i }; } - s.len = 6; - return s; + return .{ .buffer = s, .len = 6 }; } // Zisp API diff --git a/src/libzisp/value/sstr.zig b/src/libzisp/value/sstr.zig index 1c9812e..b02fd3d 100644 --- a/src/libzisp/value/sstr.zig +++ b/src/libzisp/value/sstr.zig @@ -9,7 +9,7 @@ const Value = value.Value; // Zig API pub fn check(v: Value) bool { - return v.isOther(.sstr) or v.isOther(.sstr_lit); + return v.isOtherTag(.sstr) or v.isOtherTag(.qstr); } pub fn assert(v: Value) void { @@ -19,6 +19,10 @@ pub fn assert(v: Value) void { } } +pub fn checkQuoted(v: Value) bool { + return v.isOtherTag(.qstr); +} + // For now, ignore encoding, just treat it as []u8. pub fn isValidSstr(s: []const u8) bool { @@ -50,8 +54,8 @@ pub fn pack(s: []const u8) Value { return _pack(s, .sstr); } -pub fn packLiteral(s: []const u8) Value { - return _pack(s, .sstr_lit); +pub fn packQuoted(s: []const u8) Value { + return _pack(s, .qstr); } fn _pack(s: []const u8, tag: OtherTag) Value { |
