Berry fix infinite loop in rare situations (#24132)

This commit is contained in:
s-hadinger 2025-11-17 17:37:56 +01:00 committed by GitHub
parent 458a53188e
commit 6b9e622703
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 19 additions and 13 deletions

View File

@ -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);
}

View File

@ -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);

View File

@ -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 */

View File

@ -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