From de97897ab02c4fdb3744c6f53d3b025fc943dc9d Mon Sep 17 00:00:00 2001 From: Gav Wood Date: Wed, 11 Jun 2014 19:25:21 +0100 Subject: [PATCH] LLL supports get/set/ref. Logging changes. --- alethzero/MainWin.cpp | 2 +- libethereum/PeerNetwork.h | 2 + libethereum/PeerServer.cpp | 5 ++- libethereum/PeerServer.h | 2 +- libethereum/PeerSession.cpp | 12 +++--- liblll/CodeFragment.cpp | 81 +++++++++++++++++++++++++------------ liblll/CompilerState.cpp | 4 ++ liblll/CompilerState.h | 5 ++- 8 files changed, 76 insertions(+), 37 deletions(-) diff --git a/alethzero/MainWin.cpp b/alethzero/MainWin.cpp index 57dc090b3..28f0bba41 100644 --- a/alethzero/MainWin.cpp +++ b/alethzero/MainWin.cpp @@ -188,7 +188,7 @@ Main::Main(QWidget *parent) : if (pocnumber == 4) m_servers.push_back("54.72.31.55:30303"); else if (pocnumber == 5) - m_servers.push_back("54.201.28.117:30303"); + m_servers.push_back("54.72.69.180:30303"); else { connect(&m_webCtrl, &QNetworkAccessManager::finished, [&](QNetworkReply* _r) diff --git a/libethereum/PeerNetwork.h b/libethereum/PeerNetwork.h index 8aeff9980..8e05696d3 100644 --- a/libethereum/PeerNetwork.h +++ b/libethereum/PeerNetwork.h @@ -47,6 +47,8 @@ struct NetWarn: public LogChannel { static const char* name() { return "!N!"; } struct NetNote: public LogChannel { static const char* name() { return "*N*"; } static const int verbosity = 1; }; struct NetMessageSummary: public LogChannel { static const char* name() { return "-N-"; } static const int verbosity = 2; }; struct NetMessageDetail: public LogChannel { static const char* name() { return "=N="; } static const int verbosity = 3; }; +struct NetTriviaSummary: public LogChannel { static const char* name() { return "-N-"; } static const int verbosity = 4; }; +struct NetTriviaDetail: public LogChannel { static const char* name() { return "=N="; } static const int verbosity = 5; }; struct NetAllDetail: public LogChannel { static const char* name() { return "=N="; } static const int verbosity = 6; }; struct NetRight: public LogChannel { static const char* name() { return ">N>"; } static const int verbosity = 8; }; struct NetLeft: public LogChannel { static const char* name() { return " PeerServer::peers() const +std::vector PeerServer::peers(bool _updatePing) const { - const_cast(this)->pingAll(); + if (_updatePing) + const_cast(this)->pingAll(); this_thread::sleep_for(chrono::milliseconds(200)); std::vector ret; for (auto& i: m_peers) diff --git a/libethereum/PeerServer.h b/libethereum/PeerServer.h index 47030641b..6faa4cad8 100644 --- a/libethereum/PeerServer.h +++ b/libethereum/PeerServer.h @@ -71,7 +71,7 @@ public: void setMode(NodeMode _m) { m_mode = _m; } /// Get peer information. - std::vector peers() const; + std::vector peers(bool _updatePing = false) const; /// Get number of peers connected; equivalent to, but faster than, peers().size(). size_t peerCount() const { return m_peers.size(); } diff --git a/libethereum/PeerSession.cpp b/libethereum/PeerSession.cpp index 71b4b1191..956e49432 100644 --- a/libethereum/PeerSession.cpp +++ b/libethereum/PeerSession.cpp @@ -145,32 +145,32 @@ bool PeerSession::interpret(RLP const& _r) } case PingPacket: { -// clogS(NetMessageSummary) << "Ping"; + clogS(NetTriviaSummary) << "Ping"; RLPStream s; sealAndSend(prep(s).appendList(1) << PongPacket); break; } case PongPacket: m_info.lastPing = std::chrono::steady_clock::now() - m_ping; -// clogS(NetMessageSummary) << "Latency: " << chrono::duration_cast(m_lastPing).count() << " ms"; + clogS(NetTriviaSummary) << "Latency: " << chrono::duration_cast(m_info.lastPing).count() << " ms"; break; case GetPeersPacket: { - clogS(NetMessageSummary) << "GetPeers"; + clogS(NetTriviaSummary) << "GetPeers"; auto peers = m_server->potentialPeers(); RLPStream s; prep(s).appendList(peers.size() + 1); s << PeersPacket; for (auto i: peers) { - clogS(NetMessageDetail) << "Sending peer " << toHex(i.first.ref().cropped(0, 4)) << i.second; + clogS(NetTriviaDetail) << "Sending peer " << toHex(i.first.ref().cropped(0, 4)) << i.second; s.appendList(3) << bytesConstRef(i.second.address().to_v4().to_bytes().data(), 4) << i.second.port() << i.first; } sealAndSend(s); break; } case PeersPacket: - clogS(NetMessageSummary) << "Peers (" << dec << (_r.itemCount() - 1) << " entries)"; + clogS(NetTriviaSummary) << "Peers (" << dec << (_r.itemCount() - 1) << " entries)"; for (unsigned i = 1; i < _r.itemCount(); ++i) { bi::address_v4 peerAddress(_r[i][0].toHash>().asArray()); @@ -203,7 +203,7 @@ bool PeerSession::interpret(RLP const& _r) goto CONTINUE; m_server->m_incomingPeers[id] = make_pair(ep, 0); m_server->m_freePeers.push_back(id); - clogS(NetMessageDetail) << "New peer: " << ep << "(" << id << ")"; + clogS(NetTriviaDetail) << "New peer: " << ep << "(" << id << ")"; CONTINUE:; } break; diff --git a/liblll/CodeFragment.cpp b/liblll/CodeFragment.cpp index 448d3ef2f..804504f07 100644 --- a/liblll/CodeFragment.cpp +++ b/liblll/CodeFragment.cpp @@ -79,9 +79,10 @@ CodeFragment::CodeFragment(sp::utree const& _t, CompilerState& _s, bool _allowAS if (it == _s.vars.end()) { bool ok; - tie(it, ok) = _s.vars.insert(make_pair(s, _s.vars.size() * 32)); + tie(it, ok) = _s.vars.insert(make_pair(s, make_pair(_s.stackSize, 32))); + _s.stackSize += 32; } - m_asm.append((u256)it->second); + m_asm.append((u256)it->second.first); } else error(); @@ -137,6 +138,36 @@ void CodeFragment::constructOperation(sp::utree const& _t, CompilerState& _s) default:; } + auto firstAsString = [&]() + { + auto i = *++_t.begin(); + if (i.tag()) + error(); + if (i.which() == sp::utree_type::string_type) + { + auto sr = i.get, sp::utree_type::string_type>>(); + return string(sr.begin(), sr.end()); + } + else if (i.which() == sp::utree_type::symbol_type) + { + auto sr = i.get, sp::utree_type::symbol_type>>(); + return _s.getDef(string(sr.begin(), sr.end())).m_asm.backString(); + } + return string(); + }; + + auto varAddress = [&](string const& n) + { + auto it = _s.vars.find(n); + if (it == _s.vars.end()) + { + bool ok; + tie(it, ok) = _s.vars.insert(make_pair(n, make_pair(_s.stackSize, 32))); + _s.stackSize += 32; + } + return it->second.first; + }; + // Operations who args are not standard stack-pushers. bool nonStandard = true; if (us == "ASM") @@ -150,22 +181,28 @@ void CodeFragment::constructOperation(sp::utree const& _t, CompilerState& _s) { if (_t.size() != 2) error(); - string n; - auto i = *++_t.begin(); - if (i.tag()) - error(); - if (i.which() == sp::utree_type::string_type) - { - auto sr = i.get, sp::utree_type::string_type>>(); - n = string(sr.begin(), sr.end()); - } - else if (i.which() == sp::utree_type::symbol_type) - { - auto sr = i.get, sp::utree_type::symbol_type>>(); - n = _s.getDef(string(sr.begin(), sr.end())).m_asm.backString(); - } - m_asm.append(CodeFragment::compile(asString(contents(n)), _s).m_asm); + m_asm.append(CodeFragment::compile(asString(contents(firstAsString())), _s).m_asm); + } + else if (us == "SET") + { + if (_t.size() != 3) + error(); + int c = 0; + for (auto const& i: _t) + if (c++ == 2) + m_asm.append(CodeFragment(i, _s, false).m_asm); + m_asm.append((u256)varAddress(firstAsString())); + m_asm.append(Instruction::MSTORE); } + else if (us == "GET") + { + if (_t.size() != 2) + error(); + m_asm.append((u256)varAddress(firstAsString())); + m_asm.append(Instruction::MLOAD); + } + else if (us == "REF") + m_asm.append((u256)varAddress(firstAsString())); else if (us == "DEF") { string n; @@ -497,15 +534,7 @@ void CodeFragment::constructOperation(sp::utree const& _t, CompilerState& _s) m_asm.popTo(1); } else if (us.find_first_of("1234567890") != 0 && us.find_first_not_of("QWERTYUIOPASDFGHJKLZXCVBNM1234567890_") == string::npos) - { - auto it = _s.vars.find(s); - if (it == _s.vars.end()) - { - bool ok; - tie(it, ok) = _s.vars.insert(make_pair(s, _s.vars.size() * 32)); - } - m_asm.append((u256)it->second); - } + m_asm.append((u256)varAddress(s)); else error(); } diff --git a/liblll/CompilerState.cpp b/liblll/CompilerState.cpp index 74e5062f7..490e92672 100644 --- a/liblll/CompilerState.cpp +++ b/liblll/CompilerState.cpp @@ -25,6 +25,10 @@ using namespace std; using namespace eth; +CompilerState::CompilerState() +{ +} + CodeFragment const& CompilerState::getDef(std::string const& _s) { if (defs.count(_s)) diff --git a/liblll/CompilerState.h b/liblll/CompilerState.h index b7581e0bc..f8f7ce815 100644 --- a/liblll/CompilerState.h +++ b/liblll/CompilerState.h @@ -36,10 +36,13 @@ struct Macro struct CompilerState { + CompilerState(); + CodeFragment const& getDef(std::string const& _s); void populateStandard(); - std::map vars; + unsigned stackSize = 64; + std::map> vars; ///< maps name to stack offset & size. std::map defs; std::map args; std::map outers;