[erlang-questions] hipe problems with R14B?

Kostis Sagonas kostis@REDACTED
Fri Oct 15 15:14:09 CEST 2010

Dan Kelley wrote:
> I can't, but this minimal reproducer shows the problem:
> -----
> -module(example).
> -export([bar/1]).
> bar (Baz) ->
>     binary_part(Baz, 0, 1).

Thanks!  This is more than sufficient.  In fact, this is _exactly_ the 
information I would like to see.

> That compiles without +native, but throws the same error with +native.
> While making up the reproducer, I tried this with the 2-arity version of
> binary_part (i.e., binary_part(Baz, {0,1}), and that seemed to work fine.

Well, it's not surprising.  This is the first time that a BIF with three 
arguments was ever introduced to BEAM and the BEAM->ICode translation 
was never notified about it.  It currently has cases for:

%%--- bif0 ---
trans_fun([{bif,BifName,nofail,[],Reg}|Instructions], Env) ->
   BifInst = trans_bif0(BifName,Reg),
%%--- bif1 ---
trans_fun([{bif,BifName,{f,Lbl},[_] = Args,Reg}|Instructions], Env) ->
   {BifInsts,Env1} = trans_bif(1,BifName,Lbl,Args,Reg,Env),
%%--- bif2 ---
trans_fun([{bif,BifName,{f,Lbl},[_,_] = Args,Reg}|Instructions], Env) ->
   {BifInsts,Env1} = trans_bif(2,BifName,Lbl,Args,Reg,Env),

and there is no case for BIFs with more than two arguments.  I will look 
into this.

But, out of curiosity, is there really a need to have both binary_part/2 
and binary_part/3 as BIFs in the language?


PS. I also noticed that the manual contains a typo:

         2> binary_part(Bin,{byte_size(Bin), -5)).

     The first ) should be }

More information about the erlang-questions mailing list