From 7de72c4858a8240ae025aecb3599291f0bf90e34 Mon Sep 17 00:00:00 2001 From: matz Date: Mon, 18 Feb 2002 09:52:48 +0000 Subject: * parse.y (expr_value, arg_value, primary_value): value_expr() check in place. * eval.c (block_pass): "&nil" should clear block given. * dir.c (push_braces): remove MAXPATHLEN dependency. * dir.c (dir_s_globd): ditto. * dln.c (init_funcname): ditto. * dln.c (load_1): ditto. * dln.c (dln_load): ditto. * configure.in: add GNU/Hurd switches. * pack.c (pack_pack): allows comment in template strings. * pack.c (pack_unpack): ditto. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@2082 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 28 ++++++++ configure.in | 9 +++ defines.h | 43 +++++++++++++ dir.c | 19 ++---- dln.c | 47 ++++++++++---- doc/NEWS | 8 +++ eval.c | 15 +++-- pack.c | 18 +++++- parse.y | 204 ++++++++++++++++++++++++++--------------------------------- ruby.h | 43 ------------- 10 files changed, 246 insertions(+), 188 deletions(-) diff --git a/ChangeLog b/ChangeLog index 4054f88ba8..00c4feac1d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -3,6 +3,33 @@ Mon Feb 18 14:06:28 2002 Nobuyoshi Nakada * misc/ruby-mode.el (ruby-block-hanging-re): rescue block was too indented. +Mon Feb 18 13:56:44 2002 Yukihiro Matsumoto + + * parse.y (expr_value, arg_value, primary_value): value_expr() + check in place. + + * eval.c (block_pass): "&nil" should clear block given. + +Mon Feb 18 02:05:56 2002 Wolfgang Jahrling + + * dir.c (push_braces): remove MAXPATHLEN dependency. + + * dir.c (dir_s_globd): ditto. + + * dln.c (init_funcname): ditto. + + * dln.c (load_1): ditto. + + * dln.c (dln_load): ditto. + + * configure.in: add GNU/Hurd switches. + +Fri Feb 15 17:44:26 2002 Yukihiro Matsumoto + + * pack.c (pack_pack): allows comment in template strings. + + * pack.c (pack_unpack): ditto. + Sun Feb 17 23:41:37 2002 Nobuyoshi Nakada * mkconfig.rb (Config::expand): expand ${} too. @@ -36,6 +63,7 @@ Thu Feb 16 02:11:08 2002 Nobuyoshi Nakada * misc/ruby-mode.el (ruby-font-lock-keywords): fontify instance/class/global variables start with '_'. +>>>>>>> 1.742 Fri Feb 15 14:40:38 2002 Yukihiro Matsumoto * eval.c (rb_eval): replace rb_cvar_declare() by rb_cvar_set(). diff --git a/configure.in b/configure.in index afa29a70e0..31a007a941 100644 --- a/configure.in +++ b/configure.in @@ -610,6 +610,9 @@ if test "$with_dln_a_out" != yes; then rb_cv_dlopen=yes ;; linux*) LDSHARED="$CC -shared" rb_cv_dlopen=yes ;; + gnu*) LDSHARED="$CC -shared" + rb_cv_dlopen=yes + LDFLAGS="-rdynamic" ;; freebsd*) LDSHARED="$CC -shared" if test "$rb_cv_binary_elf" = yes; then LDFLAGS="-rdynamic" @@ -741,6 +744,8 @@ fi case "$target_os" in linux*) STRIP='strip -S -x';; + gnu*) + STRIP='strip -S -x';; nextstep*) STRIP='strip -A -n';; openstep*) @@ -882,6 +887,10 @@ if test "$enable_shared" = 'yes'; then LIBRUBY_DLDFLAGS='-Wl,-soname,lib$(RUBY_INSTALL_NAME).so.$(MAJOR).$(MINOR)' LIBRUBY_ALIASES='lib$(RUBY_INSTALL_NAME).so.$(MAJOR).$(MINOR) lib$(RUBY_INSTALL_NAME).so' ;; + gnu*) + LIBRUBY_DLDFLAGS='-Wl,-soname,lib$(RUBY_INSTALL_NAME).so.$(MAJOR).$(MINOR)' + LIBRUBY_ALIASES='lib$(RUBY_INSTALL_NAME).so.$(MAJOR).$(MINOR) lib$(RUBY_INSTALL_NAME).so' + ;; freebsd*) SOLIBS='$(LIBS)' LIBRUBY_SO='lib$(RUBY_INSTALL_NAME).so.$(MAJOR)$(MINOR)' diff --git a/defines.h b/defines.h index bdf3e856bd..c2b3dce685 100644 --- a/defines.h +++ b/defines.h @@ -12,6 +12,49 @@ #define RUBY +#if !defined(__STDC__) && !defined(_MSC_VER) +# define volatile +#endif + +#ifdef __cplusplus +# ifndef HAVE_PROTOTYPES +# define HAVE_PROTOTYPES 1 +# endif +# ifndef HAVE_STDARG_PROTOTYPES +# define HAVE_STDARG_PROTOTYPES 1 +# endif +#endif + +#undef _ +#ifdef HAVE_PROTOTYPES +# define _(args) args +#else +# define _(args) () +#endif + +#undef __ +#ifdef HAVE_STDARG_PROTOTYPES +# define __(args) args +#else +# define __(args) () +#endif + +#ifdef __cplusplus +#define ANYARGS ... +#else +#define ANYARGS +#endif + +#define xmalloc ruby_xmalloc +#define xcalloc ruby_xcalloc +#define xrealloc ruby_xrealloc +#define xfree ruby_xfree + +void *xmalloc _((long)); +void *xcalloc _((long,long)); +void *xrealloc _((void*,long)); +void xfree _((void*)); + #if SIZEOF_LONG_LONG > 0 # define HAVE_LONG_LONG # define LONG_LONG long long diff --git a/dir.c b/dir.c index 13176f4cc5..b56198633e 100644 --- a/dir.c +++ b/dir.c @@ -841,7 +841,7 @@ push_braces(ary, s) VALUE ary; char *s; { - char buffer[MAXPATHLEN], *buf = buffer; + char *buf; char *p, *t, *b; char *lbrace, *rbrace; int nest = 0; @@ -866,8 +866,7 @@ push_braces(ary, s) if (lbrace) { int len = strlen(s); - if (len >= MAXPATHLEN) - buf = xmalloc(len + 1); + buf = xmalloc(len + 1); memcpy(buf, s, lbrace-s); b = buf + (lbrace-s); p = lbrace; @@ -881,8 +880,7 @@ push_braces(ary, s) strcpy(b+(p-t), rbrace+1); push_braces(ary, buf); } - if (buf != buffer) - free(buf); + free(buf); } else { push_globs(ary, s); @@ -896,7 +894,7 @@ dir_s_glob(dir, str) VALUE dir, str; { char *p, *pend; - char buffer[MAXPATHLEN], *buf; + char *buf; char *t; int nest; VALUE ary = 0; @@ -905,11 +903,7 @@ dir_s_glob(dir, str) if (!rb_block_given_p()) { ary = rb_ary_new(); } - if (RSTRING(str)->len >= MAXPATHLEN) { - buf = xmalloc(RSTRING(str)->len + 1); - } else { - buf = buffer; - } + buf = xmalloc(RSTRING(str)->len + 1); p = RSTRING(str)->ptr; pend = p + RSTRING(str)->len; @@ -936,8 +930,7 @@ dir_s_glob(dir, str) } /* else unmatched braces */ } - if (buf != buffer) - free(buf); + free(buf); if (ary) { return ary; } diff --git a/dln.c b/dln.c index cbb267f6c3..06d220bff7 100644 --- a/dln.c +++ b/dln.c @@ -14,6 +14,10 @@ #include "defines.h" #include "dln.h" +#ifdef HAVE_STDLIB_H +# include +#endif + #ifdef __CHECKER__ #undef HAVE_DLOPEN #undef USE_DLN_A_OUT @@ -96,7 +100,7 @@ int eaccess(); static void init_funcname(buf, file) - char *buf; + char **buf; char *file; { char *p, *slash; @@ -109,8 +113,15 @@ init_funcname(buf, file) if (*p == '/') slash = p; #endif - snprintf(buf, MAXPATHLEN, FUNCNAME_PATTERN, slash + 1); - for (p = buf; *p; p++) { /* Delete suffix if it exists */ +/* This assumes that systems without length limitation for file names + provide asprintf(). This shouldn't be too unlikely. */ +#ifdef MAXPATHLEN + *buf = xmalloc(MAXPATHLEN); + snprintf(*buf, MAXPATHLEN, FUNCNAME_PATTERN, slash + 1); +#else + asprintf(buf, FUNCNAME_PATTERN, slash + 1); +#endif + for (p = *buf; *p; p++) { /* Delete suffix if it exists */ if (*p == '.') { *p = '\0'; break; } @@ -622,7 +633,6 @@ load_1(fd, disp, need_init) struct nlist *sym; struct nlist *end; int init_p = 0; - char buf[MAXPATHLEN]; if (load_header(fd, &hdr, disp) == -1) return -1; if (INVALID_OBJECT(hdr)) { @@ -835,12 +845,13 @@ load_1(fd, disp, need_init) if (need_init) { int len; char **libs_to_be_linked = 0; + char *buf; if (undef_tbl->num_entries > 0) { if (load_lib(libc) == -1) goto err_exit; } - init_funcname(buf, need_init); + init_funcname(&buf, need_init); len = strlen(buf); for (sym = syms; symnum_entries > 0) { while (*libs_to_be_linked) { load_lib(*libs_to_be_linked); @@ -1226,12 +1238,12 @@ dln_load(file) HINSTANCE handle; char winfile[MAXPATHLEN]; void (*init_fct)(); - char buf[MAXPATHLEN]; + char *buf; if (strlen(file) >= MAXPATHLEN) rb_loaderror("filename too long"); /* Load the file as an object one */ - init_funcname(buf, file); + init_funcname(&buf, file); strcpy(winfile, file); @@ -1244,6 +1256,8 @@ dln_load(file) if ((init_fct = (void(*)())GetProcAddress(handle, buf)) == NULL) { rb_loaderror("%s - %s\n%s", dln_strerror(), buf, file); } + free(buf); + /* Call the init code */ (*init_fct)(); return handle; @@ -1255,9 +1269,9 @@ dln_load(file) return 0; #else - char buf[MAXPATHLEN]; + char *buf; /* Load the file as an object one */ - init_funcname(buf, file); + init_funcname(&buf, file); #ifdef USE_DLN_DLOPEN #define DLN_DEFINED @@ -1277,12 +1291,15 @@ dln_load(file) goto failed; } - if ((init_fct = (void(*)())dlsym(handle, buf)) == NULL) { + init_fct = (void(*)())dlsym(handle, buf); + free(buf); + if (init_fct == NULL) { dlclose(handle); goto failed; } /* Call the init code */ (*init_fct)(); + return handle; } #endif /* USE_DLN_DLOPEN */ @@ -1301,6 +1318,7 @@ dln_load(file) rb_loaderror("%s - %s", strerror(errno), file); } shl_findsym(&lib, buf, TYPE_PROCEDURE, (void*)&init_fct); + free(buf) if (init_fct == NULL) { shl_findsym(&lib, buf, TYPE_UNDEFINED, (void*)&init_fct); if (init_fct == NULL) { @@ -1359,6 +1377,7 @@ dln_load(file) if(rld_lookup(NULL, buf, &init_address) == 0) { rb_loaderror("Failed to lookup Init function %.200s", file); } + free(buf); /* Cannot call *init_address directory, so copy this value to funtion pointer */ @@ -1372,7 +1391,7 @@ dln_load(file) int dyld_result; NSObjectFileImage obj_file; /* handle, but not use it */ /* "file" is module file name . - "buf" is initial function name with "_" . */ + "buf" is pointer to initial function name with "_" . */ void (*init_fct)(); @@ -1393,6 +1412,7 @@ dln_load(file) /* NSLookupAndBindSymbol require function name with "_" !! */ init_fct = NSAddressOfSymbol(NSLookupAndBindSymbol(buf)); + free(buf); (*init_fct)(); return (void*)init_fct; @@ -1433,14 +1453,17 @@ dln_load(file) if ((B_BAD_IMAGE_ID == err_stat) || (B_BAD_INDEX == err_stat)) { unload_add_on(img_id); + free(buf); rb_loaderror("Failed to lookup Init function %.200s", file); } else if (B_NO_ERROR != err_stat) { char errmsg[] = "Internal of BeOS version. %.200s (symbol_name = %s)"; unload_add_on(img_id); + free(buf); rb_loaderror(errmsg, strerror(err_stat), buf); } + free(buf); /* call module initialize function. */ (*init_fct)(); return (void*)img_id; @@ -1485,10 +1508,10 @@ dln_load(file) /* Locate the address of the correct init function */ c2pstr(buf); err = FindSymbol(connID, buf, &symAddr, &class); + free(buf); if (err) { rb_loaderror("Unresolved symbols - %s" , file); } - init_fct = (void (*)())symAddr; (*init_fct)(); return (void*)init_fct; diff --git a/doc/NEWS b/doc/NEWS index b611e7c1c6..83f5ffcc65 100644 --- a/doc/NEWS +++ b/doc/NEWS @@ -1,3 +1,11 @@ +: Array#pack, String#unpack + + allows comment in template strings. + +: Array#pack, String#unpack + + new templates 'q' and 'Q' for 64bit integer (signed and unsigned respectively). + : Array#fill takes block to get the values to fill. diff --git a/eval.c b/eval.c index 1bc78c72d1..634347388e 100644 --- a/eval.c +++ b/eval.c @@ -2323,17 +2323,18 @@ rb_eval(self, n) case NODE_WHILE: PUSH_TAG(PROT_NONE); + result = Qnil; switch (state = EXEC_TAG()) { case 0: ruby_sourceline = nd_line(node); - if (node->nd_state && !RTEST(result = rb_eval(self, node->nd_cond))) + if (node->nd_state && !RTEST(rb_eval(self, node->nd_cond))) goto while_out; do { while_redo: rb_eval(self, node->nd_body); while_next: ; - } while (RTEST(result = rb_eval(self, node->nd_cond))); + } while (RTEST(rb_eval(self, node->nd_cond))); break; case TAG_REDO: @@ -2355,16 +2356,17 @@ rb_eval(self, n) case NODE_UNTIL: PUSH_TAG(PROT_NONE); + result = Qnil; switch (state = EXEC_TAG()) { case 0: - if (node->nd_state && RTEST(result = rb_eval(self, node->nd_cond))) + if (node->nd_state && RTEST(rb_eval(self, node->nd_cond))) goto until_out; do { until_redo: rb_eval(self, node->nd_body); until_next: ; - } while (!RTEST(result = rb_eval(self, node->nd_cond))); + } while (!RTEST(rb_eval(self, node->nd_cond))); break; case TAG_REDO: @@ -6598,7 +6600,10 @@ block_pass(self, node) volatile int safe = ruby_safe_level; if (NIL_P(block)) { - return rb_eval(self, node->nd_iter); + PUSH_ITER(ITER_NOT); + result = rb_eval(self, node->nd_iter); + POP_ITER(); + return result; } if (rb_obj_is_kind_of(block, rb_cMethod)) { block = method_proc(block); diff --git a/pack.c b/pack.c index 316becea40..00237659de 100644 --- a/pack.c +++ b/pack.c @@ -363,6 +363,13 @@ pack_pack(ary, fmt) #endif if (ISSPACE(type)) continue; + if (type == '#') { + while (p < pend) { + if (*p == '\n') continue; + p++; + } + break; + } if (*p == '_' || *p == '!') { char *natstr = "sSiIlL"; @@ -1070,11 +1077,20 @@ pack_unpack(str, fmt) ary = rb_ary_new(); while (p < pend) { + type = *p++; #ifdef NATINT_PACK natint = 0; #endif + + if (ISSPACE(type)) continue; + if (type == '#') { + while (p < pend) { + if (*p == '\n') continue; + p++; + } + break; + } star = 0; - type = *p++; if (*p == '_' || *p == '!') { char *natstr = "sSiIlL"; diff --git a/parse.y b/parse.y index 1545961881..bff58ef4a3 100644 --- a/parse.y +++ b/parse.y @@ -213,6 +213,7 @@ static void top_local_setup(); %type singleton string %type literal numeric %type compstmt stmts stmt expr arg primary command command_call method_call +%type expr_value arg_value primary_value block_call_value %type if_tail opt_else case_body cases rescue exc_list exc_var ensure %type args when_args call_args call_args2 open_args paren_args opt_paren_args %type command_args aref_args opt_block_arg block_arg var_ref var_lhs @@ -356,21 +357,18 @@ stmt : kALIAS fitem {lex_state = EXPR_FNAME;} fitem yyerror("undef within method"); $$ = $2; } - | stmt kIF_MOD expr + | stmt kIF_MOD expr_value { - value_expr($3); $$ = NEW_IF(cond($3), $1, 0); fixpos($$, $3); } - | stmt kUNLESS_MOD expr + | stmt kUNLESS_MOD expr_value { - value_expr($3); $$ = NEW_UNLESS(cond($3), $1, 0); fixpos($$, $3); } - | stmt kWHILE_MOD expr + | stmt kWHILE_MOD expr_value { - value_expr($3); if ($1 && nd_type($1) == NODE_BEGIN) { $$ = NEW_WHILE(cond($3), $1->nd_body, 0); } @@ -378,9 +376,8 @@ stmt : kALIAS fitem {lex_state = EXPR_FNAME;} fitem $$ = NEW_WHILE(cond($3), $1, 1); } } - | stmt kUNTIL_MOD expr + | stmt kUNTIL_MOD expr_value { - value_expr($3); if ($1 && nd_type($1) == NODE_BEGIN) { $$ = NEW_UNTIL(cond($3), $1->nd_body, 0); } @@ -450,7 +447,7 @@ stmt : kALIAS fitem {lex_state = EXPR_FNAME;} fitem $$ = 0; } } - | primary '[' aref_args ']' tOP_ASGN command_call + | primary_value '[' aref_args ']' tOP_ASGN command_call { NODE *tmp, *args = NEW_LIST($6); @@ -465,7 +462,7 @@ stmt : kALIAS fitem {lex_state = EXPR_FNAME;} fitem $$ = NEW_OP_ASGN1($1, $5, args); fixpos($$, $1); } - | primary '.' tIDENTIFIER tOP_ASGN command_call + | primary_value '.' tIDENTIFIER tOP_ASGN command_call { if ($4 == tOROP) { $4 = 0; @@ -476,7 +473,7 @@ stmt : kALIAS fitem {lex_state = EXPR_FNAME;} fitem $$ = NEW_OP_ASGN2($1, $3, $4, $5); fixpos($$, $1); } - | primary '.' tCONSTANT tOP_ASGN command_call + | primary_value '.' tCONSTANT tOP_ASGN command_call { if ($4 == tOROP) { $4 = 0; @@ -487,7 +484,7 @@ stmt : kALIAS fitem {lex_state = EXPR_FNAME;} fitem $$ = NEW_OP_ASGN2($1, $3, $4, $5); fixpos($$, $1); } - | primary tCOLON2 tIDENTIFIER tOP_ASGN command_call + | primary_value tCOLON2 tIDENTIFIER tOP_ASGN command_call { if ($4 == tOROP) { $4 = 0; @@ -509,7 +506,6 @@ stmt : kALIAS fitem {lex_state = EXPR_FNAME;} fitem } | mlhs '=' mrhs { - value_expr($3); $1->nd_value = $3; $$ = $1; } @@ -540,7 +536,6 @@ expr : kRETURN call_args } | kNOT expr { - value_expr($2); $$ = NEW_NOT(cond($2)); } | '!' command_call @@ -549,18 +544,22 @@ expr : kRETURN call_args } | arg +expr_value : expr + { + value_expr($$); + $$ = $1; + } + command_call : command | block_command block_command : block_call - | block_call '.' operation2 command_args + | block_call_value '.' operation2 command_args { - value_expr($1); $$ = new_call($1, $3, $4); } - | block_call tCOLON2 operation2 command_args + | block_call_value tCOLON2 operation2 command_args { - value_expr($1); $$ = new_call($1, $3, $4); } @@ -569,15 +568,13 @@ command : operation command_args $$ = new_fcall($1, $2); fixpos($$, $2); } - | primary '.' operation2 command_args + | primary_value '.' operation2 command_args { - value_expr($1); $$ = new_call($1, $3, $4); fixpos($$, $1); } - | primary tCOLON2 operation2 command_args + | primary_value tCOLON2 operation2 command_args { - value_expr($1); $$ = new_call($1, $3, $4); fixpos($$, $1); } @@ -650,19 +647,19 @@ mlhs_node : variable { $$ = assignable($1, 0); } - | primary '[' aref_args ']' + | primary_value '[' aref_args ']' { $$ = aryset($1, $3); } - | primary '.' tIDENTIFIER + | primary_value '.' tIDENTIFIER { $$ = attrset($1, $3); } - | primary tCOLON2 tIDENTIFIER + | primary_value tCOLON2 tIDENTIFIER { $$ = attrset($1, $3); } - | primary '.' tCONSTANT + | primary_value '.' tCONSTANT { $$ = attrset($1, $3); } @@ -676,19 +673,19 @@ lhs : variable { $$ = assignable($1, 0); } - | primary '[' aref_args ']' + | primary_value '[' aref_args ']' { $$ = aryset($1, $3); } - | primary '.' tIDENTIFIER + | primary_value '.' tIDENTIFIER { $$ = attrset($1, $3); } - | primary tCOLON2 tIDENTIFIER + | primary_value tCOLON2 tIDENTIFIER { $$ = attrset($1, $3); } - | primary '.' tCONSTANT + | primary_value '.' tCONSTANT { $$ = attrset($1, $3); } @@ -795,7 +792,7 @@ arg : lhs '=' arg $$ = 0; } } - | primary '[' aref_args ']' tOP_ASGN arg + | primary_value '[' aref_args ']' tOP_ASGN arg { NODE *tmp, *args = NEW_LIST($6); @@ -810,7 +807,7 @@ arg : lhs '=' arg $$ = NEW_OP_ASGN1($1, $5, args); fixpos($$, $1); } - | primary '.' tIDENTIFIER tOP_ASGN arg + | primary_value '.' tIDENTIFIER tOP_ASGN arg { if ($4 == tOROP) { $4 = 0; @@ -821,7 +818,7 @@ arg : lhs '=' arg $$ = NEW_OP_ASGN2($1, $3, $4, $5); fixpos($$, $1); } - | primary '.' tCONSTANT tOP_ASGN arg + | primary_value '.' tCONSTANT tOP_ASGN arg { if ($4 == tOROP) { $4 = 0; @@ -832,7 +829,7 @@ arg : lhs '=' arg $$ = NEW_OP_ASGN2($1, $3, $4, $5); fixpos($$, $1); } - | primary tCOLON2 tIDENTIFIER tOP_ASGN arg + | primary_value tCOLON2 tIDENTIFIER tOP_ASGN arg { if ($4 == tOROP) { $4 = 0; @@ -1003,7 +1000,6 @@ arg : lhs '=' arg } | arg '?' arg ':' arg { - value_expr($1); $$ = NEW_IF(cond($1), $3, $5); fixpos($$, $1); } @@ -1012,6 +1008,12 @@ arg : lhs '=' arg $$ = $1; } +arg_value : arg + { + value_expr($1); + $$ = $1; + } + aref_args : none | command opt_nl { @@ -1064,9 +1066,8 @@ call_args : command { $$ = arg_blk_pass($1, $2); } - | args ',' tSTAR arg opt_block_arg + | args ',' tSTAR arg_value opt_block_arg { - value_expr($4); $$ = arg_concat($1, $4); $$ = arg_blk_pass($$, $5); } @@ -1075,9 +1076,8 @@ call_args : command $$ = NEW_LIST(NEW_HASH($1)); $$ = arg_blk_pass($$, $2); } - | assocs ',' tSTAR arg opt_block_arg + | assocs ',' tSTAR arg_value opt_block_arg { - value_expr($4); $$ = arg_concat(NEW_LIST(NEW_HASH($1)), $4); $$ = arg_blk_pass($$, $5); } @@ -1092,32 +1092,27 @@ call_args : command $$ = arg_concat(list_append($1, NEW_HASH($3)), $6); $$ = arg_blk_pass($$, $7); } - | tSTAR arg opt_block_arg + | tSTAR arg_value opt_block_arg { - value_expr($2); $$ = arg_blk_pass(NEW_RESTARGS($2), $3); } | block_arg -call_args2 : arg ',' args opt_block_arg +call_args2 : arg_value ',' args opt_block_arg { $$ = arg_blk_pass(list_concat(NEW_LIST($1),$3), $4); } - | arg ',' block_arg + | arg_value ',' block_arg { $$ = arg_blk_pass($1, $3); } - | arg ',' tSTAR arg opt_block_arg + | arg_value ',' tSTAR arg_value opt_block_arg { - value_expr($1); - value_expr($4); $$ = arg_concat(NEW_LIST($1), $4); $$ = arg_blk_pass($$, $5); } - | arg ',' args ',' tSTAR arg opt_block_arg + | arg_value ',' args ',' tSTAR arg_value opt_block_arg { - value_expr($1); - value_expr($6); $$ = arg_concat(list_concat($1,$3), $6); $$ = arg_blk_pass($$, $7); } @@ -1126,41 +1121,33 @@ call_args2 : arg ',' args opt_block_arg $$ = NEW_LIST(NEW_HASH($1)); $$ = arg_blk_pass($$, $2); } - | assocs ',' tSTAR arg opt_block_arg + | assocs ',' tSTAR arg_value opt_block_arg { - value_expr($4); $$ = arg_concat(NEW_LIST(NEW_HASH($1)), $4); $$ = arg_blk_pass($$, $5); } - | arg ',' assocs opt_block_arg + | arg_value ',' assocs opt_block_arg { $$ = list_append(NEW_LIST($1), NEW_HASH($3)); $$ = arg_blk_pass($$, $4); } - | arg ',' args ',' assocs opt_block_arg + | arg_value ',' args ',' assocs opt_block_arg { - value_expr($1); - value_expr($6); $$ = list_append(list_concat(NEW_LIST($1),$3), NEW_HASH($5)); $$ = arg_blk_pass($$, $6); } - | arg ',' assocs ',' tSTAR arg opt_block_arg + | arg_value ',' assocs ',' tSTAR arg_value opt_block_arg { - value_expr($1); - value_expr($6); $$ = arg_concat(list_append(NEW_LIST($1), NEW_HASH($3)), $6); $$ = arg_blk_pass($$, $7); } - | arg ',' args ',' assocs ',' tSTAR arg opt_block_arg + | arg_value ',' args ',' assocs ',' tSTAR arg_value opt_block_arg { - value_expr($1); - value_expr($8); $$ = arg_concat(list_append(list_concat(NEW_LIST($1), $3), NEW_HASH($5)), $8); $$ = arg_blk_pass($$, $9); } - | tSTAR arg opt_block_arg + | tSTAR arg_value opt_block_arg { - value_expr($2); $$ = arg_blk_pass(NEW_RESTARGS($2), $3); } | block_arg @@ -1190,9 +1177,8 @@ open_args : call_args $$ = $2; } -block_arg : tAMPER arg +block_arg : tAMPER arg_value { - value_expr($2); $$ = NEW_BLOCK_PASS($2); } @@ -1202,20 +1188,17 @@ opt_block_arg : ',' block_arg } | none -args : arg +args : arg_value { - value_expr($1); $$ = NEW_LIST($1); } - | args ',' arg + | args ',' arg_value { - value_expr($3); $$ = list_append($1, $3); } -mrhs : arg +mrhs : arg_value { - value_expr($1); $$ = $1; } | mrhs_basic @@ -1223,19 +1206,16 @@ mrhs : arg $$ = NEW_REXPAND($1); } -mrhs_basic : args ',' arg +mrhs_basic : args ',' arg_value { - value_expr($3); $$ = list_append($1, $3); } - | args ',' tSTAR arg + | args ',' tSTAR arg_value { - value_expr($4); $$ = arg_concat($1, $4); } - | tSTAR arg + | tSTAR arg_value { - value_expr($2); $$ = $2; } @@ -1286,18 +1266,16 @@ primary : literal { $$ = $2; } - | primary tCOLON2 tCONSTANT + | primary_value tCOLON2 tCONSTANT { - value_expr($1); $$ = NEW_COLON2($1, $3); } | tCOLON3 cname { $$ = NEW_COLON3($2); } - | primary '[' aref_args ']' + | primary_value '[' aref_args ']' { - value_expr($1); $$ = NEW_CALL($1, tAREF, $3); } | tLBRACK aref_args ']' @@ -1321,7 +1299,6 @@ primary : literal } | kYIELD '(' call_args ')' { - value_expr($3); $$ = NEW_YIELD(ret_args($3)); } | kYIELD '(' ')' @@ -1352,45 +1329,40 @@ primary : literal $$ = $2; fixpos($$, $1); } - | kIF expr then + | kIF expr_value then compstmt if_tail kEND { - value_expr($2); $$ = NEW_IF(cond($2), $4, $5); fixpos($$, $2); } - | kUNLESS expr then + | kUNLESS expr_value then compstmt opt_else kEND { - value_expr($2); $$ = NEW_UNLESS(cond($2), $4, $5); fixpos($$, $2); } - | kWHILE {COND_PUSH(1);} expr do {COND_POP();} + | kWHILE {COND_PUSH(1);} expr_value do {COND_POP();} compstmt kEND { - value_expr($3); $$ = NEW_WHILE(cond($3), $6, 1); fixpos($$, $3); } - | kUNTIL {COND_PUSH(1);} expr do {COND_POP();} + | kUNTIL {COND_PUSH(1);} expr_value do {COND_POP();} compstmt kEND { - value_expr($3); $$ = NEW_UNTIL(cond($3), $6, 1); fixpos($$, $3); } - | kCASE expr opt_terms + | kCASE expr_value opt_terms case_body kEND { - value_expr($2); $$ = NEW_CASE($2, $4); fixpos($$, $2); } @@ -1398,11 +1370,10 @@ primary : literal { $$ = $3; } - | kFOR block_var kIN {COND_PUSH(1);} expr do {COND_POP();} + | kFOR block_var kIN {COND_PUSH(1);} expr_value do {COND_POP();} compstmt kEND { - value_expr($5); $$ = NEW_FOR($2, $5, $8); fixpos($$, $2); } @@ -1493,7 +1464,6 @@ primary : literal } | kDEF singleton dot_or_colon {lex_state = EXPR_FNAME;} fname { - value_expr($2); in_single++; local_push(); lex_state = EXPR_END; /* force for args */ @@ -1534,6 +1504,12 @@ primary : literal $$ = NEW_RETRY(); } +primary_value : primary + { + value_expr($1); + $$ = $1; + } + then : term | kTHEN | term kTHEN @@ -1542,11 +1518,10 @@ do : term | kDO_COND if_tail : opt_else - | kELSIF expr then + | kELSIF expr_value then compstmt if_tail { - value_expr($2); $$ = NEW_IF(cond($2), $4, $5); fixpos($$, $2); } @@ -1606,37 +1581,38 @@ block_call : command do_block $$ = $2; fixpos($$, $2); } - | block_call '.' operation2 opt_paren_args + | block_call_value '.' operation2 opt_paren_args { - value_expr($1); $$ = new_call($1, $3, $4); } - | block_call tCOLON2 operation2 opt_paren_args + | block_call_value tCOLON2 operation2 opt_paren_args { - value_expr($1); $$ = new_call($1, $3, $4); } +block_call_value : block_call + { + value_expr($$); + $$ = $1; + } + method_call : operation paren_args { $$ = new_fcall($1, $2); fixpos($$, $2); } - | primary '.' operation2 opt_paren_args + | primary_value '.' operation2 opt_paren_args { - value_expr($1); $$ = new_call($1, $3, $4); fixpos($$, $1); } - | primary tCOLON2 operation2 paren_args + | primary_value tCOLON2 operation2 paren_args { - value_expr($1); $$ = new_call($1, $3, $4); fixpos($$, $1); } - | primary tCOLON2 operation3 + | primary_value tCOLON2 operation3 { - value_expr($1); $$ = new_call($1, $3, 0); } | kSUPER paren_args @@ -1685,14 +1661,12 @@ case_body : kWHEN when_args then } when_args : args - | args ',' tSTAR arg + | args ',' tSTAR arg_value { - value_expr($4); $$ = list_append($1, NEW_WHEN($4, 0, 0)); } - | tSTAR arg + | tSTAR arg_value { - value_expr($2); $$ = NEW_LIST(NEW_WHEN($2, 0, 0)); } @@ -1813,7 +1787,7 @@ superclass : term { lex_state = EXPR_BEG; } - expr term + expr_value term { $$ = $3; } @@ -1898,7 +1872,7 @@ f_arg : f_norm_arg $$ += 1; } -f_opt : tIDENTIFIER '=' arg +f_opt : tIDENTIFIER '=' arg_value { if (!is_local_id($1)) yyerror("formal argument must be local variable"); @@ -1952,6 +1926,7 @@ singleton : var_ref } else { $$ = $1; + value_expr($$); } } | '(' {lex_state = EXPR_BEG;} expr opt_nl ')' @@ -1967,6 +1942,7 @@ singleton : var_ref case NODE_ZARRAY: yyerror("can't define single method for literals."); default: + value_expr($3); break; } $$ = $3; @@ -1991,7 +1967,7 @@ assocs : assoc $$ = list_concat($1, $3); } -assoc : arg tASSOC arg +assoc : arg_value tASSOC arg_value { $$ = list_append(NEW_LIST($1), $3); } diff --git a/ruby.h b/ruby.h index 4de8b88746..c406d6b07a 100644 --- a/ruby.h +++ b/ruby.h @@ -48,39 +48,6 @@ extern "C" { #define ISXDIGIT(c) (ISASCII(c) && isxdigit((unsigned char)(c))) #endif -#if !defined(__STDC__) && !defined(_MSC_VER) -# define volatile -#endif - -#ifdef __cplusplus -# ifndef HAVE_PROTOTYPES -# define HAVE_PROTOTYPES 1 -# endif -# ifndef HAVE_STDARG_PROTOTYPES -# define HAVE_STDARG_PROTOTYPES 1 -# endif -#endif - -#undef _ -#ifdef HAVE_PROTOTYPES -# define _(args) args -#else -# define _(args) () -#endif - -#undef __ -#ifdef HAVE_STDARG_PROTOTYPES -# define __(args) args -#else -# define __(args) () -#endif - -#ifdef __cplusplus -#define ANYARGS ... -#else -#define ANYARGS -#endif - #ifndef NORETURN # define NORETURN(x) x #endif @@ -420,16 +387,6 @@ struct RBignum { #define OBJ_FROZEN(x) FL_TEST((x), FL_FREEZE) #define OBJ_FREEZE(x) FL_SET((x), FL_FREEZE) -#define xmalloc ruby_xmalloc -#define xcalloc ruby_xcalloc -#define xrealloc ruby_xrealloc -#define xfree ruby_xfree - -void *xmalloc _((long)); -void *xcalloc _((long,long)); -void *xrealloc _((void*,long)); -void xfree _((void*)); - #define ALLOC_N(type,n) (type*)xmalloc(sizeof(type)*(n)) #define ALLOC(type) (type*)xmalloc(sizeof(type)) #define REALLOC_N(var,type,n) (var)=(type*)xrealloc((char*)(var),sizeof(type)*(n)) -- cgit v1.2.3