Berry fix infinite loop in rare situations (#24132)
This commit is contained in:
parent
458a53188e
commit
6b9e622703
@ -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);
|
||||
}
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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 */
|
||||
|
||||
@ -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
|
||||
|
||||
Loading…
Reference in New Issue
Block a user