summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKevin Newton <kddnewton@gmail.com>2023-08-02 10:20:52 -0400
committerTakashi Kokubun <takashikkbn@gmail.com>2023-08-16 17:47:32 -0700
commite66e60cf696b7deaa6532273d18159b491a6e0b7 (patch)
tree9d5d8db8a4aad9381f439e834310d3b6904ce223
parent7a1c497426c38c301e65c74a77b5eead98887eba (diff)
[ruby/yarp] Handle invalid multiple parameters
https://github.com/ruby/yarp/commit/2f83265653
Notes
Notes: Merged: https://github.com/ruby/ruby/pull/8226
-rw-r--r--yarp/yarp.c35
1 files changed, 31 insertions, 4 deletions
diff --git a/yarp/yarp.c b/yarp/yarp.c
index 747e6cef48..125e3f9137 100644
--- a/yarp/yarp.c
+++ b/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.
static void
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);
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.
static void
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);
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.
static void
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);
params->block = param;
}
@@ -8321,7 +8324,13 @@ parse_parameters(
}
yp_block_parameter_node_t *param = yp_block_parameter_node_create(parser, &name, &operator);
- yp_parameters_node_block_set(params, param);
+ if (params->block == NULL) {
+ 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;
}
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_parameters_node_rest_set(params, param);
+ if (params->rest == NULL) {
+ 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;
}
case YP_TOKEN_STAR_STAR:
@@ -8500,7 +8515,13 @@ parse_parameters(
param = (yp_node_t *) yp_keyword_rest_parameter_node_create(parser, &operator, &name);
}
- yp_parameters_node_keyword_rest_set(params, param);
+ if (params->keyword_rest == NULL) {
+ 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;
}
default:
@@ -8511,7 +8532,13 @@ parse_parameters(
// represent it.
yp_token_t name = not_provided(parser);
yp_rest_parameter_node_t *param = yp_rest_parameter_node_create(parser, &parser->previous, &name);
- yp_parameters_node_rest_set(params, param);
+
+ if (params->rest == NULL) {
+ 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 {
yp_diagnostic_list_append(&parser->error_list, parser->previous.start, parser->previous.end, "Unexpected ','.");
}