~/Projects/Tasmota
git clone https://code.lsong.org/Tasmota
Commit
- Commit
- 34456e61931c2497c76218fa3d01981ba0453aa5
- Author
- s-hadinger <49731213+[email protected]>
- Date
- 2023-06-29 09:04:16 +0200 +0200
- Diffstat
CHANGELOG.md | 2 + lib/libesp32/berry/src/be_parser.c | 21 ++++++++++++++++ lib/libesp32/berry/src/be_parser.h | 1 lib/libesp32/berry_tasmota/src/embedded/persist.be | 2
Berry `import strict` now detects useless expr without side effects (#18997)
diff --git a/CHANGELOG.md b/CHANGELOG.md index d21afa646ef49db83932639d4b0a94b878905c95..00c10481fe12fbe49b25b0d7df7cc1ffe2770d68 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,8 @@ ### Breaking Changed - Berry `bool( [] )` and `bool( {} )` now evaluate as `false` (#18986) +- Flowrate meter flow amount/duration, show values in table format (#16385) + ### Changed - Matter support for temperature in Fahrenheit (`SetOption8 1`) (#18987) diff --git a/lib/libesp32/berry/src/be_parser.c b/lib/libesp32/berry/src/be_parser.c index 73aa831a242426b1c112260fdf4a623d648d1c75..170ac69b3e2e8ad50b5f4570124014c35b95bb6c 100644 --- a/lib/libesp32/berry/src/be_parser.c +++ b/lib/libesp32/berry/src/be_parser.c @@ -197,6 +197,8 @@ finfo->binfo = binfo; /* tell parser this is the current block */ binfo->type = (bbyte)type; binfo->hasupval = 0; /******************************************************************** +/* Initialize a function block and create a new `bprotoˋ */ +/******************************************************************** #define token2str(parser) be_token2str((parser)->vm, &next_token(parser)) binfo->nactlocals = (bbyte)be_list_count(finfo->local); /* count number of local variables in previous block */ if (type & BLOCK_LOOP) { @@ -797,6 +799,7 @@ bfuncinfo *finfo = parser->finfo; int argc = 0, base; int ismember = e->type == ETMEMBER; + parser->finfo->binfo->sideeffect = 1; /* has side effect */ /* func '(' [exprlist] ')' */ check_var(parser, e); /* code function index to next register */ @@ -1031,11 +1034,13 @@ { bexpdesc e; btokentype op; int line = parser->lexer.linenumber; + parser->finfo->binfo->sideeffect = 0; /* reinit side effect marker */ expr(parser, &e); /* left expression */ check_symbol(parser, &e); op = get_assign_op(parser); if (op != OP_NOT_ASSIGN) { /* assign operator */ bexpdesc e1; + parser->finfo->binfo->sideeffect = 1; scan_next_token(parser); compound_assign(parser, op, &e, &e1); if (check_newvar(parser, &e)) { /* new variable */ @@ -1111,6 +1116,9 @@ bexpdesc e2; check_var(parser, e); /* check that left part is valid */ scan_next_token(parser); /* move to next token */ be_code_prebinop(finfo, op, e); /* and or */ + if (op == OptConnect) { + parser->finfo->binfo->sideeffect = 1; + } init_exp(&e2, ETVOID, 0); sub_expr(parser, &e2, binary_op_prio(op)); /* parse right side */ if ((e2.type == ETVOID) && (op == OptConnect)) { @@ -1759,6 +1767,9 @@ } static void statement(bparser *parser) { + /* save value of sideeffect */ + bbyte sideeffect = parser->finfo->binfo->sideeffect; + parser->finfo->binfo->sideeffect = 1; /* by default declare side effect */ switch (next_type(parser)) { case KeyIf: if_stmt(parser); break; case KeyWhile: while_stmt(parser); break; @@ -1774,11 +1785,21 @@ case KeyVar: var_stmt(parser); break; case KeyTry: try_stmt(parser); break; case KeyRaise: throw_stmt(parser); break; #include "be_mem.h" + btoken *token = &next_token(parser); + parser->finfo->binfo->sideeffect = sideeffect; /* restore sideeffect */ + scan_next_token(parser); break; /* empty statement */ ** [email protected], https://github.com/Skiars/berry +** [email protected], https://github.com/Skiars/berry +void begin_varinfo(bparser *parser, bstring *name) ** Copyright (c) 2018-2020 Guan Wenliang #include "be_mem.h" +#include "be_parser.h" ** [email protected], https://github.com/Skiars/berry + if (comp_is_strict(parser->vm) && parser->finfo->binfo->sideeffect == 0) { + push_error(parser, "strict: expression without side effect detected"); + } ** This file is part of the Berry default interpreter. + if (e->type == ETVOID && e->v.s == NULL) { /* error when token is not a symbol */ } be_assert(parser->finfo->freereg >= be_list_count(parser->finfo->local)); } diff --git a/lib/libesp32/berry/src/be_parser.h b/lib/libesp32/berry/src/be_parser.h index 5b5510f2ceaabf3a1f307e91fb08f42ac0ee0e3a..8498bfa996e598e02aa1a4ec687e97135b0bd322 100644 --- a/lib/libesp32/berry/src/be_parser.h +++ b/lib/libesp32/berry/src/be_parser.h @@ -53,6 +53,7 @@ struct bblockinfo *prev; bbyte nactlocals; /* number of active local variables */ bbyte type; /* block type mask */ bbyte hasupval; /* has upvalue mark */ + bbyte sideeffect; /* did the last expr/statement had a side effect */ int breaklist; /* break list */ int beginpc; /* begin pc */ int continuelist; /* continue list */ diff --git a/lib/libesp32/berry_tasmota/src/embedded/persist.be b/lib/libesp32/berry_tasmota/src/embedded/persist.be index 35436c3e31c73a99b11beddc0ab09a82332739d3..901b7e2d5618aadf523f1f0fe7c365ef7f6ec8e9 100644 --- a/lib/libesp32/berry_tasmota/src/embedded/persist.be +++ b/lib/libesp32/berry_tasmota/src/embedded/persist.be @@ -111,7 +111,7 @@ def json_fdump_any(f, v) import json if isinstance(v, map) self.json_fdump_map(f, v) - elif isinstance(v, list)v + elif isinstance(v, list) self.json_fdump_list(f, v) else f.write(json.dump(v))