diff options
-rw-r--r-- | ChangeLog | 33 | ||||
-rw-r--r-- | bignum.c | 8 | ||||
-rw-r--r-- | env.h | 1 | ||||
-rw-r--r-- | eval.c | 45 | ||||
-rw-r--r-- | ext/extmk.rb.in | 1 | ||||
-rw-r--r-- | file.c | 10 | ||||
-rw-r--r-- | gc.c | 5 | ||||
-rw-r--r-- | hash.c | 8 | ||||
-rw-r--r-- | lib/cgi.rb | 2 | ||||
-rw-r--r-- | object.c | 12 | ||||
-rw-r--r-- | version.h | 4 |
11 files changed, 86 insertions, 43 deletions
@@ -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); } @@ -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; @@ -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(); diff --git a/ext/extmk.rb.in b/ext/extmk.rb.in index ab1b78a4c..a8bcafa0b 100644 --- a/ext/extmk.rb.in +++ b/ext/extmk.rb.in @@ -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)] @@ -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 } @@ -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. */ @@ -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; diff --git a/lib/cgi.rb b/lib/cgi.rb index eb476923e..7870c8125 100644 --- a/lib/cgi.rb +++ b/lib/cgi.rb @@ -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 |