* parse.y (clhs): allow "Foo::Bar = x".
* parse.y (primary): "self[n]=x" can be legal even when "[]=" is private. changes submitted in [ruby-talk:63982] * parse.y (aryset): ditto. * parse.y (attrset): "self.foo=x" can be legal even when "foo=" is private. * eval.c (is_defined): private "[]=" and "foo=" support. * eval.c (rb_eval): ditto. * eval.c (assign): ditto. * eval.c (rb_eval): "foo=" should not always be public. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@3509 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
afca4f0cfd
commit
d88376b135
24
ChangeLog
24
ChangeLog
@ -1,3 +1,27 @@
|
|||||||
|
Thu Feb 20 10:11:30 2003 Yukihiro Matsumoto <matz@ruby-lang.org>
|
||||||
|
|
||||||
|
* parse.y (clhs): allow "Foo::Bar = x".
|
||||||
|
|
||||||
|
Thu Feb 20 04:07:06 2003 Nobuyoshi Nakada <nobu.nokada@softhome.net>
|
||||||
|
|
||||||
|
* parse.y (primary): "self[n]=x" can be legal even when "[]=" is
|
||||||
|
private. changes submitted in [ruby-talk:63982]
|
||||||
|
|
||||||
|
* parse.y (aryset): ditto.
|
||||||
|
|
||||||
|
* parse.y (attrset): "self.foo=x" can be legal even when "foo="
|
||||||
|
is private.
|
||||||
|
|
||||||
|
* eval.c (is_defined): private "[]=" and "foo=" support.
|
||||||
|
|
||||||
|
* eval.c (rb_eval): ditto.
|
||||||
|
|
||||||
|
* eval.c (assign): ditto.
|
||||||
|
|
||||||
|
Thu Feb 20 03:58:34 2003 Yukihiro Matsumoto <matz@ruby-lang.org>
|
||||||
|
|
||||||
|
* eval.c (rb_eval): "foo=" should not always be public.
|
||||||
|
|
||||||
Thu Feb 20 01:23:59 2003 Nobuyoshi Nakada <nobu.nokada@softhome.net>
|
Thu Feb 20 01:23:59 2003 Nobuyoshi Nakada <nobu.nokada@softhome.net>
|
||||||
|
|
||||||
* eval.c (rb_thread_restore_context): inhibit interrupts in
|
* eval.c (rb_thread_restore_context): inhibit interrupts in
|
||||||
|
54
eval.c
54
eval.c
@ -1923,8 +1923,9 @@ is_defined(self, node, buf)
|
|||||||
val = self;
|
val = self;
|
||||||
goto check_bound;
|
goto check_bound;
|
||||||
|
|
||||||
case NODE_CALL:
|
|
||||||
case NODE_ATTRASGN:
|
case NODE_ATTRASGN:
|
||||||
|
if (node->nd_recv == (NODE *)1) goto check_bound;
|
||||||
|
case NODE_CALL:
|
||||||
PUSH_TAG(PROT_NONE);
|
PUSH_TAG(PROT_NONE);
|
||||||
if ((state = EXEC_TAG()) == 0) {
|
if ((state = EXEC_TAG()) == 0) {
|
||||||
val = rb_eval(self, node->nd_recv);
|
val = rb_eval(self, node->nd_recv);
|
||||||
@ -2776,15 +2777,23 @@ rb_eval(self, n)
|
|||||||
{
|
{
|
||||||
VALUE recv;
|
VALUE recv;
|
||||||
int argc; VALUE *argv; /* used in SETUP_ARGS */
|
int argc; VALUE *argv; /* used in SETUP_ARGS */
|
||||||
|
int scope;
|
||||||
TMP_PROTECT;
|
TMP_PROTECT;
|
||||||
|
|
||||||
BEGIN_CALLARGS;
|
BEGIN_CALLARGS;
|
||||||
recv = rb_eval(self, node->nd_recv);
|
if (node->nd_recv == (NODE *)1) {
|
||||||
|
recv = self;
|
||||||
|
scope = 1;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
recv = rb_eval(self, node->nd_recv);
|
||||||
|
scope = 0;
|
||||||
|
}
|
||||||
SETUP_ARGS(node->nd_args);
|
SETUP_ARGS(node->nd_args);
|
||||||
END_CALLARGS;
|
END_CALLARGS;
|
||||||
|
|
||||||
SET_CURRENT_SOURCE();
|
SET_CURRENT_SOURCE();
|
||||||
rb_call(CLASS_OF(recv),recv,node->nd_mid,argc,argv,0);
|
rb_call(CLASS_OF(recv),recv,node->nd_mid,argc,argv,scope);
|
||||||
result = argv[argc-1];
|
result = argv[argc-1];
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@ -3000,11 +3009,16 @@ rb_eval(self, n)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case NODE_CDECL:
|
case NODE_CDECL:
|
||||||
if (NIL_P(ruby_cbase)) {
|
|
||||||
rb_raise(rb_eTypeError, "no class/module to define constant");
|
|
||||||
}
|
|
||||||
result = rb_eval(self, node->nd_value);
|
result = rb_eval(self, node->nd_value);
|
||||||
rb_const_set(ruby_cbase, node->nd_vid, result);
|
if (node->nd_vid == 0) {
|
||||||
|
rb_const_set(class_prefix(self, node->nd_else), node->nd_else->nd_mid, result);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (NIL_P(ruby_cbase)) {
|
||||||
|
rb_raise(rb_eTypeError, "no class/module to define constant");
|
||||||
|
}
|
||||||
|
rb_const_set(ruby_cbase, node->nd_vid, result);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case NODE_CVDECL:
|
case NODE_CVDECL:
|
||||||
@ -3239,10 +3253,7 @@ rb_eval(self, n)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (node->nd_noex == NOEX_PUBLIC) {
|
if (SCOPE_TEST(SCOPE_PRIVATE) || node->nd_mid == init) {
|
||||||
noex = NOEX_PUBLIC; /* means is is an attrset */
|
|
||||||
}
|
|
||||||
else if (SCOPE_TEST(SCOPE_PRIVATE) || node->nd_mid == init) {
|
|
||||||
noex = NOEX_PRIVATE;
|
noex = NOEX_PRIVATE;
|
||||||
}
|
}
|
||||||
else if (SCOPE_TEST(SCOPE_PROTECTED)) {
|
else if (SCOPE_TEST(SCOPE_PROTECTED)) {
|
||||||
@ -4106,7 +4117,12 @@ assign(self, lhs, val, pcall)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case NODE_CDECL:
|
case NODE_CDECL:
|
||||||
rb_const_set(ruby_cbase, lhs->nd_vid, val);
|
if (lhs->nd_vid == 0) {
|
||||||
|
rb_const_set(class_prefix(self, lhs->nd_else), lhs->nd_else->nd_mid, val);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
rb_const_set(ruby_cbase, lhs->nd_vid, val);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case NODE_CVDECL:
|
case NODE_CVDECL:
|
||||||
@ -4128,12 +4144,20 @@ assign(self, lhs, val, pcall)
|
|||||||
case NODE_ATTRASGN:
|
case NODE_ATTRASGN:
|
||||||
{
|
{
|
||||||
VALUE recv;
|
VALUE recv;
|
||||||
recv = rb_eval(self, lhs->nd_recv);
|
int scope;
|
||||||
|
if (lhs->nd_recv == (NODE *)1) {
|
||||||
|
recv = self;
|
||||||
|
scope = 1;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
recv = rb_eval(self, lhs->nd_recv);
|
||||||
|
scope = 0;
|
||||||
|
}
|
||||||
if (!lhs->nd_args) {
|
if (!lhs->nd_args) {
|
||||||
/* attr set */
|
/* attr set */
|
||||||
ruby_current_node = lhs;
|
ruby_current_node = lhs;
|
||||||
SET_CURRENT_SOURCE();
|
SET_CURRENT_SOURCE();
|
||||||
rb_call(CLASS_OF(recv), recv, lhs->nd_mid, 1, &val, 0);
|
rb_call(CLASS_OF(recv), recv, lhs->nd_mid, 1, &val, scope);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
/* array set */
|
/* array set */
|
||||||
@ -4144,7 +4168,7 @@ assign(self, lhs, val, pcall)
|
|||||||
ruby_current_node = lhs;
|
ruby_current_node = lhs;
|
||||||
SET_CURRENT_SOURCE();
|
SET_CURRENT_SOURCE();
|
||||||
rb_call(CLASS_OF(recv), recv, lhs->nd_mid,
|
rb_call(CLASS_OF(recv), recv, lhs->nd_mid,
|
||||||
RARRAY(args)->len, RARRAY(args)->ptr, 0);
|
RARRAY(args)->len, RARRAY(args)->ptr, scope);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
2
gc.c
2
gc.c
@ -695,7 +695,6 @@ rb_gc_mark_children(ptr)
|
|||||||
case NODE_DASGN:
|
case NODE_DASGN:
|
||||||
case NODE_DASGN_CURR:
|
case NODE_DASGN_CURR:
|
||||||
case NODE_IASGN:
|
case NODE_IASGN:
|
||||||
case NODE_CDECL:
|
|
||||||
case NODE_CVDECL:
|
case NODE_CVDECL:
|
||||||
case NODE_CVASGN:
|
case NODE_CVASGN:
|
||||||
case NODE_COLON3:
|
case NODE_COLON3:
|
||||||
@ -721,6 +720,7 @@ rb_gc_mark_children(ptr)
|
|||||||
|
|
||||||
case NODE_SCOPE: /* 2,3 */
|
case NODE_SCOPE: /* 2,3 */
|
||||||
case NODE_BLOCK_PASS:
|
case NODE_BLOCK_PASS:
|
||||||
|
case NODE_CDECL:
|
||||||
rb_gc_mark((VALUE)obj->as.node.u3.node);
|
rb_gc_mark((VALUE)obj->as.node.u3.node);
|
||||||
rb_gc_mark((VALUE)obj->as.node.u2.node);
|
rb_gc_mark((VALUE)obj->as.node.u2.node);
|
||||||
break;
|
break;
|
||||||
|
2
node.h
2
node.h
@ -273,7 +273,7 @@ typedef struct RNode {
|
|||||||
#define NEW_DASGN(v,val) rb_node_newnode(NODE_DASGN,v,val,0)
|
#define NEW_DASGN(v,val) rb_node_newnode(NODE_DASGN,v,val,0)
|
||||||
#define NEW_DASGN_CURR(v,val) rb_node_newnode(NODE_DASGN_CURR,v,val,0)
|
#define NEW_DASGN_CURR(v,val) rb_node_newnode(NODE_DASGN_CURR,v,val,0)
|
||||||
#define NEW_IASGN(v,val) rb_node_newnode(NODE_IASGN,v,val,0)
|
#define NEW_IASGN(v,val) rb_node_newnode(NODE_IASGN,v,val,0)
|
||||||
#define NEW_CDECL(v,val) rb_node_newnode(NODE_CDECL,v,val,0)
|
#define NEW_CDECL(v,val,path) rb_node_newnode(NODE_CDECL,v,val,path)
|
||||||
#define NEW_CVASGN(v,val) rb_node_newnode(NODE_CVASGN,v,val,0)
|
#define NEW_CVASGN(v,val) rb_node_newnode(NODE_CVASGN,v,val,0)
|
||||||
#define NEW_CVDECL(v,val) rb_node_newnode(NODE_CVDECL,v,val,0)
|
#define NEW_CVDECL(v,val) rb_node_newnode(NODE_CVDECL,v,val,0)
|
||||||
#define NEW_OP_ASGN1(p,id,a) rb_node_newnode(NODE_OP_ASGN1,p,id,a)
|
#define NEW_OP_ASGN1(p,id,a) rb_node_newnode(NODE_OP_ASGN1,p,id,a)
|
||||||
|
60
parse.y
60
parse.y
@ -240,7 +240,7 @@ static void top_local_setup();
|
|||||||
%type <node> singleton strings string string1 xstring regexp
|
%type <node> singleton strings string string1 xstring regexp
|
||||||
%type <node> string_contents xstring_contents string_content
|
%type <node> string_contents xstring_contents string_content
|
||||||
%type <node> words qwords word_list qword_list word
|
%type <node> words qwords word_list qword_list word
|
||||||
%type <node> literal numeric dsym cbase cpath
|
%type <node> literal numeric dsym cpath clhs
|
||||||
%type <node> bodystmt compstmt stmts stmt expr arg primary command command_call method_call
|
%type <node> bodystmt compstmt stmts stmt expr arg primary command command_call method_call
|
||||||
%type <node> expr_value arg_value primary_value
|
%type <node> expr_value arg_value primary_value
|
||||||
%type <node> if_tail opt_else case_body cases opt_rescue exc_list exc_var opt_ensure
|
%type <node> if_tail opt_else case_body cases opt_rescue exc_list exc_var opt_ensure
|
||||||
@ -483,6 +483,10 @@ stmt : kALIAS fitem {lex_state = EXPR_FNAME;} fitem
|
|||||||
$1->nd_value = NEW_RESTARY($3);
|
$1->nd_value = NEW_RESTARY($3);
|
||||||
$$ = $1;
|
$$ = $1;
|
||||||
}
|
}
|
||||||
|
| clhs '=' command_call
|
||||||
|
{
|
||||||
|
$$ = node_assign($1, $3);
|
||||||
|
}
|
||||||
| var_lhs tOP_ASGN command_call
|
| var_lhs tOP_ASGN command_call
|
||||||
{
|
{
|
||||||
value_expr($3);
|
value_expr($3);
|
||||||
@ -570,6 +574,10 @@ stmt : kALIAS fitem {lex_state = EXPR_FNAME;} fitem
|
|||||||
{
|
{
|
||||||
$$ = node_assign($1, NEW_SVALUE($3));
|
$$ = node_assign($1, NEW_SVALUE($3));
|
||||||
}
|
}
|
||||||
|
| clhs '=' mrhs
|
||||||
|
{
|
||||||
|
$$ = node_assign($1, NEW_SVALUE($3));
|
||||||
|
}
|
||||||
| mlhs '=' arg_value
|
| mlhs '=' arg_value
|
||||||
{
|
{
|
||||||
$1->nd_value = $3;
|
$1->nd_value = $3;
|
||||||
@ -580,6 +588,10 @@ stmt : kALIAS fitem {lex_state = EXPR_FNAME;} fitem
|
|||||||
$1->nd_value = $3;
|
$1->nd_value = $3;
|
||||||
$$ = $1;
|
$$ = $1;
|
||||||
}
|
}
|
||||||
|
| clhs '=' arg
|
||||||
|
{
|
||||||
|
$$ = node_assign($1, $3);
|
||||||
|
}
|
||||||
| expr
|
| expr
|
||||||
;
|
;
|
||||||
|
|
||||||
@ -830,6 +842,14 @@ lhs : variable
|
|||||||
}
|
}
|
||||||
;
|
;
|
||||||
|
|
||||||
|
clhs : primary_value tCOLON2 tCONSTANT
|
||||||
|
{
|
||||||
|
if (in_def || in_single)
|
||||||
|
yyerror("dynamic constant assignment");
|
||||||
|
$$ = NEW_CDECL(0, 0, NEW_COLON2($1, $3));
|
||||||
|
}
|
||||||
|
;
|
||||||
|
|
||||||
cname : tIDENTIFIER
|
cname : tIDENTIFIER
|
||||||
{
|
{
|
||||||
yyerror("class/module name must be CONSTANT");
|
yyerror("class/module name must be CONSTANT");
|
||||||
@ -837,27 +857,20 @@ cname : tIDENTIFIER
|
|||||||
| tCONSTANT
|
| tCONSTANT
|
||||||
;
|
;
|
||||||
|
|
||||||
cbase : tCOLON3 cname
|
cpath : tCOLON3 cname
|
||||||
{
|
{
|
||||||
$$ = NEW_COLON3($2);
|
$$ = NEW_COLON3($2);
|
||||||
}
|
}
|
||||||
| cname
|
| cname
|
||||||
{
|
{
|
||||||
$$ = NEW_CONST($1);
|
$$ = NEW_COLON2(0, $$);
|
||||||
}
|
}
|
||||||
| cbase tCOLON2 cname
|
| primary_value tCOLON2 cname
|
||||||
{
|
{
|
||||||
$$ = NEW_COLON2($1, $3);
|
$$ = NEW_COLON2($1, $3);
|
||||||
}
|
}
|
||||||
;
|
;
|
||||||
|
|
||||||
cpath : cbase
|
|
||||||
{
|
|
||||||
if (nd_type($$ = $1) == NODE_CONST)
|
|
||||||
$$ = NEW_COLON2(0, $$->nd_vid);
|
|
||||||
}
|
|
||||||
;
|
|
||||||
|
|
||||||
fname : tIDENTIFIER
|
fname : tIDENTIFIER
|
||||||
| tCONSTANT
|
| tCONSTANT
|
||||||
| tFID
|
| tFID
|
||||||
@ -1423,7 +1436,10 @@ primary : literal
|
|||||||
}
|
}
|
||||||
| primary_value '[' aref_args ']'
|
| primary_value '[' aref_args ']'
|
||||||
{
|
{
|
||||||
$$ = NEW_CALL($1, tAREF, $3);
|
if (nd_type($1) == NODE_SELF)
|
||||||
|
$$ = NEW_FCALL(tAREF, $3);
|
||||||
|
else
|
||||||
|
$$ = NEW_CALL($1, tAREF, $3);
|
||||||
}
|
}
|
||||||
| tLBRACK aref_args ']'
|
| tLBRACK aref_args ']'
|
||||||
{
|
{
|
||||||
@ -1612,7 +1628,6 @@ primary : literal
|
|||||||
kEND
|
kEND
|
||||||
{
|
{
|
||||||
$$ = NEW_DEFN($2, $4, $5, NOEX_PRIVATE);
|
$$ = NEW_DEFN($2, $4, $5, NOEX_PRIVATE);
|
||||||
if (is_attrset_id($2)) $$->nd_noex = NOEX_PUBLIC;
|
|
||||||
fixpos($$, $4);
|
fixpos($$, $4);
|
||||||
local_pop();
|
local_pop();
|
||||||
in_def--;
|
in_def--;
|
||||||
@ -4648,9 +4663,12 @@ call_op(recv, id, narg, arg1)
|
|||||||
value_expr(recv);
|
value_expr(recv);
|
||||||
if (narg == 1) {
|
if (narg == 1) {
|
||||||
value_expr(arg1);
|
value_expr(arg1);
|
||||||
|
arg1 = NEW_LIST(arg1);
|
||||||
}
|
}
|
||||||
|
else {
|
||||||
return NEW_CALL(recv, id, narg==1?NEW_LIST(arg1):0);
|
arg1 = 0;
|
||||||
|
}
|
||||||
|
return NEW_CALL(recv, id, arg1);
|
||||||
}
|
}
|
||||||
|
|
||||||
static NODE*
|
static NODE*
|
||||||
@ -4788,7 +4806,7 @@ assignable(id, val)
|
|||||||
else if (is_const_id(id)) {
|
else if (is_const_id(id)) {
|
||||||
if (in_def || in_single)
|
if (in_def || in_single)
|
||||||
yyerror("dynamic constant assignment");
|
yyerror("dynamic constant assignment");
|
||||||
return NEW_CDECL(id, val);
|
return NEW_CDECL(id, val, 0);
|
||||||
}
|
}
|
||||||
else if (is_class_id(id)) {
|
else if (is_class_id(id)) {
|
||||||
if (in_def || in_single) return NEW_CVASGN(id, val);
|
if (in_def || in_single) return NEW_CVASGN(id, val);
|
||||||
@ -4804,7 +4822,10 @@ static NODE *
|
|||||||
aryset(recv, idx)
|
aryset(recv, idx)
|
||||||
NODE *recv, *idx;
|
NODE *recv, *idx;
|
||||||
{
|
{
|
||||||
value_expr(recv);
|
if (recv && nd_type(recv) == NODE_SELF)
|
||||||
|
recv = (NODE *)1;
|
||||||
|
else
|
||||||
|
value_expr(recv);
|
||||||
return NEW_ATTRASGN(recv, tASET, idx);
|
return NEW_ATTRASGN(recv, tASET, idx);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -4822,7 +4843,10 @@ attrset(recv, id)
|
|||||||
NODE *recv;
|
NODE *recv;
|
||||||
ID id;
|
ID id;
|
||||||
{
|
{
|
||||||
value_expr(recv);
|
if (recv && nd_type(recv) == NODE_SELF)
|
||||||
|
recv = (NODE *)1;
|
||||||
|
else
|
||||||
|
value_expr(recv);
|
||||||
return NEW_ATTRASGN(recv, rb_id_attrset(id), 0);
|
return NEW_ATTRASGN(recv, rb_id_attrset(id), 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user