! Copyright (C) 2004, 2005 Slava Pestov. ! See http://factor.sf.net/license.txt for BSD license. IN: inference USING: namespaces generic hashtables kernel lists sequences vectors words ; ! Method inlining optimization : min-class ( class seq -- class/f ) #! Is this class the smallest class in the sequence? [ dupd class-and null = not ] subset [ class< not ] sort tuck [ class< ] all-with? [ first ] [ drop f ] ifte ; GENERIC: dispatching-values ( node word -- seq ) M: object dispatching-values 2drop { } ; M: simple-generic dispatching-values drop node-in-d peek 1vector ; M: 2generic dispatching-values drop node-in-d 2 swap tail* ; : node-classes* ( node seq -- seq ) >r node-classes r> [ swap ?hash [ object ] unless* ] map-with ; : dispatching-classes ( node -- seq ) dup dup node-param dispatching-values node-classes* ; : inlining-class ( #call -- class ) #! If the generic dispatch can be eliminated, return the #! class of the method that will always be invoked here. dup node-param recursive-state get member? [ drop f ] [ dup dispatching-classes dup empty? [ 2drop f ] [ dup [ = ] every? [ first swap node-param order min-class ] [ 2drop f ] ifte ] ifte ] ifte ; : unlink-last ( node -- butlast last ) dup penultimate-node dup node-successor f rot set-node-successor ; : subst-node ( label old new -- new ) #! #simple-label