diff --git a/library/compiler/generator/generator.factor b/library/compiler/generator/generator.factor index 1d3e3a66d8..d52eb6f959 100644 --- a/library/compiler/generator/generator.factor +++ b/library/compiler/generator/generator.factor @@ -12,16 +12,19 @@ M: object stack-reserve* drop 0 ; : stack-reserve ( node -- n ) 0 swap [ stack-reserve* max ] each-node ; +: intrinsic ( #call -- quot ) + node-param "intrinsic" word-prop ; + : if-intrinsic ( #call -- quot ) - dup node-successor #if? - [ node-param "if-intrinsic" word-prop ] [ drop f ] if ; + node-param "if-intrinsic" word-prop ; DEFER: #terminal? PREDICATE: #merge #terminal-merge node-successor #terminal? ; PREDICATE: #call #terminal-call - dup node-successor node-successor #terminal? + dup node-successor #if? + over node-successor node-successor #terminal? and swap if-intrinsic and ; UNION: #terminal @@ -108,10 +111,13 @@ M: #label generate-node ( node -- next ) swap node-child generate-word r> ; ! #if +: end-false-branch ( label -- ) + tail-call? [ %return drop ] [ %jump-label ] if ; + : generate-if ( node label -- next )