Inferencce refactoring for more reliable stack height recording
parent
221c464a7e
commit
bded83ef35
|
@ -1,5 +1,12 @@
|
||||||
+ 0.85:
|
+ 0.85:
|
||||||
|
|
||||||
|
- words:
|
||||||
|
- S+left: reload
|
||||||
|
- S+right: inspect
|
||||||
|
|
||||||
|
- links:
|
||||||
|
- same deal
|
||||||
|
|
||||||
- UI dataflow visualizer:
|
- UI dataflow visualizer:
|
||||||
- spacing is weird
|
- spacing is weird
|
||||||
- #label, #if mess up height
|
- #label, #if mess up height
|
||||||
|
|
|
@ -22,12 +22,11 @@ M: alien-callback-error summary
|
||||||
"infer-effect" set-word-prop
|
"infer-effect" set-word-prop
|
||||||
|
|
||||||
\ alien-callback [
|
\ alien-callback [
|
||||||
empty-node <alien-callback>
|
empty-node <alien-callback> dup node,
|
||||||
pop-literal nip over set-alien-callback-quot
|
pop-literal nip over set-alien-callback-quot
|
||||||
pop-literal nip over set-alien-callback-parameters
|
pop-literal nip over set-alien-callback-parameters
|
||||||
pop-literal nip over set-alien-callback-return
|
pop-literal nip over set-alien-callback-return
|
||||||
gensym over set-alien-callback-xt
|
gensym over set-alien-callback-xt
|
||||||
dup node,
|
|
||||||
callback-bottom
|
callback-bottom
|
||||||
] "infer" set-word-prop
|
] "infer" set-word-prop
|
||||||
|
|
||||||
|
|
|
@ -19,11 +19,10 @@ M: alien-indirect-error summary
|
||||||
"infer-effect" set-word-prop
|
"infer-effect" set-word-prop
|
||||||
|
|
||||||
\ alien-indirect [
|
\ alien-indirect [
|
||||||
empty-node <alien-indirect>
|
empty-node <alien-indirect> dup node,
|
||||||
pop-literal nip over set-alien-indirect-abi
|
pop-literal nip over set-alien-indirect-abi
|
||||||
pop-literal nip over set-alien-indirect-parameters
|
pop-literal nip over set-alien-indirect-parameters
|
||||||
pop-literal nip over set-alien-indirect-return
|
pop-literal nip swap set-alien-indirect-return
|
||||||
node,
|
|
||||||
] "infer" set-word-prop
|
] "infer" set-word-prop
|
||||||
|
|
||||||
: generate-indirect-cleanup ( node -- )
|
: generate-indirect-cleanup ( node -- )
|
||||||
|
|
|
@ -28,14 +28,13 @@ M: alien-invoke-error summary
|
||||||
"infer-effect" set-word-prop
|
"infer-effect" set-word-prop
|
||||||
|
|
||||||
\ alien-invoke [
|
\ alien-invoke [
|
||||||
empty-node <alien-invoke>
|
empty-node <alien-invoke> dup node,
|
||||||
pop-literal nip over set-alien-invoke-parameters
|
pop-literal nip over set-alien-invoke-parameters
|
||||||
pop-literal nip over set-alien-invoke-function
|
pop-literal nip over set-alien-invoke-function
|
||||||
pop-literal nip over set-alien-invoke-library
|
pop-literal nip over set-alien-invoke-library
|
||||||
pop-literal nip over set-alien-invoke-return
|
pop-literal nip over set-alien-invoke-return
|
||||||
dup alien-invoke-dlsym dlsym drop
|
dup alien-invoke-dlsym dlsym drop
|
||||||
dup alien-invoke-stack
|
alien-invoke-stack
|
||||||
node,
|
|
||||||
] "infer" set-word-prop
|
] "infer" set-word-prop
|
||||||
|
|
||||||
: unbox-parameter ( stack# type -- )
|
: unbox-parameter ( stack# type -- )
|
||||||
|
|
|
@ -81,5 +81,6 @@ TUPLE: unbalanced-branches-error in out ;
|
||||||
[ infer-branch ] map dup unify-effects unify-dataflow ;
|
[ infer-branch ] map dup unify-effects unify-dataflow ;
|
||||||
|
|
||||||
: infer-branches ( branches node -- )
|
: infer-branches ( branches node -- )
|
||||||
[ >r (infer-branches) r> set-node-children ] keep
|
dup node,
|
||||||
node, #merge node, ;
|
>r (infer-branches) r> set-node-children
|
||||||
|
#merge node, ;
|
||||||
|
|
|
@ -17,13 +17,25 @@ SYMBOL: meta-r
|
||||||
: peek-r meta-r get peek ;
|
: peek-r meta-r get peek ;
|
||||||
|
|
||||||
TUPLE: node param shuffle
|
TUPLE: node param shuffle
|
||||||
|
d-height r-height
|
||||||
classes literals history
|
classes literals history
|
||||||
successor children ;
|
successor children ;
|
||||||
|
|
||||||
M: node equal? eq? ;
|
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 )
|
: make-node ( param in-d out-d in-r out-r node -- node )
|
||||||
[ >r swapd <shuffle> f f f f f <node> r> set-delegate ] keep ;
|
[
|
||||||
|
>r swapd <shuffle> f f f f f f f <node> r>
|
||||||
|
set-delegate
|
||||||
|
] keep ;
|
||||||
|
|
||||||
: node-in-d node-shuffle shuffle-in-d ;
|
: node-in-d node-shuffle shuffle-in-d ;
|
||||||
: node-in-r node-shuffle shuffle-in-r ;
|
: node-in-r node-shuffle shuffle-in-r ;
|
||||||
|
@ -68,7 +80,7 @@ C: #call-label make-node ;
|
||||||
|
|
||||||
TUPLE: #push ;
|
TUPLE: #push ;
|
||||||
C: #push make-node ;
|
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 ;
|
: >#push< ( node -- seq ) node-out-d [ value-literal ] map ;
|
||||||
|
|
||||||
TUPLE: #shuffle ;
|
TUPLE: #shuffle ;
|
||||||
|
@ -118,6 +130,7 @@ SYMBOL: dataflow-graph
|
||||||
SYMBOL: current-node
|
SYMBOL: current-node
|
||||||
|
|
||||||
: node, ( node -- )
|
: node, ( node -- )
|
||||||
|
dup record-height
|
||||||
dataflow-graph get [
|
dataflow-graph get [
|
||||||
dup current-node [ set-node-successor ] change
|
dup current-node [ set-node-successor ] change
|
||||||
] [
|
] [
|
||||||
|
|
|
@ -56,7 +56,9 @@ SYMBOL: recorded
|
||||||
GENERIC: apply-object
|
GENERIC: apply-object
|
||||||
|
|
||||||
: apply-literal ( obj -- )
|
: apply-literal ( obj -- )
|
||||||
<value> push-d #push node, ;
|
#push dup node,
|
||||||
|
swap <value> push-d
|
||||||
|
1 d-tail swap set-node-out-d ;
|
||||||
|
|
||||||
M: object apply-object apply-literal ;
|
M: object apply-object apply-literal ;
|
||||||
|
|
||||||
|
|
|
@ -15,11 +15,10 @@ sequences words parser ;
|
||||||
node-outputs ;
|
node-outputs ;
|
||||||
|
|
||||||
: infer-shuffle ( shuffle -- )
|
: infer-shuffle ( shuffle -- )
|
||||||
#shuffle
|
#shuffle dup node,
|
||||||
2dup infer-shuffle-inputs
|
2dup infer-shuffle-inputs
|
||||||
over shuffle-stacks
|
over shuffle-stacks
|
||||||
tuck infer-shuffle-outputs
|
infer-shuffle-outputs ;
|
||||||
node, ;
|
|
||||||
|
|
||||||
: shuffle>effect ( shuffle -- effect )
|
: shuffle>effect ( shuffle -- effect )
|
||||||
dup shuffle-in-d swap shuffle-out-d <effect> ;
|
dup shuffle-in-d swap shuffle-out-d <effect> ;
|
||||||
|
|
|
@ -25,11 +25,11 @@ IN: inference
|
||||||
|
|
||||||
: consume/produce ( word effect -- )
|
: consume/produce ( word effect -- )
|
||||||
meta-d get clone >r
|
meta-d get clone >r
|
||||||
swap make-call-node
|
swap make-call-node dup node,
|
||||||
over effect-in length over consume-values
|
over effect-in length over consume-values
|
||||||
over effect-out length over produce-values
|
over effect-out length over produce-values
|
||||||
r> over #call-label? [ over set-node-in-d ] [ drop ] if
|
r> over #call-label? [ swap set-node-in-d ] [ 2drop ] if
|
||||||
node, effect-terminated? [ terminate ] when ;
|
effect-terminated? [ terminate ] when ;
|
||||||
|
|
||||||
TUPLE: no-effect word ;
|
TUPLE: no-effect word ;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue