diff options
author | yui-knk <yui-knk@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2017-10-31 00:46:30 +0000 |
---|---|---|
committer | yui-knk <yui-knk@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2017-10-31 00:46:30 +0000 |
commit | a09e1750682ee19b21c5785f34f3db39e15a2f2e (patch) | |
tree | e4a888d5da822653a45addc4a319684c9d46e543 /node.c | |
parent | bb88b1aab8ce5aad01e11f1dbd574ab46ac44648 (diff) |
Use NODE_CASE2 if case expressions don't exist
When NODE_WHEN is compiled by iseq_compile_each0,
the node passed to compile_when is NODE_WHEN (not NODE_CASE).
So we can not handle the location of NODE_CASE of
case statements which don't have case expressions.
e.g. :
```
case; when 1; foo; when 2; bar; else baz; end
```
This commit adds NODE_CASE2, and compiles it by
iseq_compile_each0.
* compile.c (compile_case): Does not call COMPILE_ when
NODE_CASE does not have case expressions.
* compile.c (compile_case2): Compile NODE_CASE2 by compile_case2.
* compile.c (compile_when): Delete an obsoleted function.
* compile.c (iseq_compile_each0): Compile NODE_CASE2.
* ext/objspace/objspace.c (count_nodes): Add NODE_CASE2 case.
* node.c (dump_node, rb_gc_mark_node): Add NODE_CASE2 case.
* node.h (node_type): Add NODE_CASE2.
* node.h (NEW_CASE2): Add a macro which generates NODE_CASE2.
* parse.y: Generate NODE_CASE2 if case expressions don't exist.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@60585 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'node.c')
-rw-r--r-- | node.c | 9 |
1 files changed, 9 insertions, 0 deletions
@@ -219,6 +219,14 @@ dump_node(VALUE buf, VALUE indent, int comment, NODE *node) LAST_NODE; F_NODE(nd_body, "when clauses"); return; + case NODE_CASE2: + ANN("case statement"); + ANN("format: case; [nd_body]; end"); + ANN("example: case; when 1; foo; when 2; bar; else baz; end"); + F_NODE(nd_head, "case expr"); + LAST_NODE; + F_NODE(nd_body, "when clauses"); + return; case NODE_WHEN: ANN("if statement"); @@ -1125,6 +1133,7 @@ rb_gc_mark_node(NODE *obj) case NODE_AND: case NODE_OR: case NODE_CASE: + case NODE_CASE2: case NODE_SCLASS: case NODE_DOT2: case NODE_DOT3: |