! Copyright (C) 2004, 2008 Slava Pestov. ! See http://factorcode.org/license.txt for BSD license. USING: accessors arrays assocs classes combinators cpu.architecture effects generator.fixup generator.registers generic hashtables inference inference.backend inference.dataflow io kernel kernel.private layouts math namespaces optimizer optimizer.specializers prettyprint quotations sequences system threads words vectors sets dequeues ; IN: generator SYMBOL: compile-queue SYMBOL: compiled : queue-compile ( word -- ) { { [ dup "forgotten" word-prop ] [ ] } { [ dup compiled get key? ] [ ] } { [ dup inlined-block? ] [ ] } { [ dup primitive? ] [ ] } [ dup compile-queue get push-front ] } cond drop ; : maybe-compile ( word -- ) dup compiled>> [ drop ] [ queue-compile ] if ; SYMBOL: compiling-word SYMBOL: compiling-label SYMBOL: compiling-loops ! Label of current word, after prologue, makes recursion faster SYMBOL: current-label-start : compiled-stack-traces? ( -- ? ) 59 getenv ; : begin-compiling ( word label -- ) H{ } clone compiling-loops set compiling-label set compiling-word set compiled-stack-traces? compiling-word get f ? 1vector literal-table set f compiling-label get compiled get set-at ; : save-machine-code ( literals relocation labels code -- ) 4array compiling-label get compiled get set-at ; : with-generator ( node word label quot -- ) [ >r begin-compiling r> { } make fixup save-machine-code ] with-scope ; inline GENERIC: generate-node ( node -- next ) : generate-nodes ( node -- ) [ node@ generate-node ] iterate-nodes end-basic-block ; : init-generate-nodes ( -- ) init-templates %save-word-xt %prologue-later current-label-start define-label current-label-start resolve-label ; : generate ( node word label -- ) [ init-generate-nodes [ generate-nodes ] with-node-iterator ] with-generator ; : word-dataflow ( word -- effect dataflow ) [ [ dup "cannot-infer" word-prop [ cannot-infer-effect ] when dup "no-compile" word-prop [ cannot-infer-effect ] when dup specialized-def over dup 2array 1array infer-quot finish-word ] maybe-cannot-infer ] with-infer ; : intrinsics ( #call -- quot ) node-param "intrinsics" word-prop ; : if-intrinsics ( #call -- quot ) node-param "if-intrinsics" word-prop ; ! node M: node generate-node drop iterate-next ; : %jump ( word -- ) dup compiling-label get eq? [ drop current-label-start get ] [ %epilogue-later ] if %jump-label ; : generate-call ( label -- next ) dup maybe-compile end-basic-block dup compiling-loops get at [ %jump-label f ] [ tail-call? [ %jump f ] [ 0 frame-required %call iterate-next ] if ] ?if ; ! #label M: #label generate-node dup node-param generate-call >r dup node-child over #label-word rot node-param generate r> ; ! #loop : compiling-loop ( word -- )