зеркало из https://github.com/github/ruby.git
* 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:
Родитель
fc0434bc1d
Коммит
00f96715f3
|
@ -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
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;
|
||||||
|
|
Загрузка…
Ссылка в новой задаче