From d29c2750894e0d3fb9ae2bda01aa92199daa4b7f Mon Sep 17 00:00:00 2001
From: Slava Pestov <slava@shill.local>
Date: Wed, 22 Jul 2009 19:17:21 -0500
Subject: [PATCH] compiler.cfg.builder: Fix construction of ##return
 instructions from #return-recursive nodes

---
 basis/compiler/cfg/builder/builder-tests.factor | 10 ++++++++++
 basis/compiler/cfg/builder/builder.factor       |  9 +++++----
 2 files changed, 15 insertions(+), 4 deletions(-)

diff --git a/basis/compiler/cfg/builder/builder-tests.factor b/basis/compiler/cfg/builder/builder-tests.factor
index 90e42912a1..7381bdca55 100644
--- a/basis/compiler/cfg/builder/builder-tests.factor
+++ b/basis/compiler/cfg/builder/builder-tests.factor
@@ -9,6 +9,15 @@ byte-arrays kernel.private math slots.private ;
 : unit-test-cfg ( quot -- )
     '[ _ test-cfg [ compute-predecessors check-cfg ] each ] [ ] swap unit-test ;
 
+: blahblah ( nodes -- ? )
+    { fixnum } declare [
+        dup 3 bitand 1 = [ drop t ] [
+            dup 3 bitand 2 = [
+                blahblah
+            ] [ drop f ] if
+        ] if
+    ] any? ; inline recursive
+
 {
     [ ]
     [ dup ]
@@ -52,6 +61,7 @@ byte-arrays kernel.private math slots.private ;
     [ "int" { "int" } "cdecl" [ ] alien-callback ]
     [ swap - + * ]
     [ swap slot ]
+    [ blahblah ]
 } [
     unit-test-cfg
 ] each
diff --git a/basis/compiler/cfg/builder/builder.factor b/basis/compiler/cfg/builder/builder.factor
index 48162156c8..7a7156d5c9 100755
--- a/basis/compiler/cfg/builder/builder.factor
+++ b/basis/compiler/cfg/builder/builder.factor
@@ -160,12 +160,13 @@ M: #shuffle emit-node
     [ [ [ out-r>> ] [ mapping>> ] bi ] dip '[ _ at _ at ] map rs-store ] 2bi ;
 
 ! #return
-M: #return emit-node
-    drop ##branch begin-basic-block ##epilogue ##return ;
+: emit-return ( -- )
+    ##branch begin-basic-block ##epilogue ##return ;
+
+M: #return emit-node drop emit-return ;
 
 M: #return-recursive emit-node
-    label>> id>> loops get key?
-    [ ##epilogue ##return ] unless ;
+    label>> id>> loops get key? [ emit-return ] unless ;
 
 ! #terminate
 M: #terminate emit-node drop ##no-tco basic-block off ;