mirror of
https://github.com/mruby/mruby
synced 2026-06-08 16:11:16 +00:00
Raise ArgumentError by aspec check; ref #4688
This is partial `aspec` check that only checks `MRB_ARGS_NONE()`.
This commit is contained in:
@@ -98,9 +98,12 @@ MRB_API mrb_value mrb_proc_cfunc_env_get(mrb_state *mrb, mrb_int idx);
|
|||||||
#define mrb_cfunc_env_get(mrb, idx) mrb_proc_cfunc_env_get(mrb, idx)
|
#define mrb_cfunc_env_get(mrb, idx) mrb_proc_cfunc_env_get(mrb, idx)
|
||||||
|
|
||||||
#define MRB_METHOD_FUNC_FL 1
|
#define MRB_METHOD_FUNC_FL 1
|
||||||
|
#define MRB_METHOD_NOARG_FL 2
|
||||||
#ifdef MRB_METHOD_TABLE_INLINE
|
#ifdef MRB_METHOD_TABLE_INLINE
|
||||||
|
|
||||||
#define MRB_METHOD_FUNC_P(m) (((uintptr_t)(m))&MRB_METHOD_FUNC_FL)
|
#define MRB_METHOD_FUNC_P(m) (((uintptr_t)(m))&MRB_METHOD_FUNC_FL)
|
||||||
|
#define MRB_METHOD_NOARG_P(m) (((uintptr_t)(m))&MRB_METHOD_NOARG_FL)
|
||||||
|
#define MRB_METHOD_NOARG_SET(m) ((m)=(mrb_method_t)(((uintptr_t)(m))|MRB_METHOD_NOARG_FL))
|
||||||
#define MRB_METHOD_FUNC(m) ((mrb_func_t)((uintptr_t)(m)>>2))
|
#define MRB_METHOD_FUNC(m) ((mrb_func_t)((uintptr_t)(m)>>2))
|
||||||
#define MRB_METHOD_FROM_FUNC(m,fn) ((m)=(mrb_method_t)((((uintptr_t)(fn))<<2)|MRB_METHOD_FUNC_FL))
|
#define MRB_METHOD_FROM_FUNC(m,fn) ((m)=(mrb_method_t)((((uintptr_t)(fn))<<2)|MRB_METHOD_FUNC_FL))
|
||||||
#define MRB_METHOD_FROM_PROC(m,pr) ((m)=(mrb_method_t)(pr))
|
#define MRB_METHOD_FROM_PROC(m,pr) ((m)=(mrb_method_t)(pr))
|
||||||
@@ -111,7 +114,9 @@ MRB_API mrb_value mrb_proc_cfunc_env_get(mrb_state *mrb, mrb_int idx);
|
|||||||
#else
|
#else
|
||||||
|
|
||||||
#define MRB_METHOD_FUNC_P(m) ((m).flags&MRB_METHOD_FUNC_FL)
|
#define MRB_METHOD_FUNC_P(m) ((m).flags&MRB_METHOD_FUNC_FL)
|
||||||
|
#define MRB_METHOD_NOARG_P(m) ((m).flags&MRB_METHOD_NOARG_FL)
|
||||||
#define MRB_METHOD_FUNC(m) ((m).func)
|
#define MRB_METHOD_FUNC(m) ((m).func)
|
||||||
|
#define MRB_METHOD_NOARG_SET(m) do{(m).flags|=MRB_METHOD_NOARG_FL;}while(0)
|
||||||
#define MRB_METHOD_FROM_FUNC(m,fn) do{(m).flags=MRB_METHOD_FUNC_FL;(m).func=(fn);}while(0)
|
#define MRB_METHOD_FROM_FUNC(m,fn) do{(m).flags=MRB_METHOD_FUNC_FL;(m).func=(fn);}while(0)
|
||||||
#define MRB_METHOD_FROM_PROC(m,pr) do{(m).flags=0;(m).proc=(pr);}while(0)
|
#define MRB_METHOD_FROM_PROC(m,pr) do{(m).flags=0;(m).proc=(pr);}while(0)
|
||||||
#define MRB_METHOD_PROC_P(m) (!MRB_METHOD_FUNC_P(m))
|
#define MRB_METHOD_PROC_P(m) (!MRB_METHOD_FUNC_P(m))
|
||||||
|
|||||||
@@ -470,6 +470,9 @@ mrb_define_method_id(mrb_state *mrb, struct RClass *c, mrb_sym mid, mrb_func_t f
|
|||||||
int ai = mrb_gc_arena_save(mrb);
|
int ai = mrb_gc_arena_save(mrb);
|
||||||
|
|
||||||
MRB_METHOD_FROM_FUNC(m, func);
|
MRB_METHOD_FROM_FUNC(m, func);
|
||||||
|
if (aspec == MRB_ARGS_NONE()) {
|
||||||
|
MRB_METHOD_NOARG_SET(m);
|
||||||
|
}
|
||||||
mrb_define_method_raw(mrb, c, mid, m);
|
mrb_define_method_raw(mrb, c, mid, m);
|
||||||
mrb_gc_arena_restore(mrb, ai);
|
mrb_gc_arena_restore(mrb, ai);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1435,6 +1435,11 @@ RETRY_TRY_BLOCK:
|
|||||||
ci->proc = p;
|
ci->proc = p;
|
||||||
recv = p->body.func(mrb, recv);
|
recv = p->body.func(mrb, recv);
|
||||||
}
|
}
|
||||||
|
else if (MRB_METHOD_NOARG_P(m) &&
|
||||||
|
(argc > 0 || (argc == -1 && RARRAY_LEN(regs[1]) != 0))) {
|
||||||
|
argnum_error(mrb, 0);
|
||||||
|
goto L_RAISE;
|
||||||
|
}
|
||||||
else {
|
else {
|
||||||
recv = MRB_METHOD_FUNC(m)(mrb, recv);
|
recv = MRB_METHOD_FUNC(m)(mrb, recv);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user