summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/zisp/gc.zig31
-rw-r--r--src/zisp/gc/PairPool.zig1
-rw-r--r--src/zisp/io/print.zig15
-rw-r--r--src/zisp/lib/list.zig4
-rw-r--r--src/zisp/value/array.zig2
-rw-r--r--src/zisp/value/istr.zig5
-rw-r--r--src/zisp/value/pair.zig24
7 files changed, 46 insertions, 36 deletions
diff --git a/src/zisp/gc.zig b/src/zisp/gc.zig
index fdb0e02..3a3e6f7 100644
--- a/src/zisp/gc.zig
+++ b/src/zisp/gc.zig
@@ -3,40 +3,39 @@ const std = @import("std");
const value = @import("value.zig");
+//const PairPool = @import("gc/PairPool.zig");
+const PairPool = std.heap.MemoryPool(value.pair.Pair); // TODO
const IstrSet = @import("gc/IstrSet.zig");
-const istr = value.istr;
-const ptr = value.ptr;
-
const Value = value.Value;
-const Zptr = value.Zptr;
+
+const PairPtr = value.pair.PairPtr;
+const IstrPtr = value.istr.IstrPtr;
pub const alloc = std.heap.smp_allocator;
-// Cons cells
+// Pairs
-const ConsPool = std.heap.MemoryPool([2]Value);
-var cons_pool: ConsPool = undefined;
+var pair_pool: PairPool = undefined;
-pub fn cons(v1: Value, v2: Value) *[2]Value {
- const mem = cons_pool.create(alloc) catch @panic("OOM");
- mem[0] = v1;
- mem[1] = v2;
- return mem;
+pub fn makePair(v1: Value, v2: Value) PairPtr {
+ const p = pair_pool.create(alloc) catch @panic("OOM");
+ p.car = v1;
+ p.cdr = v2;
+ return p;
}
// Interned strings
var istr_set: IstrSet = undefined;
-pub fn internString(s: []const u8) !Value {
- const p = istr_set.add(alloc, s) catch @panic("OOM");
- return ptr.pack(p, .istr);
+pub fn internString(s: []const u8) value.istr.IstrPtr {
+ return istr_set.add(alloc, s) catch @panic("OOM");
}
// Init
pub fn init() void {
- cons_pool = ConsPool.initCapacity(alloc, 64) catch @panic("OOM");
+ pair_pool = PairPool.initCapacity(alloc, 64) catch @panic("OOM");
istr_set = IstrSet.init(alloc) catch @panic("OOM");
}
diff --git a/src/zisp/gc/PairPool.zig b/src/zisp/gc/PairPool.zig
new file mode 100644
index 0000000..70b786d
--- /dev/null
+++ b/src/zisp/gc/PairPool.zig
@@ -0,0 +1 @@
+// TODO
diff --git a/src/zisp/io/print.zig b/src/zisp/io/print.zig
index ddf9725..0873767 100644
--- a/src/zisp/io/print.zig
+++ b/src/zisp/io/print.zig
@@ -9,6 +9,7 @@ const Parser = @import("Parser.zig");
const Value = value.Value;
+const PairPtr = value.pair.PairPtr;
const IstrPtr = value.istr.IstrPtr;
const ArrayPtr = value.array.ArrayPtr;
@@ -76,9 +77,9 @@ pub fn srat(w: Writer, v: Value) !void {
@panic("not implemented");
}
-pub fn pair(w: Writer, p: *[2]Value) !void {
- const car = p[0];
- //const cdr = p[1];
+pub fn pair(w: Writer, p: PairPtr) !void {
+ const car = p.car;
+ //const cdr = p.cdr;
if (car.eq(Parser.PQSTR)) {
//try pipeString(w, cdr);
@panic("");
@@ -114,13 +115,13 @@ pub fn string(w: Writer, s: ArrayPtr) !void {
try w.writeByte('|');
}
-pub fn list(w: Writer, p: *[2]Value) !void {
+pub fn list(w: Writer, p: PairPtr) !void {
try w.writeByte('(');
- try toWriter(w, p[0]);
- var cdr = p[1];
+ try toWriter(w, p.car);
+ var cdr = p.cdr;
while (value.pair.check(cdr)) |p2| : (cdr = value.pair.cdr(cdr)) {
try w.writeByte(' ');
- try toWriter(w, p2[0]);
+ try toWriter(w, p2.car);
}
if (!value.nil.eq(cdr)) {
try w.writeByte(' ');
diff --git a/src/zisp/lib/list.zig b/src/zisp/lib/list.zig
index cd6b553..76667d8 100644
--- a/src/zisp/lib/list.zig
+++ b/src/zisp/lib/list.zig
@@ -11,8 +11,8 @@ pub fn reverseWithTail(list: Value, tail: Value) Value {
var result = tail;
while (!value.nil.eq(head)) {
const p = value.pair.unpack(head);
- result = value.pair.cons(p[0], result);
- head = p[1];
+ result = value.pair.cons(p.car, result);
+ head = p.cdr;
}
return result;
}
diff --git a/src/zisp/value/array.zig b/src/zisp/value/array.zig
index ac56391..650cae1 100644
--- a/src/zisp/value/array.zig
+++ b/src/zisp/value/array.zig
@@ -48,7 +48,7 @@ const Value = value.Value;
/// Other remaining bits provide information about element type and size.
pub const ArrayPtr = *align(8) ArrayHeader;
-const ArrayHeader = packed struct(u64) {
+pub const ArrayHeader = packed struct(u64) {
len_or_ptr: u48,
is_slice: bool,
is_ptr: bool,
diff --git a/src/zisp/value/istr.zig b/src/zisp/value/istr.zig
index a525c7e..aef5405 100644
--- a/src/zisp/value/istr.zig
+++ b/src/zisp/value/istr.zig
@@ -72,9 +72,10 @@ fn assertValidIstr(s: []const u8) void {
}
}
-pub fn intern(s: []const u8) !Value {
+pub fn intern(s: []const u8) Value {
assertValidIstr(s);
- return gc.internString(s);
+ const istr = gc.internString(s);
+ return value.ptr.pack(@ptrCast(istr), .istr);
}
// Zisp API
diff --git a/src/zisp/value/pair.zig b/src/zisp/value/pair.zig
index 9afaf12..ec7e69b 100644
--- a/src/zisp/value/pair.zig
+++ b/src/zisp/value/pair.zig
@@ -7,20 +7,27 @@ const ptr = @import("ptr.zig");
const Value = value.Value;
+pub const PairPtr = *align(8) Pair;
+
+pub const Pair = struct {
+ car: Value,
+ cdr: Value,
+};
+
// Zig API
-pub fn check(v: Value) ?*[2]Value {
+pub fn check(v: Value) ?PairPtr {
return @ptrCast(v.getPtr(.pair));
}
-pub fn assert(v: Value) *[2]Value {
+pub fn assert(v: Value) PairPtr {
return check(v) orelse {
v.dump();
@panic("not pair");
};
}
-pub fn unpack(v: Value) *[2]Value {
+pub fn unpack(v: Value) PairPtr {
return assert(v);
}
@@ -31,21 +38,22 @@ pub fn pred(v: Value) Value {
}
pub fn cons(v1: Value, v2: Value) Value {
- return ptr.pack(@ptrCast(gc.cons(v1, v2)), .pair);
+ const pair = gc.makePair(v1, v2);
+ return ptr.pack(@ptrCast(pair), .pair);
}
pub fn car(v: Value) Value {
- return unpack(v)[0];
+ return unpack(v).car;
}
pub fn cdr(v: Value) Value {
- return unpack(v)[1];
+ return unpack(v).cdr;
}
pub fn setCar(v: Value, new: Value) void {
- unpack(v)[0] = new;
+ unpack(v).car = new;
}
pub fn setCdr(v: Value, new: Value) void {
- unpack(v)[1] = new;
+ unpack(v).cdr = new;
}