From a944bdd5fa7c7c2ddeae063eb567a4a9baceae5e Mon Sep 17 00:00:00 2001 From: nobu Date: Thu, 10 Mar 2016 06:19:55 +0000 Subject: node.c: hidden options hash * node.c (dump_option): nd_compile_option is a hidden hash object, cannot call inspect on it. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@54077 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 5 +++++ node.c | 49 +++++++++++++++++++++++++++++++++++++++---- test/ruby/test_rubyoptions.rb | 15 +++++++------ 3 files changed, 57 insertions(+), 12 deletions(-) diff --git a/ChangeLog b/ChangeLog index 4c7f7e2a4c..3b02b53e68 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +Thu Mar 10 15:19:54 2016 Nobuyoshi Nakada + + * node.c (dump_option): nd_compile_option is a hidden hash object, + cannot call inspect on it. + Thu Mar 10 09:49:54 2016 Rei Odaira * test/socket/test_socket.rb (test_udp_recvmsg_truncation): diff --git a/node.c b/node.c index a8ccf05780..0e0a863386 100644 --- a/node.c +++ b/node.c @@ -37,6 +37,11 @@ rb_str_resize(indent, RSTRING_LEN(indent) - 4); \ } while (0) +#define COMPOUND_FIELD1(name, ann, block) \ + COMPOUND_FIELD(FIELD_NAME_LEN(#name, ann), \ + FIELD_NAME_DESC(#name, ann), \ + block) + #define FIELD_NAME_DESC(name, ann) name " (" ann ")" #define FIELD_NAME_LEN(name, ann) (int)( \ comment ? \ @@ -57,9 +62,9 @@ #define F_MSG(name, ann, desc) SIMPLE_FIELD1(#name, ann) A(desc) #define F_NODE(name, ann) \ - COMPOUND_FIELD(FIELD_NAME_LEN(#name, ann), \ - FIELD_NAME_DESC(#name, ann), \ - dump_node(buf, indent, comment, node->name)) + COMPOUND_FIELD1(name, ann, dump_node(buf, indent, comment, node->name)) +#define F_OPTION(name, ann) \ + COMPOUND_FIELD1(name, ann, dump_option(buf, indent, node->name)) #define ANN(ann) \ if (comment) { \ @@ -91,6 +96,42 @@ add_id(VALUE buf, ID id) } } +struct add_option_arg { + VALUE buf, indent; + st_index_t count; +}; + +static int +add_option_i(VALUE key, VALUE val, VALUE args) +{ + struct add_option_arg *argp = (void *)args; + VALUE buf = argp->buf; + VALUE indent = argp->indent; + + A_INDENT; + A("+- "); + AR(rb_sym2str(key)); + A(": "); + A_LIT(val); + A("\n"); + return ST_CONTINUE; +} + +static void +dump_option(VALUE buf, VALUE indent, VALUE opt) +{ + struct add_option_arg arg; + + if (!RB_TYPE_P(opt, T_HASH)) { + A_LIT(opt); + return; + } + arg.buf = buf; + arg.indent = indent; + arg.count = 0; + rb_hash_foreach(opt, add_option_i, (VALUE)&arg); +} + static void dump_node(VALUE buf, VALUE indent, int comment, NODE *node) { @@ -828,7 +869,7 @@ dump_node(VALUE buf, VALUE indent, int comment, NODE *node) F_NODE(nd_body, "body"); LAST_NODE; #define nd_compile_option u3.value - F_LIT(nd_compile_option, "compile_option"); + F_OPTION(nd_compile_option, "compile_option"); break; case NODE_LAMBDA: diff --git a/test/ruby/test_rubyoptions.rb b/test/ruby/test_rubyoptions.rb index 82fc5e44e7..ea361bcf37 100644 --- a/test/ruby/test_rubyoptions.rb +++ b/test/ruby/test_rubyoptions.rb @@ -752,21 +752,19 @@ class TestRubyOptions < Test::Unit::TestCase assert_in_out_err(['-p', '-e', 'sub(/t.*/){"TEST"}'], %[test], %w[TEST], [], bug7157) end - def assert_norun_with_rflag(opt) + def assert_norun_with_rflag(*opt) bug10435 = "[ruby-dev:48712] [Bug #10435]: should not run with #{opt} option" stderr = [] Tempfile.create(%w"bug10435- .rb") do |script| dir, base = File.split(script.path) script.puts "abort ':run'" script.close - opts = ['-C', dir, '-r', "./#{base}", opt] - assert_in_out_err([*opts, '-ep']) do |_, e| - stderr.concat(e) - end + opts = ['-C', dir, '-r', "./#{base}", *opt] + _, e = assert_in_out_err([*opts, '-ep'], "", //) + stderr.concat(e) if e stderr << "---" - assert_in_out_err([*opts, base]) do |_, e| - stderr.concat(e) - end + _, e = assert_in_out_err([*opts, base], "", //) + stderr.concat(e) if e end assert_not_include(stderr, ":run", bug10435) end @@ -783,6 +781,7 @@ class TestRubyOptions < Test::Unit::TestCase def test_dump_parsetree_with_rflag assert_norun_with_rflag('--dump=parsetree') + assert_norun_with_rflag('--dump=parsetree', '-e', '#frozen-string-literal: true') end def test_dump_insns_with_rflag -- cgit v1.2.3