Skip to content

Commit 0260799

Browse files
Earlopainmatzbot
authored andcommitted
[ruby/prism] Do not use 0 to indicate the latest ruby version to parse
This makes it hard to do version checks against this value. The current version checks work because there are so few possible values at the moment. As an example, PR 3337 introduces new syntax for ruby 3.5 and uses `PM_OPTIONS_VERSION_LATEST` as its version guard. Because what is considered the latest changes every year, it must later be changed to `parser->version == parser->version == PM_OPTIONS_VERSION_CRUBY_3_5 || parser->version == PM_OPTIONS_VERSION_LATEST`, with one extra version each year. With this change, the PR can instead write `parser->version >= PM_OPTIONS_VERSION_CRUBY_3_5` which is self-explanatory and works for future versions. ruby/prism@8318a113ca
1 parent b22eb0e commit 0260799

File tree

4 files changed

+29
-17
lines changed

4 files changed

+29
-17
lines changed

lib/prism/ffi.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -422,13 +422,13 @@ def dump_options_command_line(options)
422422
def dump_options_version(version)
423423
case version
424424
when nil, "latest"
425-
0
425+
0 # Handled in pm_parser_init
426426
when /\A3\.3(\.\d+)?\z/
427427
1
428428
when /\A3\.4(\.\d+)?\z/
429429
2
430430
when /\A3\.5(\.\d+)?\z/
431-
0
431+
3
432432
else
433433
raise ArgumentError, "invalid version: #{version}"
434434
end

prism/options.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ pm_options_version_set(pm_options_t *options, const char *version, size_t length
8989
}
9090

9191
if (strncmp(version, "3.5", 3) == 0) {
92-
options->version = PM_OPTIONS_VERSION_LATEST;
92+
options->version = PM_OPTIONS_VERSION_CRUBY_3_5;
9393
return true;
9494
}
9595

@@ -108,7 +108,7 @@ pm_options_version_set(pm_options_t *options, const char *version, size_t length
108108
}
109109

110110
if (strncmp(version, "3.5.", 4) == 0 && is_number(version + 4, length - 4)) {
111-
options->version = PM_OPTIONS_VERSION_LATEST;
111+
options->version = PM_OPTIONS_VERSION_CRUBY_3_5;
112112
return true;
113113
}
114114
}

prism/options.h

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -82,14 +82,20 @@ typedef void (*pm_options_shebang_callback_t)(struct pm_options *options, const
8282
* parse in the same way as a specific version of CRuby would have.
8383
*/
8484
typedef enum {
85-
/** The current version of prism. */
86-
PM_OPTIONS_VERSION_LATEST = 0,
85+
/** If an explicit version is not provided, the current version of prism will be used. */
86+
PM_OPTIONS_VERSION_UNSET = 0,
8787

8888
/** The vendored version of prism in CRuby 3.3.x. */
8989
PM_OPTIONS_VERSION_CRUBY_3_3 = 1,
9090

9191
/** The vendored version of prism in CRuby 3.4.x. */
92-
PM_OPTIONS_VERSION_CRUBY_3_4 = 2
92+
PM_OPTIONS_VERSION_CRUBY_3_4 = 2,
93+
94+
/** The vendored version of prism in CRuby 3.5.x. */
95+
PM_OPTIONS_VERSION_CRUBY_3_5 = 3,
96+
97+
/** The current version of prism. */
98+
PM_OPTIONS_VERSION_LATEST = PM_OPTIONS_VERSION_CRUBY_3_5
9399
} pm_options_version_t;
94100

95101
/**

prism/prism.c

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1409,7 +1409,7 @@ pm_conditional_predicate_warn_write_literal_p(const pm_node_t *node) {
14091409
static inline void
14101410
pm_conditional_predicate_warn_write_literal(pm_parser_t *parser, const pm_node_t *node) {
14111411
if (pm_conditional_predicate_warn_write_literal_p(node)) {
1412-
pm_parser_warn_node(parser, node, parser->version == PM_OPTIONS_VERSION_CRUBY_3_3 ? PM_WARN_EQUAL_IN_CONDITIONAL_3_3 : PM_WARN_EQUAL_IN_CONDITIONAL);
1412+
pm_parser_warn_node(parser, node, parser->version <= PM_OPTIONS_VERSION_CRUBY_3_3 ? PM_WARN_EQUAL_IN_CONDITIONAL_3_3 : PM_WARN_EQUAL_IN_CONDITIONAL);
14131413
}
14141414
}
14151415

@@ -2976,7 +2976,7 @@ pm_call_and_write_node_create(pm_parser_t *parser, pm_call_node_t *target, const
29762976
*/
29772977
static void
29782978
pm_index_arguments_check(pm_parser_t *parser, const pm_arguments_node_t *arguments, const pm_node_t *block) {
2979-
if (parser->version != PM_OPTIONS_VERSION_CRUBY_3_3) {
2979+
if (parser->version >= PM_OPTIONS_VERSION_CRUBY_3_4) {
29802980
if (arguments != NULL && PM_NODE_FLAG_P(arguments, PM_ARGUMENTS_NODE_FLAGS_CONTAINS_KEYWORDS)) {
29812981
pm_node_t *node;
29822982
PM_NODE_LIST_FOREACH(&arguments->arguments, index, node) {
@@ -9113,7 +9113,7 @@ lex_global_variable(pm_parser_t *parser) {
91139113
} while ((width = char_is_identifier(parser, parser->current.end, parser->end - parser->current.end)) > 0);
91149114

91159115
// $0 isn't allowed to be followed by anything.
9116-
pm_diagnostic_id_t diag_id = parser->version == PM_OPTIONS_VERSION_CRUBY_3_3 ? PM_ERR_INVALID_VARIABLE_GLOBAL_3_3 : PM_ERR_INVALID_VARIABLE_GLOBAL;
9116+
pm_diagnostic_id_t diag_id = parser->version <= PM_OPTIONS_VERSION_CRUBY_3_3 ? PM_ERR_INVALID_VARIABLE_GLOBAL_3_3 : PM_ERR_INVALID_VARIABLE_GLOBAL;
91179117
PM_PARSER_ERR_TOKEN_FORMAT_CONTENT(parser, parser->current, diag_id);
91189118
}
91199119

@@ -9150,7 +9150,7 @@ lex_global_variable(pm_parser_t *parser) {
91509150
} else {
91519151
// If we get here, then we have a $ followed by something that
91529152
// isn't recognized as a global variable.
9153-
pm_diagnostic_id_t diag_id = parser->version == PM_OPTIONS_VERSION_CRUBY_3_3 ? PM_ERR_INVALID_VARIABLE_GLOBAL_3_3 : PM_ERR_INVALID_VARIABLE_GLOBAL;
9153+
pm_diagnostic_id_t diag_id = parser->version <= PM_OPTIONS_VERSION_CRUBY_3_3 ? PM_ERR_INVALID_VARIABLE_GLOBAL_3_3 : PM_ERR_INVALID_VARIABLE_GLOBAL;
91549154
const uint8_t *end = parser->current.end + parser->encoding->char_width(parser->current.end, parser->end - parser->current.end);
91559155
PM_PARSER_ERR_FORMAT(parser, parser->current.start, end, diag_id, (int) (end - parser->current.start), (const char *) parser->current.start);
91569156
}
@@ -10177,7 +10177,7 @@ lex_at_variable(pm_parser_t *parser) {
1017710177
}
1017810178
} else if (parser->current.end < end && pm_char_is_decimal_digit(*parser->current.end)) {
1017910179
pm_diagnostic_id_t diag_id = (type == PM_TOKEN_CLASS_VARIABLE) ? PM_ERR_INCOMPLETE_VARIABLE_CLASS : PM_ERR_INCOMPLETE_VARIABLE_INSTANCE;
10180-
if (parser->version == PM_OPTIONS_VERSION_CRUBY_3_3) {
10180+
if (parser->version <= PM_OPTIONS_VERSION_CRUBY_3_3) {
1018110181
diag_id = (type == PM_TOKEN_CLASS_VARIABLE) ? PM_ERR_INCOMPLETE_VARIABLE_CLASS_3_3 : PM_ERR_INCOMPLETE_VARIABLE_INSTANCE_3_3;
1018210182
}
1018310183

@@ -14667,7 +14667,7 @@ parse_parameters(
1466714667
parser_lex(parser);
1466814668

1466914669
pm_constant_id_t name_id = pm_parser_constant_id_token(parser, &name);
14670-
uint32_t reads = parser->version == PM_OPTIONS_VERSION_CRUBY_3_3 ? pm_locals_reads(&parser->current_scope->locals, name_id) : 0;
14670+
uint32_t reads = parser->version <= PM_OPTIONS_VERSION_CRUBY_3_3 ? pm_locals_reads(&parser->current_scope->locals, name_id) : 0;
1467114671

1467214672
if (accepts_blocks_in_defaults) pm_accepts_block_stack_push(parser, true);
1467314673
pm_node_t *value = parse_value_expression(parser, binding_power, false, false, PM_ERR_PARAMETER_NO_DEFAULT, (uint16_t) (depth + 1));
@@ -14683,7 +14683,7 @@ parse_parameters(
1468314683
// If the value of the parameter increased the number of
1468414684
// reads of that parameter, then we need to warn that we
1468514685
// have a circular definition.
14686-
if ((parser->version == PM_OPTIONS_VERSION_CRUBY_3_3) && (pm_locals_reads(&parser->current_scope->locals, name_id) != reads)) {
14686+
if ((parser->version <= PM_OPTIONS_VERSION_CRUBY_3_3) && (pm_locals_reads(&parser->current_scope->locals, name_id) != reads)) {
1468714687
PM_PARSER_ERR_TOKEN_FORMAT_CONTENT(parser, name, PM_ERR_PARAMETER_CIRCULAR);
1468814688
}
1468914689

@@ -14768,13 +14768,13 @@ parse_parameters(
1476814768

1476914769
if (token_begins_expression_p(parser->current.type)) {
1477014770
pm_constant_id_t name_id = pm_parser_constant_id_token(parser, &local);
14771-
uint32_t reads = parser->version == PM_OPTIONS_VERSION_CRUBY_3_3 ? pm_locals_reads(&parser->current_scope->locals, name_id) : 0;
14771+
uint32_t reads = parser->version <= PM_OPTIONS_VERSION_CRUBY_3_3 ? pm_locals_reads(&parser->current_scope->locals, name_id) : 0;
1477214772

1477314773
if (accepts_blocks_in_defaults) pm_accepts_block_stack_push(parser, true);
1477414774
pm_node_t *value = parse_value_expression(parser, binding_power, false, false, PM_ERR_PARAMETER_NO_DEFAULT_KW, (uint16_t) (depth + 1));
1477514775
if (accepts_blocks_in_defaults) pm_accepts_block_stack_pop(parser);
1477614776

14777-
if (parser->version == PM_OPTIONS_VERSION_CRUBY_3_3 && (pm_locals_reads(&parser->current_scope->locals, name_id) != reads)) {
14777+
if (parser->version <= PM_OPTIONS_VERSION_CRUBY_3_3 && (pm_locals_reads(&parser->current_scope->locals, name_id) != reads)) {
1477814778
PM_PARSER_ERR_TOKEN_FORMAT_CONTENT(parser, local, PM_ERR_PARAMETER_CIRCULAR);
1477914779
}
1478014780

@@ -16478,7 +16478,7 @@ parse_variable(pm_parser_t *parser) {
1647816478
pm_node_list_append(&current_scope->implicit_parameters, node);
1647916479

1648016480
return node;
16481-
} else if ((parser->version != PM_OPTIONS_VERSION_CRUBY_3_3) && pm_token_is_it(parser->previous.start, parser->previous.end)) {
16481+
} else if ((parser->version >= PM_OPTIONS_VERSION_CRUBY_3_4) && pm_token_is_it(parser->previous.start, parser->previous.end)) {
1648216482
pm_node_t *node = (pm_node_t *) pm_it_local_variable_read_node_create(parser, &parser->previous);
1648316483
pm_node_list_append(&current_scope->implicit_parameters, node);
1648416484

@@ -22641,6 +22641,12 @@ pm_parser_init(pm_parser_t *parser, const uint8_t *source, size_t size, const pm
2264122641
}
2264222642
}
2264322643

22644+
// Now that we have established the user-provided options, check if
22645+
// a version was given and parse as the latest version otherwise.
22646+
if (parser->version == PM_OPTIONS_VERSION_UNSET) {
22647+
parser->version = PM_OPTIONS_VERSION_LATEST;
22648+
}
22649+
2264422650
pm_accepts_block_stack_push(parser, true);
2264522651

2264622652
// Skip past the UTF-8 BOM if it exists.

0 commit comments

Comments
 (0)