@@ -4524,6 +4524,7 @@ pm_compile_defined_expr0(rb_iseq_t *iseq, const pm_node_t *node, const pm_node_l
45244524 case PM_PARAMETERS_NODE :
45254525 case PM_KEYWORD_REST_PARAMETER_NODE :
45264526 case PM_NO_KEYWORDS_PARAMETER_NODE :
4527+ case PM_NO_BLOCK_PARAMETER_NODE :
45274528 case PM_NUMBERED_PARAMETERS_NODE :
45284529 case PM_OPTIONAL_KEYWORD_PARAMETER_NODE :
45294530 case PM_OPTIONAL_PARAMETER_NODE :
@@ -6340,7 +6341,7 @@ pm_compile_scope_node(rb_iseq_t *iseq, pm_scope_node_t *scope_node, const pm_nod
63406341 }
63416342 }
63426343
6343- if (parameters_node && parameters_node -> block ) {
6344+ if (parameters_node && parameters_node -> block && PM_NODE_TYPE_P ( parameters_node -> block , PM_BLOCK_PARAMETER_NODE ) ) {
63446345 const pm_block_parameter_node_t * block_node = (const pm_block_parameter_node_t * ) parameters_node -> block ;
63456346
63466347 if (PM_NODE_FLAG_P (block_node , PM_PARAMETER_FLAGS_REPEATED_PARAMETER ) || !block_node -> name ) {
@@ -6686,26 +6687,38 @@ pm_compile_scope_node(rb_iseq_t *iseq, pm_scope_node_t *scope_node, const pm_nod
66866687 // def foo(a, (b, *c, d), e = 1, *f, g, (h, *i, j), k:, l: 1, **m, &n)
66876688 // ^^
66886689 if (parameters_node -> block ) {
6689- body -> param .block_start = local_index ;
6690- body -> param .flags .has_block = true;
6691- iseq_set_use_block (iseq );
6690+ switch (PM_NODE_TYPE (parameters_node -> block )) {
6691+ case PM_BLOCK_PARAMETER_NODE : {
6692+ body -> param .block_start = local_index ;
6693+ body -> param .flags .has_block = true;
66926694
6693- pm_constant_id_t name = (( const pm_block_parameter_node_t * ) parameters_node -> block ) -> name ;
6695+ iseq_set_use_block ( iseq ) ;
66946696
6695- if (name ) {
6696- if (PM_NODE_FLAG_P (parameters_node -> block , PM_PARAMETER_FLAGS_REPEATED_PARAMETER )) {
6697- ID local = pm_constant_id_lookup (scope_node , name );
6698- local_table_for_iseq -> ids [local_index ] = local ;
6697+ pm_constant_id_t name = ((const pm_block_parameter_node_t * ) parameters_node -> block )-> name ;
6698+
6699+ if (name ) {
6700+ if (PM_NODE_FLAG_P (parameters_node -> block , PM_PARAMETER_FLAGS_REPEATED_PARAMETER )) {
6701+ ID local = pm_constant_id_lookup (scope_node , name );
6702+ local_table_for_iseq -> ids [local_index ] = local ;
6703+ }
6704+ else {
6705+ pm_insert_local_index (name , local_index , index_lookup_table , local_table_for_iseq , scope_node );
6706+ }
66996707 }
67006708 else {
6701- pm_insert_local_index ( name , local_index , index_lookup_table , local_table_for_iseq , scope_node );
6709+ pm_insert_local_special ( idAnd , local_index , index_lookup_table , local_table_for_iseq );
67026710 }
6703- }
6704- else {
6705- pm_insert_local_special (idAnd , local_index , index_lookup_table , local_table_for_iseq );
6706- }
67076711
6708- local_index ++ ;
6712+ local_index ++ ;
6713+ break ;
6714+ }
6715+ case PM_NO_BLOCK_PARAMETER_NODE : {
6716+ body -> param .flags .accepts_no_block = true;
6717+ break ;
6718+ }
6719+ default :
6720+ rb_bug ("node type %s not expected as block parameter" , pm_node_type_to_str (PM_NODE_TYPE (parameters_node -> block )));
6721+ }
67096722 }
67106723 }
67116724
@@ -9955,6 +9968,12 @@ pm_compile_node(rb_iseq_t *iseq, const pm_node_t *node, LINK_ANCHOR *const ret,
99559968
99569969 return ;
99579970 }
9971+ case PM_NO_BLOCK_PARAMETER_NODE : {
9972+ // def foo(&nil); end
9973+ // ^^^^
9974+ ISEQ_BODY (iseq )-> param .flags .accepts_no_block = TRUE;
9975+ return ;
9976+ }
99589977 case PM_NO_KEYWORDS_PARAMETER_NODE : {
99599978 // def foo(**nil); end
99609979 // ^^^^^
0 commit comments