1 ! Copyright (C) 2003, 2006 Slava Pestov.
2 ! See http://factorcode.org/license.txt for BSD license.
6 : catchstack* ( -- catchstack )
7 6 getenv { vector } declare ; inline
10 USING: kernel kernel-internals ;
12 : catchstack ( -- catchstack ) catchstack* clone ; inline
13 : set-catchstack ( catchstack -- ) >vector 6 setenv ; inline
16 USING: arrays namespaces sequences ;
18 TUPLE: continuation data retain call name catch ;
20 : continuation ( -- continuation )
21 datastack retainstack callstack namestack catchstack
22 <continuation> ; inline
24 : >continuation< ( continuation -- data retain call name catch )
25 [ continuation-data ] keep
26 [ continuation-retain ] keep
27 [ continuation-call ] keep
28 [ continuation-name ] keep
29 continuation-catch ; inline
31 : ifcc ( terminator balance -- )
32 >r >r f [ continuation nip t ] call r> r> if ; inline
34 : callcc0 ( quot -- ) [ ] ifcc ; inline
36 : callcc1 ( quot -- obj ) callcc0 ; inline
40 : set-walker-hook 2 setenv ; inline
42 : get-walker-hook 2 getenv f set-walker-hook ; inline
44 : (continue) ( continuation -- )
50 set-datastack ; inline
52 : (continue-with) ( obj continuation -- )
53 #! There's no good way to avoid this code duplication!
61 9 getenv swap ; inline
63 : continue ( continuation -- )
64 get-walker-hook [ (continue-with) ] [ (continue) ] if* ;
67 : continue-with ( obj continuation -- )
68 get-walker-hook [ >r 2array r> ] when* (continue-with) ;
72 [ continuation-data clone ] keep
73 [ continuation-retain clone ] keep
74 [ continuation-call clone ] keep
75 [ continuation-name clone ] keep
76 continuation-catch clone <continuation> ;