HiPE bug with nested try/catch

Mikael Pettersson <>
Thu Aug 3 14:05:02 CEST 2006


On Fri, 21 Jul 2006 09:09:03 +0100, Trap Exit wrote:
(badly encoding-damaged)
>According to the Erlang ref. manual: 
>Quote:
>If an exception occurs during evaluation of Expr but there is no matching ExceptionPattern of the right Class with a true guard sequence, the exception is passed on as if Expr had not been enclosed in a try expression.
>(end of quote)
>
>
>So I constructed the following example and noticed that it behaved differently when HiPE compiled.
>
>
>-module(trycatch).
>
>
>-export([main/0]).
>
>main() ->
>    try
>        f()
>    catch
>        throw:Throw ->
>            io:format("gotcha: ~p~n", [Throw])
>    end.
>
>f() ->
>    try
>        throw('i.wonder.who.will.catch.me')
>    catch
>        error:Error ->
>            io:format("function f caused an error: ~p~n", [Error])
>    end.
>
>
>
>Erlang (BEAM) emulator version 5.5 [source] [async-threads:0] [hipe]
>
>Eshell V5.5  (abort with ^G)
>1> c(trycatch).
>{ok,trycatch}
>2> trycatch:main().
>gotcha: 'i.wonder.who.will.catch.me'
>ok
>3> c(trycatch,native).
>{ok,trycatch}
>4> trycatch:main().
>
>=ERROR REPORT==== 21-Jul-2006::09:56:33 ===
>Error in process <0.32.0> with exit value: {undef,[{erlang,raise,[[[{erlang,raise,[[true|16#4044646A0000000000000000000000000000006A],'i.wonder.who.will.catch.me']},{erl_eval,do_apply,5},{shell,exprs,6},{shell,eval_loop,3}]|-16#0000000000000000000000000010],undef]},{erl_eval,do_apply,5},{shell,exprs,6},{shell,eval_loop,3}]}
>
>** exited {undef,[{erlang,raise,
>                           [[[{erlang,raise,
>                                      [[true|
>                                        366900607304749881568687426529269484530033492074],
>                                       'i.wonder.who.will.catch.me']},
>                              {erl_eval,do_apply,5},
>                              {shell,exprs,6},
>                              {shell,eval_loop,3}]|
>                             -00000000000000000016],
>                            undef]},
>                   {erl_eval,do_apply,5},
>                   {shell,exprs,6},
>                   {shell,eval_loop,3}]} **

Thanks for reporting this. The bug has been fixed and the fix will
be included in the next OTP-R11B update. In the mean time you can
use the patch below.

/Mikael Pettersson
The HiPE Team

--- otp-0704/lib/compiler/src/beam_disasm.erl.~1~	2006-06-27 15:58:34.000000000 +0200
+++ otp-0704/lib/compiler/src/beam_disasm.erl	2006-08-03 12:48:02.000000000 +0200
@@ -850,7 +850,8 @@ resolve_inst({try_case,[Reg]},_,_,_) -> 
 resolve_inst({try_case_end,[Arg]},_,_,_) ->
     {try_case_end,resolve_arg(Arg)};
 resolve_inst({raise,[Reg1,Reg2]},_,_,_) ->
-    {bif,raise,{f,0},[Reg1,Reg2],{x,0}};
+    {raise,{f,0},[Reg1,Reg2],{x,0}};	 % do NOT wrap this as a 'bif'
+					 % as there is no raise/2 bif!
 
 %%
 %% New bit syntax instructions added in February 2004 (R10B).
--- otp-0704/lib/hipe/icode/hipe_beam_to_icode.erl.~1~	2006-06-01 11:29:34.000000000 +0200
+++ otp-0704/lib/hipe/icode/hipe_beam_to_icode.erl	2006-08-03 12:48:43.000000000 +0200
@@ -575,7 +575,7 @@ trans_fun([{try_case_end,Arg}|Instructio
   Fail = hipe_icode:mk_fail([V],error),
   [Atom,Tuple,Fail | trans_fun(Instructions,Env)];
 %%--- raise ---
-trans_fun([{bif,raise,{f,0},[Reg1,Reg2],{x,0}}|Instructions], Env) ->
+trans_fun([{raise,{f,0},[Reg1,Reg2],{x,0}}|Instructions], Env) ->
   V1 = trans_arg(Reg1),
   V2 = trans_arg(Reg2),
   Fail = hipe_icode:mk_fail([V1,V2],rethrow),



More information about the erlang-bugs mailing list