From 06218d5d12b107ff2578f9797e750c595b1f33f9 Mon Sep 17 00:00:00 2001
From: Slava Pestov <slava@factorcode.org>
Date: Sun, 2 Oct 2011 19:52:02 -0700
Subject: [PATCH] compiler.cfg.builder.alien: fix compilation of callbacks
 which unconditionally throw errors

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

diff --git a/basis/compiler/cfg/builder/alien/alien.factor b/basis/compiler/cfg/builder/alien/alien.factor
index ff7a2cdae2..dca9d01fa9 100644
--- a/basis/compiler/cfg/builder/alien/alien.factor
+++ b/basis/compiler/cfg/builder/alien/alien.factor
@@ -182,6 +182,9 @@ M: #alien-assembly emit-node
 : emit-callback-body ( nodes -- )
     [ last #return? t assert= ] [ but-last emit-nodes ] bi ;
 
+: emit-callback-return ( params -- )
+    basic-block get [ callee-return ##callback-outputs ] [ drop ] if ;
+
 M: #alien-callback emit-node
     dup params>> xt>> dup
     [
@@ -193,9 +196,9 @@ M: #alien-callback emit-node
             [ params>> callee-parameters ##callback-inputs ]
             [ params>> box-parameters ]
             [ child>> emit-callback-body ]
-            [ params>> callee-return ##callback-outputs ]
+            [ params>> emit-callback-return ]
             [ params>> callback-stack-cleanup ]
         } cleave
 
-        end-word
+        basic-block get [ end-word ] when
     ] with-cfg-builder ;
diff --git a/basis/compiler/tests/alien.factor b/basis/compiler/tests/alien.factor
index 6aa9cd8bce..feb18e0d7a 100755
--- a/basis/compiler/tests/alien.factor
+++ b/basis/compiler/tests/alien.factor
@@ -334,6 +334,10 @@ FUNCTION: ulonglong ffi_test_38 ( ulonglong x, ulonglong y ) ;
 [ t ] [ 31 2^ 32 2^ ffi_test_38 63 2^ = ] unit-test
 
 ! Test callbacks
+: callback-throws ( -- x )
+    int { } cdecl [ "Hi" throw ] alien-callback ;
+
+[ t ] [ callback-throws alien? ] unit-test
 
 : callback-1 ( -- callback ) void { } cdecl [ ] alien-callback ;