From 6b9e6227032cb882649c7554da25a4c8f39207a9 Mon Sep 17 00:00:00 2001 From: s-hadinger <49731213+s-hadinger@users.noreply.github.com> Date: Mon, 17 Nov 2025 17:37:56 +0100 Subject: [PATCH] Berry fix infinite loop in rare situations (#24132) --- lib/libesp32/berry/src/be_code.c | 2 +- lib/libesp32/berry/src/be_code.h | 2 +- lib/libesp32/berry/src/be_parser.c | 25 ++++++++++++++----------- lib/libesp32/berry/tests/parser.be | 3 +++ 4 files changed, 19 insertions(+), 13 deletions(-) diff --git a/lib/libesp32/berry/src/be_code.c b/lib/libesp32/berry/src/be_code.c index 7b9483974..55831b6c8 100644 --- a/lib/libesp32/berry/src/be_code.c +++ b/lib/libesp32/berry/src/be_code.c @@ -867,7 +867,7 @@ static void package_suffix(bfuncinfo *finfo, bexpdesc *c, bexpdesc *k) c->v.ss.idx = key; } -int be_code_nglobal(bfuncinfo *finfo, bexpdesc *k) +int be_code_resolve(bfuncinfo *finfo, bexpdesc *k) { return exp2anyreg(finfo, k); } diff --git a/lib/libesp32/berry/src/be_code.h b/lib/libesp32/berry/src/be_code.h index f0ef2e194..9ce01b4ed 100644 --- a/lib/libesp32/berry/src/be_code.h +++ b/lib/libesp32/berry/src/be_code.h @@ -31,7 +31,7 @@ void be_code_closure(bfuncinfo *finfo, bexpdesc *e, int idx); void be_code_close(bfuncinfo *finfo, int isret); void be_code_class(bfuncinfo *finfo, bexpdesc *dst, bclass *c); void be_code_ret(bfuncinfo *finfo, bexpdesc *e); -int be_code_nglobal(bfuncinfo *finfo, bexpdesc *k); +int be_code_resolve(bfuncinfo *finfo, bexpdesc *k); void be_code_member(bfuncinfo *finfo, bexpdesc *e1, bexpdesc *e2); void be_code_index(bfuncinfo *finfo, bexpdesc *c, bexpdesc *k); void be_code_setsuper(bfuncinfo *finfo, bexpdesc *c, bexpdesc *s); diff --git a/lib/libesp32/berry/src/be_parser.c b/lib/libesp32/berry/src/be_parser.c index 371c53792..96144483b 100644 --- a/lib/libesp32/berry/src/be_parser.c +++ b/lib/libesp32/berry/src/be_parser.c @@ -502,7 +502,7 @@ static void new_var(bparser *parser, bstring *name, bexpdesc *var) init_exp(&key, ETSTRING, 0); key.v.s = name; init_exp(var, ETNGLOBAL, 0); - var->v.idx = be_code_nglobal(parser->finfo, &key); + var->v.idx = be_code_resolve(parser->finfo, &key); } } } @@ -564,7 +564,7 @@ static void singlevar(bparser *parser, bexpdesc *var) init_exp(&key, ETSTRING, 0); key.v.s = varname; init_exp(var, ETNGLOBAL, 0); - var->v.idx = be_code_nglobal(parser->finfo, &key); + var->v.idx = be_code_resolve(parser->finfo, &key); break; default: break; @@ -1026,15 +1026,18 @@ static void assign_expr(bparser *parser) parser_error(parser, "try to assign constant expressions."); } - } else if (e.type >= ETMEMBER) { - bfuncinfo *finfo = parser->finfo; - /* these expressions occupy a register and need to be freed */ - finfo->freereg = (bbyte)be_list_count(finfo->local); - } else if (e.type == ETVOID) { /* not assign expression */ - /* undeclared symbol */ - parser->lexer.linenumber = line; - check_var(parser, &e); - } + } else { + be_code_resolve(parser->finfo, &e); + if (e.type >= ETMEMBER) { + bfuncinfo *finfo = parser->finfo; + /* these expressions occupy a register and need to be freed */ + finfo->freereg = (bbyte)be_list_count(finfo->local); + } else if (e.type == ETVOID) { /* not assign expression */ + /* undeclared symbol */ + parser->lexer.linenumber = line; + check_var(parser, &e); + } + } } /* conditional expression */ diff --git a/lib/libesp32/berry/tests/parser.be b/lib/libesp32/berry/tests/parser.be index 41a2f61ee..1f617e02a 100644 --- a/lib/libesp32/berry/tests/parser.be +++ b/lib/libesp32/berry/tests/parser.be @@ -23,3 +23,6 @@ def parse_022025() end end assert(parse_022025() == 0) + +# bug #371 - fix an infinite loop +def f() 1 || print(2) end