Commit d271bf0a authored by Yukihiro Matsumoto's avatar Yukihiro Matsumoto

make mrb_funcall_argv and mrb_funcall_with_block to take mrb_sym as a method name

parent 7511508a
...@@ -330,8 +330,8 @@ struct RClass * mrb_define_module_under(mrb_state *mrb, struct RClass *outer, co ...@@ -330,8 +330,8 @@ struct RClass * mrb_define_module_under(mrb_state *mrb, struct RClass *outer, co
int mrb_get_args(mrb_state *mrb, const char *format, ...); int mrb_get_args(mrb_state *mrb, const char *format, ...);
mrb_value mrb_funcall(mrb_state*, mrb_value, const char*, int,...); mrb_value mrb_funcall(mrb_state*, mrb_value, const char*, int,...);
mrb_value mrb_funcall_argv(mrb_state*, mrb_value, const char*, int, mrb_value*); mrb_value mrb_funcall_argv(mrb_state*, mrb_value, mrb_sym, int, mrb_value*);
mrb_value mrb_funcall_with_block(mrb_state*, mrb_value, const char*, int, mrb_value*, mrb_value); mrb_value mrb_funcall_with_block(mrb_state*, mrb_value, mrb_sym, int, mrb_value*, mrb_value);
mrb_sym mrb_intern(mrb_state*,const char*); mrb_sym mrb_intern(mrb_state*,const char*);
mrb_sym mrb_intern2(mrb_state*,const char*,int); mrb_sym mrb_intern2(mrb_state*,const char*,int);
mrb_sym mrb_intern_str(mrb_state*,mrb_value); mrb_sym mrb_intern_str(mrb_state*,mrb_value);
......
...@@ -723,8 +723,8 @@ mrb_mod_include(mrb_state *mrb, mrb_value klass) ...@@ -723,8 +723,8 @@ mrb_mod_include(mrb_state *mrb, mrb_value klass)
mrb_check_type(mrb, argv[i], MRB_TT_MODULE); mrb_check_type(mrb, argv[i], MRB_TT_MODULE);
} }
while (argc--) { while (argc--) {
mrb_funcall_argv(mrb, argv[argc], "append_features", 1, &klass); mrb_funcall(mrb, argv[argc], "append_features", 1, klass);
mrb_funcall_argv(mrb, argv[argc], "included", 1, &klass); mrb_funcall(mrb, argv[argc], "included", 1, klass);
} }
return klass; return klass;
...@@ -877,29 +877,41 @@ mrb_method_search(mrb_state *mrb, struct RClass* c, mrb_sym mid) ...@@ -877,29 +877,41 @@ mrb_method_search(mrb_state *mrb, struct RClass* c, mrb_sym mid)
mrb_value mrb_value
mrb_funcall(mrb_state *mrb, mrb_value self, const char *name, int argc, ...) mrb_funcall(mrb_state *mrb, mrb_value self, const char *name, int argc, ...)
{ {
mrb_value args[MRB_FUNCALL_ARGC_MAX]; mrb_sym mid = mrb_intern(mrb, name);
va_list ap; va_list ap;
int i; int i;
if (argc != 0) { if (argc == 0) {
return mrb_funcall_argv(mrb, self, mid, 0, 0);
}
else if (argc == 1) {
mrb_value v;
va_start(ap, argc);
v = va_arg(ap, mrb_value);
va_end(ap);
return mrb_funcall_argv(mrb, self, mid, 1, &v);
}
else {
mrb_value argv[MRB_FUNCALL_ARGC_MAX];
if (argc > MRB_FUNCALL_ARGC_MAX) { if (argc > MRB_FUNCALL_ARGC_MAX) {
mrb_raise(mrb, E_ARGUMENT_ERROR, "Too long arguments. (limit=%d)\n", MRB_FUNCALL_ARGC_MAX); mrb_raise(mrb, E_ARGUMENT_ERROR, "Too long arguments. (limit=%d)", MRB_FUNCALL_ARGC_MAX);
} }
va_start(ap, argc); va_start(ap, argc);
for (i = 0; i < argc; i++) { for (i = 0; i < argc; i++) {
args[i] = va_arg(ap, mrb_value); argv[i] = va_arg(ap, mrb_value);
} }
va_end(ap); va_end(ap);
return mrb_funcall_argv(mrb, self, mid, argc, argv);
} }
return mrb_funcall_argv(mrb, self, name, argc, args);
} }
void void
mrb_obj_call_init(mrb_state *mrb, mrb_value obj, int argc, mrb_value *argv) mrb_obj_call_init(mrb_state *mrb, mrb_value obj, int argc, mrb_value *argv)
{ {
mrb_funcall_argv(mrb, obj, "initialize", argc, argv); mrb_funcall_argv(mrb, obj, mrb_intern(mrb, "initialize"), argc, argv);
} }
/* /*
...@@ -938,7 +950,7 @@ mrb_class_new_instance_m(mrb_state *mrb, mrb_value klass) ...@@ -938,7 +950,7 @@ mrb_class_new_instance_m(mrb_state *mrb, mrb_value klass)
c = (struct RClass*)mrb_obj_alloc(mrb, k->tt, k); c = (struct RClass*)mrb_obj_alloc(mrb, k->tt, k);
c->super = k; c->super = k;
obj = mrb_obj_value(c); obj = mrb_obj_value(c);
mrb_funcall_with_block(mrb, obj, "initialize", argc, argv, blk); mrb_funcall_with_block(mrb, obj, mrb_intern(mrb, "initialize"), argc, argv, blk);
return obj; return obj;
} }
...@@ -957,7 +969,7 @@ mrb_instance_new(mrb_state *mrb, mrb_value cv) ...@@ -957,7 +969,7 @@ mrb_instance_new(mrb_state *mrb, mrb_value cv)
o = (struct RObject*)mrb_obj_alloc(mrb, ttype, c); o = (struct RObject*)mrb_obj_alloc(mrb, ttype, c);
obj = mrb_obj_value(o); obj = mrb_obj_value(o);
mrb_get_args(mrb, "*&", &argv, &argc, &blk); mrb_get_args(mrb, "*&", &argv, &argc, &blk);
mrb_funcall_with_block(mrb, obj, "initialize", argc, argv, blk); mrb_funcall_with_block(mrb, obj, mrb_intern(mrb, "initialize"), argc, argv, blk);
return obj; return obj;
} }
......
...@@ -144,7 +144,7 @@ exc_equal(mrb_state *mrb, mrb_value exc) ...@@ -144,7 +144,7 @@ exc_equal(mrb_state *mrb, mrb_value exc)
if (mrb_obj_equal(mrb, exc, obj)) return mrb_true_value(); if (mrb_obj_equal(mrb, exc, obj)) return mrb_true_value();
if (mrb_obj_class(mrb, exc) != mrb_obj_class(mrb, obj)) { if (mrb_obj_class(mrb, exc) != mrb_obj_class(mrb, obj)) {
if ( mrb_respond_to(mrb, obj, mrb_intern(mrb, "message")) ) { if (mrb_respond_to(mrb, obj, mrb_intern(mrb, "message"))) {
mesg = mrb_funcall(mrb, obj, "message", 0); mesg = mrb_funcall(mrb, obj, "message", 0);
} }
else else
...@@ -306,13 +306,16 @@ make_exception(mrb_state *mrb, int argc, mrb_value *argv, int isstr) ...@@ -306,13 +306,16 @@ make_exception(mrb_state *mrb, int argc, mrb_value *argv, int isstr)
case 3: case 3:
n = 1; n = 1;
exception_call: exception_call:
if (mrb_respond_to(mrb, argv[0], mrb_intern(mrb, "exception"))) { {
mesg = mrb_funcall_argv(mrb, argv[0], "exception", n, argv+1); mrb_sym exc = mrb_intern(mrb, "exception");
if (mrb_respond_to(mrb, argv[0], exc)) {
mesg = mrb_funcall_argv(mrb, argv[0], exc, n, argv+1);
} }
else { else {
/* undef */ /* undef */
mrb_raise(mrb, E_TYPE_ERROR, "exception class/object expected"); mrb_raise(mrb, E_TYPE_ERROR, "exception class/object expected");
} }
}
break; break;
default: default:
......
...@@ -245,7 +245,7 @@ mrb_f_send(mrb_state *mrb, mrb_value self) ...@@ -245,7 +245,7 @@ mrb_f_send(mrb_state *mrb, mrb_value self)
int argc; int argc;
mrb_get_args(mrb, "n*&", &name, &argv, &argc, &block); mrb_get_args(mrb, "n*&", &name, &argv, &argc, &block);
return mrb_funcall_with_block(mrb,self, mrb_sym2name(mrb, name), argc, argv, block); return mrb_funcall_with_block(mrb,self, name, argc, argv, block);
} }
/* 15.3.1.2.2 */ /* 15.3.1.2.2 */
......
...@@ -76,7 +76,7 @@ mrb_reg_s_new_instance(mrb_state *mrb, /*int argc, mrb_value *argv, */mrb_value ...@@ -76,7 +76,7 @@ mrb_reg_s_new_instance(mrb_state *mrb, /*int argc, mrb_value *argv, */mrb_value
re->ptr = 0; re->ptr = 0;
re->src = 0; re->src = 0;
re->usecnt = 0; re->usecnt = 0;
return mrb_funcall_argv(mrb, mrb_obj_value(re), "initialize", argc, argv); return mrb_funcall_argv(mrb, mrb_obj_value(re), mrb_intern(mrb, "initialize"), argc, argv);
} }
mrb_value mrb_value
......
...@@ -320,8 +320,8 @@ const_get(mrb_state *mrb, struct RClass *base, mrb_sym sym) ...@@ -320,8 +320,8 @@ const_get(mrb_state *mrb, struct RClass *base, mrb_sym sym)
return kh_value(h, k); return kh_value(h, k);
} }
if (mrb_respond_to(mrb, mrb_obj_value(c), cm)) { if (mrb_respond_to(mrb, mrb_obj_value(c), cm)) {
mrb_value argv = mrb_symbol_value(sym); mrb_value name = mrb_symbol_value(sym);
return mrb_funcall_argv(mrb, mrb_obj_value(c), "const_missing", 1, &argv); return mrb_funcall(mrb, mrb_obj_value(c), "const_missing", 1, name);
} }
} }
c = c->super; c = c->super;
......
...@@ -179,16 +179,18 @@ ecall(mrb_state *mrb, int i) ...@@ -179,16 +179,18 @@ ecall(mrb_state *mrb, int i)
} }
mrb_value mrb_value
mrb_funcall_with_block(mrb_state *mrb, mrb_value self, const char *name, int argc, mrb_value *argv, mrb_value blk) mrb_funcall_with_block(mrb_state *mrb, mrb_value self, mrb_sym mid, int argc, mrb_value *argv, mrb_value blk)
{ {
struct RProc *p; struct RProc *p;
struct RClass *c; struct RClass *c;
mrb_sym mid = mrb_intern(mrb, name);
mrb_sym undef = 0; mrb_sym undef = 0;
mrb_callinfo *ci; mrb_callinfo *ci;
int n = mrb->ci->nregs; int n = mrb->ci->nregs;
mrb_value val; mrb_value val;
if (argc < 0) {
mrb_raise(mrb, E_ARGUMENT_ERROR, "negative argc for funcall (%d)", argc);
}
c = mrb_class(mrb, self); c = mrb_class(mrb, self);
p = mrb_method_search_vm(mrb, &c, mid); p = mrb_method_search_vm(mrb, &c, mid);
if (!p) { if (!p) {
...@@ -232,9 +234,9 @@ mrb_funcall_with_block(mrb_state *mrb, mrb_value self, const char *name, int arg ...@@ -232,9 +234,9 @@ mrb_funcall_with_block(mrb_state *mrb, mrb_value self, const char *name, int arg
} }
mrb_value mrb_value
mrb_funcall_argv(mrb_state *mrb, mrb_value self, const char *name, int argc, mrb_value *argv) mrb_funcall_argv(mrb_state *mrb, mrb_value self, mrb_sym mid, int argc, mrb_value *argv)
{ {
return mrb_funcall_with_block(mrb, self, name, argc, argv, mrb_nil_value()); return mrb_funcall_with_block(mrb, self, mid, argc, argv, mrb_nil_value());
} }
mrb_value mrb_value
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment