diff options
| author | eileencodes <eileencodes@gmail.com> | 2023-09-27 16:53:37 -0400 |
|---|---|---|
| committer | Kevin Newton <kddnewton@gmail.com> | 2023-09-27 18:36:23 -0400 |
| commit | 54bbf9a6e92acd0b1581e2a7bb31aab1ecbdb176 (patch) | |
| tree | 8af651770da747f875ccb397ea5dbf03b4c009de | |
| parent | 175ac32c62101c601ab701f08e3a781b3b088e62 (diff) | |
[PRISM] Implement MatchLastLineNode
This PR implements `MatchLastLineNode` for Prism.
Related: ruby/prism#1335
| -rw-r--r-- | prism/prism_compiler.c | 26 | ||||
| -rw-r--r-- | test/prism/iseq_test.rb | 11 |
2 files changed, 37 insertions, 0 deletions
diff --git a/prism/prism_compiler.c b/prism/prism_compiler.c index 56f0907f6f..7247d701bd 100644 --- a/prism/prism_compiler.c +++ b/prism/prism_compiler.c @@ -1594,6 +1594,32 @@ pm_compile_node(rb_iseq_t *iseq, const pm_node_t *node, LINK_ANCHOR *const ret, ADD_SETLOCAL(ret, &dummy_line_node, (int)index, local_write_node->depth); return; } + case PM_MATCH_LAST_LINE_NODE: { + if (!popped) { + pm_match_last_line_node_t *regular_expression_node = (pm_match_last_line_node_t *) node; + VALUE regex_str = parse_string(®ular_expression_node->unescaped); + int flags = 0; + + if (regular_expression_node->base.flags & PM_REGULAR_EXPRESSION_FLAGS_IGNORE_CASE) { + flags |= ONIG_OPTION_IGNORECASE; + } + + if (regular_expression_node->base.flags & PM_REGULAR_EXPRESSION_FLAGS_MULTI_LINE) { + flags |= ONIG_OPTION_MULTILINE; + } + + if (regular_expression_node->base.flags & PM_REGULAR_EXPRESSION_FLAGS_EXTENDED) { + flags |= ONIG_OPTION_EXTEND; + } + + VALUE regex = rb_reg_new(RSTRING_PTR(regex_str), RSTRING_LEN(regex_str), flags); + ADD_INSN1(ret, &dummy_line_node, putobject, regex); + ADD_INSN2(ret, &dummy_line_node, getspecial, INT2FIX(0), INT2FIX(0)); + ADD_SEND(ret, &dummy_line_node, idEqTilde, INT2NUM(1)); + } + + return; + } case PM_MISSING_NODE: { rb_bug("A pm_missing_node_t should not exist in prism's AST."); return; diff --git a/test/prism/iseq_test.rb b/test/prism/iseq_test.rb index d719923413..8fe5c99505 100644 --- a/test/prism/iseq_test.rb +++ b/test/prism/iseq_test.rb @@ -37,6 +37,17 @@ module Prism test_prism_eval("010") end + def test_MatchLastLineNode + test_prism_eval("if /foo/; end") + test_prism_eval("if /foo/i; end") + test_prism_eval("if /foo/x; end") + test_prism_eval("if /foo/m; end") + test_prism_eval("if /foo/im; end") + test_prism_eval("if /foo/mx; end") + test_prism_eval("if /foo/xi; end") + test_prism_eval("if /foo/ixm; end") + end + def test_NilNode test_prism_eval("nil") end |
