From 64d284a97041f65356a4a77ffc64da4f66995329 Mon Sep 17 00:00:00 2001
From: Slava Pestov <slava@factorcode.org>
Date: Mon, 21 Jan 2008 17:30:10 -0500
Subject: [PATCH] Fix recompilation of foldable, flushable

---
 core/compiler/test/redefine.factor    | 24 ++++++++++++++++++++++++
 core/optimizer/backend/backend.factor | 11 ++++++-----
 core/words/words-tests.factor         | 11 +++++++++++
 core/words/words.factor               |  2 +-
 4 files changed, 42 insertions(+), 6 deletions(-)

diff --git a/core/compiler/test/redefine.factor b/core/compiler/test/redefine.factor
index 6e652df877..718e98c9c2 100755
--- a/core/compiler/test/redefine.factor
+++ b/core/compiler/test/redefine.factor
@@ -205,3 +205,27 @@ DEFER: generic-then-not-generic-test-2
 [ ] [ "IN: temporary USE: math : generic-then-not-generic-test-1 1 + ;" eval ] unit-test
 
 [ 4 ] [ generic-then-not-generic-test-2 ] unit-test
+
+DEFER: foldable-test-2
+
+[ ] [ "IN: temporary : foldable-test-1 3 ; foldable" eval ] unit-test
+
+[ ] [ "IN: temporary : foldable-test-2 foldable-test-1 ;" eval ] unit-test
+
+[ 3 ] [ foldable-test-2 ] unit-test
+
+[ ] [ "IN: temporary : foldable-test-1 4 ; foldable" eval ] unit-test
+
+[ 4 ] [ foldable-test-2 ] unit-test
+
+DEFER: flushable-test-2
+
+[ ] [ "IN: temporary USE: kernel : flushable-test-1 drop 3 ; flushable" eval ] unit-test
+
+[ ] [ "IN: temporary USE: kernel : flushable-test-2 V{ } dup flushable-test-1 drop ;" eval ] unit-test
+
+[ V{ } ] [ flushable-test-2 ] unit-test
+
+[ ] [ "IN: temporary USING: kernel sequences ; : flushable-test-1 3 over push ;" eval ] unit-test
+
+[ V{ 3 } ] [ flushable-test-2 ] unit-test
diff --git a/core/optimizer/backend/backend.factor b/core/optimizer/backend/backend.factor
index 1122d83129..4843a9ff26 100644
--- a/core/optimizer/backend/backend.factor
+++ b/core/optimizer/backend/backend.factor
@@ -17,17 +17,17 @@ SYMBOL: optimizer-changed
 
 GENERIC: optimize-node* ( node -- node/t changed? )
 
-: ?union ( hash/f hash -- hash )
+: ?union ( assoc/f assoc -- hash )
     over [ union ] [ nip ] if ;
 
-: add-node-literals ( hash node -- )
+: add-node-literals ( assoc node -- )
     over assoc-empty? [
         2drop
     ] [
         [ node-literals ?union ] keep set-node-literals
     ] if ;
 
-: add-node-classes ( hash node -- )
+: add-node-classes ( assoc node -- )
     over assoc-empty? [
         2drop
     ] [
@@ -324,6 +324,7 @@ M: #dispatch optimize-node*
     ] if ;
 
 : flush-eval ( #call -- node )
+    dup node-param +inlined+ depends-on
     dup node-out-d length f <repetition> inline-literals ;
 
 : partial-eval? ( #call -- ? )
@@ -337,9 +338,9 @@ M: #dispatch optimize-node*
     dup node-in-d [ node-literal ] with map ;
 
 : partial-eval ( #call -- node )
+    dup node-param +inlined+ depends-on
     dup literal-in-d over node-param 1quotation
-    [ with-datastack ] catch
-    [ 3drop t ] [ inline-literals ] if ;
+    [ with-datastack inline-literals ] [ 2drop 2drop t ] recover ;
 
 : define-identities ( words identities -- )
     [ "identities" set-word-prop ] curry each ;
diff --git a/core/words/words-tests.factor b/core/words/words-tests.factor
index a88892b5f4..2455250dc9 100755
--- a/core/words/words-tests.factor
+++ b/core/words/words-tests.factor
@@ -175,3 +175,14 @@ SYMBOL: quot-uses-b
 
 [ t ] [ "symbol-generic" "temporary" lookup symbol? ] unit-test
 [ f ] [ "symbol-generic" "temporary" lookup generic? ] unit-test
+
+! Regressions
+[ ] [ "IN: temporary : decl-forget-test ; foldable" eval ] unit-test
+[ t ] [ "decl-forget-test" "temporary" lookup "foldable" word-prop ] unit-test
+[ ] [ "IN: temporary : decl-forget-test ;" eval ] unit-test
+[ f ] [ "decl-forget-test" "temporary" lookup "foldable" word-prop ] unit-test
+
+[ ] [ "IN: temporary : decl-forget-test ; flushable" eval ] unit-test
+[ t ] [ "decl-forget-test" "temporary" lookup "flushable" word-prop ] unit-test
+[ ] [ "IN: temporary : decl-forget-test ;" eval ] unit-test
+[ f ] [ "decl-forget-test" "temporary" lookup "flushable" word-prop ] unit-test
diff --git a/core/words/words.factor b/core/words/words.factor
index a2d9234353..6d8bad4f9e 100755
--- a/core/words/words.factor
+++ b/core/words/words.factor
@@ -127,7 +127,7 @@ SYMBOL: changed-words
 : reset-word ( word -- )
     {
         "unannotated-def"
-        "parsing" "inline" "foldable"
+        "parsing" "inline" "foldable" "flushable"
         "predicating"
         "reading" "writing"
         "constructing"