* bignum.c (rb_big_cmp): use dbl2big() for Floats, instead of

big2dbl().

* bignum.c (Init_Bignum): rb_big_zero_p() removed.  There may be
  Bignum zero.

* eval.c (rb_call0): new argument added for original method name.
  preserve original method name in frame->orig_func.

* eval.c (is_defined): use frame->orig_func, not last_func.

* eval.c (rb_eval): ditto.

* eval.c (method_call): supply data->oid also to rb_call0().

* object.c (rb_class_allocate_instance): call rb_obj_alloc() when
  called from alias, thus invoke original "allocate".

* eval.c (remove_method): removing allocate from classes should
  cause NameError.

* hash.c (rb_hash_equal): should check default values.

* ext/socket/socket.c (s_recvfrom): update RSTRING len.


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@2702 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
matz 2002-08-12 07:39:12 +00:00
Родитель 66f8f8691b
Коммит 1f99d95729
11 изменённых файлов: 86 добавлений и 43 удалений

Просмотреть файл

@ -10,6 +10,14 @@ Sun Aug 11 09:34:07 2002 Nobuyoshi Nakada <nobu.nokada@softhome.net>
* marshal.c (r_object): register TYPE_BIGNUM regardless real type.
Sat Aug 10 23:47:16 2002 Yukihiro Matsumoto <matz@ruby-lang.org>
* bignum.c (rb_big_cmp): use dbl2big() for Floats, instead of
big2dbl().
* bignum.c (Init_Bignum): rb_big_zero_p() removed. There may be
Bignum zero.
Fri Aug 9 13:31:40 2002 WATANABE Hirofumi <eban@ruby-lang.org>
* ext/Win32API/extconf.rb: check existence of <windows.h>.
@ -20,6 +28,23 @@ Thu Aug 8 09:37:02 2002 Nobuyoshi Nakada <nobu.nokada@softhome.net>
* lib/optparse.rb (String): ditto.
Thu Aug 8 00:45:15 2002 Yukihiro Matsumoto <matz@ruby-lang.org>
* eval.c (rb_call0): new argument added for original method name.
preserve original method name in frame->orig_func.
* eval.c (is_defined): use frame->orig_func, not last_func.
* eval.c (rb_eval): ditto.
* eval.c (method_call): supply data->oid also to rb_call0().
* object.c (rb_class_allocate_instance): call rb_obj_alloc() when
called from alias, thus invoke original "allocate".
* eval.c (remove_method): removing allocate from classes should
cause NameError.
Wed Aug 7 22:12:54 2002 Nobuyoshi Nakada <nobu.nokada@softhome.net>
* lib/optparse.rb (OptionParser::Completion::convert): returned
@ -35,6 +60,10 @@ Wed Aug 7 22:12:54 2002 Nobuyoshi Nakada <nobu.nokada@softhome.net>
* lib/optparse/uri.rb: require standard uri module. thanks to
Minero Aoki.
Wed Aug 7 09:51:54 2002 Yukihiro Matsumoto <matz@ruby-lang.org>
* hash.c (rb_hash_equal): should check default values.
Wed Aug 7 08:44:32 2002 Minero Aoki <aamine@loveruby.net>
* ext/racc/cparse/cparse.c: reduce goto.
@ -65,6 +94,10 @@ Fri Aug 2 09:12:32 2002 Minero Aoki <aamine@loveruby.net>
* ext/strscan/strscan.c: follow allocation framework.
Fri Aug 2 01:21:52 2002 Yukihiro Matsumoto <matz@ruby-lang.org>
* ext/socket/socket.c (s_recvfrom): update RSTRING len.
Thu Aug 1 17:47:15 2002 Tachino Nobuhiro <tachino@jp.fujitsu.com>
* parse.y (tokadd_string): ignore backslashed spaces in %w.

Просмотреть файл

@ -1700,13 +1700,6 @@ rb_big_size(big)
return INT2FIX(RBIGNUM(big)->len*SIZEOF_BDIGITS);
}
static VALUE
rb_big_zero_p(big)
VALUE big;
{
return Qfalse;
}
void
Init_Bignum()
{
@ -1740,5 +1733,4 @@ Init_Bignum()
rb_define_method(rb_cBignum, "to_f", rb_big_to_f, 0);
rb_define_method(rb_cBignum, "abs", rb_big_abs, 0);
rb_define_method(rb_cBignum, "size", rb_big_size, 0);
rb_define_method(rb_cBignum, "zero?", rb_big_zero_p, 0);
}

1
env.h
Просмотреть файл

@ -18,6 +18,7 @@ extern struct FRAME {
int argc;
VALUE *argv;
ID last_func;
ID orig_func;
VALUE last_class;
VALUE cbase;
struct FRAME *prev;

45
eval.c
Просмотреть файл

@ -315,6 +315,10 @@ rb_get_method_body(klassp, idp, noexp)
return body;
}
static ID init, alloc, eqq, each, aref, aset, match, missing;
static ID added, singleton_added;
static ID __id__, __send__;
static void
remove_method(klass, mid)
VALUE klass;
@ -329,6 +333,16 @@ remove_method(klass, mid)
rb_raise(rb_eSecurityError, "Insecure: can't remove method");
}
if (OBJ_FROZEN(klass)) rb_error_frozen("class/module");
if (mid == __id__ || mid == __send__ || mid == init) {
rb_warn("removing `%s' may cause serious problem", rb_id2name(mid));
}
if (mid == alloc) {
if (klass == rb_cClass ||
(FL_TEST(klass, FL_SINGLETON) &&
rb_obj_is_kind_of(rb_iv_get(klass, "__attached__"), rb_cClass))) {
rb_name_error(mid, "removing `%s'", rb_id2name(mid));
}
}
if (!st_delete(RCLASS(klass)->m_tbl, &mid, &body) || !body->nd_body) {
rb_name_error(mid, "method `%s' not defined in %s",
rb_id2name(mid), rb_class2name(klass));
@ -454,10 +468,6 @@ rb_method_boundp(klass, id, ex)
return Qfalse;
}
static ID init, alloc, eqq, each, aref, aset, match, missing;
static ID added, singleton_added;
static ID __id__, __send__;
void
rb_attr(klass, id, read, write, ex)
VALUE klass;
@ -1324,6 +1334,7 @@ rb_eval_string_wrap(str, state)
rb_extend_object(ruby_top_self, ruby_wrapper);
PUSH_FRAME();
ruby_frame->last_func = 0;
ruby_frame->orig_func = 0;
ruby_frame->last_class = 0;
ruby_frame->self = self;
ruby_frame->cbase = (VALUE)rb_node_newnode(NODE_CREF,ruby_wrapper,0,0);
@ -1415,6 +1426,7 @@ rb_eval_cmd(cmd, arg, tcheck)
ruby_scope = top_scope;
PUSH_FRAME();
ruby_frame->last_func = 0;
ruby_frame->orig_func = 0;
ruby_frame->last_class = 0;
ruby_frame->self = ruby_top_self;
ruby_frame->cbase = (VALUE)rb_node_newnode(NODE_CREF,0,0,0);
@ -1621,13 +1633,10 @@ rb_undef(klass, id)
rb_secure(4);
}
if (ruby_safe_level >= 4 && !OBJ_TAINTED(klass)) {
rb_raise(rb_eSecurityError, "Insecure: can't undef");
if (id == __id__ || id == __send__ || id == init) {
rb_name_error(id, "undefining `%s' prohibited", rb_id2name(id));
}
rb_raise(rb_eSecurityError, "Insecure: can't undef `%s'", rb_id2name(id));
}
rb_frozen_class_p(klass);
if (id == __id__ || id == __send__ || id == init) {
if (id == __id__ || id == __send__ || id == init || id == alloc) {
rb_warn("undefining `%s' may cause serious problem", rb_id2name(id));
}
body = search_method(klass, id, &origin);
@ -1844,10 +1853,10 @@ is_defined(self, node, buf)
switch (nd_type(node)) {
case NODE_SUPER:
case NODE_ZSUPER:
if (ruby_frame->last_func == 0) return 0;
if (ruby_frame->orig_func == 0) return 0;
else if (ruby_frame->last_class == 0) return 0;
else if (rb_method_boundp(RCLASS(ruby_frame->last_class)->super,
ruby_frame->last_func, 0)) {
ruby_frame->orig_func, 0)) {
if (nd_type(node) == NODE_SUPER) {
return arg_defined(self, node->nd_args, buf, "super");
}
@ -2759,10 +2768,10 @@ rb_eval(self, n)
TMP_PROTECT;
if (ruby_frame->last_class == 0) {
if (ruby_frame->last_func) {
if (ruby_frame->orig_func) {
rb_name_error(ruby_frame->last_func,
"superclass method `%s' disabled",
rb_id2name(ruby_frame->last_func));
rb_id2name(ruby_frame->orig_func));
}
else {
rb_raise(rb_eNoMethodError, "super called outside of method");
@ -2780,7 +2789,7 @@ rb_eval(self, n)
PUSH_ITER(ruby_iter->iter?ITER_PRE:ITER_NOT);
result = rb_call(RCLASS(ruby_frame->last_class)->super,
ruby_frame->self, ruby_frame->last_func,
ruby_frame->self, ruby_frame->orig_func,
argc, argv, 3);
POP_ITER();
}
@ -4458,9 +4467,10 @@ call_cfunc(func, recv, len, argc, argv)
}
static VALUE
rb_call0(klass, recv, id, argc, argv, body, nosuper)
rb_call0(klass, recv, id, oid, argc, argv, body, nosuper)
VALUE klass, recv;
ID id;
ID oid;
int argc; /* OK */
VALUE *argv; /* OK */
NODE *body; /* OK */
@ -4490,6 +4500,7 @@ rb_call0(klass, recv, id, argc, argv, body, nosuper)
PUSH_FRAME();
ruby_frame->last_func = id;
ruby_frame->orig_func = oid;
ruby_frame->last_class = nosuper?0:klass;
ruby_frame->self = recv;
ruby_frame->argc = argc;
@ -4747,7 +4758,7 @@ rb_call(klass, recv, mid, argc, argv, scope)
}
}
return rb_call0(klass, recv, id, argc, argv, body, noex & NOEX_UNDEF);
return rb_call0(klass, recv, mid, id, argc, argv, body, noex & NOEX_UNDEF);
}
VALUE
@ -6914,7 +6925,7 @@ method_call(argc, argv, method)
ruby_safe_level = 4;
}
if ((state = EXEC_TAG()) == 0) {
result = rb_call0(data->klass,data->recv,data->id,argc,argv,data->body,0);
result = rb_call0(data->klass,data->recv,data->id,data->oid,argc,argv,data->body,0);
}
POP_TAG();
POP_ITER();

Просмотреть файл

@ -708,6 +708,7 @@ def extmake(target)
end
end
end
$static = $target if $static
if File.exist?("./Makefile")
if $static
$extlist.push [$static, File.basename($target)]

10
file.c
Просмотреть файл

@ -214,7 +214,7 @@ rb_stat_rdev(self)
#ifdef HAVE_ST_RDEV
return ULONG2NUM(get_stat(self)->st_rdev);
#else
return INT2FIX(0);
return Qnil;
#endif
}
@ -226,7 +226,7 @@ rb_stat_rdev_major(self)
long rdev = get_stat(self)->st_rdev;
return ULONG2NUM(major(rdev));
#else
return INT2FIX(0);
return Qnil;
#endif
}
@ -238,7 +238,7 @@ rb_stat_rdev_minor(self)
long rdev = get_stat(self)->st_rdev;
return ULONG2NUM(minor(rdev));
#else
return INT2FIX(0);
return Qnil;
#endif
}
@ -256,7 +256,7 @@ rb_stat_blksize(self)
#ifdef HAVE_ST_BLKSIZE
return ULONG2NUM(get_stat(self)->st_blksize);
#else
return INT2FIX(0);
return Qnil;
#endif
}
@ -267,7 +267,7 @@ rb_stat_blocks(self)
#ifdef HAVE_ST_BLOCKS
return ULONG2NUM(get_stat(self)->st_blocks);
#else
return INT2FIX(0);
return Qnil;
#endif
}

5
gc.c
Просмотреть файл

@ -33,11 +33,8 @@
void re_free_registers _((struct re_registers*));
void rb_io_fptr_finalize _((struct OpenFile*));
#ifndef setjmp
#ifdef HAVE__SETJMP
#if !defined(setjmp) && defined(HAVE__SETJMP)
#define setjmp(env) _setjmp(env)
#define longjmp(env,val) _longjmp(env,val)
#endif
#endif
/* Make alloca work the best possible way. */

8
hash.c
Просмотреть файл

@ -24,6 +24,7 @@ static void
rb_hash_modify(hash)
VALUE hash;
{
if (!RHASH(hash)->tbl) rb_raise(rb_eTypeError, "uninitialized Hash");
if (OBJ_FROZEN(hash)) rb_error_frozen("hash");
if (!OBJ_TAINTED(hash) && rb_safe_level() >= 4)
rb_raise(rb_eSecurityError, "Insecure: can't modify hash");
@ -226,7 +227,7 @@ rb_hash_s_create(argc, argv, klass)
int i;
if (argc == 1 && TYPE(argv[0]) == T_HASH) {
VALUE hash = rb_obj_alloc(klass);
hash = rb_obj_alloc(klass);
RHASH(hash)->ifnone = Qnil;
RHASH(hash)->tbl = st_copy(RHASH(argv[0])->tbl);
@ -237,8 +238,8 @@ rb_hash_s_create(argc, argv, klass)
if (argc % 2 != 0) {
rb_raise(rb_eArgError, "odd number args for Hash");
}
hash = rb_hash_s_alloc(klass);
hash = rb_obj_alloc(klass);
for (i=0; i<argc; i+=2) {
rb_hash_aset(hash, argv[i], argv[i + 1]);
}
@ -280,6 +281,7 @@ rb_hash_rehash(hash)
{
st_table *tbl;
rb_hash_modify(hash);
tbl = st_init_table_with_size(&objhash, RHASH(hash)->tbl->num_entries);
st_foreach(RHASH(hash)->tbl, rb_hash_rehash_i, tbl);
st_free_table(RHASH(hash)->tbl);
@ -852,6 +854,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))
return Qfalse;
data.tbl = RHASH(hash2)->tbl;
data.result = Qtrue;

Просмотреть файл

@ -1273,7 +1273,7 @@ The hash keys are case sensitive. Ask the samples.
end
if @output_hidden
hidden = @output_hidden.collect{|k,v|
"<INPUT TYPE=HIDDEN NAME=\"#{k}\" VALUE=\"#{v}\">"
"<DIV><INPUT TYPE=HIDDEN NAME=\"#{k}\" VALUE=\"#{v}\"></DIV>"
}.to_s
body += hidden
end

Просмотреть файл

@ -684,10 +684,14 @@ static VALUE
rb_class_allocate_instance(klass)
VALUE klass;
{
NEWOBJ(obj, struct RObject);
OBJSETUP(obj, klass, T_OBJECT);
return (VALUE)obj;
if (rb_frame_last_func() != alloc) {
return rb_obj_alloc(klass);
}
else {
NEWOBJ(obj, struct RObject);
OBJSETUP(obj, klass, T_OBJECT);
return (VALUE)obj;
}
}
VALUE

Просмотреть файл

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