diff options
author | ko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2006-12-31 15:02:22 +0000 |
---|---|---|
committer | ko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2006-12-31 15:02:22 +0000 |
commit | a3e1b1ce7ed7e7ffac23015fc2fde56511b30681 (patch) | |
tree | 7b725552a9a4ded93849ca2faab1b257f7761790 /ruby.c | |
parent | 3e7566d8fb5138bb9cd647e5fdefc54fc9803509 (diff) | |
download | ruby-a3e1b1ce7ed7e7ffac23015fc2fde56511b30681.tar.gz |
* Merge YARV
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@11439 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'ruby.c')
-rw-r--r-- | ruby.c | 297 |
1 files changed, 179 insertions, 118 deletions
@@ -55,7 +55,7 @@ extern int ruby_yydebug; char *ruby_inplace_mode = Qfalse; static void load_stdin(void); -static void load_file(const char *, int); +static NODE *load_file(const char *, int); static void forbid_setid(const char *); static VALUE do_loop = Qfalse, do_print = Qfalse; @@ -72,31 +72,31 @@ usage(const char *name) * Removed -h because the user already knows that option. Others? */ static const char *usage_msg[] = { -"-0[octal] specify record separator (\\0, if no argument)", -"-a autosplit mode with -n or -p (splits $_ into $F)", -"-c check syntax only", -"-Cdirectory cd to directory, before executing your script", -"-d set debugging flags (set $DEBUG to true)", -"-e 'command' one line of script. Several -e's allowed. Omit [programfile]", -"-Fpattern split() pattern for autosplit (-a)", -"-i[extension] edit ARGV files in place (make backup if extension supplied)", -"-Idirectory specify $LOAD_PATH directory (may be used more than once)", -"-Kkcode specifies KANJI (Japanese) code-set", -"-l enable line ending processing", -"-n assume 'while gets(); ... end' loop around your script", -"-p assume loop like -n but print line also like sed", -"-rlibrary require the library, before executing your script", -"-s enable some switch parsing for switches after script name", -"-S look for the script using PATH environment variable", -"-T[level] turn on tainting checks", -"-v print version number, then turn on verbose mode", -"-w turn warnings on for your script", -"-W[level] set warning level; 0=silence, 1=medium, 2=verbose (default)", -"-x[directory] strip off text before #!ruby line and perhaps cd to directory", -"--copyright print the copyright", -"--version print the version", -NULL -}; + "-0[octal] specify record separator (\\0, if no argument)", + "-a autosplit mode with -n or -p (splits $_ into $F)", + "-c check syntax only", + "-Cdirectory cd to directory, before executing your script", + "-d set debugging flags (set $DEBUG to true)", + "-e 'command' one line of script. Several -e's allowed. Omit [programfile]", + "-Fpattern split() pattern for autosplit (-a)", + "-i[extension] edit ARGV files in place (make backup if extension supplied)", + "-Idirectory specify $LOAD_PATH directory (may be used more than once)", + "-Kkcode specifies KANJI (Japanese) code-set", + "-l enable line ending processing", + "-n assume 'while gets(); ... end' loop around your script", + "-p assume loop like -n but print line also like sed", + "-rlibrary require the library, before executing your script", + "-s enable some switch parsing for switches after script name", + "-S look for the script using PATH environment variable", + "-T[level] turn on tainting checks", + "-v print version number, then turn on verbose mode", + "-w turn warnings on for your script", + "-W[level] set warning level; 0=silence, 1=medium, 2=verbose (default)", + "-x[directory] strip off text before #!ruby line and perhaps cd to directory", + "--copyright print the copyright", + "--version print the version", + NULL + }; const char **p = usage_msg; printf("Usage: %s [switches] [--] [programfile] [arguments]\n", name); @@ -114,7 +114,7 @@ rubylib_mangle(const char *s, unsigned int l) { static char *newp, *oldp; static int newl, oldl, notfound; - static char newsub[STATIC_FILE_LENGTH+1]; + static char newsub[STATIC_FILE_LENGTH + 1]; if (!newp && !notfound) { newp = getenv("RUBYLIB_PREFIX"); @@ -123,7 +123,8 @@ rubylib_mangle(const char *s, unsigned int l) oldp = newp; while (*newp && !ISSPACE(*newp) && *newp != ';') { - newp++; oldl++; /* Skip digits. */ + newp++; + oldl++; /* Skip digits. */ } while (*newp && (ISSPACE(*newp) || *newp == ';')) { newp++; /* Skip whitespace. */ @@ -135,7 +136,8 @@ rubylib_mangle(const char *s, unsigned int l) strcpy(newsub, newp); s = newsub; while (*s) { - if (*s == '\\') *s = '/'; + if (*s == '\\') + *s = '/'; s++; } } @@ -147,7 +149,7 @@ rubylib_mangle(const char *s, unsigned int l) l = strlen(s); } if (!newp || l < oldl || strncasecmp(oldp, s, oldl) != 0) { - static char ret[STATIC_FILE_LENGTH+1]; + static char ret[STATIC_FILE_LENGTH + 1]; strncpy(ret, s, l); ret[l] = 0; return ret; @@ -159,6 +161,7 @@ rubylib_mangle(const char *s, unsigned int l) newsub[l + newl - oldl] = 0; return newsub; } + #define rubylib_mangled_path(s, l) rb_str_new2(rubylib_mangle((s), (l))) #define rubylib_mangled_path2(s) rb_str_new2(rubylib_mangle((s), 0)) #else @@ -171,7 +174,8 @@ ruby_push_include(const char *path, VALUE (*filter) (VALUE)) { const char sep = PATH_SEP_CHAR; - if (path == 0) return; + if (path == 0) + return; #if defined(__CYGWIN__) { char rubylib[FILENAME_MAX]; @@ -185,20 +189,23 @@ ruby_push_include(const char *path, VALUE (*filter) (VALUE)) p = path; while (*p) { - while (*p == sep) p++; + while (*p == sep) + p++; if ((s = strchr(p, sep)) != 0) { - rb_ary_push(ary, (*filter)(rubylib_mangled_path(p, (int)(s-p)))); + rb_ary_push(ary, + (*filter) (rubylib_mangled_path + (p, (int)(s - p)))); p = s + 1; } else { - rb_ary_push(ary, (*filter)(rubylib_mangled_path2(p))); + rb_ary_push(ary, (*filter) (rubylib_mangled_path2(p))); break; } } rb_ary_concat(rb_load_path, ary); } else { - rb_ary_push(rb_load_path, (*filter)(rubylib_mangled_path2(path))); + rb_ary_push(rb_load_path, (*filter) (rubylib_mangled_path2(path))); } } @@ -218,8 +225,10 @@ static VALUE expand_include_path(VALUE path) { char *p = RSTRING_PTR(path); - if (!p) return path; - if (*p == '.' && p[1] == '/') return path; + if (!p) + return path; + if (*p == '.' && p[1] == '/') + return path; return rb_file_expand_path(path, Qnil); } @@ -254,7 +263,7 @@ void ruby_init_loadpath(void) { #if defined LOAD_RELATIVE - char libpath[MAXPATHLEN+1]; + char libpath[MAXPATHLEN + 1]; char *p; int rest; #if defined _WIN32 || defined __CYGWIN__ @@ -263,8 +272,9 @@ ruby_init_loadpath(void) #ifndef _WIN32_WCE memset(&m, 0, sizeof(m)); - if (VirtualQuery(ruby_init_loadpath, &m, sizeof(m)) && m.State == MEM_COMMIT) - libruby = (HMODULE)m.AllocationBase; + if (VirtualQuery(ruby_init_loadpath, &m, sizeof(m)) + && m.State == MEM_COMMIT) + libruby = (HMODULE) m.AllocationBase; #endif GetModuleFileName(libruby, libpath, sizeof libpath); #elif defined(DJGPP) @@ -284,7 +294,7 @@ ruby_init_loadpath(void) p = strrchr(libpath, '/'); if (p) { *p = 0; - if (p-libpath > 3 && !strcasecmp(p-4, "/bin")) { + if (p - libpath > 3 && !strcasecmp(p - 4, "/bin")) { p -= 4; *p = 0; } @@ -339,7 +349,7 @@ add_modules(const char *mod) struct req_list *list; list = ALLOC(struct req_list); - list->name = ALLOC_N(char, strlen(mod)+1); + list->name = ALLOC_N(char, strlen(mod) + 1); strcpy(list->name, mod); list->next = 0; req_list_last->next = list; @@ -369,7 +379,8 @@ require_libraries(void) ruby_current_node = 0; rb_protect((VALUE (*)(VALUE))rb_require, (VALUE)list->name, &state); - if (state) rb_jump_tag(state); + if (state) + rb_jump_tag(state); tmp = list->next; free(list->name); free(list); @@ -398,9 +409,11 @@ process_sflag(void) char *p; int hyphen = Qfalse; - if (s[0] != '-') break; + if (s[0] != '-') + break; n--; - if (s[1] == '-' && s[2] == '\0') break; + if (s[1] == '-' && s[2] == '\0') + break; v = Qtrue; /* check if valid name before replacing - with _ */ @@ -415,7 +428,8 @@ process_sflag(void) } else if (*p != '_' && !ISALNUM(*p)) { VALUE name_error[2]; - name_error[0] = rb_str_new2("invalid name for global variable - "); + name_error[0] = + rb_str_new2("invalid name for global variable - "); if (!(p = strchr(p, '='))) { rb_str_cat2(name_error[0], s); } @@ -423,13 +437,15 @@ process_sflag(void) rb_str_cat(name_error[0], s, p - s); } name_error[1] = args[-1]; - rb_exc_raise(rb_class_new_instance(2, name_error, rb_eNameError)); + rb_exc_raise(rb_class_new_instance + (2, name_error, rb_eNameError)); } } s[0] = '$'; if (hyphen) { for (p = s + 1; *p; ++p) { - if (*p == '-') *p = '_'; + if (*p == '-') + *p = '_'; } } rb_gv_set(s, v); @@ -444,19 +460,21 @@ process_sflag(void) static void proc_options(int argc, char **argv); -static char* +static char * moreswitches(const char *s) { - int argc; char *argv[3]; + int argc; + char *argv[3]; const char *p = s; - argc = 2; argv[0] = argv[2] = 0; + argc = 2; + argv[0] = argv[2] = 0; while (*s && !ISSPACE(*s)) s++; - argv[1] = ALLOCA_N(char, s-p+2); + argv[1] = ALLOCA_N(char, s - p + 2); argv[1][0] = '-'; - strncpy(argv[1]+1, p, s-p); - argv[1][s-p+1] = '\0'; + strncpy(argv[1] + 1, p, s - p); + argv[1][s - p + 1] = '\0'; proc_options(argc, argv); while (*s && ISSPACE(*s)) s++; @@ -479,14 +497,16 @@ proc_options(int argc, char **argv) int verbose = 0; VALUE e_script = Qfalse; - if (argc == 0) return; + if (argc == 0) + return; do_search = Qfalse; - for (argc--,argv++; argc > 0; argc--,argv++) { - if (argv[0][0] != '-' || !argv[0][1]) break; + for (argc--, argv++; argc > 0; argc--, argv++) { + if (argv[0][0] != '-' || !argv[0][1]) + break; - s = argv[0]+1; + s = argv[0] + 1; reswitch: switch (*s) { case 'a': @@ -532,16 +552,20 @@ proc_options(int argc, char **argv) if (*++s) { v = scan_oct(s, 1, &numlen); - if (numlen == 0) v = 1; + if (numlen == 0) + v = 1; s += numlen; } switch (v) { case 0: - ruby_verbose = Qnil; break; + ruby_verbose = Qnil; + break; case 1: - ruby_verbose = Qfalse; break; + ruby_verbose = Qfalse; + break; default: - ruby_verbose = Qtrue; break; + ruby_verbose = Qtrue; + break; } } goto reswitch; @@ -577,15 +601,17 @@ proc_options(int argc, char **argv) forbid_setid("-e"); if (!*++s) { s = argv[1]; - argc--,argv++; + argc--, argv++; } if (!s) { - fprintf(stderr, "%s: no code specified for -e\n", origargv[0]); + fprintf(stderr, "%s: no code specified for -e\n", + origargv[0]); exit(2); } if (!e_script) { - e_script = rb_str_new(0,0); - if (script == 0) script = "-e"; + e_script = rb_str_new(0, 0); + if (script == 0) + script = "-e"; } rb_str_cat2(e_script, s); rb_str_cat2(e_script, "\n"); @@ -598,14 +624,15 @@ proc_options(int argc, char **argv) } else if (argv[1]) { add_modules(argv[1]); - argc--,argv++; + argc--, argv++; } break; case 'i': forbid_setid("-i"); - if (ruby_inplace_mode) free(ruby_inplace_mode); - ruby_inplace_mode = strdup(s+1); + if (ruby_inplace_mode) + free(ruby_inplace_mode); + ruby_inplace_mode = strdup(s + 1); break; case 'x': @@ -621,7 +648,7 @@ proc_options(int argc, char **argv) s++; if (!*s) { s = argv[1]; - argc--,argv++; + argc--, argv++; } if (!s || !*s) { rb_fatal("Can't chdir"); @@ -651,7 +678,8 @@ proc_options(int argc, char **argv) if (*++s) { v = scan_oct(s, 2, &numlen); - if (numlen == 0) v = 1; + if (numlen == 0) + v = 1; s += numlen; } rb_set_safe_level(v); @@ -664,7 +692,7 @@ proc_options(int argc, char **argv) ruby_incpush_expand(s); else if (argv[1]) { ruby_incpush_expand(argv[1]); - argc--,argv++; + argc--, argv++; } break; @@ -676,7 +704,8 @@ proc_options(int argc, char **argv) v = scan_oct(s, 4, &numlen); s += numlen; - if (v > 0377) rb_rs = Qnil; + if (v > 0377) + rb_rs = Qnil; else if (v == 0 && numlen >= 2) { rb_rs = rb_str_new2("\n\n"); } @@ -689,7 +718,7 @@ proc_options(int argc, char **argv) case '-': if (!s[1] || (s[1] == '\r' && !s[2])) { - argc--,argv++; + argc--, argv++; goto switch_end; } s++; @@ -712,23 +741,27 @@ proc_options(int argc, char **argv) exit(0); } else { - fprintf(stderr, "%s: invalid option --%s (-h will show valid options)\n", + fprintf(stderr, + "%s: invalid option --%s (-h will show valid options)\n", origargv[0], s); exit(2); } break; case '\r': - if (!s[1]) break; + if (!s[1]) + break; default: { const char *format; if (ISPRINT(*s)) { - format = "%s: invalid option -%c (-h will show valid options)\n"; + format = + "%s: invalid option -%c (-h will show valid options)\n"; } else { - format = "%s: invalid option -\\%03o (-h will show valid options)\n"; + format = + "%s: invalid option -\\%03o (-h will show valid options)\n"; } fprintf(stderr, format, origargv[0], (int)(unsigned char)*s); } @@ -740,18 +773,22 @@ proc_options(int argc, char **argv) } switch_end: - if (argv0 == 0) return; + if (argv0 == 0) + return; if (rb_safe_level() == 0 && (s = getenv("RUBYOPT"))) { - while (ISSPACE(*s)) s++; - if (*s == 'T' || (*s == '-' && *(s+1) == 'T')) { + while (ISSPACE(*s)) + s++; + if (*s == 'T' || (*s == '-' && *(s + 1) == 'T')) { int numlen; int v = 1; - if (*s != 'T') ++s; + if (*s != 'T') + ++s; if (*++s) { v = scan_oct(s, 2, &numlen); - if (numlen == 0) v = 1; + if (numlen == 0) + v = 1; } rb_set_safe_level(v); } @@ -760,13 +797,17 @@ proc_options(int argc, char **argv) if (*s == '-') { s++; if (ISSPACE(*s)) { - do {s++;} while (ISSPACE(*s)); + do { + s++; + } while (ISSPACE(*s)); continue; } } - if (!*s) break; + if (!*s) + break; if (!strchr("IdvwrK", *s)) - rb_raise(rb_eRuntimeError, "illegal switch in RUBYOPT: -%c", *s); + rb_raise(rb_eRuntimeError, + "illegal switch in RUBYOPT: -%c", *s); s = moreswitches(s); } } @@ -787,7 +828,8 @@ proc_options(int argc, char **argv) if (!e_script) { if (argc == 0) { /* no more args */ - if (verbose) exit(0); + if (verbose) + exit(0); script = "-"; } else { @@ -805,7 +847,8 @@ proc_options(int argc, char **argv) if (!script) { script = dln_find_file(argv[0], getenv(PATH_ENV)); } - if (!script) script = argv[0]; + if (!script) + script = argv[0]; script = ruby_sourcefile = rb_source_filename(script); script_node = NEW_BEGIN(0); } @@ -813,7 +856,8 @@ proc_options(int argc, char **argv) /* assume that we can change argv[n] if never change its length. */ translate_char(script, '\\', '/'); #endif - argc--; argv++; + argc--; + argv++; } } @@ -843,15 +887,17 @@ proc_options(int argc, char **argv) } } -static void +static NODE * load_file(const char *fname, int script) { extern VALUE rb_stdin; - VALUE parser; + volatile VALUE parser; VALUE f; int line_start = 1; + NODE *tree = 0; - if (!fname) rb_load_fail(fname); + if (!fname) + rb_load_fail(fname); if (strcmp(fname, "-") == 0) { f = rb_stdin; } @@ -899,7 +945,8 @@ load_file(const char *fname, int script) c = rb_io_getc(f); if (c == INT2FIX('!')) { line = rb_io_gets(f); - if (NIL_P(line)) return; + if (NIL_P(line)) + return 0; if ((p = strstr(RSTRING_PTR(line), "ruby")) == 0) { /* not ruby script, kick the program */ @@ -908,8 +955,10 @@ load_file(const char *fname, int script) char *pend = RSTRING_PTR(line) + RSTRING_LEN(line); p = RSTRING_PTR(line); /* skip `#!' */ - if (pend[-1] == '\n') pend--; /* chomp line */ - if (pend[-1] == '\r') pend--; + if (pend[-1] == '\n') + pend--; /* chomp line */ + if (pend[-1] == '\r') + pend--; *pend = '\0'; while (p < pend && ISSPACE(*p)) p++; @@ -918,9 +967,9 @@ load_file(const char *fname, int script) p++; *p++ = '\0'; if (p < pend) { - argv = ALLOCA_N(char*, origargc+3); + argv = ALLOCA_N(char *, origargc + 3); argv[1] = p; - MEMCPY(argv+2, origargv+1, char*, origargc); + MEMCPY(argv + 2, origargv + 1, char *, origargc); } else { argv = origargv; @@ -935,13 +984,13 @@ load_file(const char *fname, int script) start_read: p += 4; - RSTRING_PTR(line)[RSTRING_LEN(line)-1] = '\0'; - if (RSTRING_PTR(line)[RSTRING_LEN(line)-2] == '\r') - RSTRING_PTR(line)[RSTRING_LEN(line)-2] = '\0'; + RSTRING_PTR(line)[RSTRING_LEN(line) - 1] = '\0'; + if (RSTRING_PTR(line)[RSTRING_LEN(line) - 2] == '\r') + RSTRING_PTR(line)[RSTRING_LEN(line) - 2] = '\0'; if ((p = strstr(p, " -")) != 0) { p++; /* skip space before `-' */ while (*p == '-') { - p = moreswitches(p+1); + p = moreswitches(p + 1); } } @@ -958,22 +1007,24 @@ load_file(const char *fname, int script) rb_io_ungetc(f, c); } require_libraries(); /* Why here? unnatural */ - if (NIL_P(c)) return; + if (NIL_P(c)) + return 0; } parser = rb_parser_new(); - ruby_eval_tree = rb_parser_compile_file(parser, fname, f, line_start); + ruby_eval_tree = tree = (NODE *)rb_parser_compile_file(parser, fname, f, line_start); if (script && rb_parser_end_seen_p(parser)) { rb_define_global_const("DATA", f); } else if (f != rb_stdin) { rb_io_close(f); } + return tree; } -void +void * rb_load_file(const char *fname) { - load_file(fname, 0); + return load_file(fname, 0); } static void @@ -1006,7 +1057,8 @@ set_arg0space() char *s; int i; - if (!environ || (s = environ[0]) == NULL) return; + if (!environ || (s = environ[0]) == NULL) + return; envspace.begin = s; s += strlen(s); for (i = 1; environ[i]; i++) { @@ -1030,7 +1082,8 @@ set_arg0(VALUE val, ID id) static int len; #endif - if (origargv == 0) rb_raise(rb_eRuntimeError, "$0 not initialized"); + if (origargv == 0) + rb_raise(rb_eRuntimeError, "$0 not initialized"); StringValue(val); s = RSTRING_PTR(val); i = RSTRING_LEN(val); @@ -1080,12 +1133,13 @@ set_arg0(VALUE val, ID id) if (i >= len) { i = len; } + memcpy(origargv[0], s, i); s = origargv[0] + i; *s = '\0'; if (++i < len) memset(s + 1, ' ', len - i); for (i = 1; i < origargc; i++) - origargv[i] = s; + origargv[i] = s; rb_progname = rb_tainted_str_new2(origargv[0]); #endif } @@ -1137,9 +1191,12 @@ verbose_setter(VALUE val, ID id, VALUE *variable) static VALUE opt_W_getter(VALUE val, ID id) { - if (ruby_verbose == Qnil) return INT2FIX(0); - if (ruby_verbose == Qfalse) return INT2FIX(1); - if (ruby_verbose == Qtrue) return INT2FIX(2); + if (ruby_verbose == Qnil) + return INT2FIX(0); + if (ruby_verbose == Qfalse) + return INT2FIX(1); + if (ruby_verbose == Qtrue) + return INT2FIX(2); return Qnil; /* not reached */ } @@ -1183,11 +1240,13 @@ ruby_set_argv(int argc, char **argv) int i; #if defined(USE_DLN_A_OUT) - if (origargv) dln_argv0 = origargv[0]; - else dln_argv0 = argv[0]; + if (origargv) + dln_argv0 = origargv[0]; + else + dln_argv0 = argv[0]; #endif rb_ary_clear(rb_argv); - for (i=0; i < argc; i++) { + for (i = 0; i < argc; i++) { VALUE arg = rb_tainted_str_new2(argv[i]); OBJ_FREEZE(arg); @@ -1195,13 +1254,14 @@ ruby_set_argv(int argc, char **argv) } } -NODE *rb_parser_append_print(NODE*); -NODE *rb_parser_while_loop(NODE*, int, int); +NODE *rb_parser_append_print(NODE *); +NODE *rb_parser_while_loop(NODE *, int, int); void ruby_process_options(int argc, char **argv) { - origargc = argc; origargv = argv; + origargc = argc; + origargv = argv; ruby_script(argv[0]); /* for the time being */ rb_argv0 = rb_progname; @@ -1219,6 +1279,7 @@ ruby_process_options(int argc, char **argv) ruby_eval_tree = rb_parser_append_print(ruby_eval_tree); } if (do_loop) { - ruby_eval_tree = rb_parser_while_loop(ruby_eval_tree, do_line, do_split); + ruby_eval_tree = + rb_parser_while_loop(ruby_eval_tree, do_line, do_split); } } |