aboutsummaryrefslogtreecommitdiffstats
path: root/node.c
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2016-10-05 06:43:34 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2016-10-05 06:43:34 +0000
commit37710da6f9cdccbb5f9536e0332096d8c2347c2e (patch)
tree79e0fc0a0f7d7cf904628885447216db3701d786 /node.c
parent9afde67360c7f149c54a92d84a278870615fb297 (diff)
downloadruby-37710da6f9cdccbb5f9536e0332096d8c2347c2e.tar.gz
node.c: flatten NODE_BLOCK [ci skip]
* node.c (dump_node): flatten statements in NODE_BLOCK. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@56348 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'node.c')
-rw-r--r--node.c23
1 files changed, 19 insertions, 4 deletions
diff --git a/node.c b/node.c
index 832190d0b2..1fe47844da 100644
--- a/node.c
+++ b/node.c
@@ -16,6 +16,8 @@
#define AR(str) rb_str_concat(buf, (str))
#define A_INDENT add_indent(buf, indent)
+#define D_INDENT rb_str_cat2(indent, next_indent)
+#define D_DEDENT rb_str_resize(indent, RSTRING_LEN(indent) - 4)
#define A_ID(id) add_id(buf, (id))
#define A_INT(val) rb_str_catf(buf, "%d", (val))
#define A_LONG(val) rb_str_catf(buf, "%ld", (val))
@@ -32,9 +34,9 @@
#define COMPOUND_FIELD(len, name, block) \
do { \
D_FIELD_HEADER((len), (name), "\n"); \
- rb_str_cat2(indent, next_indent); \
+ D_INDENT; \
block; \
- rb_str_resize(indent, RSTRING_LEN(indent) - 4); \
+ D_DEDENT; \
} while (0)
#define COMPOUND_FIELD1(name, ann, block) \
@@ -154,6 +156,7 @@ static void
dump_node(VALUE buf, VALUE indent, int comment, NODE *node)
{
int field_flag;
+ int i;
const char *next_indent = default_indent;
if (!node) {
@@ -166,9 +169,21 @@ dump_node(VALUE buf, VALUE indent, int comment, NODE *node)
switch (nd_type(node)) {
case NODE_BLOCK:
ANN("statement sequence");
- ANN("format: [nd_head]; [nd_next]");
+ ANN("format: [nd_head]; ...; [nd_next]");
ANN("example: foo; bar");
- F_NODE(nd_head, "current statement");
+ i = 0;
+ do {
+ A_INDENT;
+ rb_str_catf(buf, "+- nd_head (%s%d):\n",
+ comment ? "statement #" : "", ++i);
+ if (!node->nd_next) LAST_NODE;
+ D_INDENT;
+ dump_node(buf, indent, comment, node->nd_head);
+ D_DEDENT;
+ } while (node->nd_next &&
+ nd_type(node->nd_next) == NODE_BLOCK &&
+ (node = node->nd_next, 1));
+ if (!node->nd_next) break;
LAST_NODE;
F_NODE(nd_next, "next block");
break;