From 9db294a5b7ca87e866aa9bf811078ff57ceeb48e Mon Sep 17 00:00:00 2001 From: Giacomo Tazzari Date: Sun, 10 Aug 2014 12:26:56 +0200 Subject: [PATCH 1/8] =?UTF-8?q?Fixed=20a=20crash=20in=20serpent=20compiler?= =?UTF-8?q?=20when=20converting=20to=20number=20a=20string=20containing=20?= =?UTF-8?q?non-ascii=20character=20(e.g.:=20a=20=3D=20"per=C3=B2").=20To?= =?UTF-8?q?=20prevent=20further=20signed=20int=20overflows:=20modified=20i?= =?UTF-8?q?ntToDecimal()=20and=20decimalToInt()=20into=20unsignedToDecimal?= =?UTF-8?q?()=20and=20decimalToUnsigned()=20because=20they=20currently=20m?= =?UTF-8?q?ake=20sense=20only=20on=20unsigned=20integers.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- libserpent/bignum.cpp | 8 ++++---- libserpent/bignum.h | 4 ++-- libserpent/compiler.cpp | 26 +++++++++++++------------- libserpent/rewriter.cpp | 8 ++++---- libserpent/util.cpp | 12 ++++++------ sc/cmdline.cpp | 2 +- 6 files changed, 30 insertions(+), 30 deletions(-) diff --git a/libserpent/bignum.cpp b/libserpent/bignum.cpp index 29315b871..877808ead 100644 --- a/libserpent/bignum.cpp +++ b/libserpent/bignum.cpp @@ -5,9 +5,9 @@ #include "bignum.h" //Integer to string conversion -std::string intToDecimal(int branch) { +std::string unsignedToDecimal(unsigned branch) { if (branch < 10) return nums.substr(branch, 1); - else return intToDecimal(branch / 10) + nums.substr(branch % 10,1); + else return unsignedToDecimal(branch / 10) + nums.substr(branch % 10,1); } //Add two strings representing decimal values @@ -91,8 +91,8 @@ std::string decimalMod(std::string a, std::string b) { } //String to int conversion -int decimalToInt(std::string a) { +unsigned decimalToUnsigned(std::string a) { if (a.size() == 0) return 0; else return (a[a.size() - 1] - '0') - + decimalToInt(a.substr(0,a.size()-1)) * 10; + + decimalToUnsigned(a.substr(0,a.size()-1)) * 10; } diff --git a/libserpent/bignum.h b/libserpent/bignum.h index a12929752..6656fdaec 100644 --- a/libserpent/bignum.h +++ b/libserpent/bignum.h @@ -11,7 +11,7 @@ const std::string tt255 = "57896044618658097711785492504343953926634992332820282019728792003956564819968" ; -std::string intToDecimal(int branch); +std::string unsignedToDecimal(unsigned branch); std::string decimalAdd(std::string a, std::string b); @@ -25,6 +25,6 @@ std::string decimalMod(std::string a, std::string b); bool decimalGt(std::string a, std::string b, bool eqAllowed=false); -int decimalToInt(std::string a); +unsigned decimalToUnsigned(std::string a); #endif diff --git a/libserpent/compiler.cpp b/libserpent/compiler.cpp index 959d2993b..69292091c 100644 --- a/libserpent/compiler.cpp +++ b/libserpent/compiler.cpp @@ -55,7 +55,7 @@ programData opcodeify(Node node, programAux aux=Aux()) { else if (node.val == "ref" || node.val == "get" || node.val == "set") { std::string varname = node.args[0].val; if (!aux.vars.count(varname)) { - aux.vars[varname] = intToDecimal(aux.vars.size() * 32); + aux.vars[varname] = unsignedToDecimal(aux.vars.size() * 32); } if (varname == "msg.data") aux.calldataUsed = true; // Set variable @@ -165,7 +165,7 @@ programData opcodeify(Node node, programAux aux=Aux()) { nodes.push_back(token("MSIZE", m)); nodes.push_back(token("0", m)); nodes.push_back(token("MSIZE", m)); - nodes.push_back(token(intToDecimal(subs.size() * 32 - 1), m)); + nodes.push_back(token(unsignedToDecimal(subs.size() * 32 - 1), m)); nodes.push_back(token("ADD", m)); nodes.push_back(token("MSTORE8", m)); for (unsigned i = 0; i < subs.size(); i++) { @@ -173,7 +173,7 @@ programData opcodeify(Node node, programAux aux=Aux()) { nodes.push_back(subs[i]); nodes.push_back(token("SWAP", m)); if (i > 0) { - nodes.push_back(token(intToDecimal(i * 32), m)); + nodes.push_back(token(unsignedToDecimal(i * 32), m)); nodes.push_back(token("ADD", m)); } nodes.push_back(token("MSTORE", m)); @@ -201,7 +201,7 @@ Node finalize(programData c) { if (c.aux.allocUsed && c.aux.vars.size() > 0) { Node nodelist[] = { token("0", m), - token(intToDecimal(c.aux.vars.size() * 32 - 1)), + token(unsignedToDecimal(c.aux.vars.size() * 32 - 1)), token("MSTORE8", m) }; bottom.push_back(multiToken(nodelist, 3, m)); @@ -235,7 +235,7 @@ programAux buildDict(Node program, programAux aux, int labelLength) { aux.step += 1 + toByteArr(program.val, m).size(); } else if (program.val[0] == '~') { - aux.vars[program.val.substr(1)] = intToDecimal(aux.step); + aux.vars[program.val.substr(1)] = unsignedToDecimal(aux.step); } else if (program.val[0] == '$') { aux.step += labelLength + 1; @@ -271,7 +271,7 @@ Node substDict(Node program, programAux aux, int labelLength) { std::vector inner; if (program.type == TOKEN) { if (program.val[0] == '$') { - std::string tokStr = "PUSH"+intToDecimal(labelLength); + std::string tokStr = "PUSH"+unsignedToDecimal(labelLength); out.push_back(token(tokStr, m)); int dotLoc = program.val.find('.'); if (dotLoc == -1) { @@ -289,7 +289,7 @@ Node substDict(Node program, programAux aux, int labelLength) { else if (program.val[0] == '~') { } else if (isNumberLike(program)) { inner = toByteArr(program.val, m); - out.push_back(token("PUSH"+intToDecimal(inner.size()))); + out.push_back(token("PUSH"+unsignedToDecimal(inner.size()))); out.push_back(astnode("_", inner, m)); } else return program; @@ -333,10 +333,10 @@ std::string serialize(std::vector codons) { for (unsigned i = 0; i < codons.size(); i++) { int v; if (isNumberLike(codons[i])) { - v = decimalToInt(codons[i].val); + v = decimalToUnsigned(codons[i].val); } else if (codons[i].val.substr(0,4) == "PUSH") { - v = 95 + decimalToInt(codons[i].val.substr(4)); + v = 95 + decimalToUnsigned(codons[i].val.substr(4)); } else { v = opcode(codons[i].val); @@ -355,9 +355,9 @@ std::vector deserialize(std::string ser) { std::string oper = op((int)v); if (oper != "" && backCount <= 0) o.push_back(token(oper)); else if (v >= 96 && v < 128 && backCount <= 0) { - o.push_back(token("PUSH"+intToDecimal(v - 95))); + o.push_back(token("PUSH"+unsignedToDecimal(v - 95))); } - else o.push_back(token(intToDecimal(v))); + else o.push_back(token(unsignedToDecimal(v))); if (v >= 96 && v < 128 && backCount <= 0) { backCount = v - 95; } @@ -392,7 +392,7 @@ std::string encodeDatalist(std::vector vals) { for (unsigned i = 0; i < vals.size(); i++) { std::vector n = toByteArr(strToNumeric(vals[i]), Metadata(), 32); for (unsigned j = 0; j < n.size(); j++) { - int v = decimalToInt(n[j].val); + int v = decimalToUnsigned(n[j].val); o += (char)v; } } @@ -406,7 +406,7 @@ std::vector decodeDatalist(std::string ser) { std::string o = "0"; for (unsigned j = i; j < i + 32; j++) { int vj = (int)(unsigned char)ser[j]; - o = decimalAdd(decimalMul(o, "256"), intToDecimal(vj)); + o = decimalAdd(decimalMul(o, "256"), unsignedToDecimal(vj)); } out.push_back(o); } diff --git a/libserpent/rewriter.cpp b/libserpent/rewriter.cpp index 8b50c9a28..3d59cb3bd 100644 --- a/libserpent/rewriter.cpp +++ b/libserpent/rewriter.cpp @@ -344,7 +344,7 @@ Node subst(Node pattern, Node array_lit_transform(Node node) { std::vector o1; - o1.push_back(token(intToDecimal(node.args.size() * 32), node.metadata)); + o1.push_back(token(unsignedToDecimal(node.args.size() * 32), node.metadata)); std::vector o2; std::string symb = "_temp"+mkUniqueToken()+"_0"; o2.push_back(token(symb, node.metadata)); @@ -357,7 +357,7 @@ Node array_lit_transform(Node node) { o5.push_back(token(symb, node.metadata)); std::vector o6; o6.push_back(astnode("get", o5, node.metadata)); - o6.push_back(token(intToDecimal(i * 32), node.metadata)); + o6.push_back(token(unsignedToDecimal(i * 32), node.metadata)); std::vector o7; o7.push_back(astnode("add", o6)); o7.push_back(node.args[i]); @@ -474,10 +474,10 @@ Node validate(Node inp) { int i = 0; while(valid[i][0] != "---END---") { if (inp.val == valid[i][0]) { - if (decimalGt(valid[i][1], intToDecimal(inp.args.size()))) { + if (decimalGt(valid[i][1], unsignedToDecimal(inp.args.size()))) { err("Too few arguments for "+inp.val, inp.metadata); } - if (decimalGt(intToDecimal(inp.args.size()), valid[i][2])) { + if (decimalGt(unsignedToDecimal(inp.args.size()), valid[i][2])) { err("Too many arguments for "+inp.val, inp.metadata); } } diff --git a/libserpent/util.cpp b/libserpent/util.cpp index 6ca39de9d..efef91425 100644 --- a/libserpent/util.cpp +++ b/libserpent/util.cpp @@ -60,8 +60,8 @@ std::string printAST(Node ast, bool printMetadata) { std::string o = "("; if (printMetadata) { o += ast.metadata.file + " "; - o += intToDecimal(ast.metadata.ln) + " "; - o += intToDecimal(ast.metadata.ch) + ": "; + o += unsignedToDecimal(ast.metadata.ln) + " "; + o += unsignedToDecimal(ast.metadata.ch) + ": "; } o += ast.val; std::vector subs; @@ -132,14 +132,14 @@ std::string strToNumeric(std::string inp) { else if ((inp[0] == '"' && inp[inp.length()-1] == '"') || (inp[0] == '\'' && inp[inp.length()-1] == '\'')) { for (unsigned i = 1; i < inp.length() - 1; i++) { - o = decimalAdd(decimalMul(o,"256"), intToDecimal(inp[i])); + o = decimalAdd(decimalMul(o,"256"), unsignedToDecimal((unsigned char)inp[i])); } } else if (inp.substr(0,2) == "0x") { for (unsigned i = 2; i < inp.length(); i++) { int dig = std::string("0123456789abcdef").find(inp[i]); if (dig < 0) return ""; - o = decimalAdd(decimalMul(o,"16"), intToDecimal(dig)); + o = decimalAdd(decimalMul(o,"16"), unsignedToDecimal(dig)); } } else { @@ -188,7 +188,7 @@ int counter = 0; //Makes a unique token std::string mkUniqueToken() { counter++; - return intToDecimal(counter); + return unsignedToDecimal(counter); } //Does a file exist? http://stackoverflow.com/questions/12774207 @@ -217,7 +217,7 @@ std::string get_file_contents(std::string filename) //Report error void err(std::string errtext, Metadata met) { std::string err = "Error (file \"" + met.file + "\", line " + - intToDecimal(met.ln) + ", char " + intToDecimal(met.ch) + + unsignedToDecimal(met.ln) + ", char " + unsignedToDecimal(met.ch) + "): " + errtext; std::cerr << err << "\n"; throw(err); diff --git a/sc/cmdline.cpp b/sc/cmdline.cpp index 232cbfeec..4b2eee160 100644 --- a/sc/cmdline.cpp +++ b/sc/cmdline.cpp @@ -96,7 +96,7 @@ int main(int argv, char** argc) { else if (command == "biject") { if (argv == 3) std::cerr << "Not enough arguments for biject\n"; - int pos = decimalToInt(secondInput); + int pos = decimalToUnsigned(secondInput); std::vector n = prettyCompile(input); if (pos >= (int)n.size()) std::cerr << "Code position too high\n"; From 6a4488bf698ddcd3a9fa4e490955fd8d8fb93dbc Mon Sep 17 00:00:00 2001 From: Giacomo Tazzari Date: Sun, 10 Aug 2014 20:28:51 +0200 Subject: [PATCH 2/8] Enabled click focus on the "code" text widget, to allow copying the text result of code compilation to clipboard --- alethzero/Main.ui | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/alethzero/Main.ui b/alethzero/Main.ui index a01ac7856..f52a2d043 100644 --- a/alethzero/Main.ui +++ b/alethzero/Main.ui @@ -563,7 +563,7 @@ - Qt::NoFocus + Qt::ClickFocus QFrame::NoFrame @@ -571,6 +571,9 @@ 0 + + true + From 9fcc4105162c910887a9b7cb84f05feb4e7d01e6 Mon Sep 17 00:00:00 2001 From: Giacomo Tazzari Date: Sun, 10 Aug 2014 22:51:29 +0200 Subject: [PATCH 3/8] Added a debug menu option to disable compiler optimization, for testing purposes --- alethzero/Main.ui | 9 +++++++++ alethzero/MainWin.cpp | 19 +++++++++++++++---- alethzero/MainWin.h | 2 ++ 3 files changed, 26 insertions(+), 4 deletions(-) diff --git a/alethzero/Main.ui b/alethzero/Main.ui index f52a2d043..d3f027ac1 100644 --- a/alethzero/Main.ui +++ b/alethzero/Main.ui @@ -185,6 +185,7 @@ + @@ -1667,6 +1668,14 @@ font-size: 14pt &Refresh + + + true + + + &Disable LLL Compiler Optimization + + diff --git a/alethzero/MainWin.cpp b/alethzero/MainWin.cpp index 6c18d39bd..19ce70587 100644 --- a/alethzero/MainWin.cpp +++ b/alethzero/MainWin.cpp @@ -332,6 +332,12 @@ void Main::on_forceMining_triggered() m_client->setForceMining(ui->forceMining->isChecked()); } +void Main::on_disableCompilerOptimization_triggered() +{ + m_disableCompilerOptimization = ui->disableCompilerOptimization->isChecked(); + on_data_textChanged(); +} + void Main::load(QString _s) { QFile fin(_s); @@ -1302,9 +1308,7 @@ void Main::on_data_textChanged() } else { - auto asmcode = eth::compileLLLToAsm(src, false); - auto asmcodeopt = eth::compileLLLToAsm(ui->data->toPlainText().toStdString(), true); - m_data = eth::compileLLL(ui->data->toPlainText().toStdString(), true, &errors); + m_data = eth::compileLLL(src, !m_disableCompilerOptimization, &errors); if (errors.size()) { try @@ -1319,7 +1323,14 @@ void Main::on_data_textChanged() } } else - lll = "

Opt

" + QString::fromStdString(asmcodeopt).toHtmlEscaped() + "

Pre

" + QString::fromStdString(asmcode).toHtmlEscaped() + "
"; + { + auto asmcode = eth::compileLLLToAsm(src, false); + lll = "

Pre

" + QString::fromStdString(asmcode).toHtmlEscaped() + "
"; + if (!m_disableCompilerOptimization) { + asmcode = eth::compileLLLToAsm(src, true); + lll = "

Opt

" + QString::fromStdString(asmcode).toHtmlEscaped() + "
" + lll; + } + } } QString errs; if (errors.size()) diff --git a/alethzero/MainWin.h b/alethzero/MainWin.h index f54a64053..98b4a2c03 100644 --- a/alethzero/MainWin.h +++ b/alethzero/MainWin.h @@ -138,6 +138,7 @@ private slots: void on_debugDumpState_triggered(int _add = 1); void on_debugDumpStatePre_triggered(); void on_refresh_triggered(); + void on_disableCompilerOptimization_triggered(); signals: void poll(); @@ -221,6 +222,7 @@ private: QMap m_pcWarp; QList m_history; std::map m_codes; // and pcWarps + bool m_disableCompilerOptimization = false; QNetworkAccessManager m_webCtrl; From e584148ba1a3b21feab665da43d8ad69cd5488ee Mon Sep 17 00:00:00 2001 From: Giacomo Tazzari Date: Mon, 11 Aug 2014 11:06:32 +0200 Subject: [PATCH 4/8] Fixed implementation of EXP opcode (wrong results when exponent >= 2^32) --- libevm/VM.h | 4 ++-- liblll/Assembly.cpp | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/libevm/VM.h b/libevm/VM.h index 15f05fd26..f014e2da8 100644 --- a/libevm/VM.h +++ b/libevm/VM.h @@ -241,9 +241,9 @@ template eth::bytesConstRef eth::VM::go(Ext& _ext, OnOpFunc const& _ { require(2); auto base = m_stack.back(); - unsigned expon = (unsigned)m_stack[m_stack.size() - 2]; + auto expon = m_stack[m_stack.size() - 2]; m_stack.pop_back(); - m_stack.back() = boost::multiprecision::pow(base, expon); + m_stack.back() = (u256)boost::multiprecision::powm((bigint)base, (bigint)expon, bigint(2) << 256); break; } case Instruction::NEG: diff --git a/liblll/Assembly.cpp b/liblll/Assembly.cpp index 78552f3c5..550f5c89e 100644 --- a/liblll/Assembly.cpp +++ b/liblll/Assembly.cpp @@ -230,7 +230,7 @@ Assembly& Assembly::optimise(bool _enable) { Instruction::SDIV, [](u256 a, u256 b)->u256{return s2u(u2s(a) / u2s(b));} }, { Instruction::MOD, [](u256 a, u256 b)->u256{return a % b;} }, { Instruction::SMOD, [](u256 a, u256 b)->u256{return s2u(u2s(a) % u2s(b));} }, - { Instruction::EXP, [](u256 a, u256 b)->u256{return boost::multiprecision::pow(a, (unsigned)b);} }, + { Instruction::EXP, [](u256 a, u256 b)->u256{return (u256)boost::multiprecision::powm((bigint)a, (bigint)b, bigint(2) << 256);} }, { Instruction::LT, [](u256 a, u256 b)->u256{return a < b ? 1 : 0;} }, { Instruction::GT, [](u256 a, u256 b)->u256{return a > b ? 1 : 0;} }, { Instruction::SLT, [](u256 a, u256 b)->u256{return u2s(a) < u2s(b) ? 1 : 0;} }, From 6ad2677523486b2a7a3e47ecd151925c60687289 Mon Sep 17 00:00:00 2001 From: Giacomo Tazzari Date: Mon, 11 Aug 2014 11:20:11 +0200 Subject: [PATCH 5/8] Code indentation fix --- liblll/Assembly.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/liblll/Assembly.cpp b/liblll/Assembly.cpp index 550f5c89e..491d3812e 100644 --- a/liblll/Assembly.cpp +++ b/liblll/Assembly.cpp @@ -227,14 +227,14 @@ Assembly& Assembly::optimise(bool _enable) { { Instruction::SUB, [](u256 a, u256 b)->u256{return a - b;} }, { Instruction::DIV, [](u256 a, u256 b)->u256{return a / b;} }, - { Instruction::SDIV, [](u256 a, u256 b)->u256{return s2u(u2s(a) / u2s(b));} }, + { Instruction::SDIV, [](u256 a, u256 b)->u256{return s2u(u2s(a) / u2s(b));} }, { Instruction::MOD, [](u256 a, u256 b)->u256{return a % b;} }, - { Instruction::SMOD, [](u256 a, u256 b)->u256{return s2u(u2s(a) % u2s(b));} }, + { Instruction::SMOD, [](u256 a, u256 b)->u256{return s2u(u2s(a) % u2s(b));} }, { Instruction::EXP, [](u256 a, u256 b)->u256{return (u256)boost::multiprecision::powm((bigint)a, (bigint)b, bigint(2) << 256);} }, { Instruction::LT, [](u256 a, u256 b)->u256{return a < b ? 1 : 0;} }, { Instruction::GT, [](u256 a, u256 b)->u256{return a > b ? 1 : 0;} }, - { Instruction::SLT, [](u256 a, u256 b)->u256{return u2s(a) < u2s(b) ? 1 : 0;} }, - { Instruction::SGT, [](u256 a, u256 b)->u256{return u2s(a) > u2s(b) ? 1 : 0;} }, + { Instruction::SLT, [](u256 a, u256 b)->u256{return u2s(a) < u2s(b) ? 1 : 0;} }, + { Instruction::SGT, [](u256 a, u256 b)->u256{return u2s(a) > u2s(b) ? 1 : 0;} }, { Instruction::EQ, [](u256 a, u256 b)->u256{return a == b ? 1 : 0;} }, }; map> c_associative = From 0a7f3a625f0b6ad51c0f984140f5f3c21c168374 Mon Sep 17 00:00:00 2001 From: Giacomo Tazzari Date: Tue, 12 Aug 2014 09:48:06 +0200 Subject: [PATCH 6/8] Changed the new option "Disable LLL Compiler Optimization" to a more sane "Optimize LLL Compiler" (enabled by default) --- alethzero/Main.ui | 6 +++--- alethzero/MainWin.cpp | 10 ++++++---- alethzero/MainWin.h | 4 ++-- 3 files changed, 11 insertions(+), 9 deletions(-) diff --git a/alethzero/Main.ui b/alethzero/Main.ui index d3f027ac1..0a727e505 100644 --- a/alethzero/Main.ui +++ b/alethzero/Main.ui @@ -185,7 +185,7 @@ - + @@ -1668,12 +1668,12 @@ font-size: 14pt &Refresh - + true - &Disable LLL Compiler Optimization + &Optimize LLL Compiler diff --git a/alethzero/MainWin.cpp b/alethzero/MainWin.cpp index 19ce70587..dd12236e4 100644 --- a/alethzero/MainWin.cpp +++ b/alethzero/MainWin.cpp @@ -332,9 +332,9 @@ void Main::on_forceMining_triggered() m_client->setForceMining(ui->forceMining->isChecked()); } -void Main::on_disableCompilerOptimization_triggered() +void Main::on_optimizeCompiler_triggered() { - m_disableCompilerOptimization = ui->disableCompilerOptimization->isChecked(); + m_optimizeCompiler = ui->optimizeCompiler->isChecked(); on_data_textChanged(); } @@ -576,6 +576,7 @@ void Main::readSettings(bool _skipGeometry) ui->paranoia->setChecked(s.value("paranoia", false).toBool()); ui->showAll->setChecked(s.value("showAll", false).toBool()); ui->showAllAccounts->setChecked(s.value("showAllAccounts", false).toBool()); + ui->optimizeCompiler->setChecked(m_optimizeCompiler); ui->clientName->setText(s.value("clientName", "").toString()); ui->idealPeers->setValue(s.value("idealPeers", ui->idealPeers->value()).toInt()); ui->port->setValue(s.value("port", ui->port->value()).toInt()); @@ -1308,7 +1309,7 @@ void Main::on_data_textChanged() } else { - m_data = eth::compileLLL(src, !m_disableCompilerOptimization, &errors); + m_data = eth::compileLLL(src, m_optimizeCompiler, &errors); if (errors.size()) { try @@ -1326,7 +1327,8 @@ void Main::on_data_textChanged() { auto asmcode = eth::compileLLLToAsm(src, false); lll = "

Pre

" + QString::fromStdString(asmcode).toHtmlEscaped() + "
"; - if (!m_disableCompilerOptimization) { + if (m_optimizeCompiler) + { asmcode = eth::compileLLLToAsm(src, true); lll = "

Opt

" + QString::fromStdString(asmcode).toHtmlEscaped() + "
" + lll; } diff --git a/alethzero/MainWin.h b/alethzero/MainWin.h index 98b4a2c03..fc12a567e 100644 --- a/alethzero/MainWin.h +++ b/alethzero/MainWin.h @@ -138,7 +138,7 @@ private slots: void on_debugDumpState_triggered(int _add = 1); void on_debugDumpStatePre_triggered(); void on_refresh_triggered(); - void on_disableCompilerOptimization_triggered(); + void on_optimizeCompiler_triggered(); signals: void poll(); @@ -222,7 +222,7 @@ private: QMap m_pcWarp; QList m_history; std::map m_codes; // and pcWarps - bool m_disableCompilerOptimization = false; + bool m_optimizeCompiler = true; QNetworkAccessManager m_webCtrl; From ac37ca74621bf8b60265efc04de080315b317a13 Mon Sep 17 00:00:00 2001 From: Giacomo Tazzari Date: Tue, 12 Aug 2014 09:55:33 +0200 Subject: [PATCH 7/8] Reverting fixes on Serpent because they should be merged on the Serpent repo (reverted from commit 9db294a5b7ca87e866aa9bf811078ff57ceeb48e) --- libserpent/bignum.cpp | 8 ++++---- libserpent/bignum.h | 4 ++-- libserpent/compiler.cpp | 26 +++++++++++++------------- libserpent/rewriter.cpp | 8 ++++---- libserpent/util.cpp | 12 ++++++------ sc/cmdline.cpp | 2 +- 6 files changed, 30 insertions(+), 30 deletions(-) diff --git a/libserpent/bignum.cpp b/libserpent/bignum.cpp index 877808ead..29315b871 100644 --- a/libserpent/bignum.cpp +++ b/libserpent/bignum.cpp @@ -5,9 +5,9 @@ #include "bignum.h" //Integer to string conversion -std::string unsignedToDecimal(unsigned branch) { +std::string intToDecimal(int branch) { if (branch < 10) return nums.substr(branch, 1); - else return unsignedToDecimal(branch / 10) + nums.substr(branch % 10,1); + else return intToDecimal(branch / 10) + nums.substr(branch % 10,1); } //Add two strings representing decimal values @@ -91,8 +91,8 @@ std::string decimalMod(std::string a, std::string b) { } //String to int conversion -unsigned decimalToUnsigned(std::string a) { +int decimalToInt(std::string a) { if (a.size() == 0) return 0; else return (a[a.size() - 1] - '0') - + decimalToUnsigned(a.substr(0,a.size()-1)) * 10; + + decimalToInt(a.substr(0,a.size()-1)) * 10; } diff --git a/libserpent/bignum.h b/libserpent/bignum.h index 6656fdaec..a12929752 100644 --- a/libserpent/bignum.h +++ b/libserpent/bignum.h @@ -11,7 +11,7 @@ const std::string tt255 = "57896044618658097711785492504343953926634992332820282019728792003956564819968" ; -std::string unsignedToDecimal(unsigned branch); +std::string intToDecimal(int branch); std::string decimalAdd(std::string a, std::string b); @@ -25,6 +25,6 @@ std::string decimalMod(std::string a, std::string b); bool decimalGt(std::string a, std::string b, bool eqAllowed=false); -unsigned decimalToUnsigned(std::string a); +int decimalToInt(std::string a); #endif diff --git a/libserpent/compiler.cpp b/libserpent/compiler.cpp index 69292091c..959d2993b 100644 --- a/libserpent/compiler.cpp +++ b/libserpent/compiler.cpp @@ -55,7 +55,7 @@ programData opcodeify(Node node, programAux aux=Aux()) { else if (node.val == "ref" || node.val == "get" || node.val == "set") { std::string varname = node.args[0].val; if (!aux.vars.count(varname)) { - aux.vars[varname] = unsignedToDecimal(aux.vars.size() * 32); + aux.vars[varname] = intToDecimal(aux.vars.size() * 32); } if (varname == "msg.data") aux.calldataUsed = true; // Set variable @@ -165,7 +165,7 @@ programData opcodeify(Node node, programAux aux=Aux()) { nodes.push_back(token("MSIZE", m)); nodes.push_back(token("0", m)); nodes.push_back(token("MSIZE", m)); - nodes.push_back(token(unsignedToDecimal(subs.size() * 32 - 1), m)); + nodes.push_back(token(intToDecimal(subs.size() * 32 - 1), m)); nodes.push_back(token("ADD", m)); nodes.push_back(token("MSTORE8", m)); for (unsigned i = 0; i < subs.size(); i++) { @@ -173,7 +173,7 @@ programData opcodeify(Node node, programAux aux=Aux()) { nodes.push_back(subs[i]); nodes.push_back(token("SWAP", m)); if (i > 0) { - nodes.push_back(token(unsignedToDecimal(i * 32), m)); + nodes.push_back(token(intToDecimal(i * 32), m)); nodes.push_back(token("ADD", m)); } nodes.push_back(token("MSTORE", m)); @@ -201,7 +201,7 @@ Node finalize(programData c) { if (c.aux.allocUsed && c.aux.vars.size() > 0) { Node nodelist[] = { token("0", m), - token(unsignedToDecimal(c.aux.vars.size() * 32 - 1)), + token(intToDecimal(c.aux.vars.size() * 32 - 1)), token("MSTORE8", m) }; bottom.push_back(multiToken(nodelist, 3, m)); @@ -235,7 +235,7 @@ programAux buildDict(Node program, programAux aux, int labelLength) { aux.step += 1 + toByteArr(program.val, m).size(); } else if (program.val[0] == '~') { - aux.vars[program.val.substr(1)] = unsignedToDecimal(aux.step); + aux.vars[program.val.substr(1)] = intToDecimal(aux.step); } else if (program.val[0] == '$') { aux.step += labelLength + 1; @@ -271,7 +271,7 @@ Node substDict(Node program, programAux aux, int labelLength) { std::vector inner; if (program.type == TOKEN) { if (program.val[0] == '$') { - std::string tokStr = "PUSH"+unsignedToDecimal(labelLength); + std::string tokStr = "PUSH"+intToDecimal(labelLength); out.push_back(token(tokStr, m)); int dotLoc = program.val.find('.'); if (dotLoc == -1) { @@ -289,7 +289,7 @@ Node substDict(Node program, programAux aux, int labelLength) { else if (program.val[0] == '~') { } else if (isNumberLike(program)) { inner = toByteArr(program.val, m); - out.push_back(token("PUSH"+unsignedToDecimal(inner.size()))); + out.push_back(token("PUSH"+intToDecimal(inner.size()))); out.push_back(astnode("_", inner, m)); } else return program; @@ -333,10 +333,10 @@ std::string serialize(std::vector codons) { for (unsigned i = 0; i < codons.size(); i++) { int v; if (isNumberLike(codons[i])) { - v = decimalToUnsigned(codons[i].val); + v = decimalToInt(codons[i].val); } else if (codons[i].val.substr(0,4) == "PUSH") { - v = 95 + decimalToUnsigned(codons[i].val.substr(4)); + v = 95 + decimalToInt(codons[i].val.substr(4)); } else { v = opcode(codons[i].val); @@ -355,9 +355,9 @@ std::vector deserialize(std::string ser) { std::string oper = op((int)v); if (oper != "" && backCount <= 0) o.push_back(token(oper)); else if (v >= 96 && v < 128 && backCount <= 0) { - o.push_back(token("PUSH"+unsignedToDecimal(v - 95))); + o.push_back(token("PUSH"+intToDecimal(v - 95))); } - else o.push_back(token(unsignedToDecimal(v))); + else o.push_back(token(intToDecimal(v))); if (v >= 96 && v < 128 && backCount <= 0) { backCount = v - 95; } @@ -392,7 +392,7 @@ std::string encodeDatalist(std::vector vals) { for (unsigned i = 0; i < vals.size(); i++) { std::vector n = toByteArr(strToNumeric(vals[i]), Metadata(), 32); for (unsigned j = 0; j < n.size(); j++) { - int v = decimalToUnsigned(n[j].val); + int v = decimalToInt(n[j].val); o += (char)v; } } @@ -406,7 +406,7 @@ std::vector decodeDatalist(std::string ser) { std::string o = "0"; for (unsigned j = i; j < i + 32; j++) { int vj = (int)(unsigned char)ser[j]; - o = decimalAdd(decimalMul(o, "256"), unsignedToDecimal(vj)); + o = decimalAdd(decimalMul(o, "256"), intToDecimal(vj)); } out.push_back(o); } diff --git a/libserpent/rewriter.cpp b/libserpent/rewriter.cpp index 3d59cb3bd..8b50c9a28 100644 --- a/libserpent/rewriter.cpp +++ b/libserpent/rewriter.cpp @@ -344,7 +344,7 @@ Node subst(Node pattern, Node array_lit_transform(Node node) { std::vector o1; - o1.push_back(token(unsignedToDecimal(node.args.size() * 32), node.metadata)); + o1.push_back(token(intToDecimal(node.args.size() * 32), node.metadata)); std::vector o2; std::string symb = "_temp"+mkUniqueToken()+"_0"; o2.push_back(token(symb, node.metadata)); @@ -357,7 +357,7 @@ Node array_lit_transform(Node node) { o5.push_back(token(symb, node.metadata)); std::vector o6; o6.push_back(astnode("get", o5, node.metadata)); - o6.push_back(token(unsignedToDecimal(i * 32), node.metadata)); + o6.push_back(token(intToDecimal(i * 32), node.metadata)); std::vector o7; o7.push_back(astnode("add", o6)); o7.push_back(node.args[i]); @@ -474,10 +474,10 @@ Node validate(Node inp) { int i = 0; while(valid[i][0] != "---END---") { if (inp.val == valid[i][0]) { - if (decimalGt(valid[i][1], unsignedToDecimal(inp.args.size()))) { + if (decimalGt(valid[i][1], intToDecimal(inp.args.size()))) { err("Too few arguments for "+inp.val, inp.metadata); } - if (decimalGt(unsignedToDecimal(inp.args.size()), valid[i][2])) { + if (decimalGt(intToDecimal(inp.args.size()), valid[i][2])) { err("Too many arguments for "+inp.val, inp.metadata); } } diff --git a/libserpent/util.cpp b/libserpent/util.cpp index efef91425..6ca39de9d 100644 --- a/libserpent/util.cpp +++ b/libserpent/util.cpp @@ -60,8 +60,8 @@ std::string printAST(Node ast, bool printMetadata) { std::string o = "("; if (printMetadata) { o += ast.metadata.file + " "; - o += unsignedToDecimal(ast.metadata.ln) + " "; - o += unsignedToDecimal(ast.metadata.ch) + ": "; + o += intToDecimal(ast.metadata.ln) + " "; + o += intToDecimal(ast.metadata.ch) + ": "; } o += ast.val; std::vector subs; @@ -132,14 +132,14 @@ std::string strToNumeric(std::string inp) { else if ((inp[0] == '"' && inp[inp.length()-1] == '"') || (inp[0] == '\'' && inp[inp.length()-1] == '\'')) { for (unsigned i = 1; i < inp.length() - 1; i++) { - o = decimalAdd(decimalMul(o,"256"), unsignedToDecimal((unsigned char)inp[i])); + o = decimalAdd(decimalMul(o,"256"), intToDecimal(inp[i])); } } else if (inp.substr(0,2) == "0x") { for (unsigned i = 2; i < inp.length(); i++) { int dig = std::string("0123456789abcdef").find(inp[i]); if (dig < 0) return ""; - o = decimalAdd(decimalMul(o,"16"), unsignedToDecimal(dig)); + o = decimalAdd(decimalMul(o,"16"), intToDecimal(dig)); } } else { @@ -188,7 +188,7 @@ int counter = 0; //Makes a unique token std::string mkUniqueToken() { counter++; - return unsignedToDecimal(counter); + return intToDecimal(counter); } //Does a file exist? http://stackoverflow.com/questions/12774207 @@ -217,7 +217,7 @@ std::string get_file_contents(std::string filename) //Report error void err(std::string errtext, Metadata met) { std::string err = "Error (file \"" + met.file + "\", line " + - unsignedToDecimal(met.ln) + ", char " + unsignedToDecimal(met.ch) + + intToDecimal(met.ln) + ", char " + intToDecimal(met.ch) + "): " + errtext; std::cerr << err << "\n"; throw(err); diff --git a/sc/cmdline.cpp b/sc/cmdline.cpp index 4b2eee160..232cbfeec 100644 --- a/sc/cmdline.cpp +++ b/sc/cmdline.cpp @@ -96,7 +96,7 @@ int main(int argv, char** argc) { else if (command == "biject") { if (argv == 3) std::cerr << "Not enough arguments for biject\n"; - int pos = decimalToUnsigned(secondInput); + int pos = decimalToInt(secondInput); std::vector n = prettyCompile(input); if (pos >= (int)n.size()) std::cerr << "Code position too high\n"; From a761484c2c77bfd3d26e3355a88ac11238caae2c Mon Sep 17 00:00:00 2001 From: Giacomo Tazzari Date: Tue, 12 Aug 2014 12:53:50 +0200 Subject: [PATCH 8/8] Renamed the new option to enableOptimizer and created its appropriate setting --- alethzero/Main.ui | 6 +++--- alethzero/MainWin.cpp | 12 +++++++----- alethzero/MainWin.h | 4 ++-- 3 files changed, 12 insertions(+), 10 deletions(-) diff --git a/alethzero/Main.ui b/alethzero/Main.ui index 0a727e505..f5b52c309 100644 --- a/alethzero/Main.ui +++ b/alethzero/Main.ui @@ -185,7 +185,7 @@ - + @@ -1668,12 +1668,12 @@ font-size: 14pt &Refresh
- + true - &Optimize LLL Compiler + &Enable LLL &Optimizer diff --git a/alethzero/MainWin.cpp b/alethzero/MainWin.cpp index dd12236e4..a4fc22a43 100644 --- a/alethzero/MainWin.cpp +++ b/alethzero/MainWin.cpp @@ -332,9 +332,9 @@ void Main::on_forceMining_triggered() m_client->setForceMining(ui->forceMining->isChecked()); } -void Main::on_optimizeCompiler_triggered() +void Main::on_enableOptimizer_triggered() { - m_optimizeCompiler = ui->optimizeCompiler->isChecked(); + m_enableOptimizer = ui->enableOptimizer->isChecked(); on_data_textChanged(); } @@ -529,6 +529,7 @@ void Main::writeSettings() s.setValue("paranoia", ui->paranoia->isChecked()); s.setValue("showAll", ui->showAll->isChecked()); s.setValue("showAllAccounts", ui->showAllAccounts->isChecked()); + s.setValue("enableOptimizer", m_enableOptimizer); s.setValue("clientName", ui->clientName->text()); s.setValue("idealPeers", ui->idealPeers->value()); s.setValue("port", ui->port->value()); @@ -576,7 +577,8 @@ void Main::readSettings(bool _skipGeometry) ui->paranoia->setChecked(s.value("paranoia", false).toBool()); ui->showAll->setChecked(s.value("showAll", false).toBool()); ui->showAllAccounts->setChecked(s.value("showAllAccounts", false).toBool()); - ui->optimizeCompiler->setChecked(m_optimizeCompiler); + m_enableOptimizer = s.value("enableOptimizer", true).toBool(); + ui->enableOptimizer->setChecked(m_enableOptimizer); ui->clientName->setText(s.value("clientName", "").toString()); ui->idealPeers->setValue(s.value("idealPeers", ui->idealPeers->value()).toInt()); ui->port->setValue(s.value("port", ui->port->value()).toInt()); @@ -1309,7 +1311,7 @@ void Main::on_data_textChanged() } else { - m_data = eth::compileLLL(src, m_optimizeCompiler, &errors); + m_data = eth::compileLLL(src, m_enableOptimizer, &errors); if (errors.size()) { try @@ -1327,7 +1329,7 @@ void Main::on_data_textChanged() { auto asmcode = eth::compileLLLToAsm(src, false); lll = "

Pre

" + QString::fromStdString(asmcode).toHtmlEscaped() + "
"; - if (m_optimizeCompiler) + if (m_enableOptimizer) { asmcode = eth::compileLLLToAsm(src, true); lll = "

Opt

" + QString::fromStdString(asmcode).toHtmlEscaped() + "
" + lll; diff --git a/alethzero/MainWin.h b/alethzero/MainWin.h index fc12a567e..46cb1843a 100644 --- a/alethzero/MainWin.h +++ b/alethzero/MainWin.h @@ -138,7 +138,7 @@ private slots: void on_debugDumpState_triggered(int _add = 1); void on_debugDumpStatePre_triggered(); void on_refresh_triggered(); - void on_optimizeCompiler_triggered(); + void on_enableOptimizer_triggered(); signals: void poll(); @@ -222,7 +222,7 @@ private: QMap m_pcWarp; QList m_history; std::map m_codes; // and pcWarps - bool m_optimizeCompiler = true; + bool m_enableOptimizer = true; QNetworkAccessManager m_webCtrl;