@@ -6383,7 +6383,7 @@ pm_parser_local_add(pm_parser_t *parser, pm_constant_id_t constant_id) {
6383
6383
* Set the numbered_parameters value of the current scope.
6384
6384
*/
6385
6385
static inline void
6386
- pm_parser_numbered_parameters_set(pm_parser_t *parser, uint8_t numbered_parameters) {
6386
+ pm_parser_numbered_parameters_set(pm_parser_t *parser, int8_t numbered_parameters) {
6387
6387
parser->current_scope->numbered_parameters = numbered_parameters;
6388
6388
}
6389
6389
@@ -12588,10 +12588,10 @@ parse_block(pm_parser_t *parser) {
12588
12588
}
12589
12589
12590
12590
pm_node_t *parameters = (pm_node_t *) block_parameters;
12591
- uint8_t maximum = parser->current_scope->numbered_parameters;
12591
+ int8_t maximum = parser->current_scope->numbered_parameters;
12592
12592
12593
12593
if (parameters == NULL && (maximum > 0)) {
12594
- parameters = (pm_node_t *) pm_numbered_parameters_node_create(parser, &(pm_location_t) { .start = opening.start, .end = parser->previous.end }, maximum);
12594
+ parameters = (pm_node_t *) pm_numbered_parameters_node_create(parser, &(pm_location_t) { .start = opening.start, .end = parser->previous.end }, (uint8_t) maximum);
12595
12595
}
12596
12596
12597
12597
pm_constant_id_list_t locals = parser->current_scope->locals;
@@ -13289,7 +13289,7 @@ parse_alias_argument(pm_parser_t *parser, bool first) {
13289
13289
static bool
13290
13290
outer_scope_using_numbered_parameters_p(pm_parser_t *parser) {
13291
13291
for (pm_scope_t *scope = parser->current_scope->previous; scope != NULL && !scope->closed; scope = scope->previous) {
13292
- if (scope->numbered_parameters) return true;
13292
+ if (scope->numbered_parameters > 0 ) return true;
13293
13293
}
13294
13294
13295
13295
return false;
@@ -13315,12 +13315,13 @@ parse_variable(pm_parser_t *parser) {
13315
13315
return pm_local_variable_read_node_create(parser, &parser->previous, (uint32_t) depth);
13316
13316
}
13317
13317
13318
- if (!parser->current_scope->closed && pm_token_is_numbered_parameter(parser->previous.start, parser->previous.end)) {
13318
+ pm_scope_t *current_scope = parser->current_scope;
13319
+ if (!current_scope->closed && current_scope->numbered_parameters != PM_NUMBERED_PARAMETERS_DISALLOWED && pm_token_is_numbered_parameter(parser->previous.start, parser->previous.end)) {
13319
13320
// Now that we know we have a numbered parameter, we need to check
13320
13321
// if it's allowed in this context. If it is, then we will create a
13321
13322
// local variable read. If it's not, then we'll create a normal call
13322
13323
// node but add an error.
13323
- if (parser-> current_scope->explicit_params) {
13324
+ if (current_scope->explicit_params) {
13324
13325
pm_parser_err_previous(parser, PM_ERR_NUMBERED_PARAMETER_NOT_ALLOWED);
13325
13326
} else if (outer_scope_using_numbered_parameters_p(parser)) {
13326
13327
pm_parser_err_previous(parser, PM_ERR_NUMBERED_PARAMETER_OUTER_SCOPE);
@@ -13329,9 +13330,9 @@ parse_variable(pm_parser_t *parser) {
13329
13330
// scopes cannot. We subtract the value for the character '0' to get
13330
13331
// the actual integer value of the number (only _1 through _9 are
13331
13332
// valid).
13332
- uint8_t numbered_parameters = (uint8_t ) (parser->previous.start[1] - '0');
13333
- if (numbered_parameters > parser-> current_scope->numbered_parameters) {
13334
- parser-> current_scope->numbered_parameters = numbered_parameters;
13333
+ int8_t numbered_parameters = (int8_t ) (parser->previous.start[1] - '0');
13334
+ if (numbered_parameters > current_scope->numbered_parameters) {
13335
+ current_scope->numbered_parameters = numbered_parameters;
13335
13336
pm_parser_numbered_parameters_set(parser, numbered_parameters);
13336
13337
}
13337
13338
@@ -13340,7 +13341,7 @@ parse_variable(pm_parser_t *parser) {
13340
13341
// referencing _2 means that _1 must exist. Therefore here we
13341
13342
// loop through all of the possibilities and add them into the
13342
13343
// constant pool.
13343
- for (uint8_t numbered_parameter = 1; numbered_parameter <= numbered_parameters - 1; numbered_parameter++) {
13344
+ for (int8_t numbered_parameter = 1; numbered_parameter <= numbered_parameters - 1; numbered_parameter++) {
13344
13345
pm_parser_local_add_constant(parser, pm_numbered_parameter_names[numbered_parameter - 1], 2);
13345
13346
}
13346
13347
@@ -16734,10 +16735,10 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b
16734
16735
}
16735
16736
16736
16737
pm_node_t *parameters = (pm_node_t *) block_parameters;
16737
- uint8_t maximum = parser->current_scope->numbered_parameters;
16738
+ int8_t maximum = parser->current_scope->numbered_parameters;
16738
16739
16739
16740
if (parameters == NULL && (maximum > 0)) {
16740
- parameters = (pm_node_t *) pm_numbered_parameters_node_create(parser, &(pm_location_t) { .start = operator.start, .end = parser->previous.end }, maximum);
16741
+ parameters = (pm_node_t *) pm_numbered_parameters_node_create(parser, &(pm_location_t) { .start = operator.start, .end = parser->previous.end }, (uint8_t) maximum);
16741
16742
}
16742
16743
16743
16744
pm_constant_id_list_t locals = parser->current_scope->locals;
@@ -18008,6 +18009,10 @@ pm_parser_init(pm_parser_t *parser, const uint8_t *source, size_t size, const pm
18008
18009
const pm_options_scope_t *scope = pm_options_scope_get(options, scope_index);
18009
18010
pm_parser_scope_push(parser, scope_index == 0);
18010
18011
18012
+ // Scopes given from the outside are not allowed to have numbered
18013
+ // parameters.
18014
+ parser->current_scope->numbered_parameters = PM_NUMBERED_PARAMETERS_DISALLOWED;
18015
+
18011
18016
for (size_t local_index = 0; local_index < scope->locals_count; local_index++) {
18012
18017
const pm_string_t *local = pm_options_scope_local_get(scope, local_index);
18013
18018
0 commit comments