From b2c1fec326315d6f38c8b7c2c392539bf6df58c2 Mon Sep 17 00:00:00 2001 From: kitty Date: Fri, 27 Feb 2026 00:12:50 +1100 Subject: fix new handler just reset the stack at the error --- jefs.fs | 16 +++++++++++----- jefs.s | 7 +++++++ 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/jefs.fs b/jefs.fs index 771c53c..21c1b3e 100644 --- a/jefs.fs +++ b/jefs.fs @@ -2,6 +2,7 @@ \ things TODO: \ better error handling \ :noname +\ asciiz strings (for syscalls) \ DO LOOP \ s\" \ @@ -192,12 +193,12 @@ variable hld \ FUCK is BYE but it takes an error code. its called that because you call it when shit is fucked. : fuck ( code -- ) 60 syscall1 ; \ TODO broken as shit -: (handler) error @ dup case +: (handler) >s0 error @ dup case 1 of ." stack underflow" endof 2 of ." word not found" endof ." unknown error" endcase cr fuck ; -\ : _ ' (handler) handler ! ; _ \ so broken that it breaks Seer +: _ ' (handler) handler ! ; _ \ i should do immediate ' at some point : >ffa ( lfa -- ffa ) 8 + ; : >nfa ( lfa -- nfa ) 9 + ; @@ -207,10 +208,15 @@ variable hld : (evaluate) ( c-addr u -- ) 0 >in ! ( u ) #tib ! ( c-addr ) tib ! interpret ; : evaluate ( c-addr u -- ) tib @ >r #tib @ >r >in @ >r (evaluate) r> >in ! r> #tib ! r> tib ! ; -: teststr3 s" 1 2 3 2drop drop" ; -teststr3 evaluate - \ FILE I/O {{{ +\ for syswrite see the top of the file +0 constant stdin +1 constant stdout +2 constant stderr \ }}} +: teststr3 s" 1 2 3 2drop drop" ; +teststr3 evaluate + +drop .free bye diff --git a/jefs.s b/jefs.s index 5f27236..f7ad9ac 100644 --- a/jefs.s +++ b/jefs.s @@ -1093,6 +1093,13 @@ defword "(handler)", brac_handler, 0 syscall ret +; used in later error handler; +; just say 'fuck the stack' and put it back to s0. +; this avoids any stack fuckery happening inside the handler. +defword ">s0", to_s0, 0 + mov r14, wstack + ret + ; TEMPORARY HORRIBLE DEBUGGING BULLSHIT {{{ ; debugging word; outputs raw bytes so needs to be piped through `x(x)d` ; terrible and awful -- cgit v1.2.3