mirror of https://github.com/arendst/Tasmota.git
Merge pull request #16383 from s-hadinger/berry_stricter
Berry stricter strict mode
This commit is contained in:
commit
286b0ca916
|
@ -469,6 +469,12 @@ static int new_upval(bvm *vm, bfuncinfo *finfo, bstring *name, bexpdesc *var)
|
||||||
static void new_var(bparser *parser, bstring *name, bexpdesc *var)
|
static void new_var(bparser *parser, bstring *name, bexpdesc *var)
|
||||||
{
|
{
|
||||||
bfuncinfo *finfo = parser->finfo;
|
bfuncinfo *finfo = parser->finfo;
|
||||||
|
if (comp_is_strict(parser->vm)) {
|
||||||
|
/* check if we are masking a builtin */
|
||||||
|
if (be_builtin_class_find(parser->vm, name) >= 0) {
|
||||||
|
push_error(parser, "strict: redefinition of builtin '%s'", str(name));
|
||||||
|
}
|
||||||
|
}
|
||||||
if (finfo->prev || finfo->binfo->prev || parser->islocal) {
|
if (finfo->prev || finfo->binfo->prev || parser->islocal) {
|
||||||
init_exp(var, ETLOCAL, 0);
|
init_exp(var, ETLOCAL, 0);
|
||||||
var->v.idx = new_localvar(parser, name); /* if local, contains the index in current local var list */
|
var->v.idx = new_localvar(parser, name); /* if local, contains the index in current local var list */
|
||||||
|
@ -982,7 +988,6 @@ static void compound_assign(bparser *parser, int op, bexpdesc *l, bexpdesc *r)
|
||||||
/* A new implicit local variable is created if no global has the same name (excluding builtins) */
|
/* A new implicit local variable is created if no global has the same name (excluding builtins) */
|
||||||
/* This means that you can override a builtin silently */
|
/* This means that you can override a builtin silently */
|
||||||
/* This also means that a function cannot create a global, they must preexist or create with `global` module */
|
/* This also means that a function cannot create a global, they must preexist or create with `global` module */
|
||||||
/* TODO add warning in strict mode */
|
|
||||||
static int check_newvar(bparser *parser, bexpdesc *e)
|
static int check_newvar(bparser *parser, bexpdesc *e)
|
||||||
{
|
{
|
||||||
if (e->type == ETGLOBAL) {
|
if (e->type == ETGLOBAL) {
|
||||||
|
|
|
@ -132,6 +132,21 @@ int be_builtin_find(bvm *vm, bstring *name)
|
||||||
return -1; /* not found */
|
return -1; /* not found */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* find in the list of builtins or classes - used by strict to avoid accidental change of those */
|
||||||
|
int be_builtin_class_find(bvm *vm, bstring *name)
|
||||||
|
{
|
||||||
|
bvalue *res = be_map_findstr(vm, builtin(vm).vtab, name);
|
||||||
|
if (res) {
|
||||||
|
return var_toidx(res);
|
||||||
|
} else {
|
||||||
|
int idx = global_native_class_find(vm, name);
|
||||||
|
if (idx >= 0) {
|
||||||
|
return idx;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return -1; /* not found */
|
||||||
|
}
|
||||||
|
|
||||||
bstring* be_builtin_name(bvm *vm, int index)
|
bstring* be_builtin_name(bvm *vm, int index)
|
||||||
{
|
{
|
||||||
bmap *map = builtin(vm).vtab;
|
bmap *map = builtin(vm).vtab;
|
||||||
|
|
|
@ -23,6 +23,7 @@ int be_global_new(bvm *vm, bstring *name);
|
||||||
bvalue* be_global_var(bvm *vm, int index);
|
bvalue* be_global_var(bvm *vm, int index);
|
||||||
void be_global_release_space(bvm *vm);
|
void be_global_release_space(bvm *vm);
|
||||||
int be_builtin_find(bvm *vm, bstring *name);
|
int be_builtin_find(bvm *vm, bstring *name);
|
||||||
|
int be_builtin_class_find(bvm *vm, bstring *name);
|
||||||
bstring* be_builtin_name(bvm *vm, int index);
|
bstring* be_builtin_name(bvm *vm, int index);
|
||||||
int be_builtin_new(bvm *vm, bstring *name);
|
int be_builtin_new(bvm *vm, bstring *name);
|
||||||
void be_bulitin_release_space(bvm *vm);
|
void be_bulitin_release_space(bvm *vm);
|
||||||
|
|
Loading…
Reference in New Issue