* eval.c (calling_scope_t): gave names to magic numbers for rb_call().

[ruby-dev:27978]


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@9665 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
nobu 2005-12-09 15:32:00 +00:00
Родитель fc0434bc1d
Коммит 00f96715f3
2 изменённых файлов: 37 добавлений и 26 удалений

Просмотреть файл

@ -1,3 +1,8 @@
Sat Dec 10 00:31:42 2005 Nobuyoshi Nakada <nobu@ruby-lang.org>
* eval.c (calling_scope_t): gave names to magic numbers for rb_call().
[ruby-dev:27978]
Fri Dec 9 23:31:02 2005 Nobuyoshi Nakada <nobu@ruby-lang.org> Fri Dec 9 23:31:02 2005 Nobuyoshi Nakada <nobu@ruby-lang.org>
* lib/rexml/encoding.rb (encoding=): give priority to particular * lib/rexml/encoding.rb (encoding=): give priority to particular

58
eval.c
Просмотреть файл

@ -1012,7 +1012,14 @@ static VALUE rb_yield_0(VALUE, VALUE, VALUE, int, int);
#define YIELD_FUNC_AVALUE 1 #define YIELD_FUNC_AVALUE 1
#define YIELD_FUNC_SVALUE 2 #define YIELD_FUNC_SVALUE 2
static VALUE rb_call(VALUE,VALUE,ID,int,const VALUE*,int); typedef enum calling_scope {
CALLING_NORMAL,
CALLING_FCALL,
CALLING_VCALL,
CALLING_SUPER,
} calling_scope_t;
static VALUE rb_call(VALUE,VALUE,ID,int,const VALUE*,calling_scope_t);
static VALUE module_setup(VALUE,NODE*); static VALUE module_setup(VALUE,NODE*);
static VALUE massign(VALUE,NODE*,VALUE,int); static VALUE massign(VALUE,NODE*,VALUE,int);
@ -2988,7 +2995,7 @@ rb_eval(VALUE self, NODE *n)
END_CALLARGS; END_CALLARGS;
ruby_current_node = node; ruby_current_node = node;
SET_CURRENT_SOURCE(); SET_CURRENT_SOURCE();
result = rb_call(CLASS_OF(recv),recv,each,0,0,0); result = rb_call(CLASS_OF(recv),recv,each,0,0,CALLING_NORMAL);
} }
POP_ITER(); POP_ITER();
} }
@ -3214,17 +3221,17 @@ rb_eval(VALUE self, NODE *n)
{ {
VALUE recv; VALUE recv;
int argc; VALUE *argv; /* used in SETUP_ARGS */ int argc; VALUE *argv; /* used in SETUP_ARGS */
int scope; calling_scope_t scope;
TMP_PROTECT; TMP_PROTECT;
BEGIN_CALLARGS; BEGIN_CALLARGS;
if (node->nd_recv == (NODE *)1) { if (node->nd_recv == (NODE *)1) {
recv = self; recv = self;
scope = 1; scope = CALLING_FCALL;
} }
else { else {
recv = rb_eval(self, node->nd_recv); recv = rb_eval(self, node->nd_recv);
scope = 0; scope = CALLING_NORMAL;
} }
SETUP_ARGS(node->nd_args); SETUP_ARGS(node->nd_args);
END_CALLARGS; END_CALLARGS;
@ -3249,7 +3256,7 @@ rb_eval(VALUE self, NODE *n)
ruby_current_node = node; ruby_current_node = node;
SET_CURRENT_SOURCE(); SET_CURRENT_SOURCE();
result = rb_call(CLASS_OF(recv),recv,node->nd_mid,argc,argv,0); result = rb_call(CLASS_OF(recv),recv,node->nd_mid,argc,argv,CALLING_NORMAL);
} }
break; break;
@ -3264,13 +3271,13 @@ rb_eval(VALUE self, NODE *n)
ruby_current_node = node; ruby_current_node = node;
SET_CURRENT_SOURCE(); SET_CURRENT_SOURCE();
result = rb_call(CLASS_OF(self),self,node->nd_mid,argc,argv,1); result = rb_call(CLASS_OF(self),self,node->nd_mid,argc,argv,CALLING_FCALL);
} }
break; break;
case NODE_VCALL: case NODE_VCALL:
SET_CURRENT_SOURCE(); SET_CURRENT_SOURCE();
result = rb_call(CLASS_OF(self),self,node->nd_mid,0,0,2); result = rb_call(CLASS_OF(self),self,node->nd_mid,0,0,CALLING_VCALL);
break; break;
case NODE_SUPER: case NODE_SUPER:
@ -5038,14 +5045,14 @@ assign(VALUE self, NODE *lhs, VALUE val, int pcall)
case NODE_ATTRASGN: case NODE_ATTRASGN:
{ {
VALUE recv; VALUE recv;
int scope; calling_scope_t scope;
if (lhs->nd_recv == (NODE *)1) { if (lhs->nd_recv == (NODE *)1) {
recv = self; recv = self;
scope = 1; scope = CALLING_FCALL;
} }
else { else {
recv = rb_eval(self, lhs->nd_recv); recv = rb_eval(self, lhs->nd_recv);
scope = 0; scope = CALLING_NORMAL;
} }
if (!lhs->nd_args) { if (!lhs->nd_args) {
/* attr set */ /* attr set */
@ -5740,8 +5747,7 @@ rb_call0(VALUE klass, VALUE recv, ID id, ID oid,
static VALUE static VALUE
rb_call(VALUE klass, VALUE recv, ID mid, rb_call(VALUE klass, VALUE recv, ID mid,
int argc /* OK */, const VALUE *argv /* OK */, int scope) int argc /* OK */, const VALUE *argv /* OK */, calling_scope_t scope)
/* scope: 0=normal, 1=functional style, 2=variable style */
{ {
NODE *body; /* OK */ NODE *body; /* OK */
int noex; int noex;
@ -5756,20 +5762,20 @@ rb_call(VALUE klass, VALUE recv, ID mid,
ent = cache + EXPR1(klass, mid); ent = cache + EXPR1(klass, mid);
if (ent->mid == mid && ent->klass == klass) { if (ent->mid == mid && ent->klass == klass) {
if (!ent->method) if (!ent->method)
return method_missing(recv, mid, argc, argv, scope==2?CSTAT_VCALL:0); return method_missing(recv, mid, argc, argv, scope==CALLING_VCALL?CSTAT_VCALL:0);
klass = ent->origin; klass = ent->origin;
id = ent->mid0; id = ent->mid0;
noex = ent->noex; noex = ent->noex;
body = ent->method; body = ent->method;
} }
else if ((body = rb_get_method_body(&klass, &id, &noex)) == 0) { else if ((body = rb_get_method_body(&klass, &id, &noex)) == 0) {
if (scope == 3) { if (scope == CALLING_SUPER) {
return method_missing(recv, mid, argc, argv, CSTAT_SUPER); return method_missing(recv, mid, argc, argv, CSTAT_SUPER);
} }
return method_missing(recv, mid, argc, argv, scope==2?CSTAT_VCALL:0); return method_missing(recv, mid, argc, argv, scope==CALLING_VCALL?CSTAT_VCALL:0);
} }
if (mid != missing && scope == 0) { if (mid != missing && scope == CALLING_NORMAL) {
/* receiver specified form for private method */ /* receiver specified form for private method */
if (noex & NOEX_PRIVATE) if (noex & NOEX_PRIVATE)
return method_missing(recv, mid, argc, argv, CSTAT_PRIV); return method_missing(recv, mid, argc, argv, CSTAT_PRIV);
@ -5785,7 +5791,7 @@ rb_call(VALUE klass, VALUE recv, ID mid,
return method_missing(recv, mid, argc, argv, CSTAT_PROT); return method_missing(recv, mid, argc, argv, CSTAT_PROT);
} }
} }
if (scope > 0) { /* pass receiver info */ if (scope > CALLING_NORMAL) { /* pass receiver info */
noex |= NOEX_RECV; noex |= NOEX_RECV;
} }
return rb_call0(klass, recv, mid, id, argc, argv, body, noex); return rb_call0(klass, recv, mid, id, argc, argv, body, noex);
@ -5800,11 +5806,11 @@ rb_apply(VALUE recv, ID mid, VALUE args)
argc = RARRAY(args)->len; /* Assigns LONG, but argc is INT */ argc = RARRAY(args)->len; /* Assigns LONG, but argc is INT */
argv = ALLOCA_N(VALUE, argc); argv = ALLOCA_N(VALUE, argc);
MEMCPY(argv, RARRAY(args)->ptr, VALUE, argc); MEMCPY(argv, RARRAY(args)->ptr, VALUE, argc);
return rb_call(CLASS_OF(recv), recv, mid, argc, argv, 1); return rb_call(CLASS_OF(recv), recv, mid, argc, argv, CALLING_FCALL);
} }
static VALUE static VALUE
send_funcall(int argc, VALUE *argv, VALUE recv, int scope) send_funcall(int argc, VALUE *argv, VALUE recv, calling_scope_t scope)
{ {
VALUE vid; VALUE vid;
@ -5844,7 +5850,7 @@ send_funcall(int argc, VALUE *argv, VALUE recv, int scope)
static VALUE static VALUE
rb_f_send(int argc, VALUE *argv, VALUE recv) rb_f_send(int argc, VALUE *argv, VALUE recv)
{ {
int scope = (ruby_frame->flags & FRAME_FUNC) ? 1 : 0; calling_scope_t scope = (ruby_frame->flags & FRAME_FUNC) ? CALLING_FCALL : CALLING_NORMAL;
return send_funcall(argc, argv, recv, scope); return send_funcall(argc, argv, recv, scope);
} }
@ -5864,7 +5870,7 @@ rb_f_send(int argc, VALUE *argv, VALUE recv)
static VALUE static VALUE
rb_f_funcall(int argc, VALUE *argv, VALUE recv) rb_f_funcall(int argc, VALUE *argv, VALUE recv)
{ {
return send_funcall(argc, argv, recv, 1); return send_funcall(argc, argv, recv, CALLING_FCALL);
} }
VALUE VALUE
@ -5888,19 +5894,19 @@ rb_funcall(VALUE recv, ID mid, int n, ...)
argv = 0; argv = 0;
} }
return rb_call(CLASS_OF(recv), recv, mid, n, argv, 1); return rb_call(CLASS_OF(recv), recv, mid, n, argv, CALLING_FCALL);
} }
VALUE VALUE
rb_funcall2(VALUE recv, ID mid, int argc, const VALUE *argv) rb_funcall2(VALUE recv, ID mid, int argc, const VALUE *argv)
{ {
return rb_call(CLASS_OF(recv), recv, mid, argc, argv, 1); return rb_call(CLASS_OF(recv), recv, mid, argc, argv, CALLING_FCALL);
} }
VALUE VALUE
rb_funcall3(VALUE recv, ID mid, int argc, const VALUE *argv) rb_funcall3(VALUE recv, ID mid, int argc, const VALUE *argv)
{ {
return rb_call(CLASS_OF(recv), recv, mid, argc, argv, 0); return rb_call(CLASS_OF(recv), recv, mid, argc, argv, CALLING_NORMAL);
} }
VALUE VALUE
@ -5920,7 +5926,7 @@ rb_call_super(int argc, const VALUE *argv)
} }
PUSH_ITER(ruby_iter->iter ? ITER_PRE : ITER_NOT); PUSH_ITER(ruby_iter->iter ? ITER_PRE : ITER_NOT);
result = rb_call(RCLASS(klass)->super, self, ruby_frame->this_func, argc, argv, 3); result = rb_call(RCLASS(klass)->super, self, ruby_frame->this_func, argc, argv, CALLING_SUPER);
POP_ITER(); POP_ITER();
return result; return result;