Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 15 additions & 5 deletions src/zorth.zig
Original file line number Diff line number Diff line change
Expand Up @@ -120,9 +120,9 @@ fn InterpAligned(comptime alignment: mem.Alignment) type {

pub fn find(self: Self, name: []u8) ?*const Word {
const mask = @intFromEnum(Flag.HIDDEN) | F_LENMASK;
var node: ?*const Word = self.latest;
while (node != null and ((node.?.flag & mask) != name.len or !mem.eql(u8, node.?.name[0..name.len], name)))
node = node.?.link;
var node: *const Word = self.latest;
while (node.flag & mask != name.len or !mem.eql(u8, node.name[0..name.len], name))
node = node.link orelse return null;

return node;
}
Expand Down Expand Up @@ -849,7 +849,7 @@ fn _interpret(self: *Interp, sp: [*]isize, rsp: [*][*]const Instr, ip: [*]const
}
} else if (fmt.parseInt(isize, self.buffer[0..c], @truncate(@abs(self.base)))) |a| {
if (self.state == 1) {
self.append(.{ .word = codeFieldAddress(&lit) });
self.append(.{ .word = &.{.{ .code = _lit }} });
self.append(.{ .literal = a });
} else {
s = sp - 1;
Expand Down Expand Up @@ -1093,7 +1093,7 @@ test forth {
\\: OF IMMEDIATE ' OVER , ' = , [COMPILE] IF ' DROP , ;
\\: ENDOF IMMEDIATE [COMPILE] ELSE ;
\\: ENDCASE IMMEDIATE ' DROP , BEGIN ?DUP WHILE [COMPILE] THEN REPEAT ;
\\: CFA> LATEST @ BEGIN ?DUP WHILE 2DUP >CFA = IF NIP EXIT THEN @ REPEAT DROP 0 ;
\\: CFA> LATEST @ BEGIN ?DUP WHILE 2DUP SWAP < IF NIP EXIT THEN @ REPEAT DROP 0 ;
\\: SEE WORD FIND HERE @ LATEST @ BEGIN 2 PICK OVER <> WHILE NIP DUP @ REPEAT DROP SWAP
\\ ':' EMIT SPACE DUP ID. SPACE DUP ?IMMEDIATE IF ." IMMEDIATE " THEN >DFA
\\ BEGIN 2DUP > WHILE DUP @
Expand Down Expand Up @@ -1161,6 +1161,7 @@ test forth {
.{ preamble ++ "SEE >DFA ", fmt.comptimePrint(": >DFA >CFA {d}+ EXIT ;\n", .{@sizeOf(usize)}) },
.{ preamble ++ "SEE HIDE ", ": HIDE WORD FIND HIDDEN ;\n" },
.{ preamble ++ "SEE QUIT ", fmt.comptimePrint(": QUIT R0 RSP! INTERPRET BRANCH ( -{d} ) ;\n", .{2 * @sizeOf(usize)}) },
.{ preamble ++ "SEE / ", ": / /MOD SWAP DROP ;\n" },
.{
preamble ++
\\: FOO THROW ;
Expand All @@ -1183,3 +1184,12 @@ test forth {
try forth(preamble ++ fmt.comptimePrint(": GETPPID {d} SYSCALL0 ; GETPPID . ", .{@intFromEnum(syscalls.X64.getppid)}), p);
}
}

test "word addresses increase" {
var node: *const Word = @ptrCast(&syscall0);
while (node.link) |link| : (node = link) {
const a: [*]const Instr = @ptrCast(link);
const b: [*]const Instr = @ptrCast(node);
try testing.expect(b - a > offset);
}
}