Browse Source

LLL supports get/set/ref.

Logging changes.
cl-refactor
Gav Wood 11 years ago
parent
commit
de97897ab0
  1. 2
      alethzero/MainWin.cpp
  2. 2
      libethereum/PeerNetwork.h
  3. 5
      libethereum/PeerServer.cpp
  4. 2
      libethereum/PeerServer.h
  5. 12
      libethereum/PeerSession.cpp
  6. 81
      liblll/CodeFragment.cpp
  7. 4
      liblll/CompilerState.cpp
  8. 5
      liblll/CompilerState.h

2
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)

2
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 "<N<"; } static const int verbosity = 9; };

5
libethereum/PeerServer.cpp

@ -514,9 +514,10 @@ bool PeerServer::sync(BlockChain& _bc, TransactionQueue& _tq, OverlayDB& _o)
return ret;
}
std::vector<PeerInfo> PeerServer::peers() const
std::vector<PeerInfo> PeerServer::peers(bool _updatePing) const
{
const_cast<PeerServer*>(this)->pingAll();
if (_updatePing)
const_cast<PeerServer*>(this)->pingAll();
this_thread::sleep_for(chrono::milliseconds(200));
std::vector<PeerInfo> ret;
for (auto& i: m_peers)

2
libethereum/PeerServer.h

@ -71,7 +71,7 @@ public:
void setMode(NodeMode _m) { m_mode = _m; }
/// Get peer information.
std::vector<PeerInfo> peers() const;
std::vector<PeerInfo> 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(); }

12
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<chrono::milliseconds>(m_lastPing).count() << " ms";
clogS(NetTriviaSummary) << "Latency: " << chrono::duration_cast<chrono::milliseconds>(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<FixedHash<4>>().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;

81
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<BareSymbol>();
@ -137,6 +138,36 @@ void CodeFragment::constructOperation(sp::utree const& _t, CompilerState& _s)
default:;
}
auto firstAsString = [&]()
{
auto i = *++_t.begin();
if (i.tag())
error<InvalidName>();
if (i.which() == sp::utree_type::string_type)
{
auto sr = i.get<sp::basic_string<boost::iterator_range<char const*>, 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::basic_string<boost::iterator_range<char const*>, 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<IncorrectParameterCount>();
string n;
auto i = *++_t.begin();
if (i.tag())
error<InvalidName>();
if (i.which() == sp::utree_type::string_type)
{
auto sr = i.get<sp::basic_string<boost::iterator_range<char const*>, 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::basic_string<boost::iterator_range<char const*>, 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<IncorrectParameterCount>();
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<IncorrectParameterCount>();
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<InvalidOperation>();
}

4
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))

5
liblll/CompilerState.h

@ -36,10 +36,13 @@ struct Macro
struct CompilerState
{
CompilerState();
CodeFragment const& getDef(std::string const& _s);
void populateStandard();
std::map<std::string, unsigned> vars;
unsigned stackSize = 64;
std::map<std::string, std::pair<unsigned, unsigned>> vars; ///< maps name to stack offset & size.
std::map<std::string, CodeFragment> defs;
std::map<std::string, CodeFragment> args;
std::map<std::string, CodeFragment> outers;

Loading…
Cancel
Save