X-Git-Url: https://thelambdalab.xyz/gitweb/index.cgi?a=blobdiff_plain;f=src%2Fscheme.4th;h=d9c8aa5f61871dfe84db875785422764c49f5ac9;hb=7a7d76ef5449bff091c710531869b7b9eceecadc;hp=135bdabf6ef709f833cda523a21f45ff48797814;hpb=db8b19176dacb8d9b82559864c1a071d1c1bf452;p=scheme.forth.jl.git diff --git a/src/scheme.4th b/src/scheme.4th index 135bdab..d9c8aa5 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 @@ -564,6 +564,10 @@ global-env obj! : continuation->rstack-list drop pair-type cdr ; +: stack-list-len ( stack-list -- n ) + car drop +; + : restore-param-stack ( continuation -- obj_stack ) continuation->pstack-list 2dup >R >R @@ -571,32 +575,52 @@ 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 + car drop 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 -- ) - R> -rot \ store top of return stack on PS continuation->rstack-list - 2dup print 2dup - \ TODO: Implement body of return stack restoration + 2dup stack-list-len -rot ( n stack-list ) + 2dup cdr 2swap stack-list-len ( n list n ) + + list->pad ( n ) - >R \ restore original top of return stack + dup RSP0 + RSP! \ expand return stack to accommodate entries + + ( n ) + 0 \ initial offset + do + pad i + @ RSP0 i 1+ + ! + loop ; : restore-continuation ( continuation -- ) @@ -604,12 +628,11 @@ global-env obj! \ contents of continuation object. 2dup >R >R + restore-param-stack - ." ====== PARAM STACK RESTORED ======" cr - trace - R> R> + restore-return-stack ;