R13B02: hipe:load/1 crashes when called with a sticky module

Paul Guyot <>
Wed Nov 4 11:09:29 CET 2009


The source code of hipe:load/1 shows that it's supposed to work with  
sticky modules, but in fact, it's not.

load(Mod, BeamFileName) when is_list(BeamFileName) ->
   Architecture = erlang:system_info(hipe_architecture),
   ChunkName = hipe_unified_loader:chunk_name(Architecture),
   case beam_lib:chunks(BeamFileName, [ChunkName]) of
     {ok,{_,[{_,Bin}]}} when is_binary(Bin) -> do_load(Mod, Bin, Bin);  
% <-- here, Bin is the native chunk
     Error -> {error, Error}

then do_load goes like this :
do_load(Mod, Bin, WholeModule) ->
   case WholeModule of
     BinCode when is_binary(BinCode) ->
       case code:is_sticky(Mod) of
	true ->
% this is where we end up for sticky modules such as lists (hipe.erl,  
line 917)

	  %% We unpack and repack the Beam binary as a workaround to
	  %% ensure that it is not compressed.
	  {ok, _, Chunks} = beam_lib:all_chunks(WholeModule),	% <--  
WholeModule is still the native chunk above (line 928).
	  {ok, Beam} = beam_lib:build_module(Chunks),
	  %% Don't purge or register sticky mods; just load native.
	  code:load_native_sticky(Mod, Bin, Beam);

The crash happens line 928 :
** exception error: no match of right hand side value {error,beam_lib,
      in function  hipe:do_load/3

Indeed, it's not a beam file, it's a beam native chunk.

Semiocast                       http://titema.com/
+33.175000290 - 62 bis rue Gay-Lussac, 75005 Paris

More information about the erlang-bugs mailing list