# HG changeset patch # User Edouard Tisserant # Date 1590053385 -7200 # Node ID 4a9b0df0602a614d2b9cd4cc3b5aca2989d808ca # Parent 88988edb2e93ce7db7ca2174695b32b4a1ab7ba9 SVGHMI: stop using eval in change_hmi_value, apparently slowly leaking memory. diff -r 88988edb2e93 -r 4a9b0df0602a svghmi/gen_index_xhtml.xslt --- a/svghmi/gen_index_xhtml.xslt Thu May 14 17:49:20 2020 +0200 +++ b/svghmi/gen_index_xhtml.xslt Thu May 21 11:29:45 2020 +0200 @@ -1,6 +1,6 @@ - - + + @@ -1159,6 +1159,10 @@ init() { + // TODO : use attributes to allow interaction through svg:use + + // TODO : deal with dragging + this.element.addEventListener( "mousedown", @@ -2700,7 +2704,7 @@ - + @@ -3235,13 +3239,41 @@ + quotes = {"'":null, '"':null}; + + + function change_hmi_value(index, opstr) { let op = opstr[0]; - let given_val = opstr.slice(1); - - let old_val = cache[index] + let given_val; + + if(opstr.length < 2) + + return undefined; // TODO raise + + if(opstr[1] in quotes){ + + if(opstr.length < 3) + + return undefined; // TODO raise + + if(opstr[opstr.length-1] == opstr[1]){ + + given_val = opstr.slice(2,opstr.length-1); + + } + + } else { + + given_val = Number(opstr.slice(1)); + + } + + console.log(opstr, given_val); + + let old_val = cache[index]; let new_val; @@ -3249,21 +3281,31 @@ case "=": - eval("new_val"+opstr); + new_val = given_val; break; case "+": + new_val = old_val + given_val; + + break; + case "-": + new_val = old_val - given_val; + + break; + case "*": + new_val = old_val * given_val; + + break; + case "/": - if(old_val != undefined) - - new_val = eval("old_val"+opstr); + new_val = old_val / given_val; break; @@ -3273,6 +3315,8 @@ send_hmi_value(index, new_val); + // TODO else raise + return new_val; } diff -r 88988edb2e93 -r 4a9b0df0602a svghmi/svghmi.js --- a/svghmi/svghmi.js Thu May 14 17:49:20 2020 +0200 +++ b/svghmi/svghmi.js Thu May 21 11:29:45 2020 +0200 @@ -247,25 +247,44 @@ return new_val; } +quotes = {"'":null, '"':null}; + function change_hmi_value(index, opstr) { let op = opstr[0]; - let given_val = opstr.slice(1); - let old_val = cache[index] + let given_val; + if(opstr.length < 2) + return undefined; // TODO raise + if(opstr[1] in quotes){ + if(opstr.length < 3) + return undefined; // TODO raise + if(opstr[opstr.length-1] == opstr[1]){ + given_val = opstr.slice(2,opstr.length-1); + } + } else { + given_val = Number(opstr.slice(1)); + } + let old_val = cache[index]; let new_val; switch(op){ case "=": - eval("new_val"+opstr); + new_val = given_val; break; case "+": + new_val = old_val + given_val; + break; case "-": + new_val = old_val - given_val; + break; case "*": + new_val = old_val * given_val; + break; case "/": - if(old_val != undefined) - new_val = eval("old_val"+opstr); + new_val = old_val / given_val; break; } if(new_val != undefined && old_val != new_val) send_hmi_value(index, new_val); + // TODO else raise return new_val; }