* parse.y: remove global variables ruby_eval_tree and

ruby_eval_tree_begin.

* array.c (rb_ary_collect_bang): element size might change during
  comparison.  [ruby-dev:24300]

* array.c (rb_ary_reject_bang): ditto. [ruby-dev:24300]

* array.c (rb_ary_eql): ditto. [ruby-dev:24300]


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@6944 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
matz 2004-09-22 00:19:15 +00:00
parent 141dae12c5
commit 136b284b59
8 changed files with 94 additions and 74 deletions

View File

@ -1,7 +1,24 @@
Wed Sep 22 09:04:41 2004 Yukihiro Matsumoto <matz@ruby-lang.org>
* parse.y: remove global variables ruby_eval_tree and
ruby_eval_tree_begin.
* array.c (rb_ary_collect_bang): element size might change during
comparison. [ruby-dev:24300]
* array.c (rb_ary_reject_bang): ditto. [ruby-dev:24300]
* array.c (rb_ary_eql): ditto. [ruby-dev:24300]
Wed Sep 22 00:11:12 2004 Dave Thomas <dave@pragprog.com> Wed Sep 22 00:11:12 2004 Dave Thomas <dave@pragprog.com>
* process.c: Add documentation for fork() * process.c: Add documentation for fork()
Tue Sep 21 18:29:49 2004 Yukihiro Matsumoto <matz@ruby-lang.org>
* array.c (rb_ary_uniq_bang): element size might change during
comparison. [ruby-dev:24298]
Mon Sep 20 17:46:51 2004 Minero Aoki <aamine@loveruby.net> Mon Sep 20 17:46:51 2004 Minero Aoki <aamine@loveruby.net>
* ext/ripper/lib/ripper/tokenizer.rb: fix typo. * ext/ripper/lib/ripper/tokenizer.rb: fix typo.

27
array.c
View File

@ -1828,7 +1828,7 @@ rb_ary_collect_bang(ary)
rb_ary_modify(ary); rb_ary_modify(ary);
for (i = 0; i < RARRAY(ary)->len; i++) { for (i = 0; i < RARRAY(ary)->len; i++) {
RARRAY(ary)->ptr[i] = rb_yield(RARRAY(ary)->ptr[i]); rb_ary_store(ary, i, rb_yield(RARRAY(ary)->ptr[i]));
} }
return ary; return ary;
} }
@ -2089,14 +2089,16 @@ rb_ary_reject_bang(ary)
rb_ary_modify(ary); rb_ary_modify(ary);
for (i1 = i2 = 0; i1 < RARRAY(ary)->len; i1++) { for (i1 = i2 = 0; i1 < RARRAY(ary)->len; i1++) {
if (RTEST(rb_yield(RARRAY(ary)->ptr[i1]))) continue; VALUE v = RARRAY(ary)->ptr[i1];
if (RTEST(rb_yield(v))) continue;
if (i1 != i2) { if (i1 != i2) {
RARRAY(ary)->ptr[i2] = RARRAY(ary)->ptr[i1]; rb_ary_store(ary, i2, v);
} }
i2++; i2++;
} }
if (RARRAY(ary)->len == i2) return Qnil; if (RARRAY(ary)->len == i2) return Qnil;
RARRAY(ary)->len = i2; if (i2 < RARRAY(ary)->len)
RARRAY(ary)->len = i2;
return ary; return ary;
} }
@ -2603,7 +2605,7 @@ rb_ary_eql(ary1, ary2)
if (TYPE(ary2) != T_ARRAY) return Qfalse; if (TYPE(ary2) != T_ARRAY) return Qfalse;
if (RARRAY(ary1)->len != RARRAY(ary2)->len) return Qfalse; if (RARRAY(ary1)->len != RARRAY(ary2)->len) return Qfalse;
for (i=0; i<RARRAY(ary1)->len; i++) { for (i=0; i<RARRAY(ary1)->len; i++) {
if (!rb_eql(RARRAY(ary1)->ptr[i], RARRAY(ary2)->ptr[i])) if (!rb_eql(rb_ary_elt(ary1, i), rb_ary_elt(ary2, i)))
return Qfalse; return Qfalse;
} }
return Qtrue; return Qtrue;
@ -2694,7 +2696,7 @@ rb_ary_cmp(ary1, ary2)
len = RARRAY(ary2)->len; len = RARRAY(ary2)->len;
} }
for (i=0; i<len; i++) { for (i=0; i<len; i++) {
VALUE v = rb_funcall(RARRAY(ary1)->ptr[i], id_cmp, 1, RARRAY(ary2)->ptr[i]); VALUE v = rb_funcall(rb_ary_elt(ary1, i), id_cmp, 1, rb_ary_elt(ary2, i));
if (v != INT2FIX(0)) { if (v != INT2FIX(0)) {
return v; return v;
} }
@ -2842,7 +2844,7 @@ rb_ary_uniq_bang(ary)
VALUE ary; VALUE ary;
{ {
VALUE hash; VALUE hash;
VALUE *p, *q, *end; long i, j;
rb_ary_modify(ary); rb_ary_modify(ary);
@ -2851,16 +2853,13 @@ rb_ary_uniq_bang(ary)
if (RARRAY(ary)->len == RHASH(hash)->tbl->num_entries) { if (RARRAY(ary)->len == RHASH(hash)->tbl->num_entries) {
return Qnil; return Qnil;
} }
p = q = RARRAY(ary)->ptr; for (i=j=0; i<RARRAY(ary)->len; i++) {
end = p + RARRAY(ary)->len; VALUE v = rb_ary_elt(ary, i);
while (p < end) {
VALUE v = *p;
if (st_delete(RHASH(hash)->tbl, (st_data_t*)&v, 0)) { if (st_delete(RHASH(hash)->tbl, (st_data_t*)&v, 0)) {
*q++ = *p; rb_ary_store(ary, j++, v);
} }
p++;
} }
RARRAY(ary)->len = (q - RARRAY(ary)->ptr); RARRAY(ary)->len = j;
return ary; return ary;
} }

18
eval.c
View File

@ -645,8 +645,6 @@ rb_attr(klass, id, read, write, ex)
extern int ruby_in_compile; extern int ruby_in_compile;
VALUE ruby_errinfo = Qnil; VALUE ruby_errinfo = Qnil;
extern NODE *ruby_eval_tree_begin;
extern NODE *ruby_eval_tree;
extern int ruby_nerrs; extern int ruby_nerrs;
static VALUE rb_eLocalJumpError; static VALUE rb_eLocalJumpError;
@ -949,6 +947,7 @@ static struct tag *prot_tag;
#define TAG_RAISE 0x6 #define TAG_RAISE 0x6
#define TAG_THROW 0x7 #define TAG_THROW 0x7
#define TAG_FATAL 0x8 #define TAG_FATAL 0x8
#define TAG_CONT 0x9
#define TAG_MASK 0xf #define TAG_MASK 0xf
VALUE ruby_class; VALUE ruby_class;
@ -1278,13 +1277,11 @@ eval_node(self, node)
VALUE self; VALUE self;
NODE *node; NODE *node;
{ {
NODE *beg_tree = ruby_eval_tree_begin; if (!node) return Qnil;
if (nd_type(node) == NODE_PRELUDE) {
ruby_eval_tree_begin = 0; rb_eval(self, node->nd_head);
if (beg_tree) { node = node->nd_body;
rb_eval(self, beg_tree);
} }
if (!node) return Qnil; if (!node) return Qnil;
return rb_eval(self, node); return rb_eval(self, node);
} }
@ -1443,6 +1440,8 @@ ruby_cleanup(ex)
return ex; return ex;
} }
extern NODE *ruby_eval_tree;
int int
ruby_exec() ruby_exec()
{ {
@ -7508,9 +7507,6 @@ Init_eval()
__send__ = rb_intern("__send__"); __send__ = rb_intern("__send__");
rb_global_variable((VALUE*)&top_scope); rb_global_variable((VALUE*)&top_scope);
rb_global_variable((VALUE*)&ruby_eval_tree_begin);
rb_global_variable((VALUE*)&ruby_eval_tree);
rb_global_variable((VALUE*)&ruby_dyna_vars); rb_global_variable((VALUE*)&ruby_dyna_vars);
rb_define_virtual_variable("$@", errat_getter, errat_setter); rb_define_virtual_variable("$@", errat_getter, errat_setter);

2
hash.c
View File

@ -133,7 +133,7 @@ rb_hash_foreach_iter(key, value, arg)
status = (*arg->func)(key, value, arg->arg); status = (*arg->func)(key, value, arg->arg);
if (RHASH(arg->hash)->tbl != tbl || if (RHASH(arg->hash)->tbl != tbl ||
RHASH(arg->hash)->tbl->bins != bins) { RHASH(arg->hash)->tbl->bins != bins) {
rb_raise(rb_eIndexError, "rehash occurred during iteration"); rb_raise(rb_eArgError, "rehash occurred during iteration");
} }
if (RHASH(arg->hash)->iter_lev == 0) { if (RHASH(arg->hash)->iter_lev == 0) {
rb_raise(rb_eArgError, "block re-entered"); rb_raise(rb_eArgError, "block re-entered");

View File

@ -326,8 +326,6 @@ double rb_str_to_dbl _((VALUE, int));
RUBY_EXTERN int ruby_sourceline; RUBY_EXTERN int ruby_sourceline;
RUBY_EXTERN char *ruby_sourcefile; RUBY_EXTERN char *ruby_sourcefile;
ID rb_id_attrset _((ID)); ID rb_id_attrset _((ID));
void rb_parser_append_print _((void));
void rb_parser_while_loop _((int, int));
int ruby_parser_stack_on_heap _((void)); int ruby_parser_stack_on_heap _((void));
void rb_gc_mark_parser _((void)); void rb_gc_mark_parser _((void));
int rb_is_const_id _((ID)); int rb_is_const_id _((ID));

2
node.h
View File

@ -124,6 +124,7 @@ enum node_type {
NODE_IFUNC, NODE_IFUNC,
NODE_DSYM, NODE_DSYM,
NODE_ATTRASGN, NODE_ATTRASGN,
NODE_PRELUDE,
NODE_LAST NODE_LAST
}; };
@ -337,6 +338,7 @@ typedef struct RNode {
#define NEW_POSTEXE() NEW_NODE(NODE_POSTEXE,0,0,0) #define NEW_POSTEXE() NEW_NODE(NODE_POSTEXE,0,0,0)
#define NEW_BMETHOD(b) NEW_NODE(NODE_BMETHOD,0,0,b) #define NEW_BMETHOD(b) NEW_NODE(NODE_BMETHOD,0,0,b)
#define NEW_ATTRASGN(r,m,a) NEW_NODE(NODE_ATTRASGN,r,m,a) #define NEW_ATTRASGN(r,m,a) NEW_NODE(NODE_ATTRASGN,r,m,a)
#define NEW_PRELUDE(p,b) NEW_NODE(NODE_PRELUDE,p,b,0)
#define NOEX_PUBLIC 0 #define NOEX_PUBLIC 0
#define NOEX_NOSUPER 1 #define NOEX_NOSUPER 1

75
parse.y
View File

@ -49,9 +49,6 @@
((id)&ID_SCOPE_MASK) == ID_CLASS)) ((id)&ID_SCOPE_MASK) == ID_CLASS))
#ifndef RIPPER #ifndef RIPPER
NODE *ruby_eval_tree_begin = 0;
NODE *ruby_eval_tree = 0;
char *ruby_sourcefile; /* current source file */ char *ruby_sourcefile; /* current source file */
int ruby_sourceline; /* current line no. */ int ruby_sourceline; /* current line no. */
#endif #endif
@ -116,6 +113,10 @@ struct parser_params {
union tmpyystype *parser_yylval; /* YYSTYPE not defined yet */ union tmpyystype *parser_yylval; /* YYSTYPE not defined yet */
VALUE eofp; VALUE eofp;
#ifndef RIPPER
NODE *parser_eval_tree_begin;
NODE *parser_eval_tree;
#endif
NODE *parser_lex_strterm; NODE *parser_lex_strterm;
enum lex_state_e parser_lex_state; enum lex_state_e parser_lex_state;
stack_type parser_cond_stack; stack_type parser_cond_stack;
@ -158,6 +159,8 @@ static int parser_yyerror _((struct parser_params*, const char*));
#define YYLEX_PARAM parser_v #define YYLEX_PARAM parser_v
#define parser ((struct parser_params*)parser_v) #define parser ((struct parser_params*)parser_v)
#define ruby_eval_tree (parser->parser_eval_tree)
#define ruby_eval_tree_begin (parser->parser_eval_tree_begin)
#define lex_strterm (parser->parser_lex_strterm) #define lex_strterm (parser->parser_lex_strterm)
#define lex_state (parser->parser_lex_state) #define lex_state (parser->parser_lex_state)
#define cond_stack (parser->parser_cond_stack) #define cond_stack (parser->parser_cond_stack)
@ -4332,23 +4335,12 @@ yycompile(parser, f, line)
} }
} }
ruby__end__seen = 0;
ruby_eval_tree = 0;
heredoc_end = 0;
lex_strterm = 0;
ruby_current_node = 0; ruby_current_node = 0;
ruby_sourcefile = rb_source_filename(f); ruby_sourcefile = rb_source_filename(f);
n = yyparse((void*)parser); n = yyparse((void*)parser);
ruby_debug_lines = 0; ruby_debug_lines = 0;
compile_for_eval = 0; compile_for_eval = 0;
ruby_in_compile = 0; ruby_in_compile = 0;
cond_stack = 0;
cmdarg_stack = 0;
command_start = 1;
class_nest = 0;
in_single = 0;
in_def = 0;
cur_mid = 0;
vp = ruby_dyna_vars; vp = ruby_dyna_vars;
ruby_dyna_vars = vars; ruby_dyna_vars = vars;
@ -4358,6 +4350,13 @@ yycompile(parser, f, line)
vp = vp->next; vp = vp->next;
rb_gc_force_recycle((VALUE)tmp); rb_gc_force_recycle((VALUE)tmp);
} }
if (ruby_eval_tree_begin) {
return NEW_PRELUDE(ruby_eval_tree_begin, ruby_eval_tree);
}
else {
return ruby_eval_tree;
}
if (n == 0) node = ruby_eval_tree; if (n == 0) node = ruby_eval_tree;
else ruby_eval_tree_begin = 0; else ruby_eval_tree_begin = 0;
return node; return node;
@ -7750,32 +7749,31 @@ rb_gc_mark_parser()
rb_gc_mark(ruby_debug_lines); rb_gc_mark(ruby_debug_lines);
} }
void NODE*
rb_parser_append_print() rb_parser_append_print(node)
NODE *node;
{ {
ruby_eval_tree = return block_append(node,
block_append(ruby_eval_tree, NEW_FCALL(rb_intern("print"),
NEW_FCALL(rb_intern("print"), NEW_ARRAY(NEW_GVAR(rb_intern("$_")))));
NEW_ARRAY(NEW_GVAR(rb_intern("$_")))));
} }
void NODE *
rb_parser_while_loop(chop, split) rb_parser_while_loop(node, chop, split)
NODE *node;
int chop, split; int chop, split;
{ {
if (split) { if (split) {
ruby_eval_tree = node = block_append(NEW_GASGN(rb_intern("$F"),
block_append(NEW_GASGN(rb_intern("$F"), NEW_CALL(NEW_GVAR(rb_intern("$_")),
NEW_CALL(NEW_GVAR(rb_intern("$_")), rb_intern("split"), 0)),
rb_intern("split"), 0)), node);
ruby_eval_tree);
} }
if (chop) { if (chop) {
ruby_eval_tree = node = block_append(NEW_CALL(NEW_GVAR(rb_intern("$_")),
block_append(NEW_CALL(NEW_GVAR(rb_intern("$_")), rb_intern("chop!"), 0), node);
rb_intern("chop!"), 0), ruby_eval_tree);
} }
ruby_eval_tree = NEW_OPT_N(ruby_eval_tree); return NEW_OPT_N(node);
} }
static struct { static struct {
@ -8100,6 +8098,10 @@ parser_initialize(parser)
parser->toplevel_p = Qtrue; parser->toplevel_p = Qtrue;
parser->parsing_thread = Qnil; parser->parsing_thread = Qnil;
#ifndef RIPPER
parser->parser_eval_tree_begin = 0;
parser->parser_eval_tree = 0;
#endif
parser->parser_lex_strterm = 0; parser->parser_lex_strterm = 0;
parser->parser_cond_stack = 0; parser->parser_cond_stack = 0;
parser->parser_cmdarg_stack = 0; parser->parser_cmdarg_stack = 0;
@ -8124,7 +8126,7 @@ parser_initialize(parser)
} }
static void static void
ripper_mark(ptr) parser_mark(ptr)
void *ptr; void *ptr;
{ {
struct parser_params *p = (struct parser_params*)ptr; struct parser_params *p = (struct parser_params*)ptr;
@ -8138,11 +8140,14 @@ ripper_mark(ptr)
#ifdef RIPPER #ifdef RIPPER
rb_gc_mark(p->parser_ruby_sourcefile); rb_gc_mark(p->parser_ruby_sourcefile);
rb_gc_mark(p->delayed); rb_gc_mark(p->delayed);
#else
rb_gc_mark((VALUE)p->parser_eval_tree_begin) ;
rb_gc_mark((VALUE)p->parser_eval_tree) ;
#endif #endif
} }
static void static void
ripper_free(ptr) parser_free(ptr)
void *ptr; void *ptr;
{ {
struct parser_params *p = (struct parser_params*)ptr; struct parser_params *p = (struct parser_params*)ptr;
@ -8161,7 +8166,7 @@ parser_new()
p = ALLOC_N(struct parser_params, 1); p = ALLOC_N(struct parser_params, 1);
MEMZERO(p, struct parser_params, 1); MEMZERO(p, struct parser_params, 1);
p->value = Data_Wrap_Struct(rb_cData, ripper_mark, ripper_free, p); p->value = Data_Wrap_Struct(rb_cData, parser_mark, parser_free, p);
parser_initialize(p); parser_initialize(p);
return p; return p;
} }
@ -8458,7 +8463,7 @@ ripper_s_allocate(klass)
p = ALLOC_N(struct parser_params, 1); p = ALLOC_N(struct parser_params, 1);
MEMZERO(p, struct parser_params, 1); MEMZERO(p, struct parser_params, 1);
self = Data_Wrap_Struct(klass, ripper_mark, ripper_free, p); self = Data_Wrap_Struct(klass, parser_mark, parser_free, p);
p->value = self; p->value = self;
return self; return self;
} }

25
ruby.c
View File

@ -347,12 +347,11 @@ require_libraries()
struct req_list *tmp; struct req_list *tmp;
save[0] = ruby_eval_tree; save[0] = ruby_eval_tree;
save[1] = ruby_eval_tree_begin; save[1] = NEW_BEGIN(0);
save[2] = NEW_BEGIN(0); ruby_eval_tree = 0;
ruby_eval_tree = ruby_eval_tree_begin = 0;
ruby_current_node = 0; ruby_current_node = 0;
Init_ext(); /* should be called here for some reason :-( */ Init_ext(); /* should be called here for some reason :-( */
ruby_current_node = save[2]; ruby_current_node = save[1];
ruby_set_current_source(); ruby_set_current_source();
req_list_last = 0; req_list_last = 0;
while (list) { while (list) {
@ -362,13 +361,12 @@ require_libraries()
free(list->name); free(list->name);
free(list); free(list);
list = tmp; list = tmp;
ruby_current_node = save[2]; ruby_current_node = save[1];
ruby_set_current_source(); ruby_set_current_source();
} }
req_list_head.next = 0; req_list_head.next = 0;
ruby_eval_tree = save[0]; ruby_eval_tree = save[0];
ruby_eval_tree_begin = save[1]; rb_gc_force_recycle((VALUE)save[1]);
rb_gc_force_recycle((VALUE)save[2]);
ruby_current_node = 0; ruby_current_node = 0;
} }
@ -430,6 +428,8 @@ moreswitches(s)
return s; return s;
} }
NODE *ruby_eval_tree;
static void static void
proc_options(argc, argv) proc_options(argc, argv)
int argc; int argc;
@ -779,7 +779,7 @@ proc_options(argc, argv)
ruby_sourcefile = rb_source_filename(argv0); ruby_sourcefile = rb_source_filename(argv0);
if (e_script) { if (e_script) {
require_libraries(); require_libraries();
rb_compile_string(script, e_script, 1); ruby_eval_tree = rb_compile_string(script, e_script, 1);
} }
else if (strlen(script) == 1 && script[0] == '-') { else if (strlen(script) == 1 && script[0] == '-') {
load_stdin(); load_stdin();
@ -909,7 +909,7 @@ load_file(fname, script)
require_libraries(); /* Why here? unnatural */ require_libraries(); /* Why here? unnatural */
if (NIL_P(c)) return; if (NIL_P(c)) return;
} }
rb_compile_file(fname, f, line_start); ruby_eval_tree = rb_compile_file(fname, f, line_start);
if (script && ruby__end__seen) { if (script && ruby__end__seen) {
rb_define_global_const("DATA", f); rb_define_global_const("DATA", f);
} }
@ -1122,6 +1122,9 @@ ruby_set_argv(argc, argv)
} }
} }
NODE *rb_parser_append_print _((NODE*));
NODE *rb_parser_while_loop _((NODE*, int, int));
void void
ruby_process_options(argc, argv) ruby_process_options(argc, argv)
int argc; int argc;
@ -1141,9 +1144,9 @@ ruby_process_options(argc, argv)
exit(0); exit(0);
} }
if (do_print) { if (do_print) {
rb_parser_append_print(); ruby_eval_tree = rb_parser_append_print(ruby_eval_tree);
} }
if (do_loop) { if (do_loop) {
rb_parser_while_loop(do_line, do_split); ruby_eval_tree = rb_parser_while_loop(ruby_eval_tree, do_line, do_split);
} }
} }