diff options
| author | Kevin Newton <kddnewton@gmail.com> | 2023-08-02 10:20:52 -0400 |
|---|---|---|
| committer | Takashi Kokubun <takashikkbn@gmail.com> | 2023-08-16 17:47:32 -0700 |
| commit | e66e60cf696b7deaa6532273d18159b491a6e0b7 (patch) | |
| tree | 9d5d8db8a4aad9381f439e834310d3b6904ce223 | |
| parent | 7a1c497426c38c301e65c74a77b5eead98887eba (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.c | 35 |
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 ','."); } |
