diff --git a/TODO.FACTOR.txt b/TODO.FACTOR.txt index a616c9610a..76a7fb59f4 100644 --- a/TODO.FACTOR.txt +++ b/TODO.FACTOR.txt @@ -1,5 +1,12 @@ + 0.85: +- words: + - S+left: reload + - S+right: inspect + +- links: + - same deal + - UI dataflow visualizer: - spacing is weird - #label, #if mess up height diff --git a/library/compiler/alien/alien-callback.factor b/library/compiler/alien/alien-callback.factor index 3aea3dbf9f..d3065d7a2c 100644 --- a/library/compiler/alien/alien-callback.factor +++ b/library/compiler/alien/alien-callback.factor @@ -22,12 +22,11 @@ M: alien-callback-error summary "infer-effect" set-word-prop \ alien-callback [ - empty-node + empty-node dup node, pop-literal nip over set-alien-callback-quot pop-literal nip over set-alien-callback-parameters pop-literal nip over set-alien-callback-return gensym over set-alien-callback-xt - dup node, callback-bottom ] "infer" set-word-prop diff --git a/library/compiler/alien/alien-indirect.factor b/library/compiler/alien/alien-indirect.factor index bef81799a0..ff61b77df0 100644 --- a/library/compiler/alien/alien-indirect.factor +++ b/library/compiler/alien/alien-indirect.factor @@ -19,11 +19,10 @@ M: alien-indirect-error summary "infer-effect" set-word-prop \ alien-indirect [ - empty-node + empty-node dup node, pop-literal nip over set-alien-indirect-abi pop-literal nip over set-alien-indirect-parameters - pop-literal nip over set-alien-indirect-return - node, + pop-literal nip swap set-alien-indirect-return ] "infer" set-word-prop : generate-indirect-cleanup ( node -- ) diff --git a/library/compiler/alien/alien-invoke.factor b/library/compiler/alien/alien-invoke.factor index 315726eb85..5e731b80b4 100644 --- a/library/compiler/alien/alien-invoke.factor +++ b/library/compiler/alien/alien-invoke.factor @@ -28,14 +28,13 @@ M: alien-invoke-error summary "infer-effect" set-word-prop \ alien-invoke [ - empty-node + empty-node dup node, pop-literal nip over set-alien-invoke-parameters pop-literal nip over set-alien-invoke-function pop-literal nip over set-alien-invoke-library pop-literal nip over set-alien-invoke-return dup alien-invoke-dlsym dlsym drop - dup alien-invoke-stack - node, + alien-invoke-stack ] "infer" set-word-prop : unbox-parameter ( stack# type -- ) diff --git a/library/compiler/inference/branches.factor b/library/compiler/inference/branches.factor index 45d1754df9..f9563e5e2c 100644 --- a/library/compiler/inference/branches.factor +++ b/library/compiler/inference/branches.factor @@ -81,5 +81,6 @@ TUPLE: unbalanced-branches-error in out ; [ infer-branch ] map dup unify-effects unify-dataflow ; : infer-branches ( branches node -- ) - [ >r (infer-branches) r> set-node-children ] keep - node, #merge node, ; + dup node, + >r (infer-branches) r> set-node-children + #merge node, ; diff --git a/library/compiler/inference/dataflow.factor b/library/compiler/inference/dataflow.factor index f2d4701d8b..98a166192b 100644 --- a/library/compiler/inference/dataflow.factor +++ b/library/compiler/inference/dataflow.factor @@ -17,13 +17,25 @@ SYMBOL: meta-r : peek-r meta-r get peek ; TUPLE: node param shuffle - classes literals history - successor children ; +d-height r-height +classes literals history +successor children ; M: node equal? eq? ; +: d-height ( -- n ) meta-d get length d-in get - ; inline + +: r-height ( -- n ) meta-r get length ; + +: record-height ( node -- ) + d-height over set-node-d-height + r-height swap set-node-r-height ; + : make-node ( param in-d out-d in-r out-r node -- node ) - [ >r swapd f f f f f r> set-delegate ] keep ; + [ + >r swapd f f f f f f f r> + set-delegate + ] keep ; : node-in-d node-shuffle shuffle-in-d ; : node-in-r node-shuffle shuffle-in-r ; @@ -68,7 +80,7 @@ C: #call-label make-node ; TUPLE: #push ; C: #push make-node ; -: #push ( -- node ) peek-d 1array out-node <#push> ; +: #push ( -- node ) empty-node <#push> ; : >#push< ( node -- seq ) node-out-d [ value-literal ] map ; TUPLE: #shuffle ; @@ -118,6 +130,7 @@ SYMBOL: dataflow-graph SYMBOL: current-node : node, ( node -- ) + dup record-height dataflow-graph get [ dup current-node [ set-node-successor ] change ] [ diff --git a/library/compiler/inference/inference.factor b/library/compiler/inference/inference.factor index 054a54e0ae..6bc5a10dd1 100644 --- a/library/compiler/inference/inference.factor +++ b/library/compiler/inference/inference.factor @@ -56,7 +56,9 @@ SYMBOL: recorded GENERIC: apply-object : apply-literal ( obj -- ) - push-d #push node, ; + #push dup node, + swap push-d + 1 d-tail swap set-node-out-d ; M: object apply-object apply-literal ; diff --git a/library/compiler/inference/stack.factor b/library/compiler/inference/stack.factor index 19e1e51442..9b3585b6d2 100644 --- a/library/compiler/inference/stack.factor +++ b/library/compiler/inference/stack.factor @@ -15,11 +15,10 @@ sequences words parser ; node-outputs ; : infer-shuffle ( shuffle -- ) - #shuffle + #shuffle dup node, 2dup infer-shuffle-inputs over shuffle-stacks - tuck infer-shuffle-outputs - node, ; + infer-shuffle-outputs ; : shuffle>effect ( shuffle -- effect ) dup shuffle-in-d swap shuffle-out-d ; diff --git a/library/compiler/inference/words.factor b/library/compiler/inference/words.factor index 93010852c5..0ad3ac81aa 100644 --- a/library/compiler/inference/words.factor +++ b/library/compiler/inference/words.factor @@ -25,11 +25,11 @@ IN: inference : consume/produce ( word effect -- ) meta-d get clone >r - swap make-call-node + swap make-call-node dup node, over effect-in length over consume-values over effect-out length over produce-values - r> over #call-label? [ over set-node-in-d ] [ drop ] if - node, effect-terminated? [ terminate ] when ; + r> over #call-label? [ swap set-node-in-d ] [ 2drop ] if + effect-terminated? [ terminate ] when ; TUPLE: no-effect word ;