Implement missing assembly output functions and do not use PushString for assembly.

This commit is contained in:
chriseth 2017-04-11 19:53:55 +02:00
parent bd48f181b5
commit 4d715e9055
4 changed files with 16 additions and 7 deletions

View File

@ -5,6 +5,7 @@ Features:
Bugfixes: Bugfixes:
* Type system: Contract inheriting from base with unimplemented constructor should be abstract. * Type system: Contract inheriting from base with unimplemented constructor should be abstract.
* Assembly output: Implement missing AssemblyItem types.
### 0.4.10 (2017-03-15) ### 0.4.10 (2017-03-15)

View File

@ -205,7 +205,8 @@ ostream& Assembly::streamAsm(ostream& _out, string const& _prefix, StringMap con
{ {
_out << _prefix << "stop" << endl; _out << _prefix << "stop" << endl;
for (auto const& i: m_data) for (auto const& i: m_data)
assertThrow(u256(i.first) < m_subs.size(), AssemblyException, "Data not yet implemented."); if (u256(i.first) >= m_subs.size())
_out << _prefix << "data_" << toHex(u256(i.first)) << " " << toHex(i.second) << endl;
for (size_t i = 0; i < m_subs.size(); ++i) for (size_t i = 0; i < m_subs.size(); ++i)
{ {

View File

@ -159,18 +159,25 @@ string AssemblyItem::toAssemblyText() const
text = toHex(toCompactBigEndian(data(), 1), 1, HexPrefix::Add); text = toHex(toCompactBigEndian(data(), 1), 1, HexPrefix::Add);
break; break;
case PushString: case PushString:
assertThrow(false, AssemblyException, "Push string assembly output not implemented."); text = string("data_") + toHex(data());
break; break;
case PushTag: case PushTag:
assertThrow(data() < 0x10000, AssemblyException, "Sub-assembly tags not yet implemented."); {
text = string("tag_") + to_string(size_t(data())); size_t sub;
size_t tag;
tie(sub, tag) = splitForeignPushTag();
if (sub == size_t(-1))
text = string("tag_") + to_string(tag);
else
text = string("tag_") + to_string(sub) + "_" + to_string(tag);
break; break;
}
case Tag: case Tag:
assertThrow(data() < 0x10000, AssemblyException, "Sub-assembly tags not yet implemented."); assertThrow(data() < 0x10000, AssemblyException, "Declaration of sub-assembly tag.");
text = string("tag_") + to_string(size_t(data())) + ":"; text = string("tag_") + to_string(size_t(data())) + ":";
break; break;
case PushData: case PushData:
assertThrow(false, AssemblyException, "Push data not implemented."); text = string("data_") + toHex(data());
break; break;
case PushSub: case PushSub:
text = string("dataOffset(sub_") + to_string(size_t(data())) + ")"; text = string("dataOffset(sub_") + to_string(size_t(data())) + ")";

View File

@ -130,7 +130,7 @@ public:
else else
{ {
solAssert(_literal.value.size() <= 32, ""); solAssert(_literal.value.size() <= 32, "");
m_state.assembly.append(_literal.value); m_state.assembly.append(u256(h256(_literal.value, h256::FromBinary, h256::AlignLeft)));
} }
} }
void operator()(assembly::Identifier const& _identifier) void operator()(assembly::Identifier const& _identifier)