From 01a24da8d31dad0bd15b96a4527dbccb345c6a78 Mon Sep 17 00:00:00 2001 From: matz Date: Fri, 25 Jun 1999 09:02:52 +0000 Subject: 990625 git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_3@492 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 46 ++++++++++++++++++++++++++++++++++++++++++++-- Makefile.in | 2 +- configure | 8 ++++++-- configure.in | 8 ++++++-- eval.c | 39 --------------------------------------- ext/Win32API/depend | 2 +- ext/dbm/depend | 2 +- ext/etc/depend | 2 +- ext/extmk.rb.in | 22 ++++++++++++---------- ext/fcntl/depend | 2 +- ext/gdbm/depend | 2 +- ext/md5/depend | 2 +- ext/nkf/depend | 2 +- ext/socket/depend | 6 +++--- ext/tcltklib/depend | 2 +- ext/tk/depend | 2 +- gc.c | 2 +- lib/mkmf.rb | 1 + missing/isinf.c | 1 + missing/strftime.c | 2 ++ node.h | 12 ------------ pack.c | 11 +++++++++-- parse.y | 38 ++++++++++++++++++++++++++------------ re.c | 7 ++++--- regex.c | 44 ++++++++++++++++++++++++++++++-------------- ruby.h | 3 +-- rubyio.h | 1 - sample/test.rb | 8 ++++++++ string.c | 14 +++++++------- variable.c | 5 ----- version.c | 5 +++++ version.h | 4 ++-- 32 files changed, 178 insertions(+), 129 deletions(-) diff --git a/ChangeLog b/ChangeLog index 739d458612..280aedf68f 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,40 @@ +Fri Jun 25 13:07:20 1999 Koji Oda + + * missing/isinf.c: include "config.h" added. + +Fri Jun 25 13:09:12 1999 Yukihiro Matsumoto + + * pack.c (pack_unpack): needed to initialize natint. + + * regex.c (re_compile_pattern): add start_paren to avoid too much + finalization on maybe_finalize_jump. + +Fri Jun 25 07:25:05 1999 Katsuyuki Komatsu + + * lib/mkmf.rb: initialize $(topdir). + + * ext/extmk.rb.in (install_rb): install lib/*.rb properly. + + * configure.in (linux): specifies -rpath on --enable-shared. + + * configure.in (aix): ruby.imp must reside in $(topdir). + +Thu Jun 24 19:11:29 1999 Yoshida Masato + + * parse.y (rb_str_extend): multi-byte identifier in expression + interpolation in strings. + + * parse.y (yylex): support multi-byte char identifiers. + +Thu Jun 24 15:27:13 1999 Yukihiro Matsumoto + + * parse.y (f_arg): check duplicate argument names. + + * gc.c (rb_gc_mark): marking wrong member for NODE_ARGS. + + * string.c (rb_str_rindex): POSITION specifies start point, not + end point. + Thu Jun 24 13:00:17 1999 Yukihiro Matsumoto * regex.c (print_mbc): wrong boundary. @@ -8,6 +45,11 @@ Thu Jun 24 11:02:51 1999 Yoshida Masato * pack.c (uv_to_utf8): mask needed. +Wed Jun 23 21:03:56 1999 Tadayoshi Funaba + + * ruby.h (struct RFile): remove iv_tbl from struct. instance + variables are handled as generic ivs. + Wed Jun 23 22:06:26 1999 Tadayoshi Funaba * pack.c (utf8_to_uv): pack to 7 bytes sequence. @@ -615,7 +657,7 @@ Mon Apr 19 13:49:11 1999 Yukihiro Matsumoto * eval.c (eval): should restore ruby_dyna_vars. -Fri Apr 16 21:40:43 1999 Nobuyoshu Nakada +Fri Apr 16 21:40:43 1999 Nobuyoshi Nakada * io.c (f_backquote): pipe_open may return nil. @@ -641,7 +683,7 @@ Thu Apr 15 23:46:20 1999 WATANABE Hirofumi * ruby.c (rubylib_mangle): mangle path by RUBYLIB_PREFIX. -Wed Apr 14 23:52:51 1999 SHIROYAMA Takayuki +Wed Apr 14 23:52:51 1999 SHIROYAMA Takayuki * node.h (NODE_LMASK): should be long to avoid overflow. diff --git a/Makefile.in b/Makefile.in index 6fbd9fcf5c..2fb4542b52 100644 --- a/Makefile.in +++ b/Makefile.in @@ -107,12 +107,12 @@ install: rbconfig.rb clean:; @rm -f $(OBJS) $(LIBRUBY_A) $(LIBRUBY_SO) $(LIBRUBY_ALIASES) $(MAINOBJ) rbconfig.rb @rm -f ext/extinit.c ext/extinit.o dmyext.o @-./miniruby$(binsuffix) -Xext extmk.rb clean 2> /dev/null || true + @rm -f $(PROGRAM) miniruby$(binsuffix) distclean: clean @rm -f Makefile ext/extmk.rb config.h @rm -f ext/config.cache config.cache config.log config.status @rm -f *~ core *.core gmon.out y.tab.c y.output ruby.imp - @rm -f $(PROGRAM) miniruby$(binsuffix) realclean: distclean @rm -f parse.c diff --git a/configure b/configure index 3c68d45271..bca443db68 100644 --- a/configure +++ b/configure @@ -4017,7 +4017,7 @@ echo "configure:3939: checking whether OS depend dynamic link works" >&5 rb_cv_dlopen=yes ;; aix*) LDSHARED='/usr/ccs/bin/ld' XLDFLAGS='-Wl,-bE:ruby.imp' - DLDFLAGS='-eInit_$(TARGET) -bI:$(hdrdir)/ruby.imp -bM:SRE -T512 -H512 -lc' + DLDFLAGS='-eInit_$(TARGET) -bI:$(topdir)/ruby.imp -bM:SRE -T512 -H512 -lc' rb_cv_dlopen=yes ;; human*) DLDFLAGS='' @@ -4477,7 +4477,11 @@ if test "$enable_shared" = 'yes'; then LIBRUBYARG='-L. -l$(RUBY_INSTALL_NAME)' CFLAGS="$CFLAGS $CCDLFLAGS" case "$host_os" in - sunos4*|linux*) + sunos4*) + LIBRUBY_ALIASES='lib$(RUBY_INSTALL_NAME).so.$(MAJOR).$(MINOR) lib$(RUBY_INSTALL_NAME).so' + ;; + linux*) + XLDFLAGS='-Wl,-rpath,${prefix}/lib':/usr/lib:/lib LIBRUBY_ALIASES='lib$(RUBY_INSTALL_NAME).so.$(MAJOR).$(MINOR) lib$(RUBY_INSTALL_NAME).so' ;; freebsd*) diff --git a/configure.in b/configure.in index dfe9fce5ce..127a8efc20 100644 --- a/configure.in +++ b/configure.in @@ -458,7 +458,7 @@ if test "$with_dln_a_out" != yes; then rb_cv_dlopen=yes ;; aix*) LDSHARED='/usr/ccs/bin/ld' XLDFLAGS='-Wl,-bE:ruby.imp' - DLDFLAGS='-eInit_$(TARGET) -bI:$(hdrdir)/ruby.imp -bM:SRE -T512 -H512 -lc' + DLDFLAGS='-eInit_$(TARGET) -bI:$(topdir)/ruby.imp -bM:SRE -T512 -H512 -lc' rb_cv_dlopen=yes ;; human*) DLDFLAGS='' @@ -673,7 +673,11 @@ if test "$enable_shared" = 'yes'; then LIBRUBYARG='-L. -l$(RUBY_INSTALL_NAME)' CFLAGS="$CFLAGS $CCDLFLAGS" case "$host_os" in - sunos4*|linux*) + sunos4*) + LIBRUBY_ALIASES='lib$(RUBY_INSTALL_NAME).so.$(MAJOR).$(MINOR) lib$(RUBY_INSTALL_NAME).so' + ;; + linux*) + XLDFLAGS='-Wl,-rpath,${prefix}/lib':/usr/lib:/lib LIBRUBY_ALIASES='lib$(RUBY_INSTALL_NAME).so.$(MAJOR).$(MINOR) lib$(RUBY_INSTALL_NAME).so' ;; freebsd*) diff --git a/eval.c b/eval.c index de7e9864d2..2695d84dc3 100644 --- a/eval.c +++ b/eval.c @@ -1708,10 +1708,6 @@ rb_eval(self, node) { int state; volatile VALUE result = Qnil; -#ifdef NOBLOCK_RECUR - NODE * volatile next = 0; - NODE * volatile nstack = 0; -#endif #define RETURN(v) { result = (v); goto finish; } @@ -1720,7 +1716,6 @@ rb_eval(self, node) switch (nd_type(node)) { case NODE_BLOCK: -#ifndef NOBLOCK_RECUR if (!node->nd_next) { node = node->nd_head; goto again; @@ -1730,14 +1725,6 @@ rb_eval(self, node) node = node->nd_next; } break; -#else - if (next) { - nstack = rb_node_newnode(NODE_CREF,next,0,nstack); - } - next = node->nd_next; - node = node->nd_head; - goto again; -#endif case NODE_POSTEXE: rb_f_END(); nd_set_type(node, NODE_NIL); /* exec just once */ @@ -1795,11 +1782,7 @@ rb_eval(self, node) case NODE_IF: ruby_sourceline = nd_line(node); -#ifdef NOBLOCK_RECUR - if (RTEST(result)){ -#else if (RTEST(rb_eval(self, node->nd_cond))) { -#endif node = node->nd_body; } else { @@ -1811,11 +1794,7 @@ rb_eval(self, node) { VALUE val; -#ifdef NOBLOCK_RECUR - val = result; -#else val = rb_eval(self, node->nd_head); -#endif node = node->nd_body; while (node) { NODE *tag; @@ -2161,13 +2140,7 @@ rb_eval(self, node) TMP_PROTECT; BEGIN_CALLARGS; -#ifdef NOBLOCK_RECUR_incomplete - printf("mid %s recv: ", rb_id2name(node->nd_mid)); - rb_p(result); - recv = result; -#else recv = rb_eval(self, node->nd_recv); -#endif SETUP_ARGS(node->nd_args); END_CALLARGS; @@ -2845,18 +2818,6 @@ rb_eval(self, node) } finish: CHECK_INTS; -#ifdef NOBLOCK_RECUR - if (next) { - node = next; - next = 0; - goto again; - } - if (nstack) { - node = nstack->nd_head; - nstack = nstack->nd_next; - goto again; - } -#endif return result; } diff --git a/ext/Win32API/depend b/ext/Win32API/depend index 517b546de3..b224bb66c9 100644 --- a/ext/Win32API/depend +++ b/ext/Win32API/depend @@ -1 +1 @@ -Win32API.o : Win32API.c $(hdrdir)/ruby.h $(hdrdir)/config.h $(hdrdir)/defines.h +Win32API.o : Win32API.c $(hdrdir)/ruby.h $(topdir)/config.h $(hdrdir)/defines.h diff --git a/ext/dbm/depend b/ext/dbm/depend index d7f1f419d4..5fae80b096 100644 --- a/ext/dbm/depend +++ b/ext/dbm/depend @@ -1 +1 @@ -dbm.o: dbm.c $(hdrdir)/ruby.h $(hdrdir)/config.h $(hdrdir)/defines.h +dbm.o: dbm.c $(hdrdir)/ruby.h $(topdir)/config.h $(hdrdir)/defines.h diff --git a/ext/etc/depend b/ext/etc/depend index fb3318a0c6..ac706477b0 100644 --- a/ext/etc/depend +++ b/ext/etc/depend @@ -1 +1 @@ -etc.o : etc.c $(hdrdir)/ruby.h $(hdrdir)/config.h $(hdrdir)/defines.h +etc.o : etc.c $(hdrdir)/ruby.h $(topdir)/config.h $(hdrdir)/defines.h diff --git a/ext/extmk.rb.in b/ext/extmk.rb.in index fb7236441a..d3ff174894 100644 --- a/ext/extmk.rb.in +++ b/ext/extmk.rb.in @@ -147,12 +147,13 @@ def try_run(src, opt="") end end -def install_rb(mfile) +def install_rb(mfile, srcdir) + libdir = srcdir + "/lib" path = [] dir = [] - Find.find("lib") do |f| + Find.find(libdir) do |f| next unless /\.rb$/ =~ f - f = f[4..-1] + f = f[libdir.length+1..-1] path.push f dir |= File.dirname(f) end @@ -161,7 +162,7 @@ def install_rb(mfile) mfile.printf "\t@test -d $(DESTDIR)$(pkglibdir)/%s || mkdir $(DESTDIR)$(pkglibdir)/%s\n", f, f end for f in path - mfile.printf "\t$(INSTALL_DATA) lib/%s $(DESTDIR)$(pkglibdir)/%s\n", f, f + mfile.printf "\t$(INSTALL_DATA) $(srcdir)/lib/%s $(DESTDIR)$(pkglibdir)/%s\n", f, f end end @@ -347,13 +348,14 @@ SHELL = /bin/sh srcdir = #{$srcdir} VPATH = #{$srcdir} -hdrdir = #{$topdir} +topdir = #{$topdir} +hdrdir = #{$top_srcdir} DESTDIR = CC = @CC@ prefix = @prefix@ -CFLAGS = %s -I#{$topdir} -I#{$top_srcdir} -I@includedir@ #{CFLAGS} #$CFLAGS %s +CFLAGS = %s -I$(topdir) -I$(hdrdir) -I@includedir@ #{CFLAGS} #$CFLAGS %s DLDFLAGS = #$DLDFLAGS #$LDFLAGS LDSHARED = @LDSHARED@ #{defflag} ", if $static then "" else "@CCDLFLAGS@" end, $defs.join(" ") @@ -418,7 +420,7 @@ EOS $(INSTALL_DLLIB) $(DLLIB) $(DESTDIR)$(archdir)/$(DLLIB) " end - install_rb(mfile) + install_rb(mfile, $srcdir) mfile.printf "\n" if $static @@ -449,11 +451,11 @@ $(DLLIB): $(OBJS) " end - if File.exist?("depend") - dfile = open("depend", "r") + if File.exist?("#{$srcdir}/depend") + dfile = open("#{$srcdir}/depend", "r") mfile.printf "###\n" while line = dfile.gets() - mfile.printf "%s", line + mfile.printf "%s", line.gsub('\$\(hdrdir\)/config.h', '$(topdir)/config.h') end dfile.close end diff --git a/ext/fcntl/depend b/ext/fcntl/depend index a7915c7d92..10eab64a46 100644 --- a/ext/fcntl/depend +++ b/ext/fcntl/depend @@ -1 +1 @@ -fcntl.o: fcntl.c $(hdrdir)/ruby.h $(hdrdir)/config.h $(hdrdir)/defines.h +fcntl.o: fcntl.c $(hdrdir)/ruby.h $(topdir)/config.h $(hdrdir)/defines.h diff --git a/ext/gdbm/depend b/ext/gdbm/depend index 9e157bc23f..c080a81619 100644 --- a/ext/gdbm/depend +++ b/ext/gdbm/depend @@ -1 +1 @@ -gdbm.o: gdbm.c $(hdrdir)/ruby.h $(hdrdir)/config.h $(hdrdir)/defines.h +gdbm.o: gdbm.c $(hdrdir)/ruby.h $(topdir)/config.h $(hdrdir)/defines.h diff --git a/ext/md5/depend b/ext/md5/depend index abb2a47419..c99f78ee90 100644 --- a/ext/md5/depend +++ b/ext/md5/depend @@ -1,2 +1,2 @@ md5c.o: md5c.c md5.h -md5init.o: md5init.c $(hdrdir)/ruby.h $(hdrdir)/config.h $(hdrdir)/defines.h md5.h +md5init.o: md5init.c $(hdrdir)/ruby.h $(topdir)/config.h $(hdrdir)/defines.h md5.h diff --git a/ext/nkf/depend b/ext/nkf/depend index db730602e7..645bc869c8 100644 --- a/ext/nkf/depend +++ b/ext/nkf/depend @@ -1 +1 @@ -nkf.o : nkf.c $(hdrdir)/ruby.h $(hdrdir)/config.h $(hdrdir)/defines.h nkf1.7/nkf.c +nkf.o : nkf.c $(hdrdir)/ruby.h $(topdir)/config.h $(hdrdir)/defines.h nkf1.7/nkf.c diff --git a/ext/socket/depend b/ext/socket/depend index df2f0c5d16..cca6d4e62a 100644 --- a/ext/socket/depend +++ b/ext/socket/depend @@ -1,3 +1,3 @@ -socket.o : socket.c $(hdrdir)/ruby.h $(hdrdir)/config.h $(hdrdir)/defines.h $(hdrdir)/rubyio.h $(hdrdir)/rubysig.h sockport.h -getnameinfo.o: getnameinfo.c $(hdrdir)/config.h addrinfo.h sockport.h -getaddrinfo.o: getaddrinfo.c $(hdrdir)/config.h addrinfo.h sockport.h +socket.o : socket.c $(hdrdir)/ruby.h $(topdir)/config.h $(hdrdir)/defines.h $(hdrdir)/rubyio.h $(hdrdir)/rubysig.h sockport.h +getnameinfo.o: getnameinfo.c $(topdir)/config.h addrinfo.h sockport.h +getaddrinfo.o: getaddrinfo.c $(topdir)/config.h addrinfo.h sockport.h diff --git a/ext/tcltklib/depend b/ext/tcltklib/depend index 71d9f20537..e91f9dacbf 100644 --- a/ext/tcltklib/depend +++ b/ext/tcltklib/depend @@ -1 +1 @@ -tcltklib.o: tcltklib.c $(hdrdir)/ruby.h $(hdrdir)/config.h $(hdrdir)/defines.h +tcltklib.o: tcltklib.c $(hdrdir)/ruby.h $(topdir)/config.h $(hdrdir)/defines.h diff --git a/ext/tk/depend b/ext/tk/depend index e325a82c0f..fd63e230f0 100644 --- a/ext/tk/depend +++ b/ext/tk/depend @@ -1 +1 @@ -tkutil.o: tkutil.c $(hdrdir)/ruby.h $(hdrdir)/config.h $(hdrdir)/defines.h +tkutil.o: tkutil.c $(hdrdir)/ruby.h $(topdir)/config.h $(hdrdir)/defines.h diff --git a/gc.c b/gc.c index f3a39905c0..96974dba2d 100644 --- a/gc.c +++ b/gc.c @@ -459,7 +459,6 @@ rb_gc_mark(ptr) case NODE_OR: case NODE_CASE: case NODE_SCLASS: - case NODE_ARGS: case NODE_DOT2: case NODE_DOT3: case NODE_FLIP2: @@ -493,6 +492,7 @@ rb_gc_mark(ptr) case NODE_RETURN: case NODE_YIELD: case NODE_COLON2: + case NODE_ARGS: obj = RANY(obj->as.node.u1.node); goto Top; diff --git a/lib/mkmf.rb b/lib/mkmf.rb index b1f431c7e1..82beea6b4f 100644 --- a/lib/mkmf.rb +++ b/lib/mkmf.rb @@ -349,6 +349,7 @@ SHELL = /bin/sh #### Start of system configuration section. #### srcdir = #{$srcdir} +topdir = #{$hdrdir} hdrdir = #{$hdrdir} CC = #{CONFIG["CC"]} diff --git a/missing/isinf.c b/missing/isinf.c index 992ca57f67..3e1e410455 100644 --- a/missing/isinf.c +++ b/missing/isinf.c @@ -1,3 +1,4 @@ +#include "config.h" #ifdef HAVE_STRING_H # include #else diff --git a/missing/strftime.c b/missing/strftime.c index 18a6a7bf0b..cc3f1a8070 100644 --- a/missing/strftime.c +++ b/missing/strftime.c @@ -45,6 +45,8 @@ * January 1996 */ +#include "config.h" + #ifndef GAWK #include #include diff --git a/node.h b/node.h index d8484127dd..4add37b47c 100644 --- a/node.h +++ b/node.h @@ -225,17 +225,9 @@ typedef struct RNode { #define NEW_RFUNC(b1,b2) NEW_SCOPE(block_append(b1,b2)) #define NEW_SCOPE(b) rb_node_newnode(NODE_SCOPE,local_tbl(),cur_cref,(b)) #define NEW_BLOCK(a) rb_node_newnode(NODE_BLOCK,a,0,0) -#ifdef NOBLOCK_RECUR -#define NEW_IF(c,t,e) block_append(c,rb_node_newnode(NODE_IF,0,t,e)) -#else #define NEW_IF(c,t,e) rb_node_newnode(NODE_IF,c,t,e) -#endif #define NEW_UNLESS(c,t,e) NEW_IF(c,e,t) -#ifdef NOBLOCK_RECUR -#define NEW_CASE(h,b) block_append(h,rb_node_newnode(NODE_CASE,0,b,0)) -#else #define NEW_CASE(h,b) rb_node_newnode(NODE_CASE,h,b,0) -#endif #define NEW_WHEN(c,t,e) rb_node_newnode(NODE_WHEN,c,t,e) #define NEW_OPT_N(b) rb_node_newnode(NODE_OPT_N,0,b,0) #define NEW_WHILE(c,b,n) rb_node_newnode(NODE_WHILE,c,b,n) @@ -285,11 +277,7 @@ typedef struct RNode { #define NEW_XSTR(s) rb_node_newnode(NODE_XSTR,s,0,0) #define NEW_DXSTR(s) rb_node_newnode(NODE_DXSTR,s,0,0) #define NEW_EVSTR(s,l) rb_node_newnode(NODE_EVSTR,rb_str_new(s,l),0,0) -#ifdef NOBLOCK_RECUR_incomplete -#define NEW_CALL(r,m,a) block_append(r,rb_node_newnode(NODE_CALL,0,m,a)) -#else #define NEW_CALL(r,m,a) rb_node_newnode(NODE_CALL,r,m,a) -#endif #define NEW_FCALL(m,a) rb_node_newnode(NODE_FCALL,0,m,a) #define NEW_VCALL(m) rb_node_newnode(NODE_VCALL,0,m,0) #define NEW_SUPER(a) rb_node_newnode(NODE_SUPER,0,0,a) diff --git a/pack.c b/pack.c index b9988830a6..5461aaddc1 100644 --- a/pack.c +++ b/pack.c @@ -984,7 +984,7 @@ hex2num(c) #ifdef NATINT_PACK #define PACK_LENGTH_ADJUST(type,sz) do { \ - int t__len = NATINT_LEN((type),(sz)); \ + int t__len = NATINT_LEN(type,(sz)); \ tmp = 0; \ if (len > (send-s)/t__len) { \ if (!star) { \ @@ -1018,7 +1018,7 @@ pack_unpack(str, fmt) char type; int len, tmp, star; #ifdef NATINT_PACK - int natint; /* native integer */ + int natint; /* native integer */ #endif s = str2cstr(str, &len); @@ -1028,6 +1028,9 @@ pack_unpack(str, fmt) ary = rb_ary_new(); while (p < pend) { +#ifdef NATINT_PACK + natint = 0; +#endif star = 0; type = *p++; if (*p == '_') { @@ -1630,7 +1633,9 @@ uv_to_utf8(buf, uv) buf[5] = (uv&0x3f)|0x80; return 6; } +#if SIZEOF_LONG > 4 if (uv <= 0xfffffffff) { +#endif buf[0] = 0xfe; buf[1] = ((uv>>30)&0x3f)|0x80; buf[2] = ((uv>>24)&0x3f)|0x80; @@ -1639,8 +1644,10 @@ uv_to_utf8(buf, uv) buf[5] = ((uv>>6)&0x3f)|0x80; buf[6] = (uv&0x3f)|0x80; return 7; +#if SIZEOF_LONG > 4 } rb_raise(rb_eArgError, "uv_to_utf8(); too big value"); +#endif } static unsigned long diff --git a/parse.y b/parse.y index a47a3253b7..06d79a914d 100644 --- a/parse.y +++ b/parse.y @@ -180,7 +180,7 @@ static void top_local_setup(); %type mlhs mlhs_head mlhs_tail mlhs_basic mlhs_entry mlhs_item mlhs_node %type variable symbol operation operation2 operation3 %type cname fname op f_rest_arg -%type f_arg +%type f_norm_arg f_arg %token tUPLUS /* unary+ */ %token tUMINUS /* unary- */ %token tPOW /* ** */ @@ -1505,18 +1505,19 @@ f_args : f_arg ',' f_optarg ',' f_rest_arg opt_f_block_arg $$ = NEW_ARGS(0, 0, -1); } -f_arg : tIDENTIFIER +f_norm_arg : tIDENTIFIER { if (!is_local_id($1)) yyerror("formal argument must be local variable"); + else if (local_id($1)) + yyerror("duplicate argument name"); local_cnt($1); $$ = 1; } - | f_arg ',' tIDENTIFIER + +f_arg : f_norm_arg + | f_arg ',' f_norm_arg { - if (!is_local_id($3)) - yyerror("formal argument must be local variable"); - local_cnt($3); $$ += 1; } @@ -1524,6 +1525,8 @@ f_opt : tIDENTIFIER '=' arg { if (!is_local_id($1)) yyerror("formal argument must be local variable"); + else if (local_id($1)) + yyerror("duplicate optional argument name"); $$ = assignable($1, $3); } @@ -1541,6 +1544,8 @@ f_rest_arg : tSTAR tIDENTIFIER { if (!is_local_id($2)) yyerror("rest argument must be local variable"); + else if (local_id($2)) + yyerror("duplicate rest argument name"); $$ = local_cnt($2); } | tSTAR @@ -2703,9 +2708,6 @@ yylex() } if (lex_state == EXPR_BEG || lex_state == EXPR_MID || (lex_state == EXPR_ARG && space_seen && !ISSPACE(c))) { - if (ISDIGIT(c)) { - goto start_num; - } pushback(c); lex_state = EXPR_BEG; return tUPLUS; @@ -3165,7 +3167,6 @@ yylex() if (ismbchar(c)) { int i, len = mbclen(c)-1; - tokadd(c); for (i = 0; i < len; i++) { c = nextc(); tokadd(c); @@ -3326,7 +3327,21 @@ rb_str_extend(list, term) return list; } } - /* through */ + + while (is_identchar(c)) { + tokadd(c); + if (ismbchar(c)) { + int i, len = mbclen(c)-1; + + for (i = 0; i < len; i++) { + c = nextc(); + tokadd(c); + } + } + c = nextc(); + } + pushback(c); + break; case '@': tokadd(c); @@ -3336,7 +3351,6 @@ rb_str_extend(list, term) if (ismbchar(c)) { int i, len = mbclen(c)-1; - tokadd(c); for (i = 0; i < len; i++) { c = nextc(); tokadd(c); diff --git a/re.c b/re.c index 451b9b6208..4ecc46eee5 100644 --- a/re.c +++ b/re.c @@ -530,10 +530,11 @@ rb_reg_search(reg, str, pos, reverse) } regs = RMATCH(match)->regs; - range = RSTRING(str)->len - pos; if (reverse) { - range = -range; - pos = RSTRING(str)->len; + range = -pos; + } + else { + range = RSTRING(str)->len - pos; } result = re_search(RREGEXP(reg)->ptr,RSTRING(str)->ptr,RSTRING(str)->len, pos, range, regs); diff --git a/regex.c b/regex.c index db01577e66..fd06aca153 100644 --- a/regex.c +++ b/regex.c @@ -344,6 +344,7 @@ enum regexpcode and store it in a memory register. Followed by one byte containing the register number. Register numbers must be in the range 0 through RE_NREGS. */ + start_paren, /* Place holder at the start of (?:..). */ stop_paren, /* Place holder at the end of (?:..). */ casefold_on, /* Turn on casefold flag. */ casefold_off, /* Turn off casefold flag. */ @@ -464,7 +465,7 @@ re_set_syntax(syntax) static unsigned int utf8_firstbyte(c) - unsigned int c; + unsigned long c; { if (c < 0x80) return c; if (c <= 0x7ff) return ((c>>6)&0xff)|0xc0; @@ -472,12 +473,16 @@ utf8_firstbyte(c) if (c <= 0x1fffff) return ((c>>18)&0xff)|0xf0; if (c <= 0x3ffffff) return ((c>>24)&0xff)|0xf8; if (c <= 0x7fffffff) return ((c>>30)&0xff)|0xfc; +#if SIZEOF_INT > 4 if (c <= 0xfffffffff) return 0xfe; +#else + return 0xfe; +#endif } static void print_mbc(c) - unsigned int c; + unsigned long c; { if (current_mbctype == MBCTYPE_UTF8) { if (c < 0x80) @@ -587,13 +592,13 @@ print_mbc(c) } while (0) #define EXTRACT_MBC(p) \ - ((unsigned short)((unsigned char)(p)[0] << 24 | \ + ((unsigned long)((unsigned char)(p)[0] << 24 | \ (unsigned char)(p)[1] << 16 | \ (unsigned char)(p)[2] << 8 | \ (unsigned char)(p)[3])) #define EXTRACT_MBC_AND_INCR(p) \ - ((unsigned short)((p) += 4, \ + ((unsigned long)((p) += 4, \ (unsigned char)(p)[-4] << 24 | \ (unsigned char)(p)[-3] << 16 | \ (unsigned char)(p)[-2] << 8 | \ @@ -614,14 +619,14 @@ print_mbc(c) unsigned char sbc_map[sbc_size]; same as charset(_not)? up to here. unsigned short mbc_size; number of intervals. struct { - unsigned int beg; beginning of interval. - unsigned int end; end of interval. + unsigned long beg; beginning of interval. + unsigned long end; end of interval. } intervals[mbc_size]; }; */ static void set_list_bits(c1, c2, b) - unsigned int c1, c2; + unsigned long c1, c2; unsigned char *b; { unsigned char sbc_size = b[-1]; @@ -667,7 +672,7 @@ set_list_bits(c1, c2, b) static int is_in_list(c, b) - unsigned int c; + unsigned long c; const unsigned char *b; { unsigned short size; @@ -736,6 +741,10 @@ print_partial_compiled_pattern(start, end) printf("/stop_memory/%d/%d", mcnt, *p++); break; + case start_paren: + printf("/start_paren"); + break; + case stop_paren: printf("/stop_paren"); break; @@ -997,6 +1006,7 @@ calculate_must_string(start, end) case endbuf: case endbuf2: case push_dummy_failure: + case start_paren: case stop_paren: case posix_on: case posix_off: @@ -1699,6 +1709,7 @@ re_compile_pattern(pattern, size, bufp) break; case ':': + BUFPUSH(start_paren); pending_exact = 0; default: break; @@ -2617,6 +2628,7 @@ re_compile_fastmap(bufp) case wordend: case pop_and_fail: case push_dummy_failure: + case start_paren: case stop_paren: continue; @@ -2785,7 +2797,7 @@ re_compile_fastmap(bufp) } { unsigned short size; - unsigned int c, beg, end; + unsigned long c, beg, end; p += p[-1] + 2; size = EXTRACT_UNSIGNED(&p[-2]); @@ -2834,7 +2846,7 @@ re_compile_fastmap(bufp) } { unsigned short size; - unsigned int c, beg, end; + unsigned long c, beg, end; p += p[-1] + 2; size = EXTRACT_UNSIGNED(&p[-2]); @@ -3042,7 +3054,7 @@ re_search(bufp, string, size, startpos, range, regs) } else if (fastmap && (bufp->stclass)) { register unsigned char *p; - unsigned int c; + unsigned long c; int irange = range; p = (unsigned char*)string+startpos; @@ -3476,6 +3488,7 @@ re_match(bufp, string_arg, size, pos, regs) p += 2; continue; + case start_paren: case stop_paren: break; @@ -3698,7 +3711,8 @@ re_match(bufp, string_arg, size, pos, regs) if ((enum regexpcode)*p1 == stop_memory || (enum regexpcode)*p1 == start_memory) p1 += 3; /* Skip over args, too. */ - else if ((enum regexpcode)*p1 == stop_paren) + else if (/*(enum regexpcode)*p1 == start_paren ||*/ + (enum regexpcode)*p1 == stop_paren) p1 += 1; else break; @@ -3790,7 +3804,8 @@ re_match(bufp, string_arg, size, pos, regs) if ((enum regexpcode)*p1 == stop_memory || (enum regexpcode)*p1 == start_memory) p1 += 3; /* Skip over args, too. */ - else if ((enum regexpcode)*p1 == stop_paren) + else if (/*(enum regexpcode)*p1 == start_paren ||*/ + (enum regexpcode)*p1 == stop_paren) p1 += 1; else break; @@ -4052,10 +4067,11 @@ re_match(bufp, string_arg, size, pos, regs) pop_loop: switch ((enum regexpcode)*p1) { case stop_paren: +#if 0 failed_paren = 1; p1++; goto pop_loop; - +#endif case jump_n: case finalize_push_n: is_a_jump_n = 1; diff --git a/ruby.h b/ruby.h index 01beafcf68..b973105a8b 100644 --- a/ruby.h +++ b/ruby.h @@ -130,7 +130,7 @@ VALUE rb_int2inum _((long)); #define Qtrue 2 #define Qnil 4 -# define RTEST(v) rb_test_false_or_nil((VALUE)(v)) +#define RTEST(v) rb_test_false_or_nil((VALUE)(v)) #define NIL_P(v) ((VALUE)(v) == Qnil) #define CLASS_OF(v) rb_class_of((VALUE)(v)) @@ -265,7 +265,6 @@ struct RHash { struct RFile { struct RBasic basic; - struct st_table *iv_tbl; struct OpenFile *fptr; }; diff --git a/rubyio.h b/rubyio.h index 979c6e607b..1df37b1501 100644 --- a/rubyio.h +++ b/rubyio.h @@ -36,7 +36,6 @@ typedef struct OpenFile { #define GetOpenFile(obj,fp) rb_io_check_closed((fp) = RFILE(obj)->fptr) #define MakeOpenFile(obj, fp) do {\ - RFILE(obj)->iv_tbl = 0;\ fp = RFILE(obj)->fptr = ALLOC(OpenFile);\ fp->f = fp->f2 = NULL;\ fp->mode = 0;\ diff --git a/sample/test.rb b/sample/test.rb index 023ff69d72..a849a42fc2 100644 --- a/sample/test.rb +++ b/sample/test.rb @@ -609,6 +609,14 @@ ABCD ABCD END +ok(/^(ab+)+b/ =~ "ababb" && $& == "ababb") +ok(/^(?:ab+)+b/ =~ "ababb" && $& == "ababb") +ok(/^(ab+)+/ =~ "ababb" && $& == "ababb") +ok(/^(?:ab+)+/ =~ "ababb" && $& == "ababb") + +ok(/(\s+\d+){2}/ =~ " 1 2" && $& == " 1 2") +ok(/(?:\s+\d+){2}/ =~ " 1 2" && $& == " 1 2") + $x.gsub!(/((.|\n)*?)B((.|\n)*?)D/){$1+$3} ok($x == "AC\nAC\n") diff --git a/string.c b/string.c index 2e4a95ecb9..f191bd1f4d 100644 --- a/string.c +++ b/string.c @@ -623,10 +623,10 @@ rb_str_rindex(argc, argv, str) if (rb_scan_args(argc, argv, "11", &sub, &position) == 2) { pos = NUM2INT(position); - if (pos > RSTRING(str)->len) return Qnil; + if (pos > RSTRING(str)->len) pos = RSTRING(str)->len; } else { - pos = 0; + pos = RSTRING(str)->len; } switch (TYPE(sub)) { @@ -637,9 +637,9 @@ rb_str_rindex(argc, argv, str) case T_STRING: /* substring longer than string */ - if (RSTRING(str)->len - pos < RSTRING(sub)->len) return Qnil; - sbeg = RSTRING(str)->ptr + pos; - s = RSTRING(str)->ptr + RSTRING(str)->len - RSTRING(sub)->len; + if (pos < RSTRING(sub)->len) return Qnil; + sbeg = RSTRING(str)->ptr; + s = RSTRING(str)->ptr + pos - RSTRING(sub)->len; t = RSTRING(sub)->ptr; len = RSTRING(sub)->len; while (sbeg <= s) { @@ -653,8 +653,8 @@ rb_str_rindex(argc, argv, str) case T_FIXNUM: { int c = FIX2INT(sub); - char *p = RSTRING(str)->ptr + RSTRING(str)->len - 1; - char *pbeg = RSTRING(str)->ptr + pos; + char *p = RSTRING(str)->ptr + pos - 1; + char *pbeg = RSTRING(str)->ptr; while (pbeg <= p) { if (*p == c) return INT2NUM(p - RSTRING(str)->ptr); diff --git a/variable.c b/variable.c index 0edb280da2..c8ad22f4b1 100644 --- a/variable.c +++ b/variable.c @@ -833,7 +833,6 @@ rb_ivar_get(obj, id) case T_OBJECT: case T_CLASS: case T_MODULE: - case T_FILE: if (ROBJECT(obj)->iv_tbl && st_lookup(ROBJECT(obj)->iv_tbl, id, &val)) return val; break; @@ -860,7 +859,6 @@ rb_ivar_set(obj, id, val) case T_OBJECT: case T_CLASS: case T_MODULE: - case T_FILE: if (!ROBJECT(obj)->iv_tbl) ROBJECT(obj)->iv_tbl = st_init_numtable(); st_insert(ROBJECT(obj)->iv_tbl, id, val); break; @@ -880,7 +878,6 @@ rb_ivar_defined(obj, id) case T_OBJECT: case T_CLASS: case T_MODULE: - case T_FILE: if (ROBJECT(obj)->iv_tbl && st_lookup(ROBJECT(obj)->iv_tbl, id, 0)) return Qtrue; break; @@ -916,7 +913,6 @@ rb_obj_instance_variables(obj) case T_OBJECT: case T_CLASS: case T_MODULE: - case T_FILE: ary = rb_ary_new(); if (ROBJECT(obj)->iv_tbl) { st_foreach(ROBJECT(obj)->iv_tbl, ivar_i, ary); @@ -955,7 +951,6 @@ rb_obj_remove_instance_variable(obj, name) case T_OBJECT: case T_CLASS: case T_MODULE: - case T_FILE: if (ROBJECT(obj)->iv_tbl) { st_delete(ROBJECT(obj)->iv_tbl, &id, &val); } diff --git a/version.c b/version.c index 57039d5cfe..42d2ef84ca 100644 --- a/version.c +++ b/version.c @@ -35,7 +35,12 @@ Init_version() void ruby_show_version() { +#if RUBY_VERSION_CODE < 140 + printf("ruby %s-%d [%s]\n", RUBY_VERSION, RUBY_RELEASE_CODE % 1000000, + RUBY_PLATFORM); +#else printf("ruby %s (%s) [%s]\n", RUBY_VERSION, RUBY_RELEASE_DATE, RUBY_PLATFORM); +#endif } void diff --git a/version.h b/version.h index 06c560ff92..d6d3aa2974 100644 --- a/version.h +++ b/version.h @@ -1,4 +1,4 @@ #define RUBY_VERSION "1.3.4" -#define RUBY_RELEASE_DATE "1999-06-24" +#define RUBY_RELEASE_DATE "1999-06-25" #define RUBY_VERSION_CODE 134 -#define RUBY_RELEASE_CODE 19990624 +#define RUBY_RELEASE_CODE 19990625 -- cgit v1.2.3