@@ -4521,6 +4521,7 @@ pm_compile_defined_expr0(rb_iseq_t *iseq, const pm_node_t *node, const pm_node_l
45214521 case PM_PARAMETERS_NODE :
45224522 case PM_KEYWORD_REST_PARAMETER_NODE :
45234523 case PM_NO_KEYWORDS_PARAMETER_NODE :
4524+ case PM_NO_BLOCK_PARAMETER_NODE :
45244525 case PM_NUMBERED_PARAMETERS_NODE :
45254526 case PM_OPTIONAL_KEYWORD_PARAMETER_NODE :
45264527 case PM_OPTIONAL_PARAMETER_NODE :
@@ -6337,7 +6338,7 @@ pm_compile_scope_node(rb_iseq_t *iseq, pm_scope_node_t *scope_node, const pm_nod
63376338 }
63386339 }
63396340
6340- if (parameters_node && parameters_node -> block ) {
6341+ if (parameters_node && parameters_node -> block && PM_NODE_TYPE_P ( parameters_node -> block , PM_BLOCK_PARAMETER_NODE ) ) {
63416342 const pm_block_parameter_node_t * block_node = (const pm_block_parameter_node_t * ) parameters_node -> block ;
63426343
63436344 if (PM_NODE_FLAG_P (block_node , PM_PARAMETER_FLAGS_REPEATED_PARAMETER ) || !block_node -> name ) {
@@ -6683,26 +6684,38 @@ pm_compile_scope_node(rb_iseq_t *iseq, pm_scope_node_t *scope_node, const pm_nod
66836684 // def foo(a, (b, *c, d), e = 1, *f, g, (h, *i, j), k:, l: 1, **m, &n)
66846685 // ^^
66856686 if (parameters_node -> block ) {
6686- body -> param .block_start = local_index ;
6687- body -> param .flags .has_block = true;
6688- iseq_set_use_block (iseq );
6687+ switch (PM_NODE_TYPE (parameters_node -> block )) {
6688+ case PM_BLOCK_PARAMETER_NODE : {
6689+ body -> param .block_start = local_index ;
6690+ body -> param .flags .has_block = true;
66896691
6690- pm_constant_id_t name = (( const pm_block_parameter_node_t * ) parameters_node -> block ) -> name ;
6692+ iseq_set_use_block ( iseq ) ;
66916693
6692- if (name ) {
6693- if (PM_NODE_FLAG_P (parameters_node -> block , PM_PARAMETER_FLAGS_REPEATED_PARAMETER )) {
6694- ID local = pm_constant_id_lookup (scope_node , name );
6695- local_table_for_iseq -> ids [local_index ] = local ;
6694+ pm_constant_id_t name = ((const pm_block_parameter_node_t * ) parameters_node -> block )-> name ;
6695+
6696+ if (name ) {
6697+ if (PM_NODE_FLAG_P (parameters_node -> block , PM_PARAMETER_FLAGS_REPEATED_PARAMETER )) {
6698+ ID local = pm_constant_id_lookup (scope_node , name );
6699+ local_table_for_iseq -> ids [local_index ] = local ;
6700+ }
6701+ else {
6702+ pm_insert_local_index (name , local_index , index_lookup_table , local_table_for_iseq , scope_node );
6703+ }
66966704 }
66976705 else {
6698- pm_insert_local_index ( name , local_index , index_lookup_table , local_table_for_iseq , scope_node );
6706+ pm_insert_local_special ( idAnd , local_index , index_lookup_table , local_table_for_iseq );
66996707 }
6700- }
6701- else {
6702- pm_insert_local_special (idAnd , local_index , index_lookup_table , local_table_for_iseq );
6703- }
67046708
6705- local_index ++ ;
6709+ local_index ++ ;
6710+ break ;
6711+ }
6712+ case PM_NO_BLOCK_PARAMETER_NODE : {
6713+ body -> param .flags .accepts_no_block = true;
6714+ break ;
6715+ }
6716+ default :
6717+ rb_bug ("node type %s not expected as block parameter" , pm_node_type_to_str (PM_NODE_TYPE (parameters_node -> block )));
6718+ }
67066719 }
67076720 }
67086721
@@ -9952,6 +9965,12 @@ pm_compile_node(rb_iseq_t *iseq, const pm_node_t *node, LINK_ANCHOR *const ret,
99529965
99539966 return ;
99549967 }
9968+ case PM_NO_BLOCK_PARAMETER_NODE : {
9969+ // def foo(&nil); end
9970+ // ^^^^
9971+ ISEQ_BODY (iseq )-> param .flags .accepts_no_block = TRUE;
9972+ return ;
9973+ }
99559974 case PM_NO_KEYWORDS_PARAMETER_NODE : {
99569975 // def foo(**nil); end
99579976 // ^^^^^
0 commit comments