summaryrefslogtreecommitdiff
path: root/src/libzisp/value
diff options
context:
space:
mode:
authorTaylan Kammer <taylan.kammer@gmail.com>2025-02-28 14:38:57 +0100
committerTaylan Kammer <taylan.kammer@gmail.com>2025-02-28 14:38:57 +0100
commit472f3e89a61ec51218cefe65305ec6f0a0d95fbf (patch)
treea64ef16a6b23a822ab09e02b9d967f3b8bb3d17e /src/libzisp/value
parent34de389fe744018e808f2c8b301648d504ab610d (diff)
update
Diffstat (limited to 'src/libzisp/value')
-rw-r--r--src/libzisp/value/boole.zig5
-rw-r--r--src/libzisp/value/char.zig2
-rw-r--r--src/libzisp/value/eof.zig2
-rw-r--r--src/libzisp/value/istr.zig3
-rw-r--r--src/libzisp/value/misc.zig8
-rw-r--r--src/libzisp/value/nil.zig2
-rw-r--r--src/libzisp/value/pair.zig2
-rw-r--r--src/libzisp/value/ptr.zig54
-rw-r--r--src/libzisp/value/rune.zig13
-rw-r--r--src/libzisp/value/sstr.zig10
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 {