summaryrefslogtreecommitdiff
path: root/vm_eval.c
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2008-12-15 05:15:26 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2008-12-15 05:15:26 +0000
commitd5b7e690320e969d77be665927fe8a493aa5806d (patch)
tree12b8365f6e82595980cf54f3bd13bc7f941a49f4 /vm_eval.c
parent94fc275e16390962cb06653033078894987ac76f (diff)
* vm_eval.c (vm_call_super): uses method_missing().
* vm_eval.c (method_missing): get rid of too large alloca. * vm_eval.c (rb_call0, method_missing): uses idMethodMissing. * vm_method.c (rb_add_method, remove_method, rb_undef): uses id__send__. * vm_method.c (Init_eval_method): removed IDs which are defined as immediate values. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@20743 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'vm_eval.c')
-rw-r--r--vm_eval.c46
1 files changed, 20 insertions, 26 deletions
diff --git a/vm_eval.c b/vm_eval.c
index 12d32d851f..be3c0fc5be 100644
--- a/vm_eval.c
+++ b/vm_eval.c
@@ -137,28 +137,11 @@ vm_call_super(rb_thread_t * const th, const int argc, const VALUE * const argv)
}
body = rb_method_node(klass, id); /* this returns NODE_METHOD */
-
- if (body) {
- body = body->nd_body;
- }
- else {
- VALUE *argv_m, result, argv_ary = 0;
- if (argc < 0x100) {
- argv_m = ALLOCA_N(VALUE, argc+1);
- }
- else {
- argv_ary = rb_ary_tmp_new(argc+1);
- argv_m = RARRAY_PTR(argv_ary);
- }
- MEMCPY(argv_m + 1, argv, VALUE, argc);
- argv_m[0] = ID2SYM(id);
- th->method_missing_reason = 0;
- th->passed_block = 0;
- result = rb_funcall2(recv, idMethodMissing, argc + 1, argv_m);
- if (argv_ary) rb_ary_clear(argv_ary);
- return result;
+ if (!body) {
+ return method_missing(recv, id, argc, argv, 0);
}
+ body = body->nd_body;
return vm_call0(th, klass, recv, id, id, argc, argv, body, CALL_SUPER);
}
@@ -221,7 +204,7 @@ rb_call0(VALUE klass, VALUE recv, ID mid, int argc, const VALUE *argv,
}
- if (mid != missing) {
+ if (mid != idMethodMissing) {
/* receiver specified form for private method */
if (UNLIKELY(noex)) {
if (((noex & NOEX_MASK) & NOEX_PRIVATE) && scope == 0) {
@@ -347,10 +330,13 @@ rb_method_missing(int argc, const VALUE *argv, VALUE obj)
static inline VALUE
method_missing(VALUE obj, ID id, int argc, const VALUE *argv, int call_status)
{
- VALUE *nargv;
- GET_THREAD()->method_missing_reason = call_status;
+ VALUE *nargv, result, argv_ary = 0;
+ rb_thread_t *th = GET_THREAD();
+
+ th->method_missing_reason = call_status;
+ th->passed_block = 0;
- if (id == missing) {
+ if (id == idMethodMissing) {
rb_method_missing(argc, argv, obj);
}
else if (id == ID_ALLOCATOR) {
@@ -358,11 +344,19 @@ method_missing(VALUE obj, ID id, int argc, const VALUE *argv, int call_status)
rb_class2name(obj));
}
- nargv = ALLOCA_N(VALUE, argc + 1);
+ if (argc < 0x100) {
+ nargv = ALLOCA_N(VALUE, argc + 1);
+ }
+ else {
+ argv_ary = rb_ary_tmp_new(argc + 1);
+ nargv = RARRAY_PTR(argv_ary);
+ }
nargv[0] = ID2SYM(id);
MEMCPY(nargv + 1, argv, VALUE, argc);
- return rb_funcall2(obj, missing, argc + 1, nargv);
+ result = rb_funcall2(obj, idMethodMissing, argc + 1, nargv);
+ if (argv_ary) rb_ary_clear(argv_ary);
+ return result;
}
VALUE