diff options
-rw-r--r-- | ChangeLog | 30 | ||||
-rw-r--r-- | bignum.c | 2 | ||||
-rw-r--r-- | eval.c | 19 | ||||
-rw-r--r-- | intern.h | 1 | ||||
-rw-r--r-- | object.c | 1 | ||||
-rw-r--r-- | parse.y | 10 | ||||
-rw-r--r-- | ruby.h | 1 | ||||
-rw-r--r-- | sample/time.rb | 2 | ||||
-rw-r--r-- | variable.c | 37 |
9 files changed, 80 insertions, 23 deletions
@@ -1,10 +1,27 @@ +Wed Sep 13 17:11:19 2000 Yukihiro Matsumoto <[email protected]> + + * stable version 1.6.0 released. + +Thu Sep 14 02:46:54 2000 Yukihiro Matsumoto <[email protected]> + + * eval.c (rb_thread_yield): array strip should be done in this + function. + +Wed Sep 13 17:01:03 2000 Yukihiro Matsumoto <[email protected]> + + * bignum.c (rb_big_eq): imcomplete value compare of bignums. + +Wed Sep 13 06:39:54 2000 Yukihiro Matsumoto <[email protected]> + + * variable.c (rb_mod_class_variables): Module#class_variables added. + Wed Sep 13 06:09:26 2000 Wakou Aoyama <[email protected]> * lib/cgi.rb: bug fix: CGI::header(): output status header. -Tue Sep 12 22:34:20 2000 Yukihiro Matsumoto <[email protected]> +Wed Sep 13 01:09:12 2000 Yukihiro Matsumoto <[email protected]> - * stable version 1.6.0 released. + * parse.y (yylex): allow global variables like '$__a'. Tue Sep 12 22:28:43 2000 WATANABE Hirofumi <[email protected]> @@ -17,8 +34,8 @@ Tue Sep 12 16:01:58 2000 WATANABE Hirofumi <[email protected]> Tue Sep 12 15:37:55 2000 Yukihiro Matsumoto <[email protected]> - * eval.c (rb_yield_0): stripped array too much, should be just for - proc_call(). + * eval.c (rb_yield_0): stripped array too much, should remove just + for proc_call(). Tue Sep 12 07:05:24 2000 Wakou Aoyama <[email protected]> @@ -98,7 +115,7 @@ Sun Sep 3 23:44:04 2000 Noriaki Harada <[email protected]> Sun Sep 3 11:31:53 2000 Takaaki Tateishi <[email protected]> - * parse.y (rescue): no assignment was done if rescue body as + * parse.y (rescue): no assignment was done if rescue body was empty. Sat Sep 2 10:52:21 2000 Yukihiro Matsumoto <[email protected]> @@ -146,8 +163,7 @@ Wed Aug 30 23:21:20 2000 Yukihiro Matsumoto <[email protected]> * numeric.c (rb_num2long): use rb_Integer() instead of independent convert routine. - * eval.c (rb_rescue2): now arbitrary number of exception types can - be specified. + * eval.c (rb_rescue2): now takes arbitrary number of exception types. * object.c (rb_convert_type): use rb_rescue2 now to handle NameError. @@ -562,7 +562,7 @@ rb_big_eq(x, y) } if (RBIGNUM(x)->sign != RBIGNUM(y)->sign) return Qfalse; if (RBIGNUM(x)->len != RBIGNUM(y)->len) return Qfalse; - if (memcmp(BDIGITS(x),BDIGITS(y),RBIGNUM(y)->len) != 0) return Qfalse; + if (MEMCMP(BDIGITS(x),BDIGITS(y),USHORT,RBIGNUM(y)->len) != 0) return Qfalse; return Qtrue; } @@ -815,8 +815,8 @@ static rb_thread_t curr_thread = 0; static VALUE rb_eval _((VALUE,NODE*)); static VALUE eval _((VALUE,VALUE,VALUE,char*,int)); static NODE *compile _((VALUE, char*, int)); -static VALUE rb_yield_0 _((VALUE, VALUE, VALUE, int)); +static VALUE rb_yield_0 _((VALUE, VALUE, VALUE, int)); static VALUE rb_call _((VALUE,VALUE,ID,int,VALUE*,int)); static VALUE module_setup _((VALUE,NODE*)); @@ -2226,7 +2226,7 @@ rb_eval(self, n) else { result = Qnil; } - result = rb_yield_0(result, 0, 0, Qfalse); + result = rb_yield_0(result, 0, 0, 0); break; case NODE_RESCUE: @@ -3503,14 +3503,14 @@ VALUE rb_yield(val) VALUE val; { - return rb_yield_0(val, 0, 0, Qfalse); + return rb_yield_0(val, 0, 0, 0); } static VALUE rb_f_loop() { for (;;) { - rb_yield_0(Qnil, 0, 0, Qfalse); + rb_yield_0(Qnil, 0, 0, 0); CHECK_INTS; } return Qnil; /* dummy */ @@ -4809,7 +4809,7 @@ yield_under_i(self) PUSH_TAG(PROT_NONE); if ((state = EXEC_TAG()) == 0) { - result = rb_yield_0(self, self, ruby_class, Qfalse); + result = rb_yield_0(self, self, ruby_class, 0); } POP_TAG(); ruby_block = old_block; @@ -4819,7 +4819,7 @@ yield_under_i(self) } /* static block, no need to restore */ ruby_block->frame.cbase = ruby_frame->cbase; - return rb_yield_0(self, self, ruby_class, Qfalse); + return rb_yield_0(self, self, ruby_class, 0); } /* block eval under the class/module context */ @@ -5452,9 +5452,6 @@ errat_setter(val, id, var) set_backtrace(ruby_errinfo, val); } -VALUE rb_f_global_variables(); -VALUE f_instance_variables(); - static VALUE rb_f_local_variables() { @@ -7781,7 +7778,7 @@ rb_thread_yield(arg, th) rb_thread_t th; { scope_dup(ruby_block->scope); - return rb_yield_0(callargs(arg), 0, 0, Qfalse); + return rb_yield_0(callargs(arg), 0, 0, Qtrue); } static VALUE @@ -8335,7 +8332,7 @@ rb_f_catch(dmy, tag) t = rb_to_id(tag); PUSH_TAG(t); if ((state = EXEC_TAG()) == 0) { - val = rb_yield_0(tag, 0, 0, Qfalse); + val = rb_yield_0(tag, 0, 0, 0); } else if (state == TAG_THROW && t == prot_tag->dst) { val = prot_tag->retval; @@ -372,6 +372,7 @@ VALUE rb_cvar_get _((VALUE, ID)); int rb_cvar_defined_singleton _((VALUE, ID)); void rb_cvar_set_singleton _((VALUE, ID, VALUE)); VALUE rb_cvar_get_singleton _((VALUE, ID)); +VALUE rb_mod_class_variables _((VALUE)); /* version.c */ void ruby_show_version _((void)); void ruby_show_copyright _((void)); @@ -1176,6 +1176,7 @@ Init_Object() rb_define_method(rb_cModule, "const_defined?", rb_mod_const_defined, 1); rb_define_private_method(rb_cModule, "remove_const", rb_mod_remove_const, 1); rb_define_private_method(rb_cModule, "method_added", rb_obj_dummy, 1); + rb_define_method(rb_cModule, "class_variables", rb_mod_class_variables, 0); rb_define_method(rb_cClass, "new", rb_class_new_instance, -1); rb_define_method(rb_cClass, "superclass", rb_class_superclass, 0); @@ -3397,7 +3397,15 @@ yylex() case '~': /* $~: match-data */ /* fall through */ case '_': /* $_: last read line string */ - local_cnt(c); + c = nextc(); + if (is_identchar(c)) { + tokadd('$'); + tokadd('_'); + break; + } + pushback(c); + c = '_'; + local_cnt('_'); /* fall through */ case '*': /* $*: argv */ case '$': /* $$: pid */ @@ -394,6 +394,7 @@ void xfree _((void*)); #define MEMZERO(p,type,n) memset((p), 0, sizeof(type)*(n)) #define MEMCPY(p1,p2,type,n) memcpy((p1), (p2), sizeof(type)*(n)) #define MEMMOVE(p1,p2,type,n) memmove((p1), (p2), sizeof(type)*(n)) +#define MEMCMP(p1,p2,type,n) memcmp((p1), (p2), sizeof(type)*(n)) void rb_glob _((char*,void(*)(),VALUE)); diff --git a/sample/time.rb b/sample/time.rb index f4f4ec4883..1624fdf992 100644 --- a/sample/time.rb +++ b/sample/time.rb @@ -3,6 +3,6 @@ cmd = ARGV.join(" ") b = Time.now system(cmd) e = Time.now -ut, st, cut, cst = Time.times +ut, st, cut, cst = Time.times.to_a total = (e - b).to_f printf STDERR, "%11.1f real %11.1f user %11.1f sys\n", total, cut, cst diff --git a/variable.c b/variable.c index b37c040681..cd9fe0d48e 100644 --- a/variable.c +++ b/variable.c @@ -1167,11 +1167,10 @@ rb_mod_const_of(mod, ary) VALUE mod; VALUE ary; { - rb_mod_const_at(mod, ary); for (;;) { + rb_mod_const_at(mod, ary); mod = RCLASS(mod)->super; if (!mod) break; - rb_mod_const_at(mod, ary); } return ary; } @@ -1488,6 +1487,40 @@ rb_define_class_variable(klass, name, val) rb_cvar_declare(klass, id, val); } +static int +cv_i(key, value, ary) + ID key; + VALUE value; + VALUE ary; +{ + if (rb_is_class_id(key)) { + VALUE kval = rb_str_new2(rb_id2name(key)); + if (!rb_ary_includes(ary, kval)) { + rb_ary_push(ary, kval); + } + } + return ST_CONTINUE; +} + +VALUE +rb_mod_class_variables(obj) + VALUE obj; +{ + VALUE ary = rb_ary_new(); + + if (!OBJ_TAINTED(obj) && rb_safe_level() >= 4) + rb_raise(rb_eSecurityError, "Insecure: can't get metainfo"); + + for (;;) { + if (RCLASS(obj)->iv_tbl) { + st_foreach(RCLASS(obj)->iv_tbl, cv_i, ary); + } + obj = RCLASS(obj)->super; + if (!obj) break; + } + return ary; +} + VALUE rb_iv_get(obj, name) VALUE obj; |