From a1a693e138392467ca74fb4ba5b071dd7675960e Mon Sep 17 00:00:00 2001 From: matz Date: Tue, 14 Apr 1998 04:55:53 +0000 Subject: signal delivered to main_thread git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/v1_1r@166 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 22 +++ Makefile.in | 5 +- array.c | 6 +- dir.c | 12 +- eval.c | 47 +++-- ext/dbm/dbm.c | 2 + ext/dbm/extconf.rb | 1 + ext/gtk/gtk.c | 110 +++++++++++- ext/socket/socket.c | 16 +- file.c | 1 + io.c | 68 ++++--- lib/delegate.rb | 4 +- parse.y | 500 ++++++++++++++++++++++++++-------------------------- sample/ruby-mode.el | 2 +- sample/test.rb | 2 - struct.c | 16 +- 16 files changed, 490 insertions(+), 324 deletions(-) diff --git a/ChangeLog b/ChangeLog index fcd1bd088d..ec7a4bf83c 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,21 @@ +Tue Apr 14 11:34:50 1998 Yukihiro Matsumoto + + * struct.c (struct_s_def): supports subclassing of Struct. + + * io.c (io_s_new): supports subclassing of IO. + +Mon Apr 13 11:07:39 1998 Yukihiro Matsumoto + + * eval.c (f_binding): need to restore method name. + + * eval.c (rb_call0): raises SystemStackError, not Fatal. + + * io.c (obj_display): same as `print self'. + + * io.c (f_p): can now be called in the method form. + + * re.c (reg_regsub): needed to be mbchar aware. + Mon Apr 13 13:18:32 1998 Yukihiro Matsumoto * eval.c (thread_trap_eval): all handlers executed under main_thread. @@ -10,6 +28,10 @@ Sun Apr 12 22:14:07 1998 Kazunori NISHI * array.c (ary_uniq_bang): should be `==', not `='. embarrassing. +Sat Apr 11 02:13:30 1998 Yukihiro Matsumoto + + * array.c (ary_subseq): SEGVed for `[][1,1]'. + Fri Apr 10 21:29:06 1998 Tadayoshi Funaba * array.c (ary_subseq): add check for beg larger than array length. diff --git a/Makefile.in b/Makefile.in index a84da25f3f..d6b80e9f31 100644 --- a/Makefile.in +++ b/Makefile.in @@ -66,7 +66,7 @@ OBJS = array.o \ $(MISSING) all: miniruby$(binsuffix) rbconfig.rb - @cd ext; ../miniruby$(binsuffix) ./extmk.rb @EXTSTATIC@ + @./miniruby$(binsuffix) -Xext extmk.rb @EXTSTATIC@ miniruby$(binsuffix): $(OBJS) $(MAINOBJ) dmyext.o @rm -f $@ @@ -86,8 +86,7 @@ install: rbconfig.rb clean:; @rm -f $(OBJS) $(LIBRUBY) $(MAINOBJ) rbconfig.rb @rm -f ext/extinit.c ext/extinit.o dmyext.o @if test -f ./miniruby$(binsuffix); then \ - cd ext; \ - ../miniruby$(binsuffix) ./extmk.rb clean; \ + ./miniruby$(binsuffix) -Xext extmk.rb clean; \ fi realclean: clean diff --git a/array.c b/array.c index a53554ba2d..6fdcf661fa 100644 --- a/array.c +++ b/array.c @@ -306,9 +306,6 @@ ary_subseq(ary, beg, len) beg = RARRAY(ary)->len + beg; if (beg < 0) beg = 0; } - if (beg >= RARRAY(ary)->len) { - IndexError("out of range %d", beg); - } if (len < 0) { IndexError("negative length %d", RARRAY(ary)->len); } @@ -318,6 +315,9 @@ ary_subseq(ary, beg, len) if (beg + len > RARRAY(ary)->len) { len = RARRAY(ary)->len - beg; } + if (len < 0) { + len = 0; + } ary2 = ary_new2(len); MEMCPY(RARRAY(ary2)->ptr, RARRAY(ary)->ptr+beg, VALUE, len); diff --git a/dir.c b/dir.c index e2a6fd45ba..a4b8b8db94 100644 --- a/dir.c +++ b/dir.c @@ -100,7 +100,6 @@ dir_closed() if (dirp == NULL) dir_closed();\ } -#if 0 static VALUE dir_read(dir) VALUE dir; @@ -109,13 +108,16 @@ dir_read(dir) struct dirent *dp; GetDIR(dir, dirp); + errno = 0; dp = readdir(dirp); if (dp) return str_taint(str_new(dp->d_name, NAMLEN(dp))); - else - return Qnil; + else { + if (errno == 0) /* end of stream */ + return Qnil; + rb_sys_fail(0); + } } -#endif static VALUE dir_each(dir) @@ -428,9 +430,7 @@ Init_Dir() rb_define_singleton_method(cDir, "open", dir_s_open, 1); rb_define_singleton_method(cDir, "foreach", dir_foreach, 1); -#if 0 rb_define_method(cDir,"read", dir_read, 0); -#endif rb_define_method(cDir,"each", dir_each, 0); rb_define_method(cDir,"rewind", dir_rewind, 0); rb_define_method(cDir,"tell", dir_tell, 0); diff --git a/eval.c b/eval.c index 123ba4f731..0ae56d2c3d 100644 --- a/eval.c +++ b/eval.c @@ -369,6 +369,7 @@ extern VALUE eException; extern VALUE eRuntimeError; extern VALUE eSyntaxError; static VALUE eLocalJumpError; +static VALUE eSysStackError; extern VALUE eSecurityError; extern VALUE TopSelf; @@ -404,7 +405,8 @@ struct BLOCK { VALUE orig_thread; #endif struct BLOCK *prev; -} *the_block; +}; +static struct BLOCK *the_block; #define PUSH_BLOCK(v,b) { \ struct BLOCK _block; \ @@ -513,10 +515,11 @@ dyna_var_asgn(id, value) return value; } -static struct iter { +struct iter { int iter; struct iter *prev; -} *the_iter; +}; +static struct iter *the_iter; #define ITER_NOT 0 #define ITER_PRE 1 @@ -532,7 +535,7 @@ static struct iter { the_iter = _iter.prev; \ } -static struct tag { +struct tag { jmp_buf buf; struct FRAME *frame; struct iter *iter; @@ -540,7 +543,8 @@ static struct tag { VALUE retval; ID dst; struct tag *prev; -} *prot_tag; +}; +static struct tag *prot_tag; #define PUSH_TAG(ptag) { \ struct tag _tag; \ @@ -675,9 +679,13 @@ rb_check_safe_str(x) TypeError("wrong argument type %s (expected String)", rb_class2name(CLASS_OF(x))); } - if (rb_safe_level() > 0 && str_tainted(x)) { - Raise(eSecurityError, "Insecure operation - %s", - rb_id2name(the_frame->last_func)); + if (str_tainted(x)) { + if (safe_level > 0){ + Raise(eSecurityError, "Insecure operation - %s", + rb_id2name(the_frame->last_func)); + } + Warning("Insecure operation - %s", + rb_id2name(the_frame->last_func)); } } @@ -2402,7 +2410,7 @@ rb_eval(self, node) rb_id2name(node->nd_cname)); } } - if (safe_level >= 4) { + if (safe_level >= 3) { Raise(eSecurityError, "extending class prohibited"); } rb_clear_cache(); @@ -2412,6 +2420,7 @@ rb_eval(self, node) klass = rb_define_class_id(node->nd_cname, super); rb_const_set(the_class, node->nd_cname, klass); rb_set_class_path(klass,the_class,rb_id2name(node->nd_cname)); + obj_call_init(klass); } return module_setup(klass, node->nd_body); @@ -2430,7 +2439,7 @@ rb_eval(self, node) if (TYPE(module) != T_MODULE) { TypeError("%s is not a module", rb_id2name(node->nd_cname)); } - if (safe_level >= 4) { + if (safe_level >= 3) { Raise(eSecurityError, "extending module prohibited"); } } @@ -2438,6 +2447,7 @@ rb_eval(self, node) module = rb_define_module_id(node->nd_cname); rb_const_set(the_class, node->nd_cname, module); rb_set_class_path(module,the_class,rb_id2name(node->nd_cname)); + obj_call_init(module); } result = module_setup(module, node->nd_body); @@ -3238,7 +3248,7 @@ rb_call0(klass, recv, id, argc, argv, body, nosuper) } if ((++tick & 0xfff) == 0 && stack_length() > STACK_LEVEL_MAX) - Fatal("stack level too deep"); + Raise(eSysStackError, "stack level too deep"); PUSH_ITER(itr); PUSH_FRAME(); @@ -4738,6 +4748,9 @@ f_binding(self) data->orig_thread = thread_current(); #endif data->iter = f_iterator_p(); + if (the_frame->prev) { + data->frame.last_func = the_frame->prev->last_func; + } data->frame.argv = ALLOC_N(VALUE, data->frame.argc); MEMCPY(data->frame.argv, the_block->frame.argv, VALUE, data->frame.argc); @@ -4802,6 +4815,7 @@ proc_s_new(klass) break; } } + obj_call_init(proc); return proc; } @@ -5122,6 +5136,7 @@ void Init_Proc() { eLocalJumpError = rb_define_class("LocalJumpError", eException); + eSysStackError = rb_define_class("SystemStackError", eException); cProc = rb_define_class("Proc", cObject); rb_define_singleton_method(cProc, "new", proc_s_new, 0); @@ -5200,7 +5215,6 @@ struct thread { struct FRAME *frame; struct SCOPE *scope; - int vmode; struct RVarmap *dyna_vars; struct BLOCK *block; struct iter *iter; @@ -5208,6 +5222,7 @@ struct thread { VALUE klass; VALUE trace; + int misc; /* misc. states (vmode/trap_immediate) */ char *file; int line; @@ -5354,7 +5369,7 @@ thread_save_context(th) th->klass = the_class; th->dyna_vars = the_dyna_vars; th->block = the_block; - th->vmode = scope_vmode; + th->misc = scope_vmode | (trap_immediate<<8); th->iter = the_iter; th->tag = prot_tag; th->errat = errat; @@ -5414,7 +5429,8 @@ thread_restore_context(th, exit) the_class = th->klass; the_dyna_vars = th->dyna_vars; the_block = th->block; - scope_vmode = th->vmode; + scope_vmode = th->misc&SCOPE_MASK; + trap_immediate = th->misc>>8; the_iter = th->iter; prot_tag = th->tag; errat = th->errat; @@ -5445,6 +5461,7 @@ thread_restore_context(th, exit) case 3: rb_trap_eval(th_cmd, th_sig); + errno = EINTR; break; case 4: @@ -6058,7 +6075,6 @@ catch_timer(sig) #endif if (!thread_critical) { if (trap_immediate) { - trap_immediate = 0; thread_schedule(); } else thread_pending = 1; @@ -6259,6 +6275,7 @@ thread_trap_eval(cmd, sig) thread_ready(main_thread); if (curr_thread == main_thread) { rb_trap_eval(cmd, sig); + return; } thread_save_context(curr_thread); if (setjmp(curr_thread->context)) { diff --git a/ext/dbm/dbm.c b/ext/dbm/dbm.c index 98c406ace0..2ecc725ecb 100644 --- a/ext/dbm/dbm.c +++ b/ext/dbm/dbm.c @@ -328,7 +328,9 @@ fdbm_store(obj, keystr, valstr) dbmp->di_size = -1; dbm = dbmp->di_dbm; if (dbm_store(dbm, key, val, DBM_REPLACE)) { +#ifdef HAVE_DBM_CLAERERR dbm_clearerr(dbm); +#endif if (errno == EPERM) rb_sys_fail(Qnil); Fail("dbm_store failed"); } diff --git a/ext/dbm/extconf.rb b/ext/dbm/extconf.rb index 4a5d41f275..595640737d 100644 --- a/ext/dbm/extconf.rb +++ b/ext/dbm/extconf.rb @@ -1,5 +1,6 @@ $LDFLAGS = "-L/usr/local/lib" have_library("gdbm", "dbm_open") or have_library("dbm", "dbm_open") if have_func("dbm_open") + have_func("dbm_clearerr") create_makefile("dbm") end diff --git a/ext/gtk/gtk.c b/ext/gtk/gtk.c index df0cf58eb1..418c677460 100644 --- a/ext/gtk/gtk.c +++ b/ext/gtk/gtk.c @@ -44,6 +44,7 @@ static VALUE gColorSel; static VALUE gColorSelDialog; static VALUE gImage; static VALUE gDrawArea; +static VALUE gEditable; static VALUE gEntry; static VALUE gEventBox; static VALUE gFixed; @@ -4429,6 +4430,98 @@ darea_size(self, w, h) return self; } +static VALUE +edit_sel_region(self, start, end) + VALUE self, start, end; +{ + gtk_editable_select_region(GTK_EDITABLE(get_widget(self)), + NUM2INT(start), NUM2INT(end)); + return self; +} + +static VALUE +edit_insert_text(self, new_text) + VALUE self; +{ + gint pos; + + Check_Type(new_text, T_STRING); + gtk_editable_insert_text(GTK_EDITABLE(get_widget(self)), + RSTRING(new_text)->ptr, + RSTRING(new_text)->len, + &pos); + return INT2NUM(pos); +} + +static VALUE +edit_delete_text(self, start, end) + VALUE self, start, end; +{ + gtk_editable_delete_text(GTK_EDITABLE(get_widget(self)), + NUM2INT(start), NUM2INT(end)); + return self; +} + +static VALUE +edit_get_chars(self, start, end) + VALUE self, start, end; +{ + gchar *s; + + s = gtk_editable_get_chars(GTK_EDITABLE(get_widget(self)), + NUM2INT(start), NUM2INT(end)); + return str_new2(s); +} + +static VALUE +edit_cut_clipboard(self, time) + VALUE self, time; +{ + gtk_editable_cut_clipboard(GTK_EDITABLE(get_widget(self)),NUM2INT(time)); + return self; +} + +static VALUE +edit_copy_clipboard(self, time) + VALUE self, time; +{ + gtk_editable_copy_clipboard(GTK_EDITABLE(get_widget(self)),NUM2INT(time)); + return self; +} + +static VALUE +edit_paste_clipboard(self, time) + VALUE self, time; +{ + gtk_editable_paste_clipboard(GTK_EDITABLE(get_widget(self)),NUM2INT(time)); + return self; +} + +static VALUE +edit_claim_selection(self, claim, time) + VALUE self, claim, time; +{ + gtk_editable_claim_selection(GTK_EDITABLE(get_widget(self)), + RTEST(claim), NUM2INT(time)); + return self; +} + +static VALUE +edit_delete_selection(self) + VALUE self; +{ + gtk_editable_delete_selection(GTK_EDITABLE(get_widget(self))); + return self; +} + +static VALUE +edit_changed(self) + VALUE self; +{ + gtk_editable_changed(GTK_EDITABLE(get_widget(self))); + return self; +} + static VALUE entry_initialize(self) VALUE self; @@ -5625,7 +5718,8 @@ Init_gtk() gColorSelDialog = rb_define_class_under(mGtk, "ColorSelectionDialog", gWindow); gImage = rb_define_class_under(mGtk, "Image", gMisc); gDrawArea = rb_define_class_under(mGtk, "DrawingArea", gWidget); - gEntry = rb_define_class_under(mGtk, "Entry", gWidget); + gEditable = rb_define_class_under(mGtk, "Editable", gWidget); + gEntry = rb_define_class_under(mGtk, "Entry", gEditable); gEventBox = rb_define_class_under(mGtk, "EventBox", gBin); gFixed = rb_define_class_under(mGtk, "Fixed", gContainer); gGamma = rb_define_class_under(mGtk, "GammaCurve", gVBox); @@ -5666,7 +5760,7 @@ Init_gtk() gProgressBar = rb_define_class_under(mGtk, "ProgressBar", gWidget); gScrolledWin = rb_define_class_under(mGtk, "ScrolledWindow", gContainer); gTable = rb_define_class_under(mGtk, "Table", gContainer); - gText = rb_define_class_under(mGtk, "Text", gWidget); + gText = rb_define_class_under(mGtk, "Text", gEditable); gToolbar = rb_define_class_under(mGtk, "Toolbar", gContainer); gTooltips = rb_define_class_under(mGtk, "Tooltips", cData); gTree = rb_define_class_under(mGtk, "Tree", gContainer); @@ -5958,6 +6052,18 @@ Init_gtk() rb_define_method(gDrawArea, "initialize", darea_initialize, 0); rb_define_method(gDrawArea, "size", darea_size, 2); + /* Editable */ + rb_define_method(gEditable, "select_region", edit_sel_region, 2); + rb_define_method(gEditable, "insert_text", edit_insert_text, 3); + rb_define_method(gEditable, "delete_text", edit_delete_text, 2); + rb_define_method(gEditable, "get_chars", edit_get_chars, 2); + rb_define_method(gEditable, "cut_clipboard", edit_cut_clipboard, 1); + rb_define_method(gEditable, "copy_clipboard", edit_copy_clipboard, 1); + rb_define_method(gEditable, "paste_clipboard", edit_paste_clipboard, 1); + rb_define_method(gEditable, "claim_selection", edit_claim_selection, 2); + rb_define_method(gEditable, "delete_selection", edit_delete_selection, 0); + rb_define_method(gEditable, "changed", edit_changed, 0); + /* Entry */ rb_define_method(gEntry, "initialize", entry_initialize, 0); rb_define_method(gEntry, "set_text", entry_set_text, 1); diff --git a/ext/socket/socket.c b/ext/socket/socket.c index 0b3090124a..5aaff22c04 100644 --- a/ext/socket/socket.c +++ b/ext/socket/socket.c @@ -94,6 +94,7 @@ sock_new(class, fd) fp->f2 = rb_fdopen(fd, "w"); fp->mode = FMODE_READWRITE; io_unbuffered(fp); + obj_call_init((VALUE)sock); return (VALUE)sock; } @@ -543,7 +544,6 @@ tcp_s_open(class, host, serv) VALUE s; Check_SafeStr(host); s = open_inet(class, host, serv, INET_CLIENT); - obj_call_init(s); return s; } @@ -562,7 +562,6 @@ socks_s_open(class, host, serv) Check_SafeStr(host); s = open_inet(class, host, serv, INET_SOCKS); - obj_call_init(s); return s; } #endif @@ -579,7 +578,6 @@ tcp_svr_s_open(argc, argv, class) s = open_inet(class, arg1, arg2, INET_SERVER); else s = open_inet(class, 0, arg1, INET_SERVER); - obj_call_init(s); return s; } @@ -812,7 +810,6 @@ udp_s_open(class) VALUE s; s = sock_new(class, socket(AF_INET, SOCK_DGRAM, 0)); - obj_call_init(s); return s; } @@ -958,7 +955,6 @@ unix_s_sock_open(sock, path) { VALUE s; s = open_unix(sock, path, 0); - obj_call_init(s); return s; } @@ -985,7 +981,6 @@ unix_svr_s_open(sock, path) { VALUE s; s = open_unix(sock, path, 1); - obj_call_init(s); return s; } @@ -1144,20 +1139,15 @@ sock_s_open(class, domain, type, protocol) setup_domain_and_type(domain, &d, type, &t); fd = socket(d, t, NUM2INT(protocol)); if (fd < 0) rb_sys_fail("socket(2)"); - s = sock_new(class, fd); - obj_call_init(s); - return s; + return sock_new(class, fd); } static VALUE sock_s_for_fd(class, fd) VALUE class, fd; { - VALUE s = sock_new(class, NUM2INT(fd)); - - obj_call_init(s); - return s; + return sock_new(class, NUM2INT(fd)); } static VALUE diff --git a/file.c b/file.c index 338a1dd557..3ed9e2ff60 100644 --- a/file.c +++ b/file.c @@ -73,6 +73,7 @@ file_open(fname, mode) fptr->mode = io_mode_flags(mode); fptr->f = rb_fopen(fname, mode); fptr->path = strdup(fname); + obj_call_init((VALUE)port); return (VALUE)port; } diff --git a/io.c b/io.c index 9f7be6777a..ee3f23b8c9 100644 --- a/io.c +++ b/io.c @@ -1002,6 +1002,7 @@ pipe_open(pname, mode) fptr->f2 = f; io_unbuffered(fptr); } + obj_call_init((VALUE)port); return (VALUE)port; } #else @@ -1089,6 +1090,7 @@ pipe_open(pname, mode) fptr->finalize = pipe_finalize; pipe_add_fptr(fptr); #endif + obj_call_init((VALUE)port); return (VALUE)port; } } @@ -1454,14 +1456,21 @@ f_puts(argc, argv) } static VALUE -f_p(obj, val) - VALUE obj, val; +f_p(argc, argv, self) + int argc; + VALUE *argv; + VALUE self; { - VALUE str = rb_inspect(val); + VALUE str; + if (argc > 0) { + rb_scan_args(argc, argv, "1", &self); + } + str = rb_inspect(self); Check_Type(str, T_STRING); io_write(rb_defout, str); io_write(rb_defout, str_new2("\n")); + return Qnil; } @@ -1469,7 +1478,26 @@ void rb_p(obj) /* for debug print within C code */ VALUE obj; { - f_p(Qnil, obj); + f_p(0, 0, obj); +} + +static VALUE +obj_display(argc, argv, self) + int argc; + VALUE *argv; + VALUE self; +{ + VALUE out; + VALUE str; + + rb_scan_args(argc, argv, "01", &out); + if (NIL_P(out)) { + out = rb_defout; + } + + io_write(out, self); + + return Qnil; } static void @@ -1512,29 +1540,31 @@ io_stdio_set(val, id, var) } static VALUE -prep_stdio(f, mode) +prep_stdio(f, mode, klass) FILE *f; int mode; + VALUE klass; { OpenFile *fp; NEWOBJ(obj, struct RFile); - OBJSETUP(obj, cIO, T_FILE); + OBJSETUP(obj, klass, T_FILE); MakeOpenFile(obj, fp); fp->f = f; fp->mode = mode; + obj_call_init((VALUE)obj); return (VALUE)obj; } static VALUE -io_s_new(argc, argv) +io_s_new(argc, argv, klass) int argc; VALUE *argv; + VALUE klass; { VALUE fnum, mode; char *m = "r"; - VALUE io; rb_scan_args(argc, argv, "11", &fnum, &mode); @@ -1542,10 +1572,7 @@ io_s_new(argc, argv) Check_SafeStr(mode); m = RSTRING(mode)->ptr; } - io = prep_stdio(rb_fdopen(NUM2INT(fnum), m), io_mode_flags(m)); - obj_call_init(io); - - return io; + return prep_stdio(rb_fdopen(NUM2INT(fnum), m), io_mode_flags(m), klass); } static VALUE filename, file; @@ -1635,9 +1662,9 @@ next_argv() fchown(fileno(fw), st.st_uid, st.st_gid); } #endif - rb_defout = prep_stdio(fw, FMODE_WRITABLE); + rb_defout = prep_stdio(fw, FMODE_WRITABLE, cIO); } - file = prep_stdio(fr, FMODE_READABLE); + file = prep_stdio(fr, FMODE_READABLE, cIO); } } else { @@ -2135,8 +2162,8 @@ io_s_pipe() #endif rb_sys_fail(0); - r = prep_stdio(fdopen(pipes[0], "r"), FMODE_READABLE); - w = prep_stdio(fdopen(pipes[1], "w"), FMODE_WRITABLE); + r = prep_stdio(fdopen(pipes[0], "r"), FMODE_READABLE, cIO); + w = prep_stdio(fdopen(pipes[1], "w"), FMODE_WRITABLE, cIO); ary = ary_new2(2); ary_push(ary, r); @@ -2396,7 +2423,8 @@ Init_IO() rb_define_global_function("`", f_backquote, 1); rb_define_global_function("pipe", io_s_pipe, 0); - rb_define_global_function("p", f_p, 1); + rb_define_method(mKernel, "p", f_p, -1); + rb_define_method(mKernel, "display", obj_display, -1); cIO = rb_define_class("IO", cObject); rb_include_module(cIO, mEnumerable); @@ -2466,11 +2494,11 @@ Init_IO() rb_define_method(cIO, "ioctl", io_ioctl, -1); rb_define_method(cIO, "fcntl", io_fcntl, -1); - rb_stdin = prep_stdio(stdin, FMODE_READABLE); + rb_stdin = prep_stdio(stdin, FMODE_READABLE, cIO); rb_define_hooked_variable("$stdin", &rb_stdin, 0, io_stdio_set); - rb_stdout = prep_stdio(stdout, FMODE_WRITABLE); + rb_stdout = prep_stdio(stdout, FMODE_WRITABLE, cIO); rb_define_hooked_variable("$stdout", &rb_stdout, 0, io_stdio_set); - rb_stderr = prep_stdio(stderr, FMODE_WRITABLE); + rb_stderr = prep_stdio(stderr, FMODE_WRITABLE, cIO); rb_define_hooked_variable("$stderr", &rb_stderr, 0, io_stdio_set); rb_defout = rb_stdout; rb_define_hooked_variable("$>", &rb_defout, 0, io_defset); diff --git a/lib/delegate.rb b/lib/delegate.rb index a4bbe0615c..c73a3bd8a0 100644 --- a/lib/delegate.rb +++ b/lib/delegate.rb @@ -13,12 +13,12 @@ class Delegator def initialize(obj) + preserved = ::Kernel.instance_methods for t in self.type.ancestors preserved |= t.instance_methods break if t == Delegator end - preserved |= ::Kernel.instance_methods - preserved -= ["to_s", "nil?", "to_a", "hash", "dup", "==", "=~"] + preserved -= ["__getobj__","to_s","nil?","to_a","hash","dup","==","=~"] for method in obj.methods next if preserved.include? method eval "def self.#{method}(*args,&block); __getobj__.__send__(:#{method}, *args,&block); end" diff --git a/parse.y b/parse.y index e511257b61..1db24ef38a 100644 --- a/parse.y +++ b/parse.y @@ -166,9 +166,9 @@ static void top_local_setup(); k__LINE__ k__FILE__ -%token IDENTIFIER FID GVAR IVAR CONSTANT -%token INTEGER FLOAT STRING XSTRING REGEXP -%token DSTRING DXSTRING DREGEXP NTH_REF BACK_REF +%token tIDENTIFIER tFID tGVAR tIVAR tCONSTANT +%token tINTEGER tFLOAT tSTRING tXSTRING tREGEXP +%token tDSTRING tDXSTRING tDREGEXP tNTH_REF tBACK_REF %type singleton %type literal numeric @@ -184,30 +184,30 @@ static void top_local_setup(); %type variable symbol operation %type cname fname op f_rest_arg %type f_arg -%token UPLUS /* unary+ */ -%token UMINUS /* unary- */ -%token POW /* ** */ -%token CMP /* <=> */ -%token EQ /* == */ -%token EQQ /* === */ -%token NEQ /* != <> */ -%token GEQ /* >= */ -%token LEQ /* <= */ -%token ANDOP OROP /* && and || */ -%token MATCH NMATCH /* =~ and !~ */ -%token DOT2 DOT3 /* .. and ... */ -%token AREF ASET /* [] and []= */ -%token LSHFT RSHFT /* << and >> */ -%token COLON2 /* :: */ -%token COLON3 /* :: at EXPR_BEG */ -%token OP_ASGN /* +=, -= etc. */ -%token ASSOC /* => */ -%token LPAREN /* ( */ -%token LBRACK /* [ */ -%token LBRACE /* { */ -%token STAR /* * */ -%token AMPER /* & */ -%token SYMBEG +%token tUPLUS /* unary+ */ +%token tUMINUS /* unary- */ +%token tPOW /* ** */ +%token tCMP /* <=> */ +%token tEQ /* == */ +%token tEQQ /* === */ +%token tNEQ /* != <> */ +%token tGEQ /* >= */ +%token tLEQ /* <= */ +%token tANDOP tOROP /* && and || */ +%token tMATCH tNMATCH /* =~ and !~ */ +%token tDOT2 tDOT3 /* .. and ... */ +%token tAREF tASET /* [] and []= */ +%token tLSHFT tRSHFT /* << and >> */ +%token tCOLON2 /* :: */ +%token tCOLON3 /* :: at EXPR_BEG */ +%token tOP_ASGN /* +=, -= etc. */ +%token tASSOC /* => */ +%token tLPAREN /* ( */ +%token tLBRACK /* [ */ +%token tLBRACE /* { */ +%token tSTAR /* * */ +%token tAMPER /* & */ +%token tSYMBEG /* * precedence table @@ -217,20 +217,20 @@ static void top_local_setup(); %left kOR kAND %right kNOT %nonassoc kDEFINED -%right '=' OP_ASGN +%right '=' tOP_ASGN %right '?' ':' -%nonassoc DOT2 DOT3 -%left OROP -%left ANDOP -%nonassoc CMP EQ EQQ NEQ MATCH NMATCH -%left '>' GEQ '<' LEQ +%nonassoc tDOT2 tDOT3 +%left tOROP +%left tANDOP +%nonassoc tCMP tEQ tEQQ tNEQ tMATCH tNMATCH +%left '>' tGEQ '<' tLEQ %left '|' '^' %left '&' -%left LSHFT RSHFT +%left tLSHFT tRSHFT %left '+' '-' %left '*' '/' '%' -%right '!' '~' UPLUS UMINUS -%right POW +%right '!' '~' tUPLUS tUMINUS +%right tPOW %token LAST_TOKEN @@ -284,13 +284,13 @@ stmt : iterator iter_do_block yyerror("alias within method"); $$ = NEW_ALIAS($2, $4); } - | kALIAS GVAR GVAR + | kALIAS tGVAR tGVAR { if (cur_mid || in_single) yyerror("alias within method"); $$ = NEW_VALIAS($2, $3); } - | kALIAS GVAR BACK_REF + | kALIAS tGVAR tBACK_REF { char buf[3]; @@ -299,7 +299,7 @@ stmt : iterator iter_do_block sprintf(buf, "$%c", $3->nd_nth); $$ = NEW_VALIAS($2, rb_intern(buf)); } - | kALIAS GVAR NTH_REF + | kALIAS tGVAR tNTH_REF { yyerror("can't make alias for the number variables"); $$ = 0; @@ -416,7 +416,7 @@ command_call : operation call_args $$ = new_call($1, $3, $4); fixpos($$, $1); } - | primary COLON2 operation call_args + | primary tCOLON2 operation call_args { value_expr($1); $$ = new_call($1, $3, $4); @@ -434,7 +434,7 @@ mlhs : mlhs_head { $$ = NEW_MASGN(NEW_LIST($1), 0); } - | mlhs_head STAR lhs + | mlhs_head tSTAR lhs { $$ = NEW_MASGN(NEW_LIST($1), $3); } @@ -442,11 +442,11 @@ mlhs : mlhs_head { $$ = NEW_MASGN(list_concat(NEW_LIST($1),$2), 0); } - | mlhs_head mlhs_tail ',' STAR lhs + | mlhs_head mlhs_tail ',' tSTAR lhs { $$ = NEW_MASGN(list_concat(NEW_LIST($1),$2),$5); } - | STAR lhs + | tSTAR lhs { $$ = NEW_MASGN(0, $2); } @@ -470,7 +470,7 @@ lhs : variable { $$ = aryset($1, $3, 0); } - | primary '.' IDENTIFIER + | primary '.' tIDENTIFIER { $$ = attrset($1, $3, 0); } @@ -480,15 +480,15 @@ lhs : variable $$ = 0; } -cname : IDENTIFIER +cname : tIDENTIFIER { yyerror("class/module name must be CONSTANT"); } - | CONSTANT + | tCONSTANT -fname : IDENTIFIER - | CONSTANT - | FID +fname : tIDENTIFIER + | tCONSTANT + | tFID | op { lex_state = EXPR_END; @@ -509,32 +509,32 @@ undef_list : fname $$ = block_append($1, NEW_UNDEF($4)); } -op : DOT2 { $$ = DOT2; } +op : tDOT2 { $$ = tDOT2; } | '|' { $$ = '|'; } | '^' { $$ = '^'; } | '&' { $$ = '&'; } - | CMP { $$ = CMP; } - | EQ { $$ = EQ; } - | EQQ { $$ = EQQ; } - | MATCH { $$ = MATCH; } + | tCMP { $$ = tCMP; } + | tEQ { $$ = tEQ; } + | tEQQ { $$ = tEQQ; } + | tMATCH { $$ = tMATCH; } | '>' { $$ = '>'; } - | GEQ { $$ = GEQ; } + | tGEQ { $$ = tGEQ; } | '<' { $$ = '<'; } - | LEQ { $$ = LEQ; } - | LSHFT { $$ = LSHFT; } - | RSHFT { $$ = RSHFT; } + | tLEQ { $$ = tLEQ; } + | tLSHFT { $$ = tLSHFT; } + | tRSHFT { $$ = tRSHFT; } | '+' { $$ = '+'; } | '-' { $$ = '-'; } | '*' { $$ = '*'; } - | STAR { $$ = '*'; } + | tSTAR { $$ = '*'; } | '/' { $$ = '/'; } | '%' { $$ = '%'; } - | POW { $$ = POW; } + | tPOW { $$ = tPOW; } | '~' { $$ = '~'; } - | UPLUS { $$ = UPLUS; } - | UMINUS { $$ = UMINUS; } - | AREF { $$ = AREF; } - | ASET { $$ = ASET; } + | tUPLUS { $$ = tUPLUS; } + | tUMINUS { $$ = tUMINUS; } + | tAREF { $$ = tAREF; } + | tASET { $$ = tASET; } | '`' { $$ = '`'; } reswords : k__LINE__ | k__FILE__ | klBEGIN | klEND @@ -556,7 +556,7 @@ arg : variable '=' arg $$ = aryset($1, $3, $6); fixpos($$, $1); } - | primary '.' IDENTIFIER '=' arg + | primary '.' tIDENTIFIER '=' arg { $$ = attrset($1, $3, $5); fixpos($$, $5); @@ -567,7 +567,7 @@ arg : variable '=' arg backref_error($1); $$ = 0; } - | variable OP_ASGN arg + | variable tOP_ASGN arg { value_expr($3); if (is_local_id($1)) { @@ -581,7 +581,7 @@ arg : variable '=' arg $$ = assignable($1,call_op(gettable($1),$2,1,$3)); fixpos($$, $3); } - | primary '[' aref_args ']' OP_ASGN arg + | primary '[' aref_args ']' tOP_ASGN arg { NODE *args = NEW_LIST($6); @@ -590,26 +590,26 @@ arg : variable '=' arg $$ = NEW_OP_ASGN1($1, $5, args); fixpos($$, $1); } - | primary '.' IDENTIFIER OP_ASGN arg + | primary '.' tIDENTIFIER tOP_ASGN arg { $$ = NEW_OP_ASGN2($1, $3, $4, $5); fixpos($$, $1); } - | primary '.' CONSTANT OP_ASGN arg + | primary '.' tCONSTANT tOP_ASGN arg { $$ = NEW_OP_ASGN2($1, $3, $4, $5); fixpos($$, $1); } - | backref OP_ASGN arg + | backref tOP_ASGN arg { backref_error($1); $$ = 0; } - | arg DOT2 arg + | arg tDOT2 arg { $$ = NEW_DOT2($1, $3); } - | arg DOT3 arg + | arg tDOT3 arg { $$ = NEW_DOT3($1, $3); } @@ -633,17 +633,17 @@ arg : variable '=' arg { $$ = call_op($1, '%', 1, $3); } - | arg POW arg + | arg tPOW arg { - $$ = call_op($1, POW, 1, $3); + $$ = call_op($1, tPOW, 1, $3); } - | UPLUS arg + | tUPLUS arg { - $$ = call_op($2, UPLUS, 0); + $$ = call_op($2, tUPLUS, 0); } - | UMINUS arg + | tUMINUS arg { - $$ = call_op($2, UMINUS, 0); + $$ = call_op($2, tUMINUS, 0); } | arg '|' arg { @@ -657,43 +657,43 @@ arg : variable '=' arg { $$ = call_op($1, '&', 1, $3); } - | arg CMP arg + | arg tCMP arg { - $$ = call_op($1, CMP, 1, $3); + $$ = call_op($1, tCMP, 1, $3); } | arg '>' arg { $$ = call_op($1, '>', 1, $3); } - | arg GEQ arg + | arg tGEQ arg { - $$ = call_op($1, GEQ, 1, $3); + $$ = call_op($1, tGEQ, 1, $3); } | arg '<' arg { $$ = call_op($1, '<', 1, $3); } - | arg LEQ arg + | arg tLEQ arg { - $$ = call_op($1, LEQ, 1, $3); + $$ = call_op($1, tLEQ, 1, $3); } - | arg EQ arg + | arg tEQ arg { - $$ = call_op($1, EQ, 1, $3); + $$ = call_op($1, tEQ, 1, $3); } - | arg EQQ arg + | arg tEQQ arg { - $$ = call_op($1, EQQ, 1, $3); + $$ = call_op($1, tEQQ, 1, $3); } - | arg NEQ arg + | arg tNEQ arg { - $$ = NEW_NOT(call_op($1, EQ, 1, $3)); + $$ = NEW_NOT(call_op($1, tEQ, 1, $3)); } - | arg MATCH arg + | arg tMATCH arg { $$ = match_gen($1, $3); } - | arg NMATCH arg + | arg tNMATCH arg { $$ = NEW_NOT(match_gen($1, $3)); } @@ -706,19 +706,19 @@ arg : variable '=' arg { $$ = call_op($2, '~', 0); } - | arg LSHFT arg + | arg tLSHFT arg { - $$ = call_op($1, LSHFT, 1, $3); + $$ = call_op($1, tLSHFT, 1, $3); } - | arg RSHFT arg + | arg tRSHFT arg { - $$ = call_op($1, RSHFT, 1, $3); + $$ = call_op($1, tRSHFT, 1, $3); } - | arg ANDOP arg + | arg tANDOP arg { $$ = logop(NODE_AND, $1, $3); } - | arg OROP arg + | arg tOROP arg { $$ = logop(NODE_OR, $1, $3); } @@ -761,7 +761,7 @@ call_args : command_call { $$ = arg_blk_pass($1, $2); } - | args ',' STAR arg opt_block_arg + | args ',' tSTAR arg opt_block_arg { $$ = arg_add($1, $4); $$ = arg_blk_pass($$, $5); @@ -771,7 +771,7 @@ call_args : command_call $$ = NEW_LIST(NEW_HASH($1)); $$ = arg_blk_pass($$, $2); } - | assocs ',' STAR arg opt_block_arg + | assocs ',' tSTAR arg opt_block_arg { $$ = arg_add(NEW_LIST(NEW_HASH($1)), $4); $$ = arg_blk_pass($$, $5); @@ -781,19 +781,19 @@ call_args : command_call $$ = list_append($1, NEW_HASH($3)); $$ = arg_blk_pass($$, $4); } - | args ',' assocs ',' STAR arg opt_block_arg + | args ',' assocs ',' tSTAR arg opt_block_arg { $$ = arg_add(list_append($1, NEW_HASH($3)), $6); $$ = arg_blk_pass($$, $7); } - | STAR arg opt_block_arg + | tSTAR arg opt_block_arg { value_expr($2); $$ = arg_blk_pass($2, $3); } | block_arg -block_arg : AMPER arg +block_arg : tAMPER arg { value_expr($2); $$ = NEW_BLOCK_PASS($2); @@ -836,11 +836,11 @@ mrhs : args $$ = $1; } } - | args ',' STAR arg + | args ',' tSTAR arg { $$ = arg_add($1, $4); } - | STAR arg + | tSTAR arg { value_expr($2); $$ = $2; @@ -870,34 +870,34 @@ primary : literal { $$ = NEW_LIT($1); } - | primary COLON2 cname + | primary tCOLON2 cname { value_expr($1); $$ = NEW_COLON2($1, $3); } - | COLON3 cname + | tCOLON3 cname { $$ = NEW_COLON3($2); } - | STRING + | tSTRING { $$ = NEW_STR($1); } - | DSTRING - | XSTRING + | tDSTRING + | tXSTRING { $$ = NEW_XSTR($1); } - | DXSTRING - | DREGEXP + | tDXSTRING + | tDREGEXP | var_ref | backref | primary '[' aref_args ']' { value_expr($1); - $$ = NEW_CALL($1, AREF, $3); + $$ = NEW_CALL($1, tAREF, $3); } - | LBRACK array ']' + | tLBRACK array ']' { if ($2 == 0) $$ = NEW_ZARRAY(); /* zero length array*/ @@ -905,7 +905,7 @@ primary : literal $$ = $2; } } - | LBRACE assoc_list '}' + | tLBRACE assoc_list '}' { $$ = NEW_HASH($2); } @@ -946,7 +946,7 @@ primary : literal in_defined = 0; $$ = NEW_DEFINED($5); } - | FID + | tFID { $$ = NEW_VCALL($1); } @@ -1030,7 +1030,7 @@ primary : literal } fixpos($$, $2); } - | LPAREN compstmt ')' + | tLPAREN compstmt ')' { $$ = $2; } @@ -1052,7 +1052,7 @@ primary : literal cref_pop(); class_nest--; } - | kCLASS LSHFT expr term + | kCLASS tLSHFT expr term { class_nest++; cref_push(); @@ -1172,7 +1172,7 @@ opt_iter_var : /* node */ { $$ = 0; } - | OROP + | tOROP { $$ = 0; } @@ -1206,15 +1206,15 @@ iter_block : '{' dyna_pop($2); } -iterator : IDENTIFIER +iterator : tIDENTIFIER { $$ = NEW_VCALL($1); } - | CONSTANT + | tCONSTANT { $$ = NEW_VCALL($1); } - | FID + | tFID { $$ = NEW_VCALL($1); } @@ -1237,7 +1237,7 @@ method_call : operation '(' opt_call_args ')' value_expr($1); $$ = new_call($1, $3, 0); } - | primary COLON2 operation '(' opt_call_args ')' + | primary tCOLON2 operation '(' opt_call_args ')' { value_expr($1); $$ = new_call($1, $3, $5); @@ -1289,23 +1289,23 @@ ensure : /* none */ } literal : numeric - | SYMBEG symbol + | tSYMBEG symbol { $$ = INT2FIX($2); } - | REGEXP + | tREGEXP symbol : fname - | IVAR - | GVAR + | tIVAR + | tGVAR -numeric : INTEGER - | FLOAT +numeric : tINTEGER + | tFLOAT -variable : IDENTIFIER - | IVAR - | GVAR - | CONSTANT +variable : tIDENTIFIER + | tIVAR + | tGVAR + | tCONSTANT | kNIL {$$ = kNIL;} | kSELF {$$ = kSELF;} | kTRUE {$$ = kTRUE;} @@ -1318,8 +1318,8 @@ var_ref : variable $$ = gettable($1); } -backref : NTH_REF - | BACK_REF +backref : tNTH_REF + | tBACK_REF superclass : term { @@ -1382,14 +1382,14 @@ f_args : f_arg ',' f_optarg ',' f_rest_arg opt_f_block_arg $$ = NEW_ARGS(0, 0, -1); } -f_arg : IDENTIFIER +f_arg : tIDENTIFIER { if (!is_local_id($1)) yyerror("formal argument must be local variable"); local_cnt($1); $$ = 1; } - | f_arg ',' IDENTIFIER + | f_arg ',' tIDENTIFIER { if (!is_local_id($3)) yyerror("formal argument must be local variable"); @@ -1397,7 +1397,7 @@ f_arg : IDENTIFIER $$ += 1; } -f_opt : IDENTIFIER '=' arg +f_opt : tIDENTIFIER '=' arg { if (!is_local_id($1)) yyerror("formal argument must be local variable"); @@ -1414,14 +1414,14 @@ f_optarg : f_opt $$ = block_append($1, $3); } -f_rest_arg : STAR IDENTIFIER +f_rest_arg : tSTAR tIDENTIFIER { if (!is_local_id($2)) yyerror("rest argument must be local variable"); $$ = local_cnt($2); } -f_block_arg : AMPER IDENTIFIER +f_block_arg : tAMPER tIDENTIFIER { $$ = NEW_BLOCK_ARG($2); } @@ -1448,7 +1448,7 @@ singleton : var_ref $$ = $1; } } - | LPAREN expr opt_nl ')' + | tLPAREN expr opt_nl ')' { switch (nd_type($2)) { case NODE_STR: @@ -1488,14 +1488,14 @@ assocs : assoc $$ = list_concat($1, $3); } -assoc : arg ASSOC arg +assoc : arg tASSOC arg { $$ = list_append(NEW_LIST($1), $3); } -operation : IDENTIFIER - | CONSTANT - | FID +operation : tIDENTIFIER + | tCONSTANT + | tFID opt_terms : /* none */ | terms @@ -1535,15 +1535,15 @@ static NODE *str_extend(); static VALUE lex_input; /* non-nil if File */ static VALUE lex_lastline; /* gc protect */ -static char *lex_pbeg; -static char *lex_p; -static char *lex_pend; +static UCHAR *lex_pbeg; +static UCHAR *lex_p; +static UCHAR *lex_pend; static int yyerror(msg) char *msg; { - char *p, *pe, *buf; + UCHAR *p, *pe, *buf; int len, i; Error("%s", msg); @@ -1948,11 +1948,11 @@ parse_regx(term) nd_set_type(list, once?NODE_DREGX_ONCE:NODE_DREGX); list->nd_cflag = kcode | casefold; yylval.node = list; - return DREGEXP; + return tDREGEXP; } else { yylval.val = reg_new(tok(), toklen(), kcode | casefold); - return REGEXP; + return tREGEXP; } } tokadd(c); @@ -2024,15 +2024,15 @@ parse_string(func,term) yylval.node = list; if (func == '`') { nd_set_type(list, NODE_DXSTR); - return DXSTRING; + return tDXSTRING; } else { - return DSTRING; + return tDSTRING; } } else { yylval.val = str_new(tok(), toklen()); - return (func == '`') ? XSTRING : STRING; + return (func == '`') ? tXSTRING : tSTRING; } } @@ -2085,7 +2085,7 @@ parse_qstring(term) tokfix(); yylval.val = str_new(tok(), toklen()); lex_state = EXPR_END; - return STRING; + return tSTRING; } static int @@ -2094,7 +2094,7 @@ parse_quotedword(term) { if (parse_qstring(term) == 0) return 0; yylval.node = NEW_CALL(NEW_STR(yylval.val), rb_intern("split"), 0); - return DSTRING; + return tDSTRING; } char *strdup(); @@ -2161,8 +2161,8 @@ here_document(term) lex_pbeg = lex_p = RSTRING(line)->ptr; lex_pend = lex_p + RSTRING(line)->len; switch (parse_string(term, '\n')) { - case STRING: - case XSTRING: + case tSTRING: + case tXSTRING: str_cat(yylval.val, "\n", 1); if (!list) { str_cat(str, RSTRING(yylval.val)->ptr, RSTRING(yylval.val)->len); @@ -2171,8 +2171,8 @@ here_document(term) list_append(list, NEW_STR(yylval.val)); } break; - case DSTRING: - case DXSTRING: + case tDSTRING: + case tDXSTRING: list_append(yylval.node, NEW_STR(str_new2("\n"))); nd_set_type(yylval.node, NODE_STR); if (!list) list = NEW_DSTR(str); @@ -2199,12 +2199,12 @@ here_document(term) switch (term) { case '\'': case '"': - if (list) return DSTRING; + if (list) return tDSTRING; yylval.val = str; - return STRING; + return tSTRING; case '`': - if (list) return DXSTRING; - return XSTRING; + if (list) return tDXSTRING; + return tXSTRING; } return 0; } @@ -2280,26 +2280,26 @@ retry: if ((c = nextc()) == '*') { lex_state = EXPR_BEG; if (nextc() == '=') { - yylval.id = POW; - return OP_ASGN; + yylval.id = tPOW; + return tOP_ASGN; } pushback(c); - return POW; + return tPOW; } if (c == '=') { yylval.id = '*'; lex_state = EXPR_BEG; - return OP_ASGN; + return tOP_ASGN; } pushback(c); if (lex_state == EXPR_ARG && space_seen && !isspace(c)){ arg_ambiguous(); lex_state = EXPR_BEG; - return STAR; + return tSTAR; } if (lex_state == EXPR_BEG || lex_state == EXPR_MID) { lex_state = EXPR_BEG; - return STAR; + return tSTAR; } lex_state = EXPR_BEG; return '*'; @@ -2307,10 +2307,10 @@ retry: case '!': lex_state = EXPR_BEG; if ((c = nextc()) == '=') { - return NEQ; + return tNEQ; } if (c == '~') { - return NMATCH; + return tNMATCH; } pushback(c); return '!'; @@ -2341,16 +2341,16 @@ retry: lex_state = EXPR_BEG; if ((c = nextc()) == '=') { if ((c = nextc()) == '=') { - return EQQ; + return tEQQ; } pushback(c); - return EQ; + return tEQ; } if (c == '~') { - return MATCH; + return tMATCH; } else if (c == '>') { - return ASSOC; + return tASSOC; } pushback(c); return '='; @@ -2373,18 +2373,18 @@ retry: lex_state = EXPR_BEG; if (c == '=') { if ((c = nextc()) == '>') { - return CMP; + return tCMP; } pushback(c); - return LEQ; + return tLEQ; } if (c == '<') { if (nextc() == '=') { - yylval.id = LSHFT; - return OP_ASGN; + yylval.id = tLSHFT; + return tOP_ASGN; } pushback(c); - return LSHFT; + return tLSHFT; } pushback(c); return '<'; @@ -2392,15 +2392,15 @@ retry: case '>': lex_state = EXPR_BEG; if ((c = nextc()) == '=') { - return GEQ; + return tGEQ; } if (c == '>') { if ((c = nextc()) == '=') { - yylval.id = RSHFT; - return OP_ASGN; + yylval.id = tRSHFT; + return tOP_ASGN; } pushback(c); - return RSHFT; + return tRSHFT; } pushback(c); return '>'; @@ -2434,27 +2434,27 @@ retry: c &= 0xff; yylval.val = INT2FIX(c); lex_state = EXPR_END; - return INTEGER; + return tINTEGER; case '&': if ((c = nextc()) == '&') { lex_state = EXPR_BEG; - return ANDOP; + return tANDOP; } else if (c == '=') { yylval.id = '&'; lex_state = EXPR_BEG; - return OP_ASGN; + return tOP_ASGN; } pushback(c); if (lex_state == EXPR_ARG && space_seen && !isspace(c)){ arg_ambiguous(); lex_state = EXPR_BEG; - return AMPER; + return tAMPER; } if (lex_state == EXPR_BEG || lex_state == EXPR_MID) { lex_state = EXPR_BEG; - return AMPER; + return tAMPER; } lex_state = EXPR_BEG; return '&'; @@ -2462,11 +2462,11 @@ retry: case '|': lex_state = EXPR_BEG; if ((c = nextc()) == '|') { - return OROP; + return tOROP; } else if (c == '=') { yylval.id = '|'; - return OP_ASGN; + return tOP_ASGN; } pushback(c); return '|'; @@ -2475,7 +2475,7 @@ retry: c = nextc(); if (lex_state == EXPR_FNAME) { if (c == '@') { - return UPLUS; + return tUPLUS; } pushback(c); return '+'; @@ -2483,7 +2483,7 @@ retry: if (c == '=') { lex_state = EXPR_BEG; yylval.id = '+'; - return OP_ASGN; + return tOP_ASGN; } if (lex_state == EXPR_ARG) { if (space_seen && !isspace(c)) { @@ -2499,7 +2499,7 @@ retry: } pushback(c); lex_state = EXPR_BEG; - return UPLUS; + return tUPLUS; } lex_state = EXPR_BEG; pushback(c); @@ -2509,7 +2509,7 @@ retry: c = nextc(); if (lex_state == EXPR_FNAME) { if (c == '@') { - return UMINUS; + return tUMINUS; } pushback(c); return '-'; @@ -2517,7 +2517,7 @@ retry: if (c == '=') { lex_state = EXPR_BEG; yylval.id = '-'; - return OP_ASGN; + return tOP_ASGN; } if (lex_state == EXPR_ARG) { if (space_seen && !isspace(c)) { @@ -2535,7 +2535,7 @@ retry: } lex_state = EXPR_BEG; pushback(c); - return UMINUS; + return tUMINUS; } lex_state = EXPR_BEG; pushback(c); @@ -2545,10 +2545,10 @@ retry: lex_state = EXPR_BEG; if ((c = nextc()) == '.') { if ((c = nextc()) == '.') { - return DOT3; + return tDOT3; } pushback(c); - return DOT2; + return tDOT2; } pushback(c); if (!isdigit(c)) { @@ -2583,7 +2583,7 @@ retry: pushback(c); tokfix(); yylval.val = str2inum(tok(), 16); - return INTEGER; + return tINTEGER; } else if (c >= '0' && c <= '7') { /* octal */ @@ -2595,7 +2595,7 @@ retry: pushback(c); tokfix(); yylval.val = str2inum(tok(), 8); - return INTEGER; + return tINTEGER; } else if (c > '7' && c <= '9') { yyerror("Illegal octal digit"); @@ -2606,7 +2606,7 @@ retry: else { pushback(c); yylval.val = INT2FIX(0); - return INTEGER; + return tINTEGER; } } @@ -2663,10 +2663,10 @@ retry: tokfix(); if (is_float) { yylval.val = float_new(atof(tok())); - return FLOAT; + return tFLOAT; } yylval.val = str2inum(tok(), 10); - return INTEGER; + return tINTEGER; } case ']': @@ -2680,15 +2680,15 @@ retry: if (c == ':') { if (lex_state == EXPR_BEG) { lex_state = EXPR_BEG; - return COLON3; + return tCOLON3; } if (lex_state == EXPR_ARG && space_seen) { arg_ambiguous(); lex_state = EXPR_BEG; - return COLON3; + return tCOLON3; } lex_state = EXPR_DOT; - return COLON2; + return tCOLON2; } pushback(c); if (lex_state == EXPR_END || isspace(c)) { @@ -2696,7 +2696,7 @@ retry: return ':'; } lex_state = EXPR_FNAME; - return SYMBEG; + return tSYMBEG; case '/': if (lex_state == EXPR_BEG || lex_state == EXPR_MID) { @@ -2705,7 +2705,7 @@ retry: if ((c = nextc()) == '=') { lex_state = EXPR_BEG; yylval.id = '/'; - return OP_ASGN; + return tOP_ASGN; } if (lex_state == EXPR_ARG) { if (space_seen && !isspace(c)) { @@ -2722,7 +2722,7 @@ retry: lex_state = EXPR_BEG; if (nextc() == '=') { yylval.id = '^'; - return OP_ASGN; + return tOP_ASGN; } pushback(c); return c; @@ -2743,7 +2743,7 @@ retry: case '(': if (lex_state == EXPR_BEG || lex_state == EXPR_MID) { - c = LPAREN; + c = tLPAREN; lex_state = EXPR_BEG; } else { @@ -2755,27 +2755,27 @@ retry: if (lex_state == EXPR_FNAME) { if ((c = nextc()) == ']') { if ((c = nextc()) == '=') { - return ASET; + return tASET; } pushback(c); - return AREF; + return tAREF; } pushback(c); return '['; } else if (lex_state == EXPR_BEG || lex_state == EXPR_MID) { - c = LBRACK; + c = tLBRACK; } else if (lex_state == EXPR_ARG && space_seen) { arg_ambiguous(); - c = LBRACK; + c = tLBRACK; } lex_state = EXPR_BEG; return c; case '{': if (lex_state != EXPR_END && lex_state != EXPR_ARG) - c = LBRACE; + c = tLBRACE; lex_state = EXPR_BEG; return c; @@ -2843,7 +2843,7 @@ retry: } if ((c = nextc()) == '=') { yylval.id = '%'; - return OP_ASGN; + return tOP_ASGN; } if (lex_state == EXPR_ARG) { if (space_seen && !isspace(c)) { @@ -2884,7 +2884,7 @@ retry: tokadd(c); tokfix(); yylval.id = rb_intern(tok()); - return GVAR; + return tGVAR; case '-': tokadd('$'); @@ -2893,14 +2893,14 @@ retry: tokadd(c); tokfix(); yylval.id = rb_intern(tok()); - return GVAR; + return tGVAR; case '&': /* $&: last match */ case '`': /* $`: string before last match */ case '\'': /* $': string after last match */ case '+': /* $+: string matches last paren. */ yylval.node = NEW_BACK_REF(c); - return BACK_REF; + return tBACK_REF; case '1': case '2': case '3': case '4': case '5': case '6': @@ -2912,7 +2912,7 @@ retry: pushback(c); tokfix(); yylval.node = NEW_NTH_REF(atoi(tok())); - return NTH_REF; + return tNTH_REF; default: if (!is_identchar(c)) { @@ -2966,11 +2966,11 @@ retry: switch (tok()[0]) { case '$': lex_state = EXPR_END; - result = GVAR; + result = tGVAR; break; case '@': lex_state = EXPR_END; - result = IVAR; + result = tIVAR; break; default: if (lex_state != EXPR_DOT) { @@ -3002,12 +3002,12 @@ retry: lex_state = EXPR_END; } if (isupper(tok()[0])) { - result = CONSTANT; + result = tCONSTANT; } else if (toklast() == '!' || toklast() == '?') { - result = FID; + result = tFID; } else { - result = IDENTIFIER; + result = tIDENTIFIER; } } tokfix(); @@ -3349,7 +3349,7 @@ match_gen(node1, node2) } } - return NEW_CALL(node1, MATCH, NEW_LIST(node2)); + return NEW_CALL(node1, tMATCH, NEW_LIST(node2)); } static NODE* @@ -3468,7 +3468,7 @@ aryset(recv, idx, val) idx = arg_add(idx, val); } } - return NEW_CALL(recv, ASET, idx); + return NEW_CALL(recv, tASET, idx); } ID @@ -3586,6 +3586,7 @@ assign_in_cond(node) return 1; default: + break; } if (assign_in_cond(node->nd_value) == 0) { Warning("assignment in condition"); @@ -3653,7 +3654,7 @@ cond2(node) type = nd_type(node); if (type == NODE_NEWLINE) node = node->nd_next; if (type == NODE_LIT && FIXNUM_P(node->nd_lit)) { - return call_op(node,EQ,1,NEW_GVAR(rb_intern("$."))); + return call_op(node,tEQ,1,NEW_GVAR(rb_intern("$."))); } return node; } @@ -3904,7 +3905,7 @@ yywhile_loop(chop, split) } static struct op_tbl rb_op_tbl[] = { - DOT2, "..", + tDOT2, "..", '+', "+", '-', "-", '+', "+(binary)", @@ -3912,35 +3913,36 @@ static struct op_tbl rb_op_tbl[] = { '*', "*", '/', "/", '%', "%", - POW, "**", - UPLUS, "+@", - UMINUS, "-@", - UPLUS, "+(unary)", - UMINUS, "-(unary)", + tPOW, "**", + tUPLUS, "+@", + tUMINUS, "-@", + tUPLUS, "+(unary)", + tUMINUS, "-(unary)", '|', "|", '^', "^", '&', "&", - CMP, "<=>", + tCMP, "<=>", '>', ">", - GEQ, ">=", + tGEQ, ">=", '<', "<", - LEQ, "<=", - EQ, "==", - EQQ, "===", - NEQ, "!=", - MATCH, "=~", - NMATCH, "!~", + tLEQ, "<=", + tEQ, "==", + tEQQ, "===", + tNEQ, "!=", + tMATCH, "=~", + tNMATCH, "!~", '!', "!", '~', "~", '!', "!(unary)", '~', "~(unary)", '!', "!@", '~', "~@", - AREF, "[]", - ASET, "[]=", - LSHFT, "<<", - RSHFT, ">>", - COLON2, "::", + tAREF, "[]", + tASET, "[]=", + tLSHFT, "<<", + tRSHFT, ">>", + tCOLON2, "::", + tCOLON3, "::", '`', "`", 0, 0, }; diff --git a/sample/ruby-mode.el b/sample/ruby-mode.el index e33a164bd9..33e9d2ce4d 100644 --- a/sample/ruby-mode.el +++ b/sample/ruby-mode.el @@ -141,7 +141,7 @@ The variable ruby-indent-level controls the amount of indentation. (use-local-map ruby-mode-map) (setq mode-name "ruby") (setq major-mode 'ruby-mode) - (ruby-mode-variable) + (ruby-mode-variables) (run-hooks 'ruby-mode-hook)) (defun ruby-current-indentation () diff --git a/sample/test.rb b/sample/test.rb index 29670987fa..f09619b827 100644 --- a/sample/test.rb +++ b/sample/test.rb @@ -675,8 +675,6 @@ if defined? Process.kill x = $! end ok(x && x =~ /Interrupt/) -else - ok(false) end check "eval" diff --git a/struct.c b/struct.c index 6d31896d37..6cd1eafe6b 100644 --- a/struct.c +++ b/struct.c @@ -121,8 +121,8 @@ struct_set(obj, val) VALUE struct_alloc(); static VALUE -make_struct(name, member) - VALUE name, member; +make_struct(name, member, klass) + VALUE name, member, klass; { VALUE nstr; ID id; @@ -132,7 +132,7 @@ make_struct(name, member) if (!rb_is_const_id(id)) { NameError("identifier %s needs to be constant", RSTRING(name)->ptr); } - nstr = rb_define_class_under(cStruct, RSTRING(name)->ptr, cStruct); + nstr = rb_define_class_under(klass, RSTRING(name)->ptr, klass); rb_iv_set(nstr, "__size__", INT2FIX(RARRAY(member)->len)); rb_iv_set(nstr, "__member__", member); @@ -174,11 +174,11 @@ struct_define(name, va_alist) } va_end(ar); - return make_struct(nm, ary); + return make_struct(nm, ary, cStruct); } static VALUE -struct_s_def(argc, argv) +struct_s_def(argc, argv, klass) int argc; VALUE *argv; { @@ -193,8 +193,8 @@ struct_s_def(argc, argv) ID id = rb_to_id(rest->ptr[i]); rest->ptr[i] = INT2FIX(id); } - st = make_struct(name, rest); - obj_call_init((VALUE)st); + st = make_struct(name, rest, klass); + obj_call_init(st); return st; } @@ -218,7 +218,7 @@ struct_alloc(klass, values) st->ptr = ALLOC_N(VALUE, n); st->len = n; MEMCPY(st->ptr, RARRAY(values)->ptr, VALUE, RARRAY(values)->len); - memclear(st->ptr+RARRAY(values)->len, n - RARRAY(values)->len); + memclear(st->ptr+RARRAY(values)->len, n-RARRAY(values)->len); obj_call_init((VALUE)st); return (VALUE)st; -- cgit v1.2.3