diff options
-rw-r--r-- | prism_compile.c | 58 | ||||
-rw-r--r-- | test/ruby/test_compile_prism.rb | 59 |
2 files changed, 105 insertions, 12 deletions
@@ -3709,6 +3709,13 @@ pm_compile_node(rb_iseq_t *iseq, const pm_node_t *node, LINK_ANCHOR *const ret, PM_POP_IF_POPPED; return; } case PM_MULTI_TARGET_NODE: { pm_multi_target_node_t *cast = (pm_multi_target_node_t *) node; bool has_rest_expression = (cast->rest && @@ -3723,17 +3730,22 @@ pm_compile_node(rb_iseq_t *iseq, const pm_node_t *node, LINK_ANCHOR *const ret, } } if (cast->rights.size) { - ADD_INSN2(ret, &dummy_line_node, expandarray, INT2FIX(cast->rights.size), INT2FIX(2)); for (size_t index = 0; index < cast->rights.size; index++) { PM_COMPILE_NOT_POPPED(cast->rights.nodes[index]); } } - - if (has_rest_expression) { - pm_node_t *expression = ((pm_splat_node_t *)cast->rest)->expression; - PM_COMPILE_NOT_POPPED(expression); - } return; } case PM_MULTI_WRITE_NODE: { @@ -4368,6 +4380,11 @@ pm_compile_node(rb_iseq_t *iseq, const pm_node_t *node, LINK_ANCHOR *const ret, // those anonymous items temporary names (as below) int local_index = 0; // Here we figure out local table indices and insert them in to the // index lookup table and local tables. // @@ -4384,6 +4401,7 @@ pm_compile_node(rb_iseq_t *iseq, const pm_node_t *node, LINK_ANCHOR *const ret, // def foo(a, (b, *c, d), e = 1, *f, g, (h, *i, j), k:, l: 1, **m, &n) // ^^^^^^^^^^ case PM_MULTI_TARGET_NODE: { local = rb_make_temporary_id(local_index); local_table_for_iseq->ids[local_index] = local; break; @@ -4453,6 +4471,7 @@ pm_compile_node(rb_iseq_t *iseq, const pm_node_t *node, LINK_ANCHOR *const ret, // def foo(a, (b, *c, d), e = 1, *f, g, (h, *i, j), k:, l: 1, **m, &n) // ^^^^^^^^^^ case PM_MULTI_TARGET_NODE: { local = rb_make_temporary_id(local_index); local_table_for_iseq->ids[local_index] = local; break; @@ -4638,6 +4657,7 @@ pm_compile_node(rb_iseq_t *iseq, const pm_node_t *node, LINK_ANCHOR *const ret, // Goal: fill in the names of the parameters in MultiTargetNodes // // Go through requireds again to set the multis if (requireds_list && requireds_list->size) { for (size_t i = 0; i < requireds_list->size; i++) { // For each MultiTargetNode, we're going to have one @@ -4757,6 +4777,32 @@ pm_compile_node(rb_iseq_t *iseq, const pm_node_t *node, LINK_ANCHOR *const ret, body->param.opt_table = (const VALUE *)opt_table; } switch (body->type) { case ISEQ_TYPE_BLOCK: { LABEL *start = ISEQ_COMPILE_DATA(iseq)->start_label = NEW_LABEL(0); @@ -505,6 +505,7 @@ module Prism assert_prism_eval("a, (b, *c) = [1, [2, 3]]; c") assert_prism_eval("a, (b, *c) = 1, [2, 3]; c") assert_prism_eval("a, (b, *) = 1, [2, 3]; b") assert_prism_eval("(a, (b, c, d, e), f, g), h = [1, [2, 3]], 4, 5, [6, 7]; c") end @@ -1175,12 +1176,58 @@ module Prism assert_prism_eval("class PrismTestDefNode; def prism_test_def_node(*a) a end end; PrismTestDefNode.new.prism_test_def_node(1).inspect") # block argument - assert_prism_eval(<<-CODE - def self.prism_test_def_node(&block) prism_test_def_node2(&block) end - def self.prism_test_def_node2() yield 1 end - prism_test_def_node2 {|a| a } - CODE - ) end def test_method_parameters |