[ruby/yarp] Handle invalid multiple parameters
https://github.com/ruby/yarp/commit/2f83265653
This commit is contained in:
parent
7a1c497426
commit
e66e60cf69
Notes:
git
2023-08-17 00:48:09 +00:00
27
yarp/yarp.c
27
yarp/yarp.c
@ -3221,6 +3221,7 @@ yp_parameters_node_posts_append(yp_parameters_node_t *params, yp_node_t *param)
|
|||||||
// Set the rest parameter on a ParametersNode node.
|
// Set the rest parameter on a ParametersNode node.
|
||||||
static void
|
static void
|
||||||
yp_parameters_node_rest_set(yp_parameters_node_t *params, yp_rest_parameter_node_t *param) {
|
yp_parameters_node_rest_set(yp_parameters_node_t *params, yp_rest_parameter_node_t *param) {
|
||||||
|
assert(params->rest == NULL);
|
||||||
yp_parameters_node_location_set(params, (yp_node_t *) param);
|
yp_parameters_node_location_set(params, (yp_node_t *) param);
|
||||||
params->rest = param;
|
params->rest = param;
|
||||||
}
|
}
|
||||||
@ -3235,6 +3236,7 @@ yp_parameters_node_keywords_append(yp_parameters_node_t *params, yp_node_t *para
|
|||||||
// Set the keyword rest parameter on a ParametersNode node.
|
// Set the keyword rest parameter on a ParametersNode node.
|
||||||
static void
|
static void
|
||||||
yp_parameters_node_keyword_rest_set(yp_parameters_node_t *params, yp_node_t *param) {
|
yp_parameters_node_keyword_rest_set(yp_parameters_node_t *params, yp_node_t *param) {
|
||||||
|
assert(params->keyword_rest == NULL);
|
||||||
yp_parameters_node_location_set(params, param);
|
yp_parameters_node_location_set(params, param);
|
||||||
params->keyword_rest = param;
|
params->keyword_rest = param;
|
||||||
}
|
}
|
||||||
@ -3242,6 +3244,7 @@ yp_parameters_node_keyword_rest_set(yp_parameters_node_t *params, yp_node_t *par
|
|||||||
// Set the block parameter on a ParametersNode node.
|
// Set the block parameter on a ParametersNode node.
|
||||||
static void
|
static void
|
||||||
yp_parameters_node_block_set(yp_parameters_node_t *params, yp_block_parameter_node_t *param) {
|
yp_parameters_node_block_set(yp_parameters_node_t *params, yp_block_parameter_node_t *param) {
|
||||||
|
assert(params->block == NULL);
|
||||||
yp_parameters_node_location_set(params, (yp_node_t *) param);
|
yp_parameters_node_location_set(params, (yp_node_t *) param);
|
||||||
params->block = param;
|
params->block = param;
|
||||||
}
|
}
|
||||||
@ -8321,7 +8324,13 @@ parse_parameters(
|
|||||||
}
|
}
|
||||||
|
|
||||||
yp_block_parameter_node_t *param = yp_block_parameter_node_create(parser, &name, &operator);
|
yp_block_parameter_node_t *param = yp_block_parameter_node_create(parser, &name, &operator);
|
||||||
|
if (params->block == NULL) {
|
||||||
yp_parameters_node_block_set(params, param);
|
yp_parameters_node_block_set(params, param);
|
||||||
|
} else {
|
||||||
|
yp_diagnostic_list_append(&parser->error_list, param->base.location.start, param->base.location.end, "Unexpected multiple block parameter");
|
||||||
|
yp_parameters_node_posts_append(params, (yp_node_t *) param);
|
||||||
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case YP_TOKEN_UDOT_DOT_DOT: {
|
case YP_TOKEN_UDOT_DOT_DOT: {
|
||||||
@ -8472,7 +8481,13 @@ parse_parameters(
|
|||||||
}
|
}
|
||||||
|
|
||||||
yp_rest_parameter_node_t *param = yp_rest_parameter_node_create(parser, &operator, &name);
|
yp_rest_parameter_node_t *param = yp_rest_parameter_node_create(parser, &operator, &name);
|
||||||
|
if (params->rest == NULL) {
|
||||||
yp_parameters_node_rest_set(params, param);
|
yp_parameters_node_rest_set(params, param);
|
||||||
|
} else {
|
||||||
|
yp_diagnostic_list_append(&parser->error_list, param->base.location.start, param->base.location.end, "Unexpected multiple splat parameters.");
|
||||||
|
yp_parameters_node_posts_append(params, (yp_node_t *) param);
|
||||||
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case YP_TOKEN_STAR_STAR:
|
case YP_TOKEN_STAR_STAR:
|
||||||
@ -8500,7 +8515,13 @@ parse_parameters(
|
|||||||
param = (yp_node_t *) yp_keyword_rest_parameter_node_create(parser, &operator, &name);
|
param = (yp_node_t *) yp_keyword_rest_parameter_node_create(parser, &operator, &name);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (params->keyword_rest == NULL) {
|
||||||
yp_parameters_node_keyword_rest_set(params, param);
|
yp_parameters_node_keyword_rest_set(params, param);
|
||||||
|
} else {
|
||||||
|
yp_diagnostic_list_append(&parser->error_list, param->location.start, param->location.end, "Unexpected multiple double splat parameters.");
|
||||||
|
yp_parameters_node_posts_append(params, param);
|
||||||
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
@ -8511,7 +8532,13 @@ parse_parameters(
|
|||||||
// represent it.
|
// represent it.
|
||||||
yp_token_t name = not_provided(parser);
|
yp_token_t name = not_provided(parser);
|
||||||
yp_rest_parameter_node_t *param = yp_rest_parameter_node_create(parser, &parser->previous, &name);
|
yp_rest_parameter_node_t *param = yp_rest_parameter_node_create(parser, &parser->previous, &name);
|
||||||
|
|
||||||
|
if (params->rest == NULL) {
|
||||||
yp_parameters_node_rest_set(params, param);
|
yp_parameters_node_rest_set(params, param);
|
||||||
|
} else {
|
||||||
|
yp_diagnostic_list_append(&parser->error_list, param->base.location.start, param->base.location.end, "Unexpected multiple splat parameters.");
|
||||||
|
yp_parameters_node_posts_append(params, (yp_node_t *) param);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
yp_diagnostic_list_append(&parser->error_list, parser->previous.start, parser->previous.end, "Unexpected ','.");
|
yp_diagnostic_list_append(&parser->error_list, parser->previous.start, parser->previous.end, "Unexpected ','.");
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user