From 881c5a9c320c637ee0f6526b40cf70c1379ab656 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Fri, 24 Feb 1995 13:15:43 +0900 Subject: version 0.68 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit https://cache.ruby-lang.org/pub/ruby/1.0/ruby-0.67-0.68.diff.gz Fri Feb 24 13:15:43 1995 Yukihiro Matsumoto (matz@ix-02) * version 0.68 Thu Feb 23 11:19:19 1995 Yukihiro Matsumoto (matz@ix-02) * eval.c: resque節のselfの値が間違っていた. * eval.c(rb_clear_cache): キャッシュのクリアし忘れがあった. * eval.c: 定数のスコープをクラス内の静的スコープに変更した.これに よって,特異メソッドからは参照される定数は,レシーバのクラスでは なく,定義されたスコープのクラスの定数となる. Wed Feb 22 00:51:38 1995 Yukihiro Matsumoto (matz@dyna) * regex.c: ignorecaseを正規表現のコンパイル前に指定しないと正しく 動作しない.修正. * string.c(toupper,tolower): bug fix. * ENV,VERSION: readonly変数から定数へ. --- ChangeLog | 36 +++++++++++ array.c | 2 +- class.c | 22 +------ compar.c | 2 +- cons.c | 2 +- dbm.c | 2 +- dict.c | 7 +-- dir.c | 2 +- dln.c | 2 +- enum.c | 2 +- env.h | 2 + error.c | 2 +- eval.c | 138 ++++++++++++++++++++++++++++++++---------- file.c | 2 +- gc.c | 4 +- ident.h | 2 +- inits.c | 2 +- io.c | 33 +++++----- io.h | 2 +- math.c | 2 +- node.h | 99 +++++++++++++++--------------- numeric.c | 2 +- object.c | 2 +- pack.c | 2 +- parse.y | 134 +++++++++++++++++++++++------------------ process.c | 2 +- random.c | 2 +- range.c | 2 +- re.c | 50 +++++++++------- re.h | 2 +- regex.c | 10 ++-- ruby.c | 4 +- ruby.h | 2 +- sample/MANIFEST | 1 + sample/biorhythm.rb | 24 ++++---- sample/cbreak.rb | 4 +- sample/clnt.rb | 2 +- sample/from.rb | 100 +++++++++++++++++++++++++++++++ sample/io.rb | 2 +- sample/ruby-mode.el | 6 +- sample/svr.rb | 8 ++- sample/time.rb | 2 +- sample/trojan.rb | 2 +- spec | 170 +++++++++++++++++++++++++--------------------------- sprintf.c | 2 +- string.c | 17 +++--- struct.c | 2 +- time.c | 2 +- variable.c | 15 ++++- version.c | 11 ++-- version.h | 4 +- 51 files changed, 587 insertions(+), 368 deletions(-) create mode 100644 sample/from.rb diff --git a/ChangeLog b/ChangeLog index f66a446971..78d6488e6d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,35 @@ +Fri Feb 24 13:15:43 1995 Yukihiro Matsumoto (matz@ix-02) + + * version 0.68 + +Thu Feb 23 11:19:19 1995 Yukihiro Matsumoto (matz@ix-02) + + * eval.c: resqueselfְͤäƤ + + * eval.c(rb_clear_cache): åΥꥢ˺줬ä + + * eval.c: Υפ򥯥饹Ūפѹ + äơðۥ᥽åɤϻȤϡ쥷ФΥ饹Ǥ + ʤ줿פΥ饹Ȥʤ롥 + +Wed Feb 22 00:51:38 1995 Yukihiro Matsumoto (matz@dyna) + + * regex.c: ignorecaseɽΥѥ˻ꤷʤ + ưʤ + + * string.c(toupper,tolower): bug fix. + + * ENV,VERSION: readonlyѿء + +Tue Feb 21 18:56:56 1995 Yukihiro Matsumoto (matz@ix-02) + + * io.c(STDIN, STDOUT, STDERR): ȤޤǤ$stdinʤ + Ͼʤʤ뤫Τʤ + + * io.c(select): bug fix. + + * version 0.67 + Mon Feb 20 16:10:14 1995 Yukihiro Matsumoto (matz@ix-02) * parse.y(yylex): `%̻'顤1ʸʸμ̻Ҥ @@ -38,11 +70,15 @@ Fri Feb 10 16:30:00 1995 Yukihiro Matsumoto (matz@ix-02) Thu Feb 9 16:18:37 1995 Yukihiro Matsumoto (matz@ix-02) + * version 0.66 + * parse.y: protectbeginѹbegin..end㳰Ǥʤ ʸ̤ȤƤƯȤˤʤä Wed Feb 1 19:48:24 1995 Yukihiro Matsumoto (matz@ix-02) + * version 0.65 + * string.c(str_replace): ֤ʸĹꥳ ԡ򤷤ʤ diff --git a/array.c b/array.c index 895a6797ed..120fd13019 100644 --- a/array.c +++ b/array.c @@ -6,7 +6,7 @@ $Date: 1995/01/10 10:42:18 $ created at: Fri Aug 6 09:46:12 JST 1993 - Copyright (C) 1994 Yukihiro Matsumoto + Copyright (C) 1995 Yukihiro Matsumoto ************************************************/ diff --git a/class.c b/class.c index 2d051832c8..a7fbf7a2f5 100644 --- a/class.c +++ b/class.c @@ -6,7 +6,7 @@ $Date: 1995/01/12 08:54:44 $ created at: Tue Aug 10 15:05:44 JST 1993 - Copyright (C) 1994 Yukihiro Matsumoto + Copyright (C) 1995 Yukihiro Matsumoto ************************************************/ @@ -203,7 +203,7 @@ rb_include_module(class, module) Check_Type(module, T_MODULE); if (BUILTIN_TYPE(class) == T_CLASS) { - rb_clear_cache2(class); + rb_clear_cache(class); } while (module) { @@ -223,24 +223,6 @@ rb_include_module(class, module) } } -void -rb_add_method(class, mid, node, noex) - struct RClass *class; - ID mid; - NODE *node; - int noex; -{ - NODE *body; - - if (class == Qnil) class = (struct RClass*)C_Object; - if (st_lookup(class->m_tbl, mid, &body)) { - Warning("redefine %s", rb_id2name(mid)); - rb_clear_cache(body); - } - body = NEW_METHOD(node, noex); - st_insert(class->m_tbl, mid, body); -} - void rb_define_method(class, name, func, argc) struct RClass *class; diff --git a/compar.c b/compar.c index e3861b77a6..dee8f3f4bf 100644 --- a/compar.c +++ b/compar.c @@ -6,7 +6,7 @@ $Date: 1994/10/14 06:19:05 $ created at: Thu Aug 26 14:39:48 JST 1993 - Copyright (C) 1994 Yukihiro Matsumoto + Copyright (C) 1995 Yukihiro Matsumoto ************************************************/ diff --git a/cons.c b/cons.c index bf755865c9..42df8cb4fa 100644 --- a/cons.c +++ b/cons.c @@ -6,7 +6,7 @@ $Date: 1995/01/10 10:30:37 $ created at: Fri Jan 6 10:10:36 JST 1995 - Copyright (C) 1994 Yukihiro Matsumoto + Copyright (C) 1995 Yukihiro Matsumoto ************************************************/ diff --git a/dbm.c b/dbm.c index ed605614a0..dfe0a8bf83 100644 --- a/dbm.c +++ b/dbm.c @@ -6,7 +6,7 @@ $Date: 1995/01/10 10:42:24 $ created at: Mon Jan 24 15:59:52 JST 1994 - Copyright (C) 1994 Yukihiro Matsumoto + Copyright (C) 1995 Yukihiro Matsumoto ************************************************/ diff --git a/dict.c b/dict.c index b973fb7175..364a1ac99f 100644 --- a/dict.c +++ b/dict.c @@ -6,7 +6,7 @@ $Date: 1995/01/10 10:42:26 $ created at: Mon Nov 22 18:51:18 JST 1993 - Copyright (C) 1994 Yukihiro Matsumoto + Copyright (C) 1995 Yukihiro Matsumoto ************************************************/ @@ -614,7 +614,6 @@ Init_Dict() rb_define_method(C_Dict,"has_key", Fdic_has_key, 1); rb_define_method(C_Dict,"has_value", Fdic_has_value, 1); - envtbl = obj_alloc(C_Object); rb_define_single_method(envtbl,"[]", Fgetenv, 1); rb_define_single_method(envtbl,"[]=", Fsetenv, 2); @@ -624,7 +623,5 @@ Init_Dict() rb_include_module(CLASS_OF(envtbl), M_Enumerable); rb_define_variable("$ENV", &envtbl, Qnil, rb_readonly_hook, 0); - - rb_define_private_method(C_Kernel, "getenv", Fgetenv, 1); - rb_define_private_method(C_Kernel, "setenv", Fsetenv, 2); + rb_define_const(C_Kernel, "ENV", envtbl); } diff --git a/dir.c b/dir.c index 73478a70e0..f20e555a2f 100644 --- a/dir.c +++ b/dir.c @@ -6,7 +6,7 @@ $Date: 1995/01/10 10:42:28 $ created at: Wed Jan 5 09:51:01 JST 1994 - Copyright (C) 1994 Yukihiro Matsumoto + Copyright (C) 1995 Yukihiro Matsumoto ************************************************/ diff --git a/dln.c b/dln.c index 2e1ff5aed5..e0be1808eb 100644 --- a/dln.c +++ b/dln.c @@ -6,7 +6,7 @@ $Date: 1994/12/09 01:28:23 $ created at: Tue Jan 18 17:05:06 JST 1994 - Copyright (C) 1994 Yukihiro Matsumoto + Copyright (C) 1995 Yukihiro Matsumoto ************************************************/ diff --git a/enum.c b/enum.c index a27c9860d2..42960149b3 100644 --- a/enum.c +++ b/enum.c @@ -6,7 +6,7 @@ $Date: 1995/01/10 10:42:29 $ created at: Fri Oct 1 15:15:19 JST 1993 - Copyright (C) 1994 Yukihiro Matsumoto + Copyright (C) 1995 Yukihiro Matsumoto ************************************************/ diff --git a/env.h b/env.h index b13b5f0683..2076c25608 100644 --- a/env.h +++ b/env.h @@ -30,4 +30,6 @@ struct SCOPE { extern int rb_in_eval; +extern struct RClass *the_class; + #endif /* ENV_H */ diff --git a/error.c b/error.c index dad7c5f70a..d9dcbe0516 100644 --- a/error.c +++ b/error.c @@ -6,7 +6,7 @@ $Date: 1995/01/10 10:42:31 $ created at: Mon Aug 9 16:11:34 JST 1993 - Copyright (C) 1994 Yukihiro Matsumoto + Copyright (C) 1995 Yukihiro Matsumoto ************************************************/ diff --git a/eval.c b/eval.c index 0287e9f52c..b0d8022074 100644 --- a/eval.c +++ b/eval.c @@ -6,7 +6,7 @@ $Date: 1995/01/12 08:54:45 $ created at: Thu Jun 10 14:22:17 JST 1993 - Copyright (C) 1994 Yukihiro Matsumoto + Copyright (C) 1995 Yukihiro Matsumoto ************************************************/ @@ -19,7 +19,8 @@ #include #include "st.h" -void rb_clear_cache(); +static void rb_clear_cache_body(); +static void rb_clear_cache_entry(); /* #define TEST /* prints cache miss */ #ifdef TEST @@ -40,6 +41,27 @@ struct cache_entry { /* method hash table. */ static struct cache_entry cache[CACHE_SIZE]; +void +rb_add_method(class, mid, node, noex) + struct RClass *class; + ID mid; + NODE *node; + int noex; +{ + NODE *body; + + if (class == Qnil) class = (struct RClass*)C_Object; + if (st_lookup(class->m_tbl, mid, &body)) { + Warning("redefine %s", rb_id2name(mid)); + rb_clear_cache_body(body); + } + else { + rb_clear_cache_entry(class, mid); + } + body = NEW_METHOD(node, noex); + st_insert(class->m_tbl, mid, body); +} + static NODE* search_method(class, id, origin) struct RClass *class, **origin; @@ -116,7 +138,10 @@ rb_alias(class, name, def) if (st_lookup(class->m_tbl, name, &old)) { Warning("redefine %s", rb_id2name(name)); - rb_clear_cache(old->nd_body); + rb_clear_cache_body(body); + } + else { + rb_clear_cache_entry(class, name); } st_insert(class->m_tbl, name, @@ -158,8 +183,8 @@ rb_method_boundp(class, id) return FALSE; } -void -rb_clear_cache(body) +static void +rb_clear_cache_body(body) NODE *body; { struct cache_entry *ent, *end; @@ -174,8 +199,23 @@ rb_clear_cache(body) } } +static void +rb_clear_cache_entry(class, mid) + struct RClass *class; + ID mid; +{ + struct cache_entry *ent; + + /* is it in the method cache? */ + ent = cache + EXPR1(class, mid); + if (ent->mid == mid && ent->class == class) { + ent->class = Qnil; + ent->mid = Qnil; + } +} + void -rb_clear_cache2(class) +rb_clear_cache(class) struct RClass *class; { struct cache_entry *ent, *end; @@ -285,6 +325,7 @@ static struct tag { #define EXEC_TAG() (setjmp(prot_tag->buf)) #define JUMP_TAG(val) { \ + Qself = prot_tag->self; \ the_env = prot_tag->env; \ iter = prot_tag->iter; \ longjmp(prot_tag->buf,(val)); \ @@ -305,7 +346,7 @@ static struct tag { #define IN_BLOCK 0x08 -static struct RClass *the_class; +struct RClass *the_class; struct class_link { struct RClass *class; struct class_link *prev; @@ -338,6 +379,8 @@ VALUE rb_apply(); VALUE rb_xstring(); void rb_fail(); +static void module_setup(); + static VALUE masign(); static void asign(); @@ -396,6 +439,8 @@ ruby_init(argc, argv, envp) PUSH_TAG(); PUSH_ITER(ITER_NOT); if ((state = EXEC_TAG()) == 0) { + rb_call_inits(); + the_class = (struct RClass*)C_Object; ruby_init0(argc, argv, envp); } POP_ITER(); @@ -448,7 +493,6 @@ ruby_run() PUSH_TAG(); PUSH_ITER(ITER_NOT); if ((state = EXEC_TAG()) == 0) { - the_class = (struct RClass*)C_Object; Eval(); } POP_ITER(); @@ -1038,8 +1082,9 @@ rb_eval(node) case NODE_CVAR: { - VALUE val = rb_const_get(node->nd_vid); + VALUE val; + val = rb_const_get(node->nd_rval->nd_clss, node->nd_vid); nd_set_type(node, NODE_CONST); node->nd_cval = val; return val; @@ -1114,7 +1159,9 @@ rb_eval(node) list = list->nd_next; } if (nd_type(node) == NODE_DREGX) { - return regexp_new(RSTRING(str)->ptr, RSTRING(str)->len); + VALUE re = regexp_new(RSTRING(str)->ptr, RSTRING(str)->len, + node->nd_cflag); + return re; } if (nd_type(node) == NODE_XSTR2) { return rb_xstring(str); @@ -1195,17 +1242,8 @@ rb_eval(node) class = rb_define_class_id(node->nd_cname, super); rb_const_set(the_class, node->nd_cname, class); - PUSH_CLASS(); - the_class = (struct RClass*)class; - PUSH_SELF((VALUE)the_class); - PUSH_TAG(); - if ((state = EXEC_TAG()) == 0) { - rb_eval(node->nd_body); - } - POP_TAG(); - POP_SELF(); - POP_CLASS(); - if (state) JUMP_TAG(state); + + module_setup(class, node->nd_body); return class; } @@ -1219,17 +1257,8 @@ rb_eval(node) module = rb_define_module_id(node->nd_cname); rb_const_set(the_class, node->nd_cname, module); - PUSH_CLASS(); - the_class = (struct RClass*)module; - PUSH_SELF((VALUE)the_class); - PUSH_TAG(); - if ((state = EXEC_TAG()) == 0) { - rb_eval(node->nd_body); - } - POP_TAG(); - POP_SELF(); - POP_CLASS(); - if (state) JUMP_TAG(state); + + module_setup(module, node->nd_body); return module; } @@ -1237,7 +1266,7 @@ rb_eval(node) { struct RClass *module; - module = (struct RClass*)rb_const_get(node->nd_modl); + module = (struct RClass*)rb_const_get(CLASS_OF(Qself), node->nd_modl); if (module == Qnil) { Fail("undefined module %s", rb_id2name(node->nd_modl)); } @@ -1251,6 +1280,49 @@ rb_eval(node) return Qnil; /* not reached */ } +static void +module_setup(module, node) + VALUE module; + NODE *node; +{ + int state; + + /* fill c-ref */ + node->nd_clss = module; + node = node->nd_body; + + PUSH_CLASS(); + the_class = (struct RClass*)module; + PUSH_SELF((VALUE)the_class); + PUSH_SCOPE(); + PUSH_TAG(); + + if (node->nd_cnt > 0) { + the_scope->local_vars = ALLOCA_N(VALUE, node->nd_cnt); + MEMZERO(the_scope->local_vars, VALUE, node->nd_cnt); + the_scope->local_tbl = node->nd_tbl; + } + else { + the_scope->local_vars = Qnil; + the_scope->local_tbl = Qnil; + } + + if ((state = EXEC_TAG()) == 0) { + rb_eval(node->nd_body); + } + + POP_TAG(); + if (!(the_scope->flags & SCOPE_MALLOCED)) { + the_scope->local_vars = Qnil; + the_scope->local_tbl = Qnil; + } + if (state != 0) JUMP_TAG(state); + POP_SCOPE(); + POP_SELF(); + POP_CLASS(); + if (state) JUMP_TAG(state); +} + VALUE obj_responds_to(obj, msg) VALUE obj; diff --git a/file.c b/file.c index 6f10099c33..a1729dee55 100644 --- a/file.c +++ b/file.c @@ -7,7 +7,7 @@ $Date: 1995/01/10 10:42:36 $ created at: Mon Nov 15 12:24:34 JST 1993 - Copyright (C) 1994 Yukihiro Matsumoto + Copyright (C) 1995 Yukihiro Matsumoto ************************************************/ diff --git a/gc.c b/gc.c index ec07c0fa95..9c9a2a2ed9 100644 --- a/gc.c +++ b/gc.c @@ -6,7 +6,7 @@ $Date: 1995/01/12 08:54:47 $ created at: Tue Oct 5 09:44:46 JST 1993 - Copyright (C) 1994 Yukihiro Matsumoto + Copyright (C) 1995 Yukihiro Matsumoto ************************************************/ @@ -513,7 +513,7 @@ obj_free(obj) break; case T_MODULE: case T_CLASS: - rb_clear_cache2(obj); + rb_clear_cache(obj); st_free_table(obj->as.class.m_tbl); if (obj->as.object.iv_tbl) st_free_table(obj->as.object.iv_tbl); break; diff --git a/ident.h b/ident.h index d1b46c8381..acf738ba9b 100644 --- a/ident.h +++ b/ident.h @@ -7,7 +7,7 @@ $Date: 1994/08/12 04:47:29 $ created at: Mon Jan 31 16:23:19 JST 1994 - Copyright (C) 1994 Yukihiro Matsumoto + Copyright (C) 1995 Yukihiro Matsumoto ************************************************/ diff --git a/inits.c b/inits.c index 45475e173f..271fa7de44 100644 --- a/inits.c +++ b/inits.c @@ -6,7 +6,7 @@ $Date: 1995/01/10 10:42:38 $ created at: Tue Dec 28 16:01:58 JST 1993 - Copyright (C) 1994 Yukihiro Matsumoto + Copyright (C) 1995 Yukihiro Matsumoto ************************************************/ diff --git a/io.c b/io.c index 288e86d4d9..ac94f9ee9c 100644 --- a/io.c +++ b/io.c @@ -6,7 +6,7 @@ $Date: 1995/01/10 10:42:39 $ created at: Fri Oct 15 18:08:59 JST 1993 - Copyright (C) 1994 Yukihiro Matsumoto + Copyright (C) 1995 Yukihiro Matsumoto ************************************************/ @@ -334,9 +334,8 @@ Fio_gets(obj) if (str) { fptr->lineno++; lineno = INT2FIX(fptr->lineno); - return rb_lastline = (VALUE)str; } - return Qnil; + return rb_lastline = (VALUE)str; } static VALUE @@ -936,22 +935,18 @@ rb_xstring(str) struct timeval *time_timeval(); -#ifdef STDSTDIO -# define READ_PENDING(fp) ((fp)->_cnt != 0) -#else -# ifdef __SLBF -# define READ_PENDING(fp) ((fp)->_r > 0) -# else -# ifdef __linux__ +#ifdef _STDIO_USES_IOSTREAM /* GNU libc */ # ifdef _other_gbase -# define READ_PENDING(fp) ((fp)->_IO_read_ptr < (fp)->_IO_read_end) +# define READ_DATA_PENDING(fp) ((fp)->_IO_read_ptr < (fp)->_IO_read_end) # else -# define READ_PENDING(fp) ((fp)->_gptr < (fp)->_egptr) +# define READ_DATA_PENDING(fp) ((fp)->_gptr < (fp)->_egptr) # endif -# else +#elif __SLBF +# define READ_DATA_PENDING(fp) (fp->_r > 0) +#elif STDSTDIO +# define READ_DATA_PENDING(fp) (fp->_cnt != 0) +#else --------------> You Lose <-------------- -# endif -# endif #endif static VALUE @@ -968,7 +963,7 @@ Fselect(argc, argv, obj) int i, max = 0, n; int interrupt = 0; - rb_scan_args(argc, argv, argv, "13", &read, &write, &except, &timeout); + rb_scan_args(argc, argv, "13", &read, &write, &except, &timeout); if (timeout) { tp = time_timeval(timeout); } @@ -986,7 +981,7 @@ Fselect(argc, argv, obj) for (i=0; ilen; i++) { GetOpenFile(RARRAY(read)->ptr[i], fptr); FD_SET(fileno(fptr->f), rp); - if (READ_PENDING(fptr->f)) { /* check for buffered data */ + if (READ_DATA_PENDING(fptr->f)) { /* check for buffered data */ pending++; FD_SET(fileno(fptr->f), &pset); } @@ -1395,6 +1390,10 @@ Init_IO() rb_defout = rb_stdout; rb_define_variable("$>", &rb_defout, Qnil, io_defset, 0); + rb_define_const(C_Object, "STDIN", rb_stdin); + rb_define_const(C_Object, "STDOUT", rb_stdout); + rb_define_const(C_Object, "STDERR", rb_stderr); + argf = obj_alloc(C_Object); rb_define_variable("$<", &argf, Qnil, rb_readonly_hook, 0); rb_define_variable("$ARGF", &argf, Qnil, rb_readonly_hook, 0); diff --git a/io.h b/io.h index c1216598f9..2205906321 100644 --- a/io.h +++ b/io.h @@ -7,7 +7,7 @@ $Date: 1994/08/12 11:06:42 $ created at: Fri Nov 12 16:47:09 JST 1993 - Copyright (C) 1994 Yukihiro Matsumoto + Copyright (C) 1995 Yukihiro Matsumoto ************************************************/ diff --git a/math.c b/math.c index 6a6c720c1e..78a6615e7f 100644 --- a/math.c +++ b/math.c @@ -6,7 +6,7 @@ $Date: 1994/11/01 08:28:03 $ created at: Tue Jan 25 14:12:56 JST 1994 - Copyright (C) 1994 Yukihiro Matsumoto + Copyright (C) 1995 Yukihiro Matsumoto ************************************************/ diff --git a/node.h b/node.h index 9af249e4ac..7db04c5c95 100644 --- a/node.h +++ b/node.h @@ -6,7 +6,7 @@ $Date: 1995/01/10 10:42:41 $ created at: Fri May 28 15:14:02 JST 1993 - Copyright (C) 1994 Yukihiro Matsumoto + Copyright (C) 1995 Yukihiro Matsumoto ************************************************/ @@ -70,6 +70,7 @@ enum node_type { NODE_UNDEF, NODE_CLASS, NODE_MODULE, + NODE_CREF, NODE_INC, NODE_DOT3, NODE_ATTRSET, @@ -165,73 +166,77 @@ typedef struct RNode { #define nd_super u3.id #define nd_modl u1.id +#define nd_clss u1.value #define nd_beg u1.node #define nd_end u2.node #define nd_state u3.state #define nd_rval u3.node -#define NEW_METHOD(n,x) newnode(NODE_METHOD,x,n,Qnil) +#define NEW_METHOD(n,x) newnode(NODE_METHOD,x,n,0) #define NEW_FBODY(n,i,o) newnode(NODE_FBODY,n,i,o) -#define NEW_DEFN(i,d,p) newnode(NODE_DEFN,p,i,d) -#define NEW_DEFS(r,i,d) newnode(NODE_DEFS,r,i,d) -#define NEW_CFUNC(f,c) newnode(NODE_CFUNC,f,c,Qnil) +#define NEW_DEFN(i,a,d,p) newnode(NODE_DEFN,p,i,NEW_RFUNC(a,d)) +#define NEW_DEFS(r,i,a,d) newnode(NODE_DEFS,r,i,NEW_RFUNC(a,d)) +#define NEW_CFUNC(f,c) newnode(NODE_CFUNC,f,c,0) #define NEW_RFUNC(b1,b2) NEW_SCOPE(block_append(b1,b2)) #define NEW_SCOPE(b) newnode(NODE_SCOPE,local_tbl(),(b),local_cnt(0)) -#define NEW_BLOCK(a) newnode(NODE_BLOCK,a,1,Qnil) +#define NEW_BLOCK(a) newnode(NODE_BLOCK,a,1,0) #define NEW_IF(c,t,e) newnode(NODE_IF,c,t,e) -#define NEW_EXNOT(c) newnode(NODE_EXNOT,c,Qnil,Qnil) -#define NEW_CASE(h,b) newnode(NODE_CASE,h,b,Qnil) +#define NEW_EXNOT(c) newnode(NODE_EXNOT,c,0,0) +#define NEW_CASE(h,b) newnode(NODE_CASE,h,b,0) #define NEW_WHEN(c,t,e) newnode(NODE_WHEN,c,t,e) -#define NEW_WHILE(c,b) newnode(NODE_WHILE,c,b,Qnil) -#define NEW_WHILE2(c,b) newnode(NODE_WHILE2,c,b,Qnil) +#define NEW_WHILE(c,b) newnode(NODE_WHILE,c,b,0) +#define NEW_WHILE2(c,b) newnode(NODE_WHILE2,c,b,0) #define NEW_FOR(v,i,b) newnode(NODE_FOR,v,b,i) #define NEW_ITER(v,i,b) newnode(NODE_ITER,v,b,i) #define NEW_BEGIN(b,ex,en) newnode(NODE_BEGIN,b,ex,en) -#define NEW_REDO() newnode(NODE_REDO,Qnil,Qnil,Qnil) -#define NEW_BREAK() newnode(NODE_BREAK,Qnil,Qnil,Qnil) -#define NEW_CONT() newnode(NODE_CONTINUE,Qnil,Qnil,Qnil) -#define NEW_RETRY() newnode(NODE_RETRY,Qnil,Qnil,Qnil) -#define NEW_RET(s) newnode(NODE_RETURN,s,Qnil,Qnil) -#define NEW_FAIL(s) newnode(NODE_FAIL,s,Qnil,Qnil) -#define NEW_YIELD(a) newnode(NODE_YIELD,a,Qnil,Qnil) +#define NEW_REDO() newnode(NODE_REDO,0,0,0) +#define NEW_BREAK() newnode(NODE_BREAK,0,0,0) +#define NEW_CONT() newnode(NODE_CONTINUE,0,0,0) +#define NEW_RETRY() newnode(NODE_RETRY,0,0,0) +#define NEW_RET(s) newnode(NODE_RETURN,s,0,0) +#define NEW_FAIL(s) newnode(NODE_FAIL,s,0,0) +#define NEW_YIELD(a) newnode(NODE_YIELD,a,0,0) #define NEW_LIST(a) NEW_ARRAY(a) -#define NEW_ARRAY(a) newnode(NODE_ARRAY,a,1,Qnil) -#define NEW_ZARRAY() newnode(NODE_ZARRAY,Qnil,Qnil,Qnil) -#define NEW_HASH(a) newnode(NODE_HASH,a,Qnil,Qnil) -#define NEW_AND(a,b) newnode(NODE_AND,a,b,Qnil) -#define NEW_OR(a,b) newnode(NODE_OR,a,b,Qnil) -#define NEW_NOT(a) newnode(NODE_NOT,Qnil,a,Qnil) -#define NEW_MASGN(l,r) newnode(NODE_MASGN,l,r,Qnil) +#define NEW_ARRAY(a) newnode(NODE_ARRAY,a,1,0) +#define NEW_ZARRAY() newnode(NODE_ZARRAY,0,0,0) +#define NEW_HASH(a) newnode(NODE_HASH,a,0,0) +#define NEW_AND(a,b) newnode(NODE_AND,a,b,0) +#define NEW_OR(a,b) newnode(NODE_OR,a,b,0) +#define NEW_NOT(a) newnode(NODE_NOT,0,a,0) +#define NEW_MASGN(l,r) newnode(NODE_MASGN,l,r,0) #define NEW_GASGN(v,val) newnode(NODE_GASGN,v,val,rb_global_entry(v)) #define NEW_LASGN(v,val) newnode(NODE_LASGN,v,val,local_cnt(v)) -#define NEW_IASGN(v,val) newnode(NODE_IASGN,v,val,Qnil) -#define NEW_CASGN(v,val) newnode(NODE_CASGN,v,val,Qnil) +#define NEW_IASGN(v,val) newnode(NODE_IASGN,v,val,0) +#define NEW_CASGN(v,val) newnode(NODE_CASGN,v,val,0) #define NEW_OP_ASGN1(p,id,a) newnode(NODE_OP_ASGN1,p,id,a) #define NEW_OP_ASGN2(r,i,val) newnode(NODE_OP_ASGN1,r,val,i) -#define NEW_GVAR(v) newnode(NODE_GVAR,v,Qnil,rb_global_entry(v)) -#define NEW_LVAR(v) newnode(NODE_LVAR,v,Qnil,local_cnt(v)) -#define NEW_LVAR2(v) newnode(NODE_LVAR2,v,Qnil,local_cnt(v)) -#define NEW_IVAR(v) newnode(NODE_IVAR,v,Qnil,Qnil) -#define NEW_CVAR(v) newnode(NODE_CVAR,v,Qnil,Qnil) -#define NEW_LIT(l) newnode(NODE_LIT,l,Qnil,Qnil) -#define NEW_STR(s) newnode(NODE_STR,s,Qnil,Qnil) -#define NEW_STR2(s) newnode(NODE_STR2,s,Qnil,Qnil) -#define NEW_XSTR(s) newnode(NODE_XSTR,s,Qnil,Qnil) -#define NEW_XSTR2(s) newnode(NODE_XSTR2,s,Qnil,Qnil) +#define NEW_GVAR(v) newnode(NODE_GVAR,v,0,rb_global_entry(v)) +#define NEW_LVAR(v) newnode(NODE_LVAR,v,0,local_cnt(v)) +#define NEW_LVAR2(v) newnode(NODE_LVAR2,v,0,0) +#define NEW_IVAR(v) newnode(NODE_IVAR,v,0,0) +#define NEW_CVAR(v) newnode(NODE_CVAR,v,0,cref_list) +#define NEW_LIT(l) newnode(NODE_LIT,l,0,0) +#define NEW_STR(s) newnode(NODE_STR,s,0,0) +#define NEW_STR2(s) newnode(NODE_STR2,s,0,0) +#define NEW_XSTR(s) newnode(NODE_XSTR,s,0,0) +#define NEW_XSTR2(s) newnode(NODE_XSTR2,s,0,0) #define NEW_CALL(r,m,a) newnode(NODE_CALL,r,m,a) -#define NEW_SUPER(a) newnode(NODE_SUPER,Qnil,Qnil,a) -#define NEW_ZSUPER() newnode(NODE_ZSUPER,Qnil,Qnil,Qnil) -#define NEW_ARGS(f,r) newnode(NODE_ARGS,Qnil,r,f) -#define NEW_ALIAS(n,o) newnode(NODE_ALIAS,Qnil,n,o) -#define NEW_UNDEF(i) newnode(NODE_UNDEF,Qnil,i,Qnil) -#define NEW_CLASS(n,b,s) newnode(NODE_CLASS,n,NEW_SCOPE(b),s) -#define NEW_MODULE(n,b) newnode(NODE_MODULE,n,NEW_SCOPE(b),Qnil) -#define NEW_INC(m) newnode(NODE_INC,m,Qnil,Qnil) +#define NEW_SUPER(a) newnode(NODE_SUPER,0,0,a) +#define NEW_ZSUPER() newnode(NODE_ZSUPER,0,0,0) +#define NEW_ARGS(f,r) newnode(NODE_ARGS,0,r,f) +#define NEW_ALIAS(n,o) newnode(NODE_ALIAS,0,n,o) +#define NEW_UNDEF(i) newnode(NODE_UNDEF,0,i,0) +#define NEW_CLASS(n,b,s) newnode(NODE_CLASS,n,NEW_CBODY(b),s) +#define NEW_MODULE(n,b) newnode(NODE_MODULE,n,NEW_CBODY(b),0) +#define NEW_CREF0() (cref_list=newnode(NODE_CREF,the_class,0,0)) +#define NEW_CREF(b) (cref_list=newnode(NODE_CREF,0,0,cref_list)) +#define NEW_CBODY(b) (cref_list->nd_body=NEW_SCOPE(b),cref_list) +#define NEW_INC(m) newnode(NODE_INC,m,0,0) #define NEW_DOT3(b,e) newnode(NODE_DOT3,b,e,0) -#define NEW_ATTRSET(a) newnode(NODE_ATTRSET,a,Qnil,Qnil) -#define NEW_SELF() newnode(NODE_SELF,Qnil,Qnil,Qnil) -#define NEW_NIL() newnode(NODE_NIL,Qnil,Qnil,Qnil) +#define NEW_ATTRSET(a) newnode(NODE_ATTRSET,a,0,0) +#define NEW_SELF() newnode(NODE_SELF,0,0,0) +#define NEW_NIL() newnode(NODE_NIL,0,0,0) NODE *newnode(); VALUE rb_method_booundp(); diff --git a/numeric.c b/numeric.c index cab3c69db3..8381762cd6 100644 --- a/numeric.c +++ b/numeric.c @@ -6,7 +6,7 @@ $Date: 1995/01/10 10:42:42 $ created at: Fri Aug 13 18:33:09 JST 1993 - Copyright (C) 1994 Yukihiro Matsumoto + Copyright (C) 1995 Yukihiro Matsumoto ************************************************/ diff --git a/object.c b/object.c index 6266f77493..7aa16483e1 100644 --- a/object.c +++ b/object.c @@ -6,7 +6,7 @@ $Date: 1995/01/12 08:54:49 $ created at: Thu Jul 15 12:01:24 JST 1993 - Copyright (C) 1994 Yukihiro Matsumoto + Copyright (C) 1995 Yukihiro Matsumoto ************************************************/ diff --git a/pack.c b/pack.c index e0c6e673d3..7935f33928 100644 --- a/pack.c +++ b/pack.c @@ -6,7 +6,7 @@ $Date: 1994/12/09 09:40:22 $ created at: Thu Feb 10 15:17:05 JST 1994 - Copyright (C) 1994 Yukihiro Matsumoto + Copyright (C) 1995 Yukihiro Matsumoto ************************************************/ diff --git a/parse.y b/parse.y index 0566808557..74b500b024 100644 --- a/parse.y +++ b/parse.y @@ -47,8 +47,9 @@ static enum lex_state { EXPR_FNAME, /* ignore newline, +/- is a operator. */ } lex_state; -static ID cur_class = Qnil, cur_mid = Qnil; -static int in_module, in_single; +static int class_nest = 0; +static int in_single = 0; +static ID cur_mid = Qnil; static int value_expr(); static NODE *cond(); @@ -66,16 +67,20 @@ static NODE *asignable(); static NODE *aryset(); static NODE *attrset(); -static void push_local(); -static void pop_local(); -static int local_cnt(); -static int local_id(); -static ID *local_tbl(); +static void local_push(); +static void local_pop(); +static int local_cnt(); +static int local_id(); +static ID *local_tbl(); + +#define cref_push() NEW_CREF(0) +static void cref_pop(); +static NODE *cref_list; struct global_entry* rb_global_entry(); -static void init_top_local(); -static void setup_top_local(); +static void top_local_init(); +static void top_local_setup(); %} %union { @@ -182,12 +187,12 @@ static void setup_top_local(); %% program : { lex_state = EXPR_BEG; - init_top_local(); + top_local_init(); } compexpr { eval_tree = block_append(eval_tree, $2); - setup_top_local(); + top_local_setup(); } compexpr : exprs opt_term @@ -719,6 +724,7 @@ primary : literal | primary '{' opt_iter_var '|' compexpr rbrace { if (nd_type($1) == NODE_LVAR + || nd_type($1) == NODE_LVAR2 || nd_type($1) == NODE_CVAR) { $1 = NEW_CALL(Qnil, $1->nd_vid, Qnil); } @@ -787,59 +793,61 @@ primary : literal if (cur_mid || in_single) Error("class definition in method body"); - cur_class = $2; - push_local(); + class_nest++; + cref_push(); + local_push(); } compexpr END { $$ = NEW_CLASS($2, $5, $3); - pop_local(); - cur_class = Qnil; + local_pop(); + cref_pop(); + class_nest--; } | MODULE CONSTANT { if (cur_mid || in_single) Error("module definition in method body"); - cur_class = $2; - in_module = 1; - push_local(); + class_nest++; + cref_push(); + local_push(); } compexpr END { $$ = NEW_MODULE($2, $4); - pop_local(); - cur_class = Qnil; - in_module = 0; + local_pop(); + cref_pop(); + class_nest--; } | DEF fname { if (cur_mid || in_single) Error("nested method definition"); cur_mid = $2; - push_local(); + local_push(); } f_arglist compexpr END { - $$ = NEW_DEFN($2, NEW_RFUNC($4, $5), cur_class?0:1); - pop_local(); + $$ = NEW_DEFN($2, $4, $5, class_nest?1:0); + local_pop(); cur_mid = Qnil; } | DEF singleton '.' fname { value_expr($2); in_single++; - push_local(); + local_push(); } f_arglist compexpr END { - $$ = NEW_DEFS($2, $4, NEW_RFUNC($6, $7)); - pop_local(); + $$ = NEW_DEFS($2, $4, $6, $7); + local_pop(); in_single--; } @@ -1084,7 +1092,6 @@ rbracket : ']' { yyerrok; } rbrace : '}' { yyerrok; } comma : ',' { yyerrok; } %% - #include #include #include "regex.h" @@ -1221,8 +1228,7 @@ parse_regx() return DREGEXP; } else { - yylval.val = regexp_new(tok(), toklen()); - if (casefold) FL_SET(yylval.val, FL_USER1); + yylval.val = regexp_new(tok(), toklen(), casefold); return REGEXP; } case -1: @@ -1560,24 +1566,24 @@ retry: return '|'; case '+': - if (lex_state == EXPR_BEG || lex_state == EXPR_MID) { - c = nextc(); - pushback(); - if (isdigit(c)) { - goto start_num; - } - lex_state = EXPR_BEG; - return UPLUS; - } - else if (lex_state == EXPR_FNAME) { + if (lex_state == EXPR_FNAME) { if ((c = nextc()) == '@') { return UPLUS; } pushback(); return '+'; } + c = nextc(); + if (lex_state != EXPR_END) { + pushback(); + if (isdigit(c)) { + goto start_num; + } + lex_state = EXPR_BEG; + return UMINUS; + } lex_state = EXPR_BEG; - if ((c = nextc()) == '=') { + if (c == '=') { yylval.id = '+'; return OP_ASGN; } @@ -1585,8 +1591,15 @@ retry: return '+'; case '-': - if (lex_state == EXPR_BEG || lex_state == EXPR_MID) { - c = nextc(); + if (lex_state == EXPR_FNAME) { + if ((c = nextc()) == '@') { + return UMINUS; + } + pushback(); + return '-'; + } + c = nextc(); + if (lex_state != EXPR_END) { pushback(); if (isdigit(c)) { c = '-'; @@ -1595,15 +1608,8 @@ retry: lex_state = EXPR_BEG; return UMINUS; } - else if (lex_state == EXPR_FNAME) { - if ((c = nextc()) == '@') { - return UMINUS; - } - pushback(); - return '-'; - } lex_state = EXPR_BEG; - if ((c = nextc()) == '=') { + if (c == '=') { yylval.id = '-'; return OP_ASGN; } @@ -2448,8 +2454,8 @@ attrset(recv, id, val) { value_expr(recv); value_expr(val); - - id &= ~ID_SCOPE_MASK; + + id &= ~ID_SCOPE_MASK; id |= ID_ATTRSET; return NEW_CALL(recv, id, NEW_LIST(val)); @@ -2555,7 +2561,7 @@ static struct local_vars { } *lvtbl; static void -push_local() +local_push() { struct local_vars *local; @@ -2567,7 +2573,7 @@ push_local() } static void -pop_local() +local_pop() { struct local_vars *local = lvtbl; @@ -2620,10 +2626,10 @@ local_id(id) } static void -init_top_local() +top_local_init() { if (lvtbl == Qnil) { - push_local(); + local_push(); } else if (the_scope->local_tbl) { lvtbl->cnt = the_scope->local_tbl[0]; @@ -2638,10 +2644,11 @@ init_top_local() else { lvtbl->tbl = Qnil; } + NEW_CREF0(); /* initialize constant c-ref */ } static void -setup_top_local() +top_local_setup() { int len = lvtbl->cnt; int i; @@ -2676,6 +2683,16 @@ setup_top_local() free(lvtbl->tbl); } } + cref_list = Qnil; +} + +static void +cref_pop() +{ + NODE *cref = cref_list; + + cref_list = cref_list->nd_next; + cref->nd_next = Qnil; } void @@ -2758,6 +2775,7 @@ Init_sym() int strcmp(); sym_tbl = st_init_table(strcmp, st_strhash); + rb_global_variable(&cref_list); } ID diff --git a/process.c b/process.c index 92ff8b9ac1..e7e22614a5 100644 --- a/process.c +++ b/process.c @@ -6,7 +6,7 @@ $Date: 1995/01/10 10:42:47 $ created at: Tue Aug 10 14:30:50 JST 1993 - Copyright (C) 1994 Yukihiro Matsumoto + Copyright (C) 1995 Yukihiro Matsumoto ************************************************/ diff --git a/random.c b/random.c index b687434642..09d04ffe6a 100644 --- a/random.c +++ b/random.c @@ -6,7 +6,7 @@ $Date: 1995/01/10 10:42:48 $ created at: Fri Dec 24 16:39:21 JST 1993 - Copyright (C) 1994 Yukihiro Matsumoto + Copyright (C) 1995 Yukihiro Matsumoto ************************************************/ diff --git a/range.c b/range.c index 97e68bdf80..e1ca3c986e 100644 --- a/range.c +++ b/range.c @@ -6,7 +6,7 @@ $Date: 1994/12/06 09:30:12 $ created at: Thu Aug 19 17:46:47 JST 1993 - Copyright (C) 1994 Yukihiro Matsumoto + Copyright (C) 1995 Yukihiro Matsumoto ************************************************/ diff --git a/re.c b/re.c index 2b2a06fe09..bc83ec71db 100644 --- a/re.c +++ b/re.c @@ -6,7 +6,7 @@ $Date: 1995/01/10 10:42:49 $ created at: Mon Aug 9 18:24:49 JST 1993 - Copyright (C) 1994 Yukihiro Matsumoto + Copyright (C) 1995 Yukihiro Matsumoto ************************************************/ @@ -84,7 +84,7 @@ str_cicmp(str1, str2) return str1->len - str2->len; } -Regexp* +static Regexp* make_regexp(s, len) char *s; int len; @@ -108,6 +108,7 @@ int len; if ((err = re_compile_pattern(s, (size_t)len, &(rp->pat))) != NULL) Fail("%s: /%s/", err, s); + return rp; } @@ -118,26 +119,27 @@ struct match { }; struct match last_match; +VALUE ignorecase; int -research(reg, str, start, ignorecase) +research(reg, str, start) struct RRegexp *reg; struct RString *str; int start; - int ignorecase; { int result; + int casefold = ignorecase; /* case-flag set for the object */ if (FL_TEST(reg, FL_USER1)) { - ignorecase = 1; + casefold = TRUE; } - if (ignorecase) + if (casefold) reg->ptr->pat.translate = casetable; else reg->ptr->pat.translate = NULL; - if (start >= str->len) return -1; + if (start > str->len) return -1; result = re_search(&(reg->ptr->pat), str->ptr, str->len, start, str->len - start, &(reg->ptr->regs)); @@ -290,14 +292,13 @@ const char *s; Fail(s); } -VALUE ignorecase; VALUE C_Regexp; static VALUE -regexp_new_1(class, s, len) +regexp_new_1(class, s, len, ci) VALUE class; char *s; - int len; + int len, ci; { NEWOBJ(re, struct RRegexp); OBJSETUP(re, class, T_REGEXP); @@ -307,15 +308,17 @@ regexp_new_1(class, s, len) memcpy(re->str, s, len); re->str[len] = '\0'; re->len = len; + + if (ci) FL_SET(re, FL_USER1); return (VALUE)re; } VALUE -regexp_new(s, len) +regexp_new(s, len, ci) char *s; - int len; + int len, ci; { - return regexp_new_1(C_Regexp, s, len); + return regexp_new_1(C_Regexp, s, len, ci); } static VALUE str_cache, reg_cache; @@ -329,7 +332,7 @@ re_regcomp(str) return reg_cache; str_cache = (VALUE)str; - return reg_cache = regexp_new(str->ptr, str->len); + return reg_cache = regexp_new(str->ptr, str->len, ignorecase); } VALUE @@ -340,7 +343,7 @@ Freg_match(re, str) int start; Check_Type(str, T_STRING); - start = research(re, str, 0, ignorecase); + start = research(re, str, 0); if (start == -1) { return Qnil; } @@ -357,7 +360,7 @@ Freg_match2(re) if (TYPE(rb_lastline) != T_STRING) Fail("$_ is not a string"); - start = research(re, rb_lastline, 0, ignorecase); + start = research(re, rb_lastline, 0); if (start == -1) { return Qnil; } @@ -371,27 +374,27 @@ Sreg_new(argc, argv, self) VALUE self; { VALUE src, reg; + int ci = 0; if (argc == 0 || argc > 2) { Fail("wrong # of argument"); } + if (argc == 2 && argv[1]) { + ci = 1; + } src = argv[0]; switch (TYPE(src)) { case T_STRING: - reg = regexp_new_1(self, RREGEXP(src)->ptr, RREGEXP(src)->len); + reg = regexp_new_1(self, RREGEXP(src)->ptr, RREGEXP(src)->len, ci); case T_REGEXP: - reg = regexp_new_1(self, RREGEXP(src)->str, RREGEXP(src)->len); + reg = regexp_new_1(self, RREGEXP(src)->str, RREGEXP(src)->len, ci); default: Check_Type(src, T_STRING); } - if (argc == 2 && argv[1]) { - FL_SET(reg, FL_USER1); - } - return Qnil; } @@ -429,7 +432,8 @@ static VALUE Freg_clone(re) struct RRegexp *re; { - return regexp_new_1(CLASS_OF(re), re->str, re->len); + int ci = FL_TEST(re, FL_USER1); + return regexp_new_1(CLASS_OF(re), re->str, re->len, ci); } VALUE diff --git a/re.h b/re.h index 4c6ecfbdb1..e26d325e1f 100644 --- a/re.h +++ b/re.h @@ -7,7 +7,7 @@ $Date: 1994/08/12 04:47:52 $ created at: Thu Sep 30 14:18:32 JST 1993 - Copyright (C) 1994 Yukihiro Matsumoto + Copyright (C) 1995 Yukihiro Matsumoto ************************************************/ diff --git a/regex.c b/regex.c index e23d33eb11..bfd604f99c 100644 --- a/regex.c +++ b/regex.c @@ -1633,12 +1633,12 @@ re_compile_fastmap (bufp) #endif { case exactn: -#if 0 /* The original was: */ +#if 1 /* The original was: */ if (translate) fastmap[translate[p[1]]] = 1; else fastmap[p[1]] = 1; -#else /* The compiled pattern has already been translated. */ +#else /* The compiled pattern has already been translated. (not true for ruby) */ fastmap[p[1]] = 1; #endif break; @@ -1775,7 +1775,7 @@ re_compile_fastmap (bufp) for (j = *p++ * BYTEWIDTH - 1; j >= 0; j--) if (p[j / BYTEWIDTH] & (1 << (j % BYTEWIDTH))) { -#if 0 /* The original was: */ +#if 1 /* The original was: */ if (translate) fastmap[translate[j]] = 1; else @@ -2911,7 +2911,9 @@ re_match_2 (pbufp, string1_arg, size1, string2_arg, size2, pos, regs, mstop) goto fail; continue; } - if ((unsigned char) translate[c] != (unsigned char) *p++) + /* compiled code translation needed for ruby */ + if ((unsigned char) translate[c] + != (unsigned char) translate[*p++]) goto fail; } while (--mcnt); diff --git a/ruby.c b/ruby.c index 50d4570607..87bb14ba24 100644 --- a/ruby.c +++ b/ruby.c @@ -6,7 +6,7 @@ $Date: 1995/01/10 10:42:51 $ created at: Tue Aug 10 12:47:31 JST 1993 - Copyright (C) 1994 Yukihiro Matsumoto + Copyright (C) 1995 Yukihiro Matsumoto ************************************************/ @@ -421,8 +421,6 @@ ruby_init0(argc, argv, envp) origargc = argc; origargv = argv; origenvp = envp; - rb_call_inits(); - rb_define_variable("$@", &errat, Qnil, Qnil, 0); errat = str_new2(argv[0]); rb_define_variable("$VERBOSE", &verbose, Qnil, Qnil, 0); diff --git a/ruby.h b/ruby.h index b52bd3c46d..5786574502 100644 --- a/ruby.h +++ b/ruby.h @@ -6,7 +6,7 @@ $Date: 1995/01/12 08:54:52 $ created at: Thu Jun 10 14:26:32 JST 1993 - Copyright (C) 1994 Yukihiro Matsumoto + Copyright (C) 1995 Yukihiro Matsumoto *************************************************/ diff --git a/sample/MANIFEST b/sample/MANIFEST index c91c078e39..93c971b114 100644 --- a/sample/MANIFEST +++ b/sample/MANIFEST @@ -20,6 +20,7 @@ fib.pl fib.rb fib.scm freq.rb +from.rb fullpath.pl fullpath.rb gctest.rb diff --git a/sample/biorhythm.rb b/sample/biorhythm.rb index eb14ca7365..5a452e0078 100644 --- a/sample/biorhythm.rb +++ b/sample/biorhythm.rb @@ -76,9 +76,9 @@ end # parseArgs(0, nil, "vg", "D:", "sdate", "date:", "birthday:", "days:") -printf($stderr, "\n") -printf($stderr, "Biorhythm (c) 1987-1994 V3.0\n") -printf($stderr, "\n") +printf(STDERR, "\n") +printf(STDERR, "Biorhythm (c) 1987-1994 V3.0\n") +printf(STDERR, "\n") if ($OPT_D) dtmp = Time.now.strftime("%Y%m%d") jh = dtmp[0,4].to_i @@ -94,11 +94,11 @@ else if ($OPT_birthday) dtmp = $OPT_birthday else - printf($stderr, "Birthday (YYYYMMDD) : ") - dtmp = $stdin.gets.chop + printf(STDERR, "Birthday (YYYYMMDD) : ") + dtmp = STDIN.gets.chop end if (dtmp.length != 8) - printf($stderr, "BAD Input Birthday!!\n") + printf(STDERR, "BAD Input Birthday!!\n") exit() end jg = dtmp[0,4].to_i @@ -112,8 +112,8 @@ else elsif ($OPT_date) dtmp = $OPT_date else - printf($stderr, "Date [ for Systemdate] (YYYYMMDD) : ") - dtmp = $stdin.gets.chop + printf(STDERR, "Date [ for Systemdate] (YYYYMMDD) : ") + dtmp = STDIN.gets.chop end if (dtmp.length != 8) dtmp = Time.now.strftime("%Y%m%d") @@ -127,8 +127,8 @@ else elsif ($OPT_g) ausgabeart = "g" else - printf($stderr, "Values for today or Graph (v/g) [default g] : ") - ausgabeart = $stdin.gets.chop + printf(STDERR, "Values for today or Graph (v/g) [default g] : ") + ausgabeart = STDIN.gets.chop end end if (ausgabeart == "v") @@ -151,8 +151,8 @@ else if ($OPT_D) ktage = 9 else - printf($stderr, "Graph for how many days [default 10] : ") - ktage = $stdin.gets.chop + printf(STDERR, "Graph for how many days [default 10] : ") + ktage = STDIN.gets.chop if (ktage == "") ktage = 9 else diff --git a/sample/cbreak.rb b/sample/cbreak.rb index 5d2d849512..cbb15d2f41 100644 --- a/sample/cbreak.rb +++ b/sample/cbreak.rb @@ -15,7 +15,7 @@ end def set_cbreak (on) tty = "\0" * 256 - $stdin.ioctl(TIOCGETP, tty) + STDIN.ioctl(TIOCGETP, tty) ttys = tty.unpack("C4 S") if on ttys[4] |= CBREAK @@ -25,7 +25,7 @@ def set_cbreak (on) ttys[4] |= ECHO end tty = ttys.pack("C4 S") - $stdin.ioctl(TIOCSETP, tty) + STDIN.ioctl(TIOCSETP, tty) end cbreak(); diff --git a/sample/clnt.rb b/sample/clnt.rb index a687d12211..d2c71ec563 100644 --- a/sample/clnt.rb +++ b/sample/clnt.rb @@ -2,7 +2,7 @@ # usage: ruby clnt.rb [host] port host=(if $ARGV.length == 2; $ARGV.shift; else "localhost"; end) print("Trying ", host, " ...") -$stdout.flush +STDOUT.flush s = TCPsocket.open(host, $ARGV.shift) print(" done\n") print("addr: ", s.addr.join(":"), "\n") diff --git a/sample/from.rb b/sample/from.rb new file mode 100644 index 0000000000..f6602943af --- /dev/null +++ b/sample/from.rb @@ -0,0 +1,100 @@ +#! /usr/local/bin/ruby + +$= = TRUE + +module ParseDate + MONTHS = { + 'jan' => 1, 'feb' => 2, 'mar' => 3, 'apr' => 4, + 'may' => 5, 'jun' => 6, 'jul' => 7, 'aug' => 8, + 'sep' => 9, 'oct' =>10, 'nov' =>11, 'dec' =>12 } + MONTHPAT = MONTHS.keys.join('|') + DAYPAT = 'mon|tue|wed|thu|fri|sat|sun' + + def ParseDate.parsedate(date) + if date.sub(/(#{DAYPAT})/i, ' ') + dayofweek = $1 + end + if date.sub(/\s+(\d+:\d+(:\d+)?)/, ' ') + time = $1 + end + if date =~ /19\d\d/ + year = $& + end + if date.sub(/\s*(\d+)\s+(#{MONTHPAT})\S*\s+/, ' ') + dayofmonth = $1 + monthname = $2 + elsif date.sub(/\s*(#{MONTHPAT})\S*\s+(\d+)\s+/, ' ') + monthname = $1 + dayofmonth = $2 + elsif date.sub(/\s*(#{MONTHPAT})\S*\s+(\d+)\D+/, ' ') + monthname = $1 + dayofmonth = $2 + elsif date.sub(/\s*(\d\d?)\/(\d\d?)/, ' ') + month = $1 + dayofmonth = $2 + end + if monthname + month = MONTHS[monthname.tolower] + end + if ! year && date =~ /\d\d/ + year = $& + end + return year, month, dayofmonth + end + +end + + def parsedate(date) + ParseDate.parsedate(date) + end + +# include ParseDate + +if $ARGV[0] == '-w' + wait = TRUE + $ARGV.shift +end + +$ARGV[0] = '/usr/spool/mail/' + ENV['USER'] if $ARGV.length == 0 + +$outcount = 0; +def fromout(date, from, subj) + y, m, d = parsedate(date) + printf "%-2d/%02d/%02d [%.28s] %.40s\n", y, m, d, from, subj + $outcount += 1 +end + +while TRUE + fields = {} + while gets() + $_.chop + continue if /^From / # skip From-line + break if /^[ \t]*$/ # end of header + if /^(\S+):\s*(.*)/ + fields[attr = $1] = $2 + elsif attr + sub(/^\s*/, '') + fields[attr] += "\n" + $_ + end + end + + break if ! $_ + + fromout fields['Date'], fields['From'], fields['Subject'] + + while gets() +# print $_ + break if /^From / + end + + break if ! $_ +end + +if $outcount == 0 + print "You have no mail.\n" + sleep 2 if wait +elsif wait + system "stty cbreak -echo" + getc() + system "stty cooked echo" +end diff --git a/sample/io.rb b/sample/io.rb index c3c1a47b28..c12e4f4498 100644 --- a/sample/io.rb +++ b/sample/io.rb @@ -1,7 +1,7 @@ # IO test # usage: ruby io.rb file.. -home = getenv("HOME") +home = ENV["HOME"] home.sub("m", "&&") print(home, "\n") print(home.reverse, "\n") diff --git a/sample/ruby-mode.el b/sample/ruby-mode.el index 20e1abebc9..aa91be330d 100644 --- a/sample/ruby-mode.el +++ b/sample/ruby-mode.el @@ -321,12 +321,12 @@ An end of a defun is found by moving forward from the beginning of one." (defun ruby-reindent-then-newline-and-indent () (interactive "*") - (save-excursion - (delete-region (point) (progn (skip-chars-backward " \t") (point)))) (insert ?\n) (save-excursion (forward-line -1) - (indent-according-to-mode)) + (indent-according-to-mode) + (end-of-line) + (delete-region (point) (progn (skip-chars-backward " \t") (point)))) (indent-according-to-mode)) (defun ruby-encomment-region (beg end) diff --git a/sample/svr.rb b/sample/svr.rb index 91faa56dd8..23b2bf71f6 100644 --- a/sample/svr.rb +++ b/sample/svr.rb @@ -2,7 +2,9 @@ # usage: ruby svr.rb gs = TCPserver.open(0) -printf("server port is on %d\n", gs.port) +addr = gs.addr +addr.shift +printf("server is on %d\n", addr.join(":")) socks = [gs] while TRUE @@ -10,7 +12,9 @@ while TRUE if nsock == nil; continue end for s in nsock[0] if s == gs - socks.push(s.accept) + ns = s.accept + socks.push(ns) + print(s, " is accepted\n") else if s.eof print(s, " is gone\n") diff --git a/sample/time.rb b/sample/time.rb index b0ef065ce3..715d98ac9e 100755 --- a/sample/time.rb +++ b/sample/time.rb @@ -5,4 +5,4 @@ system(cmd) e = Time.now ut, st, cut, cst = Time.times total = (e - b).to_f -printf $stderr, "%11.1f real %11.1f user %11.1f sys\n", total, cut, cst +printf STDERR, "%11.1f real %11.1f user %11.1f sys\n", total, cut, cst diff --git a/sample/trojan.rb b/sample/trojan.rb index b42fd166a8..2024da0908 100644 --- a/sample/trojan.rb +++ b/sample/trojan.rb @@ -1,5 +1,5 @@ #! /usr/local/bin/ruby -path = $ENV['PATH'].split(/:/) +path = ENV['PATH'].split(/:/) for dir in path if File.d(dir) diff --git a/spec b/spec index 42849d503b..cf7e3807c9 100644 --- a/spec +++ b/spec @@ -86,8 +86,8 @@ tab) a + b -Τ褦˹ԤǽꡤιԤ³Ȥʾζ -ڤȤƤǧ롥 +Τ褦˹ԤǽꡤιԤ³Ȥ(Ǹʸ +黻Ҥ뤤`,'Ǥ)ζڤȤǧ롥 * ץ @@ -96,19 +96,17 @@ tab) print "hello world!\n" ץϼ¤٤ΤǤ롥ȼδ֤ϥߥ(`;')ޤϲ -ԤǶڤ() - - ιԤ˷³뤳ȤʻˤϲԤϼζڤˤʤʤ +ԤǶڤ롥 * -RubyǤnilʳɾ롥CPerl ʤɤȤϰۤʤꡤ0 +RubyǤnilʳɾ롥CPerlʤɤȤϰۤʤꡤ0 ""(ʸ)ϵȤɾʤΤǵĤ뤳ȡ ** ʸ - "..." # ХååβѿŸ - '...' # Хååβʤ(\\\'ϲ᤹) +֥륯(`"')dz줿ʸϥХåå³ʸʲ +Τ褦˲ᤵ롥 Хåå嵭ˡ @@ -125,17 +123,14 @@ Ruby \^c ȥʸ(cASCIIʸ) \C-c ȥʸ(Ʊ) \M-c ᥿ʸ(c|0x80) - \ʳ ʸΤ - -ʸ󼰤󿷤ʸ󥪥֥ȤΤǡʸƤ -ƤȤȤʸѤʤ + \x ʸxΤ -ѿŸ +ޤ`#'ˤѿŸԤ롥󥰥륯(`'')dz +ʸϡ`\\'(Хåå夽Τ)`\''(󥰥륯) +ơʸȤβԤʤ -֥륯(`"')ǰϤޤ줿ʸɽǤ `#{ѿ̾}'Ȥ -ѿƤŸ뤳ȤǤ롥ѿѿ(`$',`@')ǻ -ޤˤ`#ѿ̾'ȤǤŸǤ롥ʸ`#'³ʸ -`{',`$',`@'ǤʤСΤޤ`#'ȤƲᤵ롥 +ʸ󼰤󿷤ʸ󥪥֥ȤΤǡʸƤ +Ƥ⡤ȤȤʸѤʤ ** ޥɽ @@ -146,7 +141,8 @@ Ruby ** ɽ - /.../[i] +`/'ǰϤޤ줿ʸɽɽ`/'θʸ`i'Ϳ +줿ˤϡɽϥޥåʸʸζ̤򤷤ʤ ^ Ƭ $ @@ -168,8 +164,7 @@ Ruby | ( ) ɽޤȤ -¾ʸƱХåå嵭ˡѿŸͭǤ롥ɽ -θiĤˤʸʸΰ㤤̵뤹롥 +¾ʸƱХåå嵭ˡѿŸͭǤ롥 ** 磻ɥɼ @@ -182,6 +177,14 @@ Ruby ¾ʸƱХåå嵭ˡѿŸͭǤ롥 +** ѿŸ + +֥륯(`"')ǰϤޤ줿ʸ󼰡ޥʸɽ +ӥ磻ɥɼǤ`#{ѿ̾}'ȤѿƤŸ +ȤǤ롥ѿѿ(`$',`@')ǻϤޤˤ`#ѿ̾'Ȥ +ǤŸǤ롥ʸ`#'³ʸ `{',`$',`@'ǤʤСΤޤ +ʸ`#'ȤƲᤵ롥 + ** ͥƥ 123 @@ -237,11 +240,11 @@ Ruby FOOBAR -ʸǻϤޤ뼱̻ҤϤϥ饹ؤΥǤꡤΥ饹 -Υ֥饹Υ󥹥󥹤黲ȤǤ롥ؤϥȥåץ٥롤 -ʤ᥽åɤǤ٥ǤΤǽǤ롥ѿϥ饹 -֤ͤͭ졤ͤѹ뤳ȤǤʤ饹 -μ̿ϥ饹μ̿ +ʸǻϤޤ뼱̻Ҥϥ饹ؤΥǤꡤΥ饹Ƥ +֥饹ΥǻȤǤ롥ؤϥȥåץ٥롤ʤ +᥽åɤǤ٥ǤΤ߲ǽǤ롥ѿϥ饹֤ͤ +ͭ졤ͤѹ뤳ȤǤʤ饹μ̿ +饹μ̿ 饹ϼưŪΤǡ饹̾Ǥ롥 @@ -254,8 +257,10 @@ Ruby ʸޤ`_'ǻϤޤ뼱̻ҤϥѿؤΥǤ롥 ʤѿͤnilǤ -ѿΥפϼ̿⤽Υ֥åνޤ(ȥåץ٥Υ -ѿϥץνλޤ)Ǥ롥 +ѿΥפϥ֥åϰ(᥽åǤϥ᥽åɤν +ޤǡ饹/⥸塼ǤϤνޤ)Ǥ롥̿⤽ +֥åνޤ(ȥåץ٥Υѿϥץνλޤ) +롥 *** ѿ @@ -274,7 +279,6 @@ Ruby : (1+2)*3 - (foo();bar()) ϳ̤ˤäƥ롼ԥ󥰤뤳ȤǤ롥 @@ -352,10 +356,12 @@ Ruby foo -1 # ѿfoo - 1 쥷Фꤷ᥽åɸƤӽФǤϤξ1Ĥʤˤ -άǤ롥 +άǤ(쥷Фꤷʤ硤̤Ĥʤȥѿ +ȤȤƲᤵ) -᥽å̾ȤƤǤդμ̻ҤѤ뤳ȤǤ롥ѿ̾Ȥϼ̻Ҥ -֤̾㤦ΤǽʣƤ⹽ʤ +᥽å̾ȤƤǤդμ̻ҤѤ뤳ȤǤ롥ǽʸʸ +Ǥ⾮ʸǤ⹽ʤѿ̾Ȥϼ̻Ҥ֤̾㤦ΤǽʣƤ +ʤ 饹ʸγǻꤵ줿᥽åɤȥ饹Moduleunexport᥽åɤ ꤵ줿᥽åɤϴؿŪ᥽åɤȸƤФ졤ؿǤƤӽФ @@ -516,9 +522,9 @@ Ruby Ǥ( 1 `[' 2.. `]' `=' n) - 1. `[]=' (2..) + 1. `[]=' (2.., n) -ʳ2黻( 黻 ) +ʳ2黻(1 黻 2) 1. 黻 (2) @@ -535,9 +541,9 @@ Ruby .. ] end -ȽǼ1ξ˼1ɾ롥ʳξϼ2ɾ -롥Rubyifelse ifǤelifǤʤelsififϢ³ԤʤȤ -դ뤳ȡ +ȽǼRubyifelse ifǤelifǤʤelsififϢ³Ԥʤ +Ȥդ뤳ȡ郎ΩƼ¹Ԥ֤ͤ¹Ԥʤä +ͤnil ifξȽμǤʸɽƥϼ$_=~ ƥפ άǤȤߤʤ롥 @@ -613,9 +619,8 @@ or 1ˤʤޤǤϵ֤θϼ2֤ޤǤϿ֤2 ˤʤо֤ϵ롥 -黻`...'ξդϾPǤꡤ `...'ξդμǤʸ -ɽƥϼ$_=~ ƥפξά$.==פξά -Ȳᤵ롥 +`...'ξդμǤʸɽƥϼ$_=~ ƥפξά +ϡ$.==פξάȲᤵ롥 ** NOT @@ -626,7 +631,6 @@ or `!'Ǥʸɽƥϼ$_=~ ƥפξάǤȤ ʤ롥 - 1 `!=' 2 !(1 == 2)פξά @@ -663,9 +667,6 @@ while ƥ졼θƤӽФϰʲιʸǹԤʤ롥 -ƥ졼Ȥ湽¤(ä˥롼)ݲΤѤ᥽åɤ -Ǥ롥ƥ졼θƤӽФϰʲιʸǹԤʤ롥 - `{' ռ.. `|' .. `}' ּפ֥åȤꤷּפΥ᥽åɤ򥤥ƥ졼Ȥɾ @@ -673,7 +674,7 @@ while 쥷Фɽ䡤μϥƥ졼ȤƤϸƤӽФʤּ ʣμޤơƥ졼Ȥƽ˸ƤФ롥 -ƥ졼yield¹Ԥȡǻꤵ줿ͤdoǻꤵ +ƥ졼yield¹Ԥȡǻꤵ줿ͤռǻꤵ 줿ѿ졤֥å¹Ԥ롥֥åμ¹ԤλȤ ͤ yieldͤȤ֤롥᥽åɤƥ졼ȤƸƤӽ 줿ɤϥ᥽åiterator_p()ͤΤ뤳ȤǤ롥ˤ @@ -714,11 +715,12 @@ yield 㳰ȯ롥åͿ줿ˤȯե ֹ̾򥷥ƥѿ`$@'ˡå`$!'˥åȤ롥 -failΰγ̤ۣǤʤ¤άǤ롥 +failΰγ̤ϾάǤ롥 ** BEGIN -ʣμޤȤ뤿begin롥beginηϰʲ̤Ǥ롥 +ʣμޤȤ뤿㳰Τbegin롥beginη +ʲ̤Ǥ롥 begin .. @@ -729,10 +731,10 @@ fail end beginͤϰֺǸɾ줿ͤǤ롥beginνȯ -㳰resqueͤ뤳Ȥ롥ξͤresqueǺ -ɾͤǤ롥ensure᤬¸ߤbeginλ -ɬ(ェλǤʤ㳰, return, break, continue, redoʤ -ˤæФǤ)ensureμɾ롥 +㳰resqueͤ뤳Ȥ롥ξbeginͤ +resqueǺǸɾͤǤ롥ensure᤬¸ߤ +beginλɬ(ェλǤʤ㳰, return, break, +continue, redoʤɤˤæФǤ)ensureμɾ롥 ** RETURN @@ -750,6 +752,7 @@ break Ѥcase ȴѤϻʤ ** CONTINUE + continue continueϤäȤ¦Υ롼פμη֤Ϥ롥 @@ -776,8 +779,7 @@ begin end -饹̾Ǥդμ̻ҤǤ(ʸǻϤ뤳Ȥ侩)饹 -ΥͥȤϤǤʤΤ¾Ǥϥ饹Ǥʤ +饹̾ʸǻϤޤ뼱̻ҤǤ롥 ** ⥸塼 @@ -787,8 +789,7 @@ begin end -⥸塼̾ʸǻϤޤ뼱̻ҤǤ롥饹Ʊ͡⥸塼 -ͥȤǤʤ +⥸塼̾ʸǻϤޤ뼱̻ҤǤ롥 ** ᥽å @@ -830,23 +831,22 @@ begin ɬפ롥̾᥽åȤϰۤʤꡤðۥ᥽åɤϥ᥽å ǤͥȤ뤳ȤǤ롥 -ðۥ᥽åɤ̾ϷѾʤ㳰Ȥƥ饹ðۥ᥽åɤϤ -Υ֥饹ˤѾ롥ؤХ饹ðۥ᥽åɤ¾Υ -Ȼظƥˤ륯饹᥽åɤƯ򤹤롥 +ðۥ᥽åɤ̾ϷѾʤ㳰Ȥƥ饹ðۥ᥽åɤϤ +֥饹ˤѾ롥ؤХ饹ðۥ᥽åɤ¾Υ֥ +Ȼظƥˤ륯饹᥽åɤƯ򤹤롥 ** INCLUDE ⥸塼򥤥󥯥롼ɤ뤳Ȥˤäơ饹ޤϥ⥸塼˵ǽ -ɲäǤ롥⥸塼򥤥󥯥롼ɤ硤Υ⥸塼( -Υ⥸塼뤬˥󥯥롼ɤƤ⥸塼)ƤΥ᥽åɤ -Ѥ̤Τ򤹤Х󥯥롼ɤϸꤵ줿¿ŷѾȤ롥 - -¾Υ⥸塼򥤥󥯥롼ɤ빽ϰʲ̤Ǥ롥 +ɲäǤ롥ߤΥ饹ޤϥ⥸塼(ȥåץ٥Ǥ +Object饹)˻ꤷ⥸塼򥤥󥯥롼ɤ빽ϰʲ̤ +롥 include ⥸塼̾ [`,' ⥸塼̾..] -ߤΥ饹ޤϥ⥸塼(ȥåץ٥ǤObject饹)˻ -ꤷ⥸塼򥤥󥯥롼ɤ롥 +⥸塼򥤥󥯥롼ɤȡΥ⥸塼(ӤΥ⥸塼뤬 +˥󥯥롼ɤƤ⥸塼)ƤΥ᥽åɤѤ̤Τ +򤹤Х󥯥롼ɤϸꤵ줿¿ŷѾ(Mixin)Ȥ롥 ** ALIAS @@ -855,8 +855,8 @@ begin alias ᥽å̾1 ᥽å̾2 ̾դ줿᥽åɤϡλǤΥ᥽åѤΥ -åɤƤ⡤Ť᥽åɤƤӽФ줿ΤƱƯ -롥 +åɤƤ⡤θŤ᥽åɤƤӽФ줿ΤƱ +Ư򤹤롥 ** UNDEF @@ -866,10 +866,10 @@ begin ꤷ᥽åɤä -defˤ̾undefˤäȤȥ饹Υ󥿥ե -򥹡ѡ饹Ωѹ뤳ȤǤ롥᥽åɤself -˥åäƤ⤢Τǡ褯դʤȴ¸Υ᥽å -ưʤʤǽ롥 +defˤ̾undefˤäˤäƥ饹Υ󥿥ե +򥹡ѡ饹Ωѹ뤳ȤǤ롥᥽åɤself + ˥åäƤ⤢Τǡ褯դʤȴ¸Υ᥽ +ɤưʤʤǽ롥 * Ȥ߹ߴؿ @@ -922,10 +922,6 @@ Ruby ɸϤʸФͤɤ߹ʸʸ (ASCII)ɽFixnumǤ롥 - getenv(name) - - name˳ĶѿФ$ENV[name]Ʊ - gets() ȤͿ줿ե(ʤɸ)ǹ벾 @@ -1028,11 +1024,6 @@ Ruby nilǤʤȤ3Ǥ֤γǤ// 㳰ԤΥ֥ȤǤȤƻġ - setenv(name, value) - - nameǻꤵĶѿvalue˥åȤ롥$ENV[name]=value - ƱƯ򤹤롥 - sleep([sec]) secäץμ¹Ԥߤ롥secά줿硤ץ @@ -1175,10 +1166,6 @@ Ruby $DEBUG `-d'ե饰ξ() - $ENV Ķѿ˥Ϣʸ򥭡ȤͿ - бĶѿͤ롥Ķѿ¸ߤ - nil֤롥 - $FILENAME ۥե`$<'Ǹɤ߹(᥽ågets() ɤǤ)ե̾$<.filenameƱ @@ -1190,9 +1177,6 @@ Ruby $VERBOSE `-v'ե饰ξ() - $VERSION rubyΥС򼨤ʸ - - TRUE t FALSE nil @@ -1212,6 +1196,16 @@ Ruby ϴˤƱǤϤʤFALSE˴ؤƤϡΤ褦 ʤ + STDIN ɸ + STDOUT ɸ + STDERR ɸ२顼 + + ENV Ķѿ˥Ϣʸ򥭡ȤͿ + бĶѿͤ롥Ķѿ¸ߤ + nil֤롥 + + VERSION rubyΥС򼨤ʸ + * Ȥ߹ߥ饹ȥ⥸塼 ** Array(饹) @@ -3867,9 +3861,9 @@ Ruby C, Perl, CLU, Sather, CLOS, Eiffel, Icon, tcl, AWK, bourne shell, Smalltalk, Emacs Lisp. -ޤrubyθͤꤹ뤿˶ϤƲäʲˤ +ޤrubyθͤꤹ뤿˶ϤƲäʲˤ롥 - ͷƣϺ¼ΣţáغDEC + ͷƣϺ¼Σţáغܣģţá ʤֺ.ٻ(ɾά) ------------------------------------------------------- Local variables: diff --git a/sprintf.c b/sprintf.c index c74ec080ff..e75f0bb18c 100644 --- a/sprintf.c +++ b/sprintf.c @@ -6,7 +6,7 @@ $Date: 1995/01/10 10:42:59 $ created at: Fri Oct 15 10:39:26 JST 1993 - Copyright (C) 1994 Yukihiro Matsumoto + Copyright (C) 1995 Yukihiro Matsumoto ************************************************/ diff --git a/string.c b/string.c index 0b23655aef..a107a7f8b7 100644 --- a/string.c +++ b/string.c @@ -6,7 +6,7 @@ $Date: 1995/01/10 10:43:01 $ created at: Mon Aug 9 17:12:58 JST 1993 - Copyright (C) 1994 Yukihiro Matsumoto + Copyright (C) 1995 Yukihiro Matsumoto ************************************************/ @@ -358,7 +358,6 @@ Fstr_cmp(str1, str2) return INT2FIX(result); } -Regexp * make_regexp(); VALUE Freg_match(); extern VALUE C_Glob; @@ -376,7 +375,7 @@ Fstr_match(x, y) case T_STRING: reg = re_regcomp(y); - start = research(reg, x, 0, ignorecase); + start = research(reg, x, 0); if (start == -1) { return FALSE; } @@ -403,7 +402,7 @@ Fstr_match2(str) Fail("$_ is not a string"); reg = re_regcomp(str); - start = research(reg, rb_lastline, 0, ignorecase); + start = research(reg, rb_lastline, 0); if (start == -1) { return Qnil; } @@ -451,7 +450,7 @@ Fstr_index(argc, argv, str) switch (TYPE(sub)) { case T_REGEXP: - pos = research(sub, str, pos, ignorecase); + pos = research(sub, str, pos); break; case T_STRING: @@ -684,7 +683,7 @@ str_sub(str, pat, val, once) int beg, end, offset, n; for (offset=0, n=0; - (beg=research(pat, str, offset, ignorecase)) >= 0; + (beg=research(pat, str, offset)) >= 0; offset=RREGEXP(pat)->ptr->regs.start[0]+STRLEN(val)) { end = RREGEXP(pat)->ptr->regs.end[0]-1; sub = re_regsub(val); @@ -1034,14 +1033,14 @@ static VALUE Fstr_toupper(str) struct RString *str; { - return Fstr_upcase(str_new(str_new(str->ptr, str->len))); + return Fstr_upcase(str_new(str->ptr, str->len)); } static VALUE Fstr_tolower(str) struct RString *str; { - return Fstr_downcase(str_new(str_new(str->ptr, str->len))); + return Fstr_downcase(str_new(str->ptr, str->len)); } struct tr { @@ -1343,7 +1342,7 @@ Fstr_split(argc, argv, str) #define LMATCH spat->ptr->regs.start #define RMATCH spat->ptr->regs.end - while ((end = research(spat, str, start, ignorecase)) >= 0) { + while ((end = research(spat, str, start)) >= 0) { if (start == end && LMATCH[0] == RMATCH[0]) { if (last_null == 1) { if (ismbchar(str->ptr[beg])) diff --git a/struct.c b/struct.c index a368605965..8ba8f4336e 100644 --- a/struct.c +++ b/struct.c @@ -4,7 +4,7 @@ $Author: matz $ $Date: 1995/01/10 10:43:02 $ - created at: Tue Mar 22 18:44:30 JST 1994 + created at: Tue Mar 22 18:44:30 JST 1995 ************************************************/ diff --git a/time.c b/time.c index 73f3837ec5..ae2aa4f286 100644 --- a/time.c +++ b/time.c @@ -6,7 +6,7 @@ $Date: 1994/12/06 09:30:28 $ created at: Tue Dec 28 14:31:59 JST 1993 - Copyright (C) 1994 Yukihiro Matsumoto + Copyright (C) 1995 Yukihiro Matsumoto ************************************************/ diff --git a/variable.c b/variable.c index 9ac538c37e..b65a1fc05e 100644 --- a/variable.c +++ b/variable.c @@ -335,22 +335,29 @@ rb_ivar_set(id, val) } VALUE -rb_const_get(id) +rb_const_get(class, id) + struct RClass *class; ID id; { - struct RClass *class = (struct RClass*)CLASS_OF(Qself); VALUE value; while (class) { if (class->iv_tbl && st_lookup(class->iv_tbl, id, &value)) { return value; } - class = class->super; + if (BUILTIN_TYPE(class) == T_MODULE) { + class = RCLASS(C_Object); + } + else { + class = class->super; + } } /* pre-defined class */ if (st_lookup(class_tbl, id, &value)) return value; + /* here comes autoload code in the future. */ + Fail("Uninitialized constant %s", rb_id2name(id)); /* not reached */ } @@ -366,6 +373,8 @@ rb_const_bound(class, id) } class = class->super; } + if (st_lookup(class_tbl, id, Qnil)) + return TRUE; return FALSE; } diff --git a/version.c b/version.c index 27a3182f9c..38af6d714d 100644 --- a/version.c +++ b/version.c @@ -7,7 +7,7 @@ $Date: 1995/01/12 08:54:54 $ created at: Thu Sep 30 20:08:01 JST 1993 - Copyright (C) 1994 Yukihiro Matsumoto + Copyright (C) 1995 Yukihiro Matsumoto ************************************************/ @@ -15,14 +15,11 @@ #include "version.h" #include -static VALUE rb_version; - -VALUE rb_readonly_hook(); +extern VALUE C_Kernel; Init_version() { - rb_version = str_new2(RUBY_VERSION); - rb_define_variable("$VERSION", &rb_version, Qnil, rb_readonly_hook, 0); + rb_define_const(C_Kernel, "VERSION", str_new2(RUBY_VERSION)); } show_version() @@ -32,6 +29,6 @@ show_version() show_copyright() { - fprintf(stderr, "ruby - Copyright (C) 1994 Yukihiro Matsumoto\n"); + fprintf(stderr, "ruby - Copyright (C) 1995 Yukihiro Matsumoto\n"); exit(0); } diff --git a/version.h b/version.h index f94892d9c9..4ef6289513 100644 --- a/version.h +++ b/version.h @@ -1,2 +1,2 @@ -#define RUBY_VERSION "0.67" -#define VERSION_DATE "95/02/21" +#define RUBY_VERSION "0.68" +#define VERSION_DATE "95/02/23" -- cgit v1.2.3