trifork / erjang

A JVM-based Erlang VM
http://www.erjang.org
Apache License 2.0
725 stars 62 forks source link

Missing arity check for BIFs #50

Closed eriksoe closed 13 years ago

eriksoe commented 13 years ago

To reproduce:

(fun erlang:integer_to_list/1)(1,0).

Expected behaviour:

\ exception error: integer_to_list/1 called with two arguments

Observed behaviour:

Expression evaluates to "1".

krestenkrab commented 13 years ago

If I compile

-module(foo).
-export([main/0]).
main() ->
  (fun erlang:integer_to_list/1)(1,0).

And try to run foo:main(), then I get badfun.

> catch(foo:main()).
{'EXIT',{badfun,[{foo,main,[#Fun<erlang:integer_to_list/1>]},
             {erlang,apply,4},
             {error_handler,undefined_function,3},
             {erlang,apply,4},
             {shell,apply_fun,3},
             {erl_eval,do_apply,5},
             {erl_eval,expr,5},
             {shell,exprs,7},
             {shell,eval_exprs,7},
             {shell,eval_loop,3},
             {erlang,apply,4}]}}

However, in BEAM I get

> catch(foo:main()).
{'EXIT',{{badarity,{#Fun<erlang.integer_to_list.1>,[1,0]}},
     [{foo,main,0},
      {erl_eval,do_apply,5},
      {erl_eval,expr,5},
      {shell,exprs,7},
      {shell,eval_exprs,7},
      {shell,eval_loop,3}]}}

So, it's close but no cigar ... we need to throw {badarity,{Fun,Args}} rather than badfun.

krestenkrab commented 13 years ago

Commit 2a0da3fee05f2844b817983ded2ba1729f4b9a45 improves this

eriksoe commented 13 years ago

The behaviour I described was in the shell... so probably an apply() issue.