X-Git-Url: https://thelambdalab.xyz/gitweb/index.cgi?a=blobdiff_plain;ds=sidebyside;f=src%2Fscheme.4th;h=0f2fc0d855217e422f834252203ea5be6d69cc76;hb=6f3714af79d6ecabe4ac209baea159b9f1dc708c;hp=0dec2150fe1d77d44b2592c6d7c8a60b30f3343c;hpb=b445670c931b81438c8e84a79e11500197829fa0;p=scheme.forth.jl.git diff --git a/src/scheme.4th b/src/scheme.4th index 0dec215..0f2fc0d 100644 --- a/src/scheme.4th +++ b/src/scheme.4th @@ -548,7 +548,7 @@ global-env obj! 2swap cons 2 +loop - depth 2- fixnum-type 2swap cons + depth 2- 2/ fixnum-type 2swap cons ; : make-continuation @@ -575,52 +575,42 @@ global-env obj! ( Allocate stack space first using psp!, then copy objects from list. ) - car drop + car drop 2* object-stack-base @ psp0 + + psp! R> R> 2dup cdr 2swap - car drop 2- 0 swap do + stack-list-len 1- 0 swap do 2dup car - PSP0 object-stack-base @ + i + 2 + ! - PSP0 object-stack-base @ + i + 1 + ! + PSP0 object-stack-base @ + i 2* + 2 + ! + PSP0 object-stack-base @ + i 2* + 1 + ! cdr - -2 +loop + -1 +loop 2drop ; -: list->pad ( list n -- ) - - pad + 1- \ final dest addr - pad \ initial dest addr - swap - do - 2dup cdr 2swap car - drop i ! - -1 +loop - - 2drop -; - : restore-return-stack ( continuation -- ) continuation->rstack-list - 2dup stack-list-len -rot ( n stack-list ) - 2dup cdr 2swap stack-list-len ( n list n ) - - list->pad ( n ) + 2dup cdr 2swap stack-list-len ( list n ) dup RSP0 + RSP! \ expand return stack to accommodate entries - ( n ) - 0 \ initial offset + ( list n ) + + 1- \ initial offset n-1 + 0 \ final offset 0 + swap do - pad i + @ RSP0 i 1+ + ! - loop + 2dup cdr 2swap car drop + RSP0 i 1+ + ! + -1 +loop + + 2drop ; : restore-continuation ( continuation -- )