aboutsummaryrefslogtreecommitdiffstats
path: root/Assembly.h
diff options
context:
space:
mode:
authorGav Wood <i@gavwood.com>2014-07-27 19:09:36 +0800
committerGav Wood <i@gavwood.com>2014-07-27 19:09:36 +0800
commited0209fefc50ab59b43b7f781410699c49445aab (patch)
treef82f1e4fee307efb67a16d9fb82e37c78e16b5b1 /Assembly.h
parent510abc0997c248a1a767ceade6749f426ae3a968 (diff)
downloaddexon-solidity-ed0209fefc50ab59b43b7f781410699c49445aab.tar.gz
dexon-solidity-ed0209fefc50ab59b43b7f781410699c49445aab.tar.zst
dexon-solidity-ed0209fefc50ab59b43b7f781410699c49445aab.zip
Updates to assembler - see the sub-codes.
Diffstat (limited to 'Assembly.h')
-rw-r--r--Assembly.h12
1 files changed, 8 insertions, 4 deletions
diff --git a/Assembly.h b/Assembly.h
index 4a6d02ce..581e1643 100644
--- a/Assembly.h
+++ b/Assembly.h
@@ -30,7 +30,7 @@
namespace eth
{
-enum AssemblyItemType { UndefinedItem, Operation, Push, PushString, PushTag, Tag, PushData };
+enum AssemblyItemType { UndefinedItem, Operation, Push, PushString, PushTag, PushSub, PushSubSize, Tag, PushData };
class Assembly;
@@ -70,7 +70,9 @@ public:
AssemblyItem newTag() { return AssemblyItem(Tag, m_usedTags++); }
AssemblyItem newPushTag() { return AssemblyItem(PushTag, m_usedTags++); }
AssemblyItem newData(bytes const& _data) { h256 h = (u256)std::hash<std::string>()(asString(_data)); m_data[h] = _data; return AssemblyItem(PushData, h); }
+ AssemblyItem newSub(Assembly const& _sub) { h256 h = h256::random(s_fixedHashEngine); m_subs[h] = _sub; return AssemblyItem(PushSub, h); }
AssemblyItem newPushString(std::string const& _data) { h256 h = (u256)std::hash<std::string>()(_data); m_strings[h] = _data; return AssemblyItem(PushString, h); }
+ AssemblyItem newPushSubSize(h256 const& _subId) { return AssemblyItem(PushSubSize, _subId); }
AssemblyItem append() { return append(newTag()); }
void append(Assembly const& _a);
@@ -78,6 +80,7 @@ public:
AssemblyItem const& append(AssemblyItem const& _i);
AssemblyItem const& append(std::string const& _data) { return append(newPushString(_data)); }
AssemblyItem const& append(bytes const& _data) { return append(newData(_data)); }
+ AssemblyItem appendSubSize(Assembly const& _asm) { auto ret = newSub(_asm); append(newPushSubSize(ret.data())); return ret; }
AssemblyItem appendJump() { auto ret = append(newPushTag()); append(Instruction::JUMP); return ret; }
AssemblyItem appendJumpI() { auto ret = append(newPushTag()); append(Instruction::JUMPI); return ret; }
@@ -102,8 +105,8 @@ public:
std::string out() const { std::stringstream ret; streamOut(ret); return ret.str(); }
int deposit() const { return m_deposit; }
bytes assemble() const;
- void optimise();
- std::ostream& streamOut(std::ostream& _out) const;
+ Assembly& optimise(bool _enable);
+ std::ostream& streamOut(std::ostream& _out, std::string const& _prefix = "") const;
private:
void donePath() { if (m_totalDeposit != INT_MAX && m_totalDeposit != m_deposit) throw InvalidDeposit(); }
@@ -111,7 +114,8 @@ private:
unsigned m_usedTags = 0;
AssemblyItems m_items;
- std::map<h256, bytes> m_data;
+ mutable std::map<h256, bytes> m_data;
+ std::map<h256, Assembly> m_subs;
std::map<h256, std::string> m_strings;
int m_deposit = 0;