diff options
author | Hiroshi SHIBATA <[email protected]> | 2023-12-25 17:34:06 +0900 |
---|---|---|
committer | Hiroshi SHIBATA <[email protected]> | 2023-12-25 21:12:49 +0900 |
commit | fa251d60aa9c6f271885a467a26249b29f291cd3 (patch) | |
tree | 859811df5e43f3329c16d53ca937c9171bddbf20 /prism/prism.c | |
parent | 12b69bf515111ecf4b550fe1e2c5ec81a6fcf43a (diff) |
Revert "Revert all of commits after Prism 0.19.0 release"
This reverts commit d242e8416e99eaee4465e2681210ae8b7ecd6d34.
Diffstat (limited to 'prism/prism.c')
-rw-r--r-- | prism/prism.c | 26 |
1 files changed, 23 insertions, 3 deletions
diff --git a/prism/prism.c b/prism/prism.c index 79258386d6..ec319f2cac 100644 --- a/prism/prism.c +++ b/prism/prism.c @@ -1340,6 +1340,11 @@ pm_assoc_node_create(pm_parser_t *parser, pm_node_t *key, const pm_token_t *oper flags = key->flags & value->flags & PM_NODE_FLAG_STATIC_LITERAL; } + // Hash string keys should be frozen + if (PM_NODE_TYPE_P(key, PM_STRING_NODE)) { + key->flags |= PM_STRING_FLAGS_FROZEN; + } + *node = (pm_assoc_node_t) { { .type = PM_ASSOC_NODE, @@ -11338,6 +11343,9 @@ parse_arguments(pm_parser_t *parser, pm_arguments_t *arguments, bool accepts_for } parsed_bare_hash = true; + } else if (accept1(parser, PM_TOKEN_KEYWORD_IN)) { + // TODO: Could we solve this with binding powers instead? + pm_parser_err_current(parser, PM_ERR_ARGUMENT_IN); } parse_arguments_append(parser, arguments, argument); @@ -13349,8 +13357,15 @@ parse_pattern_primitive(pm_parser_t *parser, pm_diagnostic_id_t diag_id) { // expression to determine if it's a variable or an expression. switch (parser->current.type) { case PM_TOKEN_IDENTIFIER: { + int depth = pm_parser_local_depth(parser, &parser->current); + + if (depth == -1) { + depth = 0; + PM_PARSER_ERR_TOKEN_FORMAT(parser, parser->current, PM_ERR_NO_LOCAL_VARIABLE, (int) (parser->current.end - parser->current.start), parser->current.start); + } + + pm_node_t *variable = (pm_node_t *) pm_local_variable_read_node_create(parser, &parser->current, (uint32_t) depth); parser_lex(parser); - pm_node_t *variable = (pm_node_t *) pm_local_variable_read_node_create(parser, &parser->previous, 0); return (pm_node_t *) pm_pinned_variable_node_create(parser, &operator, variable); } @@ -17175,9 +17190,14 @@ parse_expression(pm_parser_t *parser, pm_binding_power_t binding_power, bool acc static pm_node_t * parse_program(pm_parser_t *parser) { - pm_parser_scope_push(parser, !parser->current_scope); - parser_lex(parser); + // If the current scope is NULL, then we want to push a new top level scope. + // The current scope could exist in the event that we are parsing an eval + // and the user has passed into scopes that already exist. + if (parser->current_scope == NULL) { + pm_parser_scope_push(parser, true); + } + parser_lex(parser); pm_statements_node_t *statements = parse_statements(parser, PM_CONTEXT_MAIN); if (!statements) { statements = pm_statements_node_create(parser); |