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>
* 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>
* 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) {
long capa_inc = RARRAY(ary)->aux.capa / 2;
if (capa_inc < ARY_DEFAULT_SIZE) {
capa_inc = ARY_DEFAULT_SIZE;
long new_capa = RARRAY(ary)->aux.capa / 2;
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);
}
if (idx > 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) {
@ -502,9 +507,6 @@ rb_ary_aref(argc, argv, ary)
if (FIXNUM_P(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 */
switch (rb_range_beg_len(arg, &beg, &len, RARRAY(ary)->len, 0)) {
case Qfalse:
@ -706,9 +708,6 @@ rb_ary_aset(argc, argv, ary)
offset = FIX2LONG(argv[0]);
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)) {
/* check if idx is Range */
rb_ary_update(ary, beg, len, argv[1]);

View file

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

View file

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

View file

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

47
hash.c
View file

@ -259,6 +259,21 @@ rb_hash_clone(hash)
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
to_hash(hash)
VALUE hash;
@ -353,6 +368,18 @@ rb_hash_set_default(hash, 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
index_i(key, value, args)
VALUE key, value;
@ -448,8 +475,15 @@ rb_hash_shift(hash)
var.stop = 0;
st_foreach(RHASH(hash)->tbl, shift_i, &var);
if (var.stop == 0) return RHASH(hash)->ifnone;
return rb_assoc_new(var.key, var.val);
if (var.stop) {
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
@ -573,6 +607,10 @@ rb_hash_replace(hash, hash2)
hash2 = to_hash(hash2);
rb_hash_clear(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;
}
@ -854,7 +892,8 @@ rb_hash_equal(hash1, hash2)
if (TYPE(hash2) != T_HASH) return Qfalse;
if (RHASH(hash1)->tbl->num_entries != RHASH(hash2)->tbl->num_entries)
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;
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,"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,"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,"default", rb_hash_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,"indexes", 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;
{
long val = FIX2LONG(fix);
long i;
if (TYPE(idx) == T_BIGNUM) {
if (!RBIGNUM(idx)->sign || val >= 0)
return INT2FIX(0);
return INT2FIX(1);
}
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))
idx = rb_big_norm(idx);
if (!FIXNUM_P(idx)) {
if (!RBIGNUM(idx)->sign || val >= 0)
return INT2FIX(0);
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);
}
if (val & (1L<<i))
return INT2FIX(1);
return INT2FIX(0);
}
static VALUE

View file

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

View file

@ -1,4 +1,4 @@
#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_RELEASE_CODE 20020812
#define RUBY_RELEASE_CODE 20020813