1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

* hash.c (rb_hash_replace): should copy ifnone.

* hash.c (rb_hash_dup): should preserve HASH_PROC_DEFAULT and
  HASH_DELETED flags.

* hash.c (rb_hash_shift): shift from empty hash should not return
  its default proc.

* hash.c (rb_hash_default_proc): new method. [new]

* array.c (rb_ary_aref): no need for Bignum check.

* array.c (rb_ary_aset): explicit Bignum check removd.

* numeric.c (fix_aref): normalize bignum before bit-op.

* bignum.c (rb_big_rand): max may be Bignum zero.

* bignum.c (rb_cstr_to_inum): should normalize bignums, to avoid
  returning fixable bignum value.

* bignum.c (rb_uint2big): there should be no zero sized bignum.

* ext/extmk.rb.in: extmake() that works properly for both tkutil
  (tk/tkutil.so) and digest/sha1.

* hash.c (rb_hash_equal): should check HASH_PROC_DEFAULT too.


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@2706 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
matz 2002-08-13 09:21:18 +00:00
parent 510c93caac
commit cf5d04f663
9 changed files with 123 additions and 42 deletions

View file

@ -1,7 +1,43 @@
Tue Aug 13 15:32:14 2002 Yukihiro Matsumoto <matz@ruby-lang.org>
* hash.c (rb_hash_replace): should copy ifnone.
* hash.c (rb_hash_dup): should preserve HASH_PROC_DEFAULT and
HASH_DELETED flags.
* hash.c (rb_hash_shift): shift from empty hash should not return
its default proc.
* hash.c (rb_hash_default_proc): new method. [new]
Tue Aug 13 00:37:11 2002 Yukihiro Matsumoto <matz@ruby-lang.org>
* array.c (rb_ary_aref): no need for Bignum check.
* array.c (rb_ary_aset): explicit Bignum check removd.
* numeric.c (fix_aref): normalize bignum before bit-op.
* bignum.c (rb_big_rand): max may be Bignum zero.
* bignum.c (rb_cstr_to_inum): should normalize bignums, to avoid
returning fixable bignum value.
* bignum.c (rb_uint2big): there should be no zero sized bignum.
Mon Aug 12 23:45:28 2002 Yukihiro Matsumoto <matz@ruby-lang.org>
* ext/extmk.rb.in: extmake() that works properly for both tkutil
(tk/tkutil.so) and digest/sha1.
Mon Aug 12 22:29:35 2002 Akinori MUSHA <knu@iDaemons.org> Mon Aug 12 22:29:35 2002 Akinori MUSHA <knu@iDaemons.org>
* ruby.c (set_arg0): Correct the position of #endif. * ruby.c (set_arg0): Correct the position of #endif.
Mon Aug 12 17:25:06 2002 Yukihiro Matsumoto <matz@ruby-lang.org>
* hash.c (rb_hash_equal): should check HASH_PROC_DEFAULT too.
Mon Aug 12 16:15:37 2002 Nobuyoshi Nakada <nobu.nokada@softhome.net> Mon Aug 12 16:15:37 2002 Nobuyoshi Nakada <nobu.nokada@softhome.net>
* bignum.c (rb_big_cmp): raise for NaN. (ruby-bugs-ja:PR#284). * bignum.c (rb_big_cmp): raise for NaN. (ruby-bugs-ja:PR#284).

21
array.c
View file

@ -298,16 +298,21 @@ rb_ary_store(ary, idx, val)
} }
if (idx >= RARRAY(ary)->aux.capa) { if (idx >= RARRAY(ary)->aux.capa) {
long capa_inc = RARRAY(ary)->aux.capa / 2; long new_capa = RARRAY(ary)->aux.capa / 2;
if (capa_inc < ARY_DEFAULT_SIZE) {
capa_inc = ARY_DEFAULT_SIZE; if (new_capa < ARY_DEFAULT_SIZE) {
new_capa = ARY_DEFAULT_SIZE;
} }
RARRAY(ary)->aux.capa = idx + capa_inc; new_capa += idx;
if (new_capa > new_capa * (long)sizeof(VALUE)) {
rb_raise(rb_eArgError, "index too big");
}
RARRAY(ary)->aux.capa = new_capa;
REALLOC_N(RARRAY(ary)->ptr, VALUE, RARRAY(ary)->aux.capa); REALLOC_N(RARRAY(ary)->ptr, VALUE, RARRAY(ary)->aux.capa);
} }
if (idx > RARRAY(ary)->len) { if (idx > RARRAY(ary)->len) {
rb_mem_clear(RARRAY(ary)->ptr+RARRAY(ary)->len, rb_mem_clear(RARRAY(ary)->ptr+RARRAY(ary)->len,
idx-RARRAY(ary)->len + 1); idx-RARRAY(ary)->len + 1);
} }
if (idx >= RARRAY(ary)->len) { if (idx >= RARRAY(ary)->len) {
@ -502,9 +507,6 @@ rb_ary_aref(argc, argv, ary)
if (FIXNUM_P(arg)) { if (FIXNUM_P(arg)) {
return rb_ary_entry(ary, FIX2LONG(arg)); return rb_ary_entry(ary, FIX2LONG(arg));
} }
if (TYPE(arg) == T_BIGNUM) {
rb_raise(rb_eIndexError, "index too big");
}
/* check if idx is Range */ /* check if idx is Range */
switch (rb_range_beg_len(arg, &beg, &len, RARRAY(ary)->len, 0)) { switch (rb_range_beg_len(arg, &beg, &len, RARRAY(ary)->len, 0)) {
case Qfalse: case Qfalse:
@ -706,9 +708,6 @@ rb_ary_aset(argc, argv, ary)
offset = FIX2LONG(argv[0]); offset = FIX2LONG(argv[0]);
goto fixnum; goto fixnum;
} }
if (TYPE(argv[0]) == T_BIGNUM) {
rb_raise(rb_eIndexError, "index too big");
}
if (rb_range_beg_len(argv[0], &beg, &len, RARRAY(ary)->len, 1)) { if (rb_range_beg_len(argv[0], &beg, &len, RARRAY(ary)->len, 1)) {
/* check if idx is Range */ /* check if idx is Range */
rb_ary_update(ary, beg, len, argv[1]); rb_ary_update(ary, beg, len, argv[1]);

View file

@ -142,7 +142,7 @@ rb_uint2big(n)
} }
i = DIGSPERLONG; i = DIGSPERLONG;
while (i-- && !digits[i]) ; while (--i && !digits[i]) ;
RBIGNUM(big)->len = i+1; RBIGNUM(big)->len = i+1;
return big; return big;
} }
@ -398,7 +398,7 @@ rb_cstr_to_inum(str, base, badcheck)
else { else {
VALUE big = rb_uint2big(val); VALUE big = rb_uint2big(val);
RBIGNUM(big)->sign = sign; RBIGNUM(big)->sign = sign;
return big; return bignorm(big);
} }
} }
bigparse: bigparse:
@ -1685,6 +1685,9 @@ rb_big_rand(max, rand_buf)
long len; long len;
len = RBIGNUM(max)->len; len = RBIGNUM(max)->len;
if (len == 0 && BDIGITS(max)[0] == 0) {
return rb_float_new(rand_buf[0]);
}
v = bignew(len,1); v = bignew(len,1);
while (len--) { while (len--) {
BDIGITS(v)[len] = ((BDIGIT)~0) * rand_buf[len]; BDIGITS(v)[len] = ((BDIGIT)~0) * rand_buf[len];

View file

@ -693,7 +693,7 @@ def extmake(target)
unless $install or $clean unless $install or $clean
if $static_ext.size > 0 || if $static_ext.size > 0 ||
!File.exist?("./Makefile") || !File.exist?("./Makefile") ||
older("./Makefile", "#{$top_srcdir}/ext/@setup@") || older("./Makefile", $setup) ||
older("./Makefile", "#{$topdir}/ext/extmk.rb") || older("./Makefile", "#{$topdir}/ext/extmk.rb") ||
older("./Makefile", "#{$top_srcdir}/ext/#{target}/makefile.rb") || older("./Makefile", "#{$top_srcdir}/ext/#{target}/makefile.rb") ||
older("./Makefile", "#{$top_srcdir}/ext/#{target}/extconf.rb") older("./Makefile", "#{$top_srcdir}/ext/#{target}/extconf.rb")
@ -708,10 +708,9 @@ def extmake(target)
end end
end end
end end
$static = $target if $static
if File.exist?("./Makefile") if File.exist?("./Makefile")
if $static if $static
$extlist.push [$static, File.basename($target)] $extlist.push [$static, $target, File.basename($target)]
end end
if $install if $install
if /bccwin32/ =~ RUBY_PLATFORM if /bccwin32/ =~ RUBY_PLATFORM
@ -731,6 +730,7 @@ def extmake(target)
end end
if $static if $static
$extlibs ||= "" $extlibs ||= ""
$extlibs += " " + $DLDFLAGS if $DLDFLAGS
$extlibs += " " + $LDFLAGS unless $LDFLAGS == "" $extlibs += " " + $LDFLAGS unless $LDFLAGS == ""
$extlibs += " " + $libs unless $libs == "" $extlibs += " " + $libs unless $libs == ""
$extlibs += " " + $LOCAL_LIBS unless $LOCAL_LIBS == "" $extlibs += " " + $LOCAL_LIBS unless $LOCAL_LIBS == ""
@ -761,6 +761,7 @@ for setup in ["@setup@", "#{$top_srcdir}/ext/@setup@"]
target = target.downcase if /mswin32|bccwin32/ =~ RUBY_PLATFORM target = target.downcase if /mswin32|bccwin32/ =~ RUBY_PLATFORM
$static_ext[target] = true $static_ext[target] = true
end end
$setup = setup
f.close f.close
break break
end end
@ -797,13 +798,13 @@ miniruby = "miniruby@EXEEXT@"
$extobjs = "" unless $extobjs $extobjs = "" unless $extobjs
if $extlist.size > 0 if $extlist.size > 0
for s,t in $extlist for s,t,i in $extlist
f = format("%s/%s.%s", s, t, $LIBEXT) f = format("%s/%s.%s", s, i, $LIBEXT)
if File.exist?(f) if File.exist?(f)
$extinit += format("\ $extinit += format("\
\tInit_%s();\n\ \tInit_%s();\n\
\trb_provide(\"%s\");\n\ \trb_provide(\"%s\");\n\
", t, s) ", i, t)
$extobjs += "ext/" $extobjs += "ext/"
$extobjs += f $extobjs += f
$extobjs += " " $extobjs += " "
@ -812,7 +813,7 @@ if $extlist.size > 0
end end
end end
if older("extinit.c", "#{$top_srcdir}/ext/@setup@") if older("extinit.c", $setup) || older("extinit.c", "#{$topdir}/ext/extmk.rb")
f = open("extinit.c", "w") f = open("extinit.c", "w")
f.printf "void Init_ext() {\n" f.printf "void Init_ext() {\n"
f.printf $extinit f.printf $extinit
@ -827,7 +828,7 @@ if $extlist.size > 0
Dir.chdir ".." Dir.chdir ".."
if older(ruby, "#{$top_srcdir}/ext/@setup@") or older(ruby, miniruby) if older(ruby, $setup) or older(ruby, miniruby)
rm_f ruby rm_f ruby
end end

View file

@ -20,8 +20,8 @@ class IO
STDOUT.print c STDOUT.print c
STDOUT.flush STDOUT.flush
end end
if buf =~ e_pat then if mat=e_pat.match(buf) then
result = [buf,$1,$2,$3,$4,$5,$6,$7,$8,$9] result = [buf,*mat.to_a[1..-1]]
break break
end end
end end

47
hash.c
View file

@ -259,6 +259,21 @@ rb_hash_clone(hash)
return clone; return clone;
} }
static VALUE
rb_hash_dup(hash)
VALUE hash;
{
VALUE dup = rb_obj_dup(hash);
if (FL_TEST(hash, HASH_PROC_DEFAULT)) {
FL_SET(dup, HASH_PROC_DEFAULT);
}
if (FL_TEST(hash, HASH_DELETED)) {
FL_SET(dup, HASH_DELETED);
}
return dup;
}
static VALUE static VALUE
to_hash(hash) to_hash(hash)
VALUE hash; VALUE hash;
@ -353,6 +368,18 @@ rb_hash_set_default(hash, ifnone)
return ifnone; return ifnone;
} }
static VALUE
rb_hash_default_proc(hash)
VALUE hash;
{
VALUE key;
if (FL_TEST(hash, HASH_PROC_DEFAULT)) {
return RHASH(hash)->ifnone;
}
return Qnil;
}
static int static int
index_i(key, value, args) index_i(key, value, args)
VALUE key, value; VALUE key, value;
@ -448,8 +475,15 @@ rb_hash_shift(hash)
var.stop = 0; var.stop = 0;
st_foreach(RHASH(hash)->tbl, shift_i, &var); st_foreach(RHASH(hash)->tbl, shift_i, &var);
if (var.stop == 0) return RHASH(hash)->ifnone; if (var.stop) {
return rb_assoc_new(var.key, var.val); return rb_assoc_new(var.key, var.val);
}
else if (FL_TEST(hash, HASH_PROC_DEFAULT)) {
return rb_funcall(RHASH(hash)->ifnone, id_yield, 2, hash, Qnil);
}
else {
return RHASH(hash)->ifnone;
}
} }
static int static int
@ -573,6 +607,10 @@ rb_hash_replace(hash, hash2)
hash2 = to_hash(hash2); hash2 = to_hash(hash2);
rb_hash_clear(hash); rb_hash_clear(hash);
st_foreach(RHASH(hash2)->tbl, replace_i, hash); st_foreach(RHASH(hash2)->tbl, replace_i, hash);
RHASH(hash)->ifnone = RHASH(hash2)->ifnone;
if (FL_TEST(hash2, HASH_PROC_DEFAULT)) {
FL_SET(hash, HASH_PROC_DEFAULT);
}
return hash; return hash;
} }
@ -854,7 +892,8 @@ rb_hash_equal(hash1, hash2)
if (TYPE(hash2) != T_HASH) return Qfalse; if (TYPE(hash2) != T_HASH) return Qfalse;
if (RHASH(hash1)->tbl->num_entries != RHASH(hash2)->tbl->num_entries) if (RHASH(hash1)->tbl->num_entries != RHASH(hash2)->tbl->num_entries)
return Qfalse; return Qfalse;
if (!rb_equal(RHASH(hash1)->ifnone, RHASH(hash2)->ifnone)) if (!(rb_equal(RHASH(hash1)->ifnone, RHASH(hash2)->ifnone) &&
FL_TEST(hash1, HASH_PROC_DEFAULT) == FL_TEST(hash2, HASH_PROC_DEFAULT)))
return Qfalse; return Qfalse;
data.tbl = RHASH(hash2)->tbl; data.tbl = RHASH(hash2)->tbl;
@ -1576,6 +1615,7 @@ Init_Hash()
rb_define_method(rb_cHash,"initialize", rb_hash_initialize, -1); rb_define_method(rb_cHash,"initialize", rb_hash_initialize, -1);
rb_define_method(rb_cHash,"clone", rb_hash_clone, 0); rb_define_method(rb_cHash,"clone", rb_hash_clone, 0);
rb_define_method(rb_cHash,"dup", rb_hash_dup, 0);
rb_define_method(rb_cHash,"rehash", rb_hash_rehash, 0); rb_define_method(rb_cHash,"rehash", rb_hash_rehash, 0);
rb_define_method(rb_cHash,"to_hash", rb_hash_to_hash, 0); rb_define_method(rb_cHash,"to_hash", rb_hash_to_hash, 0);
@ -1590,6 +1630,7 @@ Init_Hash()
rb_define_method(rb_cHash,"store", rb_hash_aset, 2); rb_define_method(rb_cHash,"store", rb_hash_aset, 2);
rb_define_method(rb_cHash,"default", rb_hash_default, -1); rb_define_method(rb_cHash,"default", rb_hash_default, -1);
rb_define_method(rb_cHash,"default=", rb_hash_set_default, 1); rb_define_method(rb_cHash,"default=", rb_hash_set_default, 1);
rb_define_method(rb_cHash,"default_proc", rb_hash_default_proc, 0);
rb_define_method(rb_cHash,"index", rb_hash_index, 1); rb_define_method(rb_cHash,"index", rb_hash_index, 1);
rb_define_method(rb_cHash,"indexes", rb_hash_indexes, -1); rb_define_method(rb_cHash,"indexes", rb_hash_indexes, -1);
rb_define_method(rb_cHash,"indices", rb_hash_indexes, -1); rb_define_method(rb_cHash,"indices", rb_hash_indexes, -1);

View file

@ -1464,24 +1464,26 @@ fix_aref(fix, idx)
VALUE fix, idx; VALUE fix, idx;
{ {
long val = FIX2LONG(fix); long val = FIX2LONG(fix);
long i;
if (TYPE(idx) == T_BIGNUM) { if (TYPE(idx) == T_BIGNUM) {
if (!RBIGNUM(idx)->sign || val >= 0) idx = rb_big_norm(idx);
return INT2FIX(0); if (!FIXNUM_P(idx)) {
return INT2FIX(1); if (!RBIGNUM(idx)->sign || val >= 0)
} return INT2FIX(0);
else {
int i = NUM2INT(idx);
if (i < 0) return INT2FIX(0);
if (sizeof(VALUE)*CHAR_BIT-1 < i) {
if (val < 0) return INT2FIX(1);
return INT2FIX(0);
}
if (val & (1L<<i))
return INT2FIX(1); return INT2FIX(1);
}
}
i = NUM2LONG(idx);
if (i < 0) return INT2FIX(0);
if (sizeof(VALUE)*CHAR_BIT-1 < i) {
if (val < 0) return INT2FIX(1);
return INT2FIX(0); return INT2FIX(0);
} }
if (val & (1L<<i))
return INT2FIX(1);
return INT2FIX(0);
} }
static VALUE static VALUE

View file

@ -224,7 +224,6 @@ rb_f_rand(argc, argv, obj)
} }
vmax = rb_dbl2big(RFLOAT(vmax)->value); vmax = rb_dbl2big(RFLOAT(vmax)->value);
/* fall through */ /* fall through */
case T_BIGNUM:
{ {
long len = RBIGNUM(vmax)->len; long len = RBIGNUM(vmax)->len;
double *buf = ALLOCA_N(double, len); double *buf = ALLOCA_N(double, len);

View file

@ -1,4 +1,4 @@
#define RUBY_VERSION "1.7.2" #define RUBY_VERSION "1.7.2"
#define RUBY_RELEASE_DATE "2002-08-12" #define RUBY_RELEASE_DATE "2002-08-13"
#define RUBY_VERSION_CODE 172 #define RUBY_VERSION_CODE 172
#define RUBY_RELEASE_CODE 20020812 #define RUBY_RELEASE_CODE 20020813