mirror of
https://github.com/mruby/mruby
synced 2026-06-08 16:11:16 +00:00
Merge pull request #3287 from bouk/proc-arity
Fix calling .arity on Proc with undefined `initialize`
This commit is contained in:
@@ -114,6 +114,9 @@ mrb_proc_parameters(mrb_state *mrb, mrb_value self)
|
||||
// TODO cfunc aspec is not implemented yet
|
||||
return mrb_ary_new(mrb);
|
||||
}
|
||||
if (!irep) {
|
||||
return mrb_ary_new(mrb);
|
||||
}
|
||||
if (!irep->lv) {
|
||||
return mrb_ary_new(mrb);
|
||||
}
|
||||
|
||||
@@ -58,6 +58,17 @@ assert('Proc#parameters') do
|
||||
assert_equal([[:req, :a], [:req, :b], [:opt, :c], [:opt, :d], [:rest, :e], [:req, :f], [:req, :g], [:block, :h]], lambda {|a,b,c=:c,d=:d,*e,f,g,&h|}.parameters)
|
||||
end
|
||||
|
||||
assert('Proc#parameters with uninitialized Proc') do
|
||||
begin
|
||||
Proc.alias_method(:original_initialize, :initialize)
|
||||
Proc.remove_method(:initialize)
|
||||
assert_equal [], Proc.new{|a, b, c| 1}.parameters
|
||||
ensure
|
||||
Proc.alias_method(:initialize, :original_initialize)
|
||||
Proc.remove_method(:original_initialize)
|
||||
end
|
||||
end
|
||||
|
||||
assert('Proc#to_proc') do
|
||||
proc = Proc.new {}
|
||||
assert_equal proc, proc.to_proc
|
||||
|
||||
+8
-7
@@ -188,18 +188,13 @@ mrb_proc_call_cfunc(mrb_state *mrb, struct RProc *p, mrb_value self)
|
||||
return (p->body.func)(mrb, self);
|
||||
}
|
||||
|
||||
mrb_code*
|
||||
mrb_proc_iseq(mrb_state *mrb, struct RProc *p)
|
||||
{
|
||||
return p->body.irep->iseq;
|
||||
}
|
||||
|
||||
/* 15.2.17.4.2 */
|
||||
static mrb_value
|
||||
mrb_proc_arity(mrb_state *mrb, mrb_value self)
|
||||
{
|
||||
struct RProc *p = mrb_proc_ptr(self);
|
||||
mrb_code *iseq = mrb_proc_iseq(mrb, p);
|
||||
struct mrb_irep *irep;
|
||||
mrb_code *iseq;
|
||||
mrb_aspec aspec;
|
||||
int ma, op, ra, pa, arity;
|
||||
|
||||
@@ -208,6 +203,12 @@ mrb_proc_arity(mrb_state *mrb, mrb_value self)
|
||||
return mrb_fixnum_value(-1);
|
||||
}
|
||||
|
||||
irep = p->body.irep;
|
||||
if (!irep) {
|
||||
return mrb_fixnum_value(0);
|
||||
}
|
||||
|
||||
iseq = irep->iseq;
|
||||
/* arity is depend on OP_ENTER */
|
||||
if (GET_OPCODE(*iseq) != OP_ENTER) {
|
||||
return mrb_fixnum_value(0);
|
||||
|
||||
@@ -46,6 +46,17 @@ assert('Proc#arity', '15.2.17.4.2') do
|
||||
assert_equal(-1, g)
|
||||
end
|
||||
|
||||
assert('Proc#arity with unitialized Proc') do
|
||||
begin
|
||||
Proc.alias_method(:original_initialize, :initialize)
|
||||
Proc.remove_method(:initialize)
|
||||
assert_equal 0, Proc.new{|a, b, c| 1}.arity
|
||||
ensure
|
||||
Proc.alias_method(:initialize, :original_initialize)
|
||||
Proc.remove_method(:original_initialize)
|
||||
end
|
||||
end
|
||||
|
||||
assert('Proc#call', '15.2.17.4.3') do
|
||||
a = 0
|
||||
b = Proc.new { a += 1 }
|
||||
|
||||
Reference in New Issue
Block a user