summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--node.h3
-rw-r--r--parse.y99
-rw-r--r--ruby.c13
3 files changed, 41 insertions, 74 deletions
diff --git a/node.h b/node.h
index c7475cf980..ba65fcde1b 100644
--- a/node.h
+++ b/node.h
@@ -448,8 +448,7 @@ VALUE rb_parser_encoding(VALUE);
VALUE rb_parser_get_yydebug(VALUE);
VALUE rb_parser_set_yydebug(VALUE, VALUE);
VALUE rb_parser_dump_tree(NODE *node, int comment);
-NODE *rb_parser_append_print(VALUE, NODE *);
-NODE *rb_parser_while_loop(VALUE, NODE *, int, int);
+void rb_parser_set_options(VALUE, int, int, int, int);
NODE *rb_parser_compile_cstr(VALUE, const char*, const char*, int, int);
NODE *rb_parser_compile_string(VALUE, const char*, VALUE, int);
diff --git a/parse.y b/parse.y
index 1d3f603e8e..1c032d2bbe 100644
--- a/parse.y
+++ b/parse.y
@@ -234,6 +234,11 @@ struct parser_params {
#ifndef RIPPER
/* Ruby core only */
+ unsigned int do_print: 1;
+ unsigned int do_loop: 1;
+ unsigned int do_chomp: 1;
+ unsigned int do_split: 1;
+
NODE *eval_tree_begin;
NODE *eval_tree;
VALUE error_buffer;
@@ -5398,6 +5403,8 @@ vtable_included(const struct vtable * tbl, ID id)
static void parser_prepare(struct parser_params *parser);
#ifndef RIPPER
+static NODE *parser_append_options(struct parser_params *parser, NODE *node);
+
static VALUE
debug_lines(VALUE fname)
{
@@ -5492,10 +5499,11 @@ yycompile0(VALUE arg)
else {
VALUE opt = parser->compile_option;
NODE *prelude;
+ NODE *body = parser_append_options(parser, tree->nd_body);
if (!opt) opt = rb_obj_hide(rb_ident_hash_new());
rb_hash_aset(opt, rb_sym_intern_ascii_cstr("coverage_enabled"), cov);
- prelude = NEW_PRELUDE(ruby_eval_tree_begin, tree->nd_body, opt);
- nd_set_column(prelude, nd_column(tree->nd_body));
+ prelude = NEW_PRELUDE(ruby_eval_tree_begin, body, opt);
+ nd_set_column(prelude, nd_column(body));
tree->nd_body = prelude;
}
return (VALUE)tree;
@@ -11237,78 +11245,43 @@ parser_reg_compile(struct parser_params* parser, VALUE str, int options, VALUE *
#endif
#ifndef RIPPER
-NODE*
-rb_parser_append_print(VALUE vparser, NODE *node)
+void
+rb_parser_set_options(VALUE vparser, int print, int loop, int chomp, int split)
{
- NODE *prelude = 0;
- NODE *scope = node;
struct parser_params *parser;
-
- if (!node) return node;
-
TypedData_Get_Struct(vparser, struct parser_params, &parser_data_type, parser);
-
- node = node->nd_body;
-
- if (nd_type(node) == NODE_PRELUDE) {
- prelude = node;
- node = node->nd_body;
- }
-
- node = block_append(node,
- new_fcall(rb_intern("print"),
- NEW_ARRAY(new_gvar(idLASTLINE, 0)), 0),
- 0);
- if (prelude) {
- prelude->nd_body = node;
- scope->nd_body = prelude;
- }
- else {
- scope->nd_body = node;
- }
-
- return scope;
+ parser->do_print = print;
+ parser->do_loop = loop;
+ parser->do_chomp = chomp;
+ parser->do_split = split;
}
-NODE *
-rb_parser_while_loop(VALUE vparser, NODE *node, int chomp, int split)
+static NODE *
+parser_append_options(struct parser_params *parser, NODE *node)
{
- NODE *prelude = 0;
- NODE *scope = node;
- struct parser_params *parser;
-
- if (!node) return node;
-
- TypedData_Get_Struct(vparser, struct parser_params, &parser_data_type, parser);
-
- node = node->nd_body;
-
- if (nd_type(node) == NODE_PRELUDE) {
- prelude = node;
- node = node->nd_body;
- }
- if (split) {
- node = block_append(NEW_GASGN(rb_intern("$F"),
- new_call(new_gvar(idLASTLINE, 0),
- rb_intern("split"), 0, 0)),
- node, 0);
- }
- if (chomp) {
- node = block_append(new_call(new_gvar(idLASTLINE, 0),
- rb_intern("chomp!"), 0, 0), node, 0);
+ if (parser->do_print) {
+ node = block_append(node,
+ new_fcall(rb_intern("print"),
+ NEW_ARRAY(new_gvar(idLASTLINE, 0)), 0),
+ 0);
}
- node = NEW_OPT_N(node);
+ if (parser->do_loop) {
+ if (parser->do_split) {
+ node = block_append(NEW_GASGN(rb_intern("$F"),
+ new_call(new_gvar(idLASTLINE, 0),
+ rb_intern("split"), 0, 0)),
+ node, 0);
+ }
+ if (parser->do_chomp) {
+ node = block_append(new_call(new_gvar(idLASTLINE, 0),
+ rb_intern("chomp!"), 0, 0), node, 0);
+ }
- if (prelude) {
- prelude->nd_body = node;
- scope->nd_body = prelude;
- }
- else {
- scope->nd_body = node;
+ node = NEW_OPT_N(node);
}
- return scope;
+ return node;
}
void
diff --git a/ruby.c b/ruby.c
index cee50a34e8..5cc7e252e6 100644
--- a/ruby.c
+++ b/ruby.c
@@ -1646,6 +1646,10 @@ process_options(int argc, char **argv, ruby_cmdline_options_t *opt)
/* need to acquire env from toplevel_binding each time, since it
* may update after eval() */
+ base_block = toplevel_context(toplevel_binding);
+ rb_parser_set_context(parser, base_block, TRUE);
+ rb_parser_set_options(parser, opt->do_print, opt->do_loop, opt->do_line, opt->do_split);
+
if (opt->e_script) {
VALUE progname = rb_progname;
rb_encoding *eenc;
@@ -1669,15 +1673,10 @@ process_options(int argc, char **argv, ruby_cmdline_options_t *opt)
require_libraries(&opt->req_list);
}
ruby_set_script_name(progname);
-
- base_block = toplevel_context(toplevel_binding);
- rb_parser_set_context(parser, base_block, TRUE);
tree = rb_parser_compile_string(parser, opt->script, opt->e_script, 1);
}
else {
VALUE f;
- base_block = toplevel_context(toplevel_binding);
- rb_parser_set_context(parser, base_block, TRUE);
f = open_load_file(script_name, &opt->xflag);
tree = load_file(parser, opt->script_name, f, 1, opt);
}
@@ -1715,11 +1714,7 @@ process_options(int argc, char **argv, ruby_cmdline_options_t *opt)
if (!dump) return Qtrue;
}
- if (opt->do_print) {
- tree = rb_parser_append_print(parser, tree);
- }
if (opt->do_loop) {
- tree = rb_parser_while_loop(parser, tree, opt->do_line, opt->do_split);
rb_define_global_function("sub", rb_f_sub, -1);
rb_define_global_function("gsub", rb_f_gsub, -1);
rb_define_global_function("chop", rb_f_chop, 0);