duskos

dusk os fork
git clone git://git.alexwennerberg.com/duskos
Log | Files | Refs | README | LICENSE

commit 721ddda6c184c2e99ffd631c9e87cdfb7d8d5245
parent 24fba064cd34cd5a45fa4d49066ebf73aa5aaab3
Author: Virgil Dupras <hsoft@hardcoded.net>
Date:   Mon, 19 Sep 2022 13:42:11 -0400

cc: fix broken for loop

The adjustment part goes after the body, not before it!

Diffstat:
Mfs/cc/gen.fs | 3++-
Mfs/tests/cc/cc.fs | 2+-
Mfs/tests/cc/test.c | 9+++++----
3 files changed, 8 insertions(+), 6 deletions(-)

diff --git a/fs/cc/gen.fs b/fs/cc/gen.fs @@ -236,8 +236,9 @@ ASTIDCNT wordtbl gentbl ( node -- ) here swap ( loop_addr node ) Node nextsibling dup _assert dup gennode ( loop' exprnode ) \ control vmjz[, swap ( loop' cond' node ) ops$ - Node nextsibling dup _assert dup gennode ops$ \ adjustment + Node nextsibling dup _assert dup ( adjustment node ) >r Node nextsibling dup _assert gennode ( loop' cond' ) \ body + r> gennode ops$ \ adjustment node swap vmjmp, ( cond' ) ]vmjmp resolvebreaks ; :w ( PSPush ) Node firstchild dup _assert gennode vmpspush, ; :w ( PSPop ) drop vmpspop, ; diff --git a/fs/tests/cc/cc.fs b/fs/tests/cc/cc.fs @@ -34,7 +34,7 @@ global 1234 #eq capture helloworld S" Hello World!" #s= 42 40 50 isinrange 1 #eq 42 30 40 isinrange 0 #eq -42 5 forloop 47 #eq +5 forsum 10 #eq 1 multret 1 #eq 42 multret 32 #eq 1234 \ test that void funcs with args don't mess with the PS underneath it. diff --git a/fs/tests/cc/test.c b/fs/tests/cc/test.c @@ -129,12 +129,13 @@ extern int isinrange(int n, int l, int h) { #[ S" =><=" i]# (n, l, h); return pspop(); } -extern int forloop(int a, int b) { +extern int forsum(int n) { int i; - for (i=0; i<b; i++) { - a++; + int r = 0; + for (i=0; i<n; i++) { + r = r+i; } - return a; + return r; } extern unsigned int multret(unsigned int x) { if (x < 10) {