Liu Song’s Projects


~/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))