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:
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) {