Berry `var` allowed in with walrus operator `:=` (#19018)

* Berry `var` allowed in with walrus operator `:=`

* fix regression
This commit is contained in:
s-hadinger 2023-07-03 12:28:41 +02:00 committed by GitHub
parent fc9065d4c8
commit 8f06552eee
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 17 additions and 3 deletions

View File

@ -9,6 +9,7 @@ All notable changes to this project will be documented in this file.
- Matter add option to disable bridge mode (#18992)
- Support for SGP41 TVOC/NOx Sensor (#18880)
- Command ``BrRestart`` to restart the Berry VM (experimental)
- Berry `var` allowed in with walrus operator `:=`
### Breaking Changed
- Berry `bool( [] )` and `bool( {} )` now evaluate as `false` (#18986)

Binary file not shown.

View File

@ -1135,8 +1135,22 @@ static void sub_expr(bparser *parser, bexpdesc *e, int prio)
static void walrus_expr(bparser *parser, bexpdesc *e)
{
int line = parser->lexer.linenumber;
sub_expr(parser, e, ASSIGN_OP_PRIO); /* left expression */
btokentype op = next_type(parser);
if (op == KeyVar) {
/* 'var' ID ':=' expr */
scan_next_token(parser); /* skip 'var' */
bstring *name;
name = next_token(parser).u.s;
match_token(parser, TokenId); /* match and skip ID */
new_var(parser, name, e); /* new variable */
op = next_type(parser);
if (op != OptWalrus) {
parser_error(parser, "'var' in expr must be followed by ':='");
}
} else {
sub_expr(parser, e, ASSIGN_OP_PRIO); /* left expression */
op = next_type(parser);
}
if (op == OptWalrus) {
check_symbol(parser, e);
bexpdesc e1 = *e; /* copy var to e1, e will get the result of expression */
@ -1149,8 +1163,7 @@ static void walrus_expr(bparser *parser, bexpdesc *e)
}
if (be_code_setvar(parser->finfo, &e1, e, btrue /* do not release register */ )) {
parser->lexer.linenumber = line;
parser_error(parser,
"try to assign constant expressions.");
parser_error(parser, "try to assign constant expressions.");
}
}
}