Skip to content

Commit 601354b

Browse files
author
matz
committed
* eval.c (BEGIN_CALLARGS): should not always reset ruby_iter,
need to restore previous value. [ruby-talk:77577] * array.c (rb_ary_fill): array length may be changed during the block execution. [ruby-talk:77579] * array.c (rb_ary_zip): ditto. * array.c (rb_ary_fill): ditto. * hash.c (env_reject_bang): length may be changed during the block execution. * hash.c (env_clear): ditto. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@4254 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
1 parent 81f52e5 commit 601354b

File tree

6 files changed

+61
-34
lines changed

6 files changed

+61
-34
lines changed

ChangeLog

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,20 @@
1+
Fri Aug 1 09:54:38 2003 Yukihiro Matsumoto <matz@ruby-lang.org>
2+
3+
* eval.c (BEGIN_CALLARGS): should not always reset ruby_iter,
4+
need to restore previous value. [ruby-talk:77577]
5+
6+
* array.c (rb_ary_fill): array length may be changed during the
7+
block execution. [ruby-talk:77579]
8+
9+
* array.c (rb_ary_zip): ditto.
10+
11+
* array.c (rb_ary_fill): ditto.
12+
13+
* hash.c (env_reject_bang): length may be changed during the block
14+
execution.
15+
16+
* hash.c (env_clear): ditto.
17+
118
Fri Aug 1 00:52:58 2003 Yukihiro Matsumoto <matz@ruby-lang.org>
219

320
* gc.c (Init_stack): IA64 requires STACK_LEVEL_MAX to be less than

array.c

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ rb_ary_modify_check(ary)
5050
{
5151
if (OBJ_FROZEN(ary)) rb_error_frozen("array");
5252
if (FL_TEST(ary, ARY_TMPLOCK))
53-
rb_raise(rb_eTypeError, "can't modify array during sort");
53+
rb_raise(rb_eTypeError, "can't modify array during iteration");
5454
if (!OBJ_TAINTED(ary) && rb_safe_level() >= 4)
5555
rb_raise(rb_eSecurityError, "Insecure: can't modify array");
5656
}
@@ -839,6 +839,9 @@ rb_ary_reverse_each(ary)
839839

840840
while (len--) {
841841
rb_yield(RARRAY(ary)->ptr[len]);
842+
if (RARRAY(ary)->len < len) {
843+
len = RARRAY(ary)->len;
844+
}
842845
}
843846
return ary;
844847
}
@@ -1423,12 +1426,11 @@ rb_ary_zip(argc, argv, ary)
14231426
long len;
14241427
VALUE result;
14251428

1426-
len = RARRAY(ary)->len;
14271429
for (i=0; i<argc; i++) {
14281430
argv[i] = to_ary(argv[i]);
14291431
}
14301432
if (rb_block_given_p()) {
1431-
for (i=0; i<len; i++) {
1433+
for (i=0; i<RARRAY(ary)->len; i++) {
14321434
VALUE tmp = rb_ary_new2(argc+1);
14331435

14341436
rb_ary_push(tmp, rb_ary_entry(ary, i));
@@ -1439,6 +1441,7 @@ rb_ary_zip(argc, argv, ary)
14391441
}
14401442
return Qnil;
14411443
}
1444+
len = RARRAY(ary)->len;
14421445
result = rb_ary_new2(len);
14431446
for (i=0; i<len; i++) {
14441447
VALUE tmp = rb_ary_new2(argc+1);
@@ -1562,15 +1565,21 @@ rb_ary_fill(argc, argv, ary)
15621565
}
15631566
RARRAY(ary)->len = end;
15641567
}
1565-
p = RARRAY(ary)->ptr + beg;
1566-
pend = p + len;
15671568

15681569
if (block_p) {
1569-
while (p < pend) {
1570-
*p++ = rb_yield(LONG2NUM(beg++));
1570+
VALUE v;
1571+
long i;
1572+
1573+
for (i=0; i<RARRAY(ary)->len; i++) {
1574+
beg++;
1575+
v = rb_yield(LONG2NUM(beg++));
1576+
if (i>=RARRAY(ary)->len) break;
1577+
RARRAY(ary)->ptr[i] = v;
15711578
}
15721579
}
15731580
else {
1581+
p = RARRAY(ary)->ptr + beg;
1582+
pend = p + len;
15741583
while (p < pend) {
15751584
*p++ = item;
15761585
}

eval.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1964,7 +1964,7 @@ copy_node_scope(node, rval)
19641964
if (ruby_iter->iter == ITER_PRE) {\
19651965
ruby_block = ruby_block->outer;\
19661966
}\
1967-
PUSH_ITER(ITER_NOT)
1967+
PUSH_ITER((ruby_iter->prev ? ruby_iter->prev->iter : ITER_NOT))
19681968

19691969
#define END_CALLARGS \
19701970
ruby_block = tmp_block;\

hash.c

Lines changed: 13 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1372,25 +1372,21 @@ static VALUE
13721372
env_reject_bang()
13731373
{
13741374
volatile VALUE keys;
1375-
VALUE *ptr;
1376-
long len;
1375+
long i;
13771376
int del = 0;
13781377

13791378
rb_secure(4);
13801379
keys = env_keys();
1381-
ptr = RARRAY(keys)->ptr;
1382-
len = RARRAY(keys)->len;
13831380

1384-
while (len--) {
1385-
VALUE val = rb_f_getenv(Qnil, *ptr);
1381+
for (i=0; i<RARRAY(keys)->len; i++) {
1382+
VALUE val = rb_f_getenv(Qnil, RARRAY(keys)->ptr[i]);
13861383
if (!NIL_P(val)) {
1387-
if (RTEST(rb_yield_values(2, *ptr, val))) {
1388-
FL_UNSET(*ptr, FL_TAINT);
1389-
env_delete(Qnil, *ptr);
1384+
if (RTEST(rb_yield_values(2, RARRAY(keys)->ptr[i], val))) {
1385+
FL_UNSET(RARRAY(keys)->ptr[i], FL_TAINT);
1386+
env_delete(Qnil, RARRAY(keys)->ptr[i]);
13901387
del++;
13911388
}
13921389
}
1393-
ptr++;
13941390
}
13951391
if (del == 0) return Qnil;
13961392
return envtbl;
@@ -1454,20 +1450,16 @@ static VALUE
14541450
env_clear()
14551451
{
14561452
volatile VALUE keys;
1457-
VALUE *ptr;
1458-
long len;
1453+
long i;
14591454

14601455
rb_secure(4);
14611456
keys = env_keys();
1462-
ptr = RARRAY(keys)->ptr;
1463-
len = RARRAY(keys)->len;
14641457

1465-
while (len--) {
1466-
VALUE val = rb_f_getenv(Qnil, *ptr);
1458+
for (i=0; i<RARRAY(keys)->len; i++) {
1459+
VALUE val = rb_f_getenv(Qnil, RARRAY(keys)->ptr[i]);
14671460
if (!NIL_P(val)) {
1468-
env_delete(Qnil, *ptr);
1461+
env_delete(Qnil, RARRAY(keys)->ptr[i]);
14691462
}
1470-
ptr++;
14711463
}
14721464
return envtbl;
14731465
}
@@ -1719,18 +1711,14 @@ env_replace(env, hash)
17191711
VALUE env, hash;
17201712
{
17211713
volatile VALUE keys = env_keys();
1722-
VALUE *ptr;
1723-
long len;
1714+
long i;
17241715

17251716
if (env == hash) return env;
17261717
hash = to_hash(hash);
17271718
st_foreach(RHASH(hash)->tbl, env_replace_i, keys);
17281719

1729-
ptr = RARRAY(keys)->ptr;
1730-
len = RARRAY(keys)->len;
1731-
1732-
while (len--) {
1733-
env_delete(env, *ptr++);
1720+
for (i=0; i<RARRAY(keys)->len; i++) {
1721+
env_delete(env, RARRAY(keys)->ptr[i]);
17341722
}
17351723
return env;
17361724
}

lib/shell.rb

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -267,4 +267,3 @@ def self.notify(*opts, &block)
267267
CommandProcessor.initialize
268268
CommandProcessor.run_config
269269
end
270-

sample/test.rb

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1064,6 +1064,20 @@ def marity_test(m)
10641064
lambda(&method(:test_ok)).call(true)
10651065
lambda(&get_block{|a,n| test_ok(a,n)}).call(true, 2)
10661066

1067+
class ITER_TEST1
1068+
def a
1069+
block_given?
1070+
end
1071+
end
1072+
1073+
class ITER_TEST2 < ITER_TEST1
1074+
def a
1075+
test_ok(super)
1076+
super
1077+
end
1078+
end
1079+
test_ok(ITER_TEST2.new.a {})
1080+
10671081
test_check "float"
10681082
test_ok(2.6.floor == 2)
10691083
test_ok((-2.6).floor == -3)

0 commit comments

Comments
 (0)