factor/basis/compiler/tree/builder/builder.factor

54 lines
1.5 KiB
Factor
Raw Normal View History

! Copyright (C) 2008, 2009 Slava Pestov.
2008-07-20 05:24:37 -04:00
! See http://factorcode.org/license.txt for BSD license.
USING: fry locals accessors quotations kernel sequences namespaces
assocs words arrays vectors hints combinators continuations
effects compiler.tree
stack-checker
stack-checker.state
stack-checker.errors
stack-checker.visitor
stack-checker.backend
stack-checker.recursive-state ;
2008-07-20 05:24:37 -04:00
IN: compiler.tree.builder
<PRIVATE
GENERIC: (build-tree) ( quot -- )
2009-04-23 23:17:25 -04:00
M: callable (build-tree) infer-quot-here ;
: check-no-compile ( word -- )
dup "no-compile" word-prop [ do-not-compile ] [ drop ] if ;
: word-body ( word -- quot )
dup inline-recursive? [ 1quotation ] [ specialized-def ] if ;
M: word (build-tree)
2009-04-23 23:17:25 -04:00
[ check-no-compile ]
[ word-body infer-quot-here ]
[ required-stack-effect check-effect ] tri ;
: build-tree-with ( in-stack word/quot -- nodes )
[
2009-04-23 23:17:25 -04:00
<recursive-state> recursive-state set
V{ } clone stack-visitor set
[ [ >vector (meta-d) set ] [ length input-count set ] bi ]
[ (build-tree) ]
bi*
] with-infer nip ;
PRIVATE>
: build-tree ( word/quot -- nodes )
[ f ] dip build-tree-with ;
:: build-sub-tree ( in-d out-d word/quot -- nodes/f )
2010-01-20 18:06:28 -05:00
[
in-d word/quot build-tree-with unclip-last in-d>> :> in-d'
{
{ [ dup not ] [ ] }
{ [ dup ends-with-terminate? ] [ out-d [ f swap <#push> ] map append ] }
[ in-d' out-d [ [ length ] bi@ assert= ] [ <#copy> suffix ] 2bi ]
2010-01-20 18:06:28 -05:00
} cond
] [ dup inference-error? [ drop f ] [ rethrow ] if ] recover ;