From 5c51d9fd2cef229c4a729e4e54e8328688187981 Mon Sep 17 00:00:00 2001
From: Slava Pestov <slava@slava-pestovs-macbook-pro.local>
Date: Mon, 17 Nov 2008 21:42:59 -0600
Subject: [PATCH] Get regexp words to infer

---
 basis/regexp/parser/parser.factor       | 2 +-
 basis/regexp/regexp-tests.factor        | 3 +++
 basis/regexp/traversal/traversal.factor | 3 ++-
 basis/regexp/utils/utils-tests.factor   | 4 ++++
 basis/regexp/utils/utils.factor         | 4 +---
 5 files changed, 11 insertions(+), 5 deletions(-)
 create mode 100644 basis/regexp/utils/utils-tests.factor

diff --git a/basis/regexp/parser/parser.factor b/basis/regexp/parser/parser.factor
index d04016b93a..b7716d8580 100644
--- a/basis/regexp/parser/parser.factor
+++ b/basis/regexp/parser/parser.factor
@@ -137,7 +137,7 @@ ERROR: bad-special-group string ;
 DEFER: (parse-regexp)
 : nested-parse-regexp ( token ? -- )
     [ push-stack (parse-regexp) pop-stack ] dip
-    [ <negation> ] when pop-stack boa push-stack ;
+    [ <negation> ] when pop-stack new swap >>term push-stack ;
 
 ! non-capturing groups
 : (parse-special-group) ( -- )
diff --git a/basis/regexp/regexp-tests.factor b/basis/regexp/regexp-tests.factor
index 2339628801..2a6c0dc16f 100644
--- a/basis/regexp/regexp-tests.factor
+++ b/basis/regexp/regexp-tests.factor
@@ -2,6 +2,9 @@ USING: regexp tools.test kernel sequences regexp.parser
 regexp.traversal eval ;
 IN: regexp-tests
 
+\ <regexp> must-infer
+\ matches? must-infer
+
 [ f ] [ "b" "a*" <regexp> matches? ] unit-test
 [ t ] [ "" "a*" <regexp> matches? ] unit-test
 [ t ] [ "a" "a*" <regexp> matches? ] unit-test
diff --git a/basis/regexp/traversal/traversal.factor b/basis/regexp/traversal/traversal.factor
index 91c7ce16dc..c9e8a54348 100644
--- a/basis/regexp/traversal/traversal.factor
+++ b/basis/regexp/traversal/traversal.factor
@@ -107,7 +107,8 @@ M: capture-group-off flag-action ( dfa-traverser flag -- )
 : increment-state ( dfa-traverser state -- dfa-traverser )
     [
         dup traverse-forward>>
-        [ 1+ ] [ 1- ] ? change-current-index
+        [ [ 1+ ] change-current-index ]
+        [ [ 1- ] change-current-index ] if
         dup current-state>> >>last-state
     ] dip
     first >>current-state ;
diff --git a/basis/regexp/utils/utils-tests.factor b/basis/regexp/utils/utils-tests.factor
new file mode 100644
index 0000000000..d048ad4be1
--- /dev/null
+++ b/basis/regexp/utils/utils-tests.factor
@@ -0,0 +1,4 @@
+USING: regexp.utils tools.test ;
+IN: regexp.utils.tests
+
+[ [ ] [ ] while-changes ] must-infer
diff --git a/basis/regexp/utils/utils.factor b/basis/regexp/utils/utils.factor
index fb058ecf92..5116dd2b7e 100644
--- a/basis/regexp/utils/utils.factor
+++ b/basis/regexp/utils/utils.factor
@@ -5,9 +5,7 @@ namespaces regexp.backend sequences unicode.categories
 math.ranges fry combinators.short-circuit vectors ;
 IN: regexp.utils
 
-: (while-changes) ( obj quot pred pred-ret -- obj )
-    ! quot: ( obj -- obj' )
-    ! pred: ( obj -- <=> )
+: (while-changes) ( obj quot: ( obj -- obj' ) pred: ( obj -- <=> ) pred-ret -- obj )
     [ [ dup slip ] dip pick over call ] dip dupd =
     [ 3drop ] [ (while-changes) ] if ; inline recursive