From 58d997de5c9053ff6d987d3ac2f4f081e747dc74 Mon Sep 17 00:00:00 2001 From: Slava Pestov Date: Mon, 16 Mar 2009 05:00:27 -0500 Subject: [PATCH] Refactor regexp.compiler to not all with-compilation-unit so much; benchmark.regex-dna loads about twice as fast now --- basis/regexp/compiler/compiler.factor | 17 ++++++----------- basis/regexp/regexp.factor | 17 +++++++---------- 2 files changed, 13 insertions(+), 21 deletions(-) diff --git a/basis/regexp/compiler/compiler.factor b/basis/regexp/compiler/compiler.factor index b55cab6294..a0646002f9 100644 --- a/basis/regexp/compiler/compiler.factor +++ b/basis/regexp/compiler/compiler.factor @@ -104,13 +104,11 @@ C: box transitions>quot ; : states>code ( words dfa -- ) - [ - '[ - dup _ word>quot - (( last-match index string -- ? )) - define-declared - ] each - ] with-compilation-unit ; + '[ + dup _ word>quot + (( last-match index string -- ? )) + define-declared + ] each ; : states>words ( dfa -- words dfa ) dup transitions>> keys [ gensym ] H{ } map>assoc @@ -123,12 +121,9 @@ C: box PRIVATE> -: simple-define-temp ( quot effect -- word ) - [ define-temp ] with-compilation-unit ; - : dfa>word ( dfa -- quot ) dfa>main-word execution-quot '[ drop [ f ] 2dip @ ] - (( start-index string regexp -- i/f )) simple-define-temp ; + (( start-index string regexp -- i/f )) define-temp ; : dfa>shortest-word ( dfa -- word ) t shortest? [ dfa>word ] with-variable ; diff --git a/basis/regexp/regexp.factor b/basis/regexp/regexp.factor index 29f7e3e84e..63a2f25885 100644 --- a/basis/regexp/regexp.factor +++ b/basis/regexp/regexp.factor @@ -4,7 +4,7 @@ USING: accessors combinators kernel kernel.private math sequences sequences.private strings sets assocs prettyprint.backend prettyprint.custom make lexer namespaces parser arrays fry locals regexp.parser splitting sorting regexp.ast regexp.negation -regexp.compiler words call call.private math.ranges ; +regexp.compiler compiler.units words call call.private math.ranges ; IN: regexp TUPLE: regexp @@ -35,7 +35,7 @@ M: lookbehind question>quot ! Returns ( index string -- ? ) : match-index-from ( i string regexp -- index/f ) ! This word is unsafe. It assumes that i is a fixnum ! and that string is a string. - dup dfa>> execute-unsafe( index string regexp -- i/f ) ; + dup dfa>> execute-unsafe( index string regexp -- i/f ) ; inline GENERIC: end/start ( string regexp -- end start ) M: regexp end/start drop length 0 ; @@ -129,31 +129,28 @@ PRIVATE> GENERIC: compile-regexp ( regex -- regexp ) : regexp-initial-word ( i string regexp -- i/f ) - compile-regexp match-index-from ; + [ compile-regexp ] with-compilation-unit match-index-from ; -: do-compile-regexp ( regexp -- regexp ) +M: regexp compile-regexp ( regexp -- regexp ) dup '[ dup \ regexp-initial-word = [ drop _ get-ast ast>dfa dfa>word ] when ] change-dfa ; -M: regexp compile-regexp ( regexp -- regexp ) - do-compile-regexp ; - M: reverse-regexp compile-regexp ( regexp -- regexp ) - t backwards? [ do-compile-regexp ] with-variable ; + t backwards? [ call-next-method ] with-variable ; DEFER: compile-next-match : next-initial-word ( i string regexp -- i start end string ) - compile-next-match do-next-match ; + [ compile-next-match ] with-compilation-unit do-next-match ; : compile-next-match ( regexp -- regexp ) dup '[ dup \ next-initial-word = [ drop _ [ compile-regexp dfa>> def>> ] [ reverse-regexp? ] bi '[ { array-capacity string regexp } declare _ _ next-match ] - (( i string regexp -- i start end string )) simple-define-temp + (( i string regexp -- i start end string )) define-temp ] when ] change-next-match ;