--- gforth/prims2x.fs 2001/05/13 10:54:10 1.96 +++ gforth/prims2x.fs 2002/02/10 14:02:25 1.104 @@ -53,8 +53,14 @@ warnings off +[IFUNDEF] try +include startup.fs +[THEN] + : struct% struct ; \ struct is redefined in gray +warnings off + include ./gray.fs 32 constant max-effect \ number of things on one side of a stack effect @@ -641,7 +647,7 @@ stack inst-stream IP Cell 2drop type ; : print-entry ( -- ) - ." I_" prim prim-c-name 2@ type ." :" ; + ." LABEL(" prim prim-c-name 2@ type ." ):" ; : output-c ( -- ) print-entry ." /* " prim prim-name 2@ type ." ( " prim prim-stack-string 2@ type ." ) */" cr @@ -687,7 +693,7 @@ stack inst-stream IP Cell : output-profile ( -- ) \ generate code for postprocessing the VM block profile stuff ." if (VM_IS_INST(*ip, " function-number @ 0 .r ." )) {" cr - ." add_inst(b, " quote prim prim-name 2@ type quote ." );" cr + ." add_inst(b, " quote prim prim-name 2@ type quote ." );" cr ." ip += " inst-stream stack-in @ 1+ 0 .r ." ;" cr prim prim-c-code 2@ s" SET_IP" search nip nip prim prim-c-code 2@ s" SUPER_END" search nip nip or if @@ -697,6 +703,30 @@ stack inst-stream IP Cell endif ." }" cr ; +: output-profile-combined ( -- ) + \ generate code for postprocessing the VM block profile stuff + ." if (VM_IS_INST(*ip, " function-number @ 0 .r ." )) {" cr + num-combined @ 0 +do + ." add_inst(b, " quote + combined-prims i th @ prim-name 2@ type + quote ." );" cr + loop + ." ip += " inst-stream stack-in @ 1+ 0 .r ." ;" cr + combined-prims num-combined @ 1- th @ prim-c-code 2@ s" SET_IP" search nip nip + combined-prims num-combined @ 1- th @ prim-c-code 2@ s" SUPER_END" search nip nip or if + ." return;" cr + else + ." goto _endif_;" cr + endif + ." }" cr ; + +: output-superend ( -- ) + \ output flag specifying whether the current word ends a dynamic superinst + prim prim-c-code 2@ s" SET_IP" search nip nip + prim prim-c-code 2@ s" SUPER_END" search nip nip or 0<> + prim prim-c-code 2@ s" SUPER_CONTINUE" search nip nip 0= and + negate 0 .r ." , /* " prim prim-name 2@ type ." */" cr ; + : gen-arg-parm { item -- } item item-stack @ inst-stream = if ." , " item item-type @ type-c-name 2@ type space @@ -761,7 +791,7 @@ stack inst-stream IP Cell \ cr ; : output-label ( -- ) - ." (Label)&&I_" prim prim-c-name 2@ type ." ," cr ; + ." INST_ADDR(" prim prim-c-name 2@ type ." )," cr ; : output-alias ( -- ) ( primitive-number @ . ." alias " ) ." Primitive " prim prim-name 2@ type cr ; @@ -793,6 +823,11 @@ stack inst-stream IP Cell name-line @ 0 .r ." ,0" cr ; +: output-vi-tag ( -- ) + name-filename 2@ type #tab emit + prim prim-name 2@ type #tab emit + ." /^" prim prim-name 2@ type ." *(/" cr ; + [IFDEF] documentation : register-doc ( -- ) prim prim-name 2@ documentation ['] create insert-wordlist @@ -1170,7 +1205,13 @@ Variable c-flag THEN }} )) <- if-comment -(( (( eval-comment || forth-comment || c-comment || else-comment || if-comment )) ?? nonl ** )) <- comment-body +(( (( ` g || ` G )) {{ start }} nonl ** + {{ end + forth-flag @ IF ." group " type cr THEN + c-flag @ IF ." GROUP(" type ." )" cr THEN }} +)) <- group-comment + +(( (( eval-comment || forth-comment || c-comment || else-comment || if-comment || group-comment )) ?? nonl ** )) <- comment-body (( ` \ comment-body nleof )) <- comment ( -- ) @@ -1204,6 +1245,7 @@ Variable c-flag line @ name-line ! filename 2@ name-filename 2! function-number @ prim prim-num ! start }} forth-ident {{ end 2dup prim prim-name 2! prim prim-c-name 2! }} white ++ + (( ` / white ** {{ start }} c-ident {{ end prim prim-c-name 2! }} white ** )) ?? (( simple-primitive || combined-primitive )) {{ 1 function-number +! }} )) <- primitive ( -- ) @@ -1214,7 +1256,7 @@ warnings @ [IF] [THEN] -\ run with out of box gforth 0.5.0 +\ run with gforth-0.5.0 (slurp-file is missing) [IFUNDEF] slurp-file : slurp-file ( c-addr1 u1 -- c-addr2 u2 ) \ c-addr1 u1 is the filename, c-addr2 u2 is the file's contents