* gc.c (Init_stack): avoid __builtin_frame_address(2) to retrieve
stack bottom line. * st.c (numhash): should shuffle bits by dividing by prime number. * eval.c (rb_eval): multiple assignment behavior fixed, which results "*a = nil" makes "a == []" now. * eval.c (rb_f_require): should set SCOPE_PUBLIC before calling dln_load(). git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@1516 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
1b6b6ef2d6
commit
46e8ae1104
19
ChangeLog
19
ChangeLog
@ -1,3 +1,22 @@
|
|||||||
|
Fri Jun 8 22:37:40 2001 Yukihiro Matsumoto <matz@ruby-lang.org>
|
||||||
|
|
||||||
|
* gc.c (Init_stack): avoid __builtin_frame_address(2) to retrieve
|
||||||
|
stack bottom line.
|
||||||
|
|
||||||
|
Fri Jun 8 18:14:12 2001 Yukihiro Matsumoto <matz@ruby-lang.org>
|
||||||
|
|
||||||
|
* st.c (numhash): should shuffle bits by dividing by prime number.
|
||||||
|
|
||||||
|
Fri Jun 8 17:05:21 2001 Yukihiro Matsumoto <matz@ruby-lang.org>
|
||||||
|
|
||||||
|
* eval.c (rb_eval): multiple assignment behavior fixed, which
|
||||||
|
results "*a = nil" makes "a == []" now.
|
||||||
|
|
||||||
|
Fri Jun 8 15:25:09 2001 Yukihiro Matsumoto <matz@ruby-lang.org>
|
||||||
|
|
||||||
|
* eval.c (rb_f_require): should set SCOPE_PUBLIC before calling
|
||||||
|
dln_load().
|
||||||
|
|
||||||
Thu Jun 7 17:28:00 2001 Yukihiro Matsumoto <matz@ruby-lang.org>
|
Thu Jun 7 17:28:00 2001 Yukihiro Matsumoto <matz@ruby-lang.org>
|
||||||
|
|
||||||
* parse.y (yylex): exclude kDO_BLOCK too much by false condition.
|
* parse.y (yylex): exclude kDO_BLOCK too much by false condition.
|
||||||
|
29
eval.c
29
eval.c
@ -2344,6 +2344,7 @@ rb_eval(self, n)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case NODE_RESTARGS:
|
case NODE_RESTARGS:
|
||||||
|
case NODE_RESTARY:
|
||||||
result = rb_eval(self, node->nd_head);
|
result = rb_eval(self, node->nd_head);
|
||||||
if (TYPE(result) != T_ARRAY) {
|
if (TYPE(result) != T_ARRAY) {
|
||||||
result = rb_Array(result);
|
result = rb_Array(result);
|
||||||
@ -2355,7 +2356,10 @@ rb_eval(self, n)
|
|||||||
if (TYPE(result) != T_ARRAY) {
|
if (TYPE(result) != T_ARRAY) {
|
||||||
result = rb_Array(result);
|
result = rb_Array(result);
|
||||||
}
|
}
|
||||||
if (RARRAY(result)->len == 1) {
|
if (RARRAY(result)->len == 0) {
|
||||||
|
result = Qnil;
|
||||||
|
}
|
||||||
|
else if (RARRAY(result)->len == 1) {
|
||||||
result = RARRAY(result)->ptr[0];
|
result = RARRAY(result)->ptr[0];
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@ -3724,7 +3728,7 @@ massign(self, node, val, check)
|
|||||||
NODE *list;
|
NODE *list;
|
||||||
int i = 0, len;
|
int i = 0, len;
|
||||||
|
|
||||||
if (val == Qundef) {
|
if (val == Qundef || val == Qnil) {
|
||||||
val = rb_ary_new2(0);
|
val = rb_ary_new2(0);
|
||||||
}
|
}
|
||||||
else if (TYPE(val) != T_ARRAY) {
|
else if (TYPE(val) != T_ARRAY) {
|
||||||
@ -5425,17 +5429,22 @@ rb_f_require(obj, fname)
|
|||||||
|
|
||||||
load_dyna:
|
load_dyna:
|
||||||
rb_provide(feature);
|
rb_provide(feature);
|
||||||
|
{
|
||||||
|
int volatile old_vmode = scope_vmode;
|
||||||
|
|
||||||
PUSH_TAG(PROT_NONE);
|
PUSH_TAG(PROT_NONE);
|
||||||
if ((state = EXEC_TAG()) == 0) {
|
if ((state = EXEC_TAG()) == 0) {
|
||||||
void *handle;
|
void *handle;
|
||||||
|
|
||||||
load = rb_str_new2(file);
|
SCOPE_SET(SCOPE_PUBLIC);
|
||||||
file = RSTRING(load)->ptr;
|
load = rb_str_new2(file);
|
||||||
handle = dln_load(file);
|
file = RSTRING(load)->ptr;
|
||||||
rb_ary_push(ruby_dln_librefs, INT2NUM((long)handle));
|
handle = dln_load(file);
|
||||||
|
rb_ary_push(ruby_dln_librefs, INT2NUM((long)handle));
|
||||||
|
}
|
||||||
|
POP_TAG();
|
||||||
|
SCOPE_SET(old_vmode);
|
||||||
}
|
}
|
||||||
POP_TAG();
|
|
||||||
if (state) JUMP_TAG(state);
|
if (state) JUMP_TAG(state);
|
||||||
|
|
||||||
return Qtrue;
|
return Qtrue;
|
||||||
|
2
gc.c
2
gc.c
@ -1019,8 +1019,6 @@ Init_stack(addr)
|
|||||||
#if defined(__human68k__)
|
#if defined(__human68k__)
|
||||||
extern void *_SEND;
|
extern void *_SEND;
|
||||||
rb_gc_stack_start = _SEND;
|
rb_gc_stack_start = _SEND;
|
||||||
#elif defined(__GNUC__) && defined(USE_BUILTIN_FRAME_ADDRESS)
|
|
||||||
rb_gc_stack_start = __builtin_frame_address(2);
|
|
||||||
#else
|
#else
|
||||||
VALUE start;
|
VALUE start;
|
||||||
|
|
||||||
|
7
hash.c
7
hash.c
@ -94,8 +94,11 @@ rb_any_hash(a)
|
|||||||
default:
|
default:
|
||||||
DEFER_INTS;
|
DEFER_INTS;
|
||||||
hval = rb_funcall(a, hash, 0);
|
hval = rb_funcall(a, hash, 0);
|
||||||
if (!FIXNUM_P(hval)) {
|
if (FIXNUM_P(hval)) {
|
||||||
hval = rb_funcall(hval, '%', 1, INT2FIX(65439));
|
hval %= 536870917;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
hval = rb_funcall(hval, '%', 1, INT2FIX(536870917));
|
||||||
}
|
}
|
||||||
ENABLE_INTS;
|
ENABLE_INTS;
|
||||||
return (int)FIX2LONG(hval);
|
return (int)FIX2LONG(hval);
|
||||||
|
2
node.h
2
node.h
@ -89,6 +89,7 @@ enum node_type {
|
|||||||
NODE_ARGSCAT,
|
NODE_ARGSCAT,
|
||||||
NODE_ARGSPUSH,
|
NODE_ARGSPUSH,
|
||||||
NODE_RESTARGS,
|
NODE_RESTARGS,
|
||||||
|
NODE_RESTARY,
|
||||||
NODE_REXPAND,
|
NODE_REXPAND,
|
||||||
NODE_BLOCK_ARG,
|
NODE_BLOCK_ARG,
|
||||||
NODE_BLOCK_PASS,
|
NODE_BLOCK_PASS,
|
||||||
@ -305,6 +306,7 @@ typedef struct RNode {
|
|||||||
#define NEW_ARGSCAT(a,b) rb_node_newnode(NODE_ARGSCAT,a,b,0)
|
#define NEW_ARGSCAT(a,b) rb_node_newnode(NODE_ARGSCAT,a,b,0)
|
||||||
#define NEW_ARGSPUSH(a,b) rb_node_newnode(NODE_ARGSPUSH,a,b,0)
|
#define NEW_ARGSPUSH(a,b) rb_node_newnode(NODE_ARGSPUSH,a,b,0)
|
||||||
#define NEW_RESTARGS(a) rb_node_newnode(NODE_RESTARGS,a,0,0)
|
#define NEW_RESTARGS(a) rb_node_newnode(NODE_RESTARGS,a,0,0)
|
||||||
|
#define NEW_RESTARY(a) rb_node_newnode(NODE_RESTARY,a,0,0)
|
||||||
#define NEW_REXPAND(a) rb_node_newnode(NODE_REXPAND,a,0,0)
|
#define NEW_REXPAND(a) rb_node_newnode(NODE_REXPAND,a,0,0)
|
||||||
#define NEW_BLOCK_ARG(v) rb_node_newnode(NODE_BLOCK_ARG,v,0,local_cnt(v))
|
#define NEW_BLOCK_ARG(v) rb_node_newnode(NODE_BLOCK_ARG,v,0,local_cnt(v))
|
||||||
#define NEW_BLOCK_PASS(b) rb_node_newnode(NODE_BLOCK_PASS,0,b,0)
|
#define NEW_BLOCK_PASS(b) rb_node_newnode(NODE_BLOCK_PASS,0,b,0)
|
||||||
|
7
parse.y
7
parse.y
@ -426,9 +426,6 @@ stmt : kALIAS fitem {lex_state = EXPR_FNAME;} fitem
|
|||||||
}
|
}
|
||||||
| lhs '=' mrhs_basic
|
| lhs '=' mrhs_basic
|
||||||
{
|
{
|
||||||
if (nd_type($3) == NODE_RESTARGS) {
|
|
||||||
nd_set_type($3, NODE_REXPAND);
|
|
||||||
}
|
|
||||||
$$ = node_assign($1, $3);
|
$$ = node_assign($1, $3);
|
||||||
}
|
}
|
||||||
| mlhs '=' mrhs
|
| mlhs '=' mrhs
|
||||||
@ -954,7 +951,7 @@ aref_args : none
|
|||||||
| tSTAR arg opt_nl
|
| tSTAR arg opt_nl
|
||||||
{
|
{
|
||||||
value_expr($2);
|
value_expr($2);
|
||||||
$$ = NEW_RESTARGS($2);
|
$$ = NEW_RESTARY($2);
|
||||||
}
|
}
|
||||||
|
|
||||||
paren_args : '(' none ')'
|
paren_args : '(' none ')'
|
||||||
@ -1150,7 +1147,7 @@ mrhs_basic : args ',' arg
|
|||||||
| tSTAR arg
|
| tSTAR arg
|
||||||
{
|
{
|
||||||
value_expr($2);
|
value_expr($2);
|
||||||
$$ = NEW_RESTARGS($2);
|
$$ = NEW_REXPAND($2);
|
||||||
}
|
}
|
||||||
|
|
||||||
primary : literal
|
primary : literal
|
||||||
|
122
sample/test.rb
122
sample/test.rb
@ -42,6 +42,126 @@ cc = 5
|
|||||||
cc &&=44
|
cc &&=44
|
||||||
test_ok(cc == 44)
|
test_ok(cc == 44)
|
||||||
|
|
||||||
|
a = nil; test_ok(a == nil)
|
||||||
|
a = 1; test_ok(a == 1)
|
||||||
|
a = []; test_ok(a == [])
|
||||||
|
a = [1]; test_ok(a == [1])
|
||||||
|
a = [nil]; test_ok(a == [nil])
|
||||||
|
a = [[]]; test_ok(a == [[]])
|
||||||
|
a = [*[]]; test_ok(a == [])
|
||||||
|
a = [*[1]]; test_ok(a == [1])
|
||||||
|
a = [*[1,2]]; test_ok(a == [1,2])
|
||||||
|
|
||||||
|
a = *nil; test_ok(a == nil)
|
||||||
|
a = *1; test_ok(a == 1)
|
||||||
|
a = *[]; test_ok(a == nil)
|
||||||
|
a = *[1]; test_ok(a == 1)
|
||||||
|
a = *[nil]; test_ok(a == nil)
|
||||||
|
a = *[[]]; test_ok(a == [])
|
||||||
|
a = *[*[]]; test_ok(a == nil)
|
||||||
|
a = *[*[1]]; test_ok(a == 1)
|
||||||
|
a = *[*[1,2]]; test_ok(a == [1,2])
|
||||||
|
|
||||||
|
*a = nil; test_ok(a == [])
|
||||||
|
*a = 1; test_ok(a == [1])
|
||||||
|
*a = []; test_ok(a == [])
|
||||||
|
*a = [1]; test_ok(a == [1])
|
||||||
|
*a = [nil]; test_ok(a == [nil])
|
||||||
|
*a = [[]]; test_ok(a == [[]])
|
||||||
|
*a = [*[]]; test_ok(a == [])
|
||||||
|
*a = [*[1]]; test_ok(a == [1])
|
||||||
|
*a = [*[1,2]]; test_ok(a == [1,2])
|
||||||
|
|
||||||
|
*a = *nil; test_ok(a == [])
|
||||||
|
*a = *1; test_ok(a == [1])
|
||||||
|
*a = *[]; test_ok(a == [])
|
||||||
|
*a = *[1]; test_ok(a == [1])
|
||||||
|
*a = *[nil]; test_ok(a == [])
|
||||||
|
*a = *[[]]; test_ok(a == [])
|
||||||
|
*a = *[*[]]; test_ok(a == [])
|
||||||
|
*a = *[*[1]]; test_ok(a == [1])
|
||||||
|
*a = *[*[1,2]]; test_ok(a == [1,2])
|
||||||
|
|
||||||
|
a,b,*c = nil; test_ok([a,b,c] == [nil, nil, []])
|
||||||
|
a,b,*c = 1; test_ok([a,b,c] == [1, nil, []])
|
||||||
|
a,b,*c = []; test_ok([a,b,c] == [nil, nil, []])
|
||||||
|
a,b,*c = [1]; test_ok([a,b,c] == [1, nil, []])
|
||||||
|
a,b,*c = [nil]; test_ok([a,b,c] == [nil, nil, []])
|
||||||
|
a,b,*c = [[]]; test_ok([a,b,c] == [[], nil, []])
|
||||||
|
a,b,*c = [*[]]; test_ok([a,b,c] == [nil, nil, []])
|
||||||
|
a,b,*c = [*[1]]; test_ok([a,b,c] == [1, nil, []])
|
||||||
|
a,b,*c = [*[1,2]]; test_ok([a,b,c] == [1, 2, []])
|
||||||
|
|
||||||
|
a,b,*c = *nil; test_ok([a,b,c] == [nil, nil, []])
|
||||||
|
a,b,*c = *1; test_ok([a,b,c] == [1, nil, []])
|
||||||
|
a,b,*c = *[]; test_ok([a,b,c] == [nil, nil, []])
|
||||||
|
a,b,*c = *[1]; test_ok([a,b,c] == [1, nil, []])
|
||||||
|
a,b,*c = *[nil]; test_ok([a,b,c] == [nil, nil, []])
|
||||||
|
a,b,*c = *[[]]; test_ok([a,b,c] == [nil, nil, []])
|
||||||
|
a,b,*c = *[*[]]; test_ok([a,b,c] == [nil, nil, []])
|
||||||
|
a,b,*c = *[*[1]]; test_ok([a,b,c] == [1, nil, []])
|
||||||
|
a,b,*c = *[*[1,2]]; test_ok([a,b,c] == [1, 2, []])
|
||||||
|
|
||||||
|
def f; yield nil; end; f {|a| test_ok(a == nil)}
|
||||||
|
def f; yield 1; end; f {|a| test_ok(a == 1)}
|
||||||
|
def f; yield []; end; f {|a| test_ok(a == [])}
|
||||||
|
def f; yield [1]; end; f {|a| test_ok(a == [1])}
|
||||||
|
def f; yield [nil]; end; f {|a| test_ok(a == [nil])}
|
||||||
|
def f; yield [[]]; end; f {|a| test_ok(a == [[]])}
|
||||||
|
def f; yield [*[]]; end; f {|a| test_ok(a == [])}
|
||||||
|
def f; yield [*[1]]; end; f {|a| test_ok(a == [1])}
|
||||||
|
def f; yield [*[1,2]]; end; f {|a| test_ok(a == [1,2])}
|
||||||
|
|
||||||
|
def f; yield *nil; end; f {|a| test_ok(a == nil)}
|
||||||
|
def f; yield *1; end; f {|a| test_ok(a == 1)}
|
||||||
|
def f; yield *[]; end; f {|a| test_ok(a == nil)}
|
||||||
|
def f; yield *[1]; end; f {|a| test_ok(a == 1)}
|
||||||
|
def f; yield *[nil]; end; f {|a| test_ok(a == nil)}
|
||||||
|
def f; yield *[[]]; end; f {|a| test_ok(a == [])}
|
||||||
|
def f; yield *[*[]]; end; f {|a| test_ok(a == nil)}
|
||||||
|
def f; yield *[*[1]]; end; f {|a| test_ok(a == 1)}
|
||||||
|
def f; yield *[*[1,2]]; end; f {|a| test_ok(a == [1,2])}
|
||||||
|
|
||||||
|
def f; yield nil; end; f {|*a| test_ok(a == [])}
|
||||||
|
def f; yield 1; end; f {|*a| test_ok(a == [1])}
|
||||||
|
def f; yield []; end; f {|*a| test_ok(a == [])}
|
||||||
|
def f; yield [1]; end; f {|*a| test_ok(a == [1])}
|
||||||
|
def f; yield [nil]; end; f {|*a| test_ok(a == [nil])}
|
||||||
|
def f; yield [[]]; end; f {|*a| test_ok(a == [[]])}
|
||||||
|
def f; yield [*[]]; end; f {|*a| test_ok(a == [])}
|
||||||
|
def f; yield [*[1]]; end; f {|*a| test_ok(a == [1])}
|
||||||
|
def f; yield [*[1,2]]; end; f {|*a| test_ok(a == [1,2])}
|
||||||
|
|
||||||
|
def f; yield *nil; end; f {|*a| test_ok(a == [])}
|
||||||
|
def f; yield *1; end; f {|*a| test_ok(a == [1])}
|
||||||
|
def f; yield *[]; end; f {|*a| test_ok(a == [])}
|
||||||
|
def f; yield *[1]; end; f {|*a| test_ok(a == [1])}
|
||||||
|
def f; yield *[nil]; end; f {|*a| test_ok(a == [])}
|
||||||
|
def f; yield *[[]]; end; f {|*a| test_ok(a == [])}
|
||||||
|
def f; yield *[*[]]; end; f {|*a| test_ok(a == [])}
|
||||||
|
def f; yield *[*[1]]; end; f {|*a| test_ok(a == [1])}
|
||||||
|
def f; yield *[*[1,2]]; end; f {|*a| test_ok(a == [1,2])}
|
||||||
|
|
||||||
|
def f; yield nil; end; f {|a,b,*c| test_ok([a,b,c] == [nil, nil, []])}
|
||||||
|
def f; yield 1; end; f {|a,b,*c| test_ok([a,b,c] == [1, nil, []])}
|
||||||
|
def f; yield []; end; f {|a,b,*c| test_ok([a,b,c] == [nil, nil, []])}
|
||||||
|
def f; yield [1]; end; f {|a,b,*c| test_ok([a,b,c] == [1, nil, []])}
|
||||||
|
def f; yield [nil]; end; f {|a,b,*c| test_ok([a,b,c] == [nil, nil, []])}
|
||||||
|
def f; yield [[]]; end; f {|a,b,*c| test_ok([a,b,c] == [[], nil, []])}
|
||||||
|
def f; yield [*[]]; end; f {|a,b,*c| test_ok([a,b,c] == [nil, nil, []])}
|
||||||
|
def f; yield [*[1]]; end; f {|a,b,*c| test_ok([a,b,c] == [1, nil, []])}
|
||||||
|
def f; yield [*[1,2]]; end; f {|a,b,*c| test_ok([a,b,c] == [1, 2, []])}
|
||||||
|
|
||||||
|
def f; yield *nil; end; f {|a,b,*c| test_ok([a,b,c] == [nil, nil, []])}
|
||||||
|
def f; yield *1; end; f {|a,b,*c| test_ok([a,b,c] == [1, nil, []])}
|
||||||
|
def f; yield *[]; end; f {|a,b,*c| test_ok([a,b,c] == [nil, nil, []])}
|
||||||
|
def f; yield *[1]; end; f {|a,b,*c| test_ok([a,b,c] == [1, nil, []])}
|
||||||
|
def f; yield *[nil]; end; f {|a,b,*c| test_ok([a,b,c] == [nil, nil, []])}
|
||||||
|
def f; yield *[[]]; end; f {|a,b,*c| test_ok([a,b,c] == [nil, nil, []])}
|
||||||
|
def f; yield *[*[]]; end; f {|a,b,*c| test_ok([a,b,c] == [nil, nil, []])}
|
||||||
|
def f; yield *[*[1]]; end; f {|a,b,*c| test_ok([a,b,c] == [1, nil, []])}
|
||||||
|
def f; yield *[*[1,2]]; end; f {|a,b,*c| test_ok([a,b,c] == [1, 2, []])}
|
||||||
|
|
||||||
test_check "condition"
|
test_check "condition"
|
||||||
|
|
||||||
$x = '0';
|
$x = '0';
|
||||||
@ -768,7 +888,7 @@ test_ok(a == [1, 2, 3])
|
|||||||
test_ok(a == [4])
|
test_ok(a == [4])
|
||||||
|
|
||||||
*a = nil
|
*a = nil
|
||||||
test_ok(a == [nil])
|
test_ok(a == [])
|
||||||
|
|
||||||
test_check "call"
|
test_check "call"
|
||||||
def aaa(a, b=100, *rest)
|
def aaa(a, b=100, *rest)
|
||||||
|
2
st.c
2
st.c
@ -558,5 +558,5 @@ static int
|
|||||||
numhash(n)
|
numhash(n)
|
||||||
long n;
|
long n;
|
||||||
{
|
{
|
||||||
return n;
|
return n / 7;
|
||||||
}
|
}
|
||||||
|
@ -73,6 +73,7 @@ fc_i(key, value, res)
|
|||||||
|
|
||||||
if (!rb_is_const_id(key)) return ST_CONTINUE;
|
if (!rb_is_const_id(key)) return ST_CONTINUE;
|
||||||
|
|
||||||
|
printf("fc: %s\n", rb_id2name(key));
|
||||||
if (value == res->klass) {
|
if (value == res->klass) {
|
||||||
res->path = fc_path(res, key);
|
res->path = fc_path(res, key);
|
||||||
return ST_STOP;
|
return ST_STOP;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user