6 changed files with 187 additions and 96 deletions
@ -0,0 +1,66 @@ |
|||
/*
|
|||
This file is part of cpp-ethereum. |
|||
|
|||
cpp-ethereum is free software: you can redistribute it and/or modify |
|||
it under the terms of the GNU General Public License as published by |
|||
the Free Software Foundation, either version 3 of the License, or |
|||
(at your option) any later version. |
|||
|
|||
cpp-ethereum is distributed in the hope that it will be useful, |
|||
but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|||
GNU General Public License for more details. |
|||
|
|||
You should have received a copy of the GNU General Public License |
|||
along with cpp-ethereum. If not, see <http://www.gnu.org/licenses/>.
|
|||
*/ |
|||
/** @file CodeFragment.h
|
|||
* @author Gav Wood <i@gavwood.com> |
|||
* @date 2014 |
|||
*/ |
|||
|
|||
#pragma once |
|||
|
|||
#include <libethsupport/Common.h> |
|||
#include <libethcore/Instruction.h> |
|||
#include "Exceptions.h" |
|||
|
|||
namespace eth |
|||
{ |
|||
|
|||
enum AssemblyItemType { Operation, Push, PushString, PushTag, Tag, PushData }; |
|||
|
|||
class AssemblyItem |
|||
{ |
|||
public: |
|||
AssemblyItem(u256 _push): m_type(Push), m_data(_push) {} |
|||
AssemblyItem(std::string const& _push): m_type(PushString), m_pushString(_push) {} |
|||
AssemblyItem(AssemblyItemType _type, AssemblyItem const& _tag): m_type(_type), m_data(_tag.m_data) { assert(_type == PushTag); assert(_tag.m_type == Tag); } |
|||
AssemblyItem(Instruction _i): m_type(Operation), m_data((byte)_i) {} |
|||
AssemblyItem(AssemblyItemType _type, u256 _data): m_type(_type), m_data(_data) {} |
|||
|
|||
AssemblyItemType type() const { return m_type; } |
|||
u256 data() const { return m_data; } |
|||
std::string const& pushString() const { return m_pushString; } |
|||
|
|||
private: |
|||
AssemblyItemType m_type; |
|||
u256 m_data; |
|||
std::string m_pushString; |
|||
}; |
|||
|
|||
class Assembly |
|||
{ |
|||
public: |
|||
AssemblyItem newTag() { return AssemblyItem(Tag, m_usedTags++); } |
|||
AssemblyItem newData(bytes const& _data) { auto h = sha3(_data); m_data[h] = _data; return AssemblyItem(PushData, h); } |
|||
bytes assemble() const; |
|||
void append(Assembly const& _a); |
|||
|
|||
private: |
|||
u256 m_usedTags = 0; |
|||
std::vector<AssemblyItem> m_items; |
|||
std::map<h256, bytes> m_data; |
|||
}; |
|||
|
|||
} |
@ -0,0 +1,59 @@ |
|||
/*
|
|||
This file is part of cpp-ethereum. |
|||
|
|||
cpp-ethereum is free software: you can redistribute it and/or modify |
|||
it under the terms of the GNU General Public License as published by |
|||
the Free Software Foundation, either version 3 of the License, or |
|||
(at your option) any later version. |
|||
|
|||
cpp-ethereum is distributed in the hope that it will be useful, |
|||
but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|||
GNU General Public License for more details. |
|||
|
|||
You should have received a copy of the GNU General Public License |
|||
along with cpp-ethereum. If not, see <http://www.gnu.org/licenses/>.
|
|||
*/ |
|||
/** @file CodeLocation.cpp
|
|||
* @author Gav Wood <i@gavwood.com> |
|||
* @date 2014 |
|||
*/ |
|||
|
|||
#include "CodeLocation.h" |
|||
#include "CodeFragment.h" |
|||
using namespace std; |
|||
using namespace eth; |
|||
|
|||
CodeLocation::CodeLocation(CodeFragment* _f) |
|||
{ |
|||
m_f = _f; |
|||
m_pos = _f->m_code.size(); |
|||
} |
|||
|
|||
unsigned CodeLocation::get() const |
|||
{ |
|||
assert(m_f->m_code[m_pos - 1] == (byte)Instruction::PUSH4); |
|||
bytesConstRef r(&m_f->m_code[m_pos], 4); |
|||
return fromBigEndian<uint32_t>(r); |
|||
} |
|||
|
|||
void CodeLocation::set(unsigned _val) |
|||
{ |
|||
assert(m_f->m_code[m_pos - 1] == (byte)Instruction::PUSH4); |
|||
assert(!get()); |
|||
bytesRef r(&m_f->m_code[m_pos], 4); |
|||
toBigEndian(_val, r); |
|||
} |
|||
|
|||
void CodeLocation::anchor() |
|||
{ |
|||
set(m_f->m_code.size()); |
|||
} |
|||
|
|||
void CodeLocation::increase(unsigned _val) |
|||
{ |
|||
assert(m_f->m_code[m_pos - 1] == (byte)Instruction::PUSH4); |
|||
bytesRef r(&m_f->m_code[m_pos], 4); |
|||
toBigEndian(get() + _val, r); |
|||
} |
|||
|
@ -0,0 +1,54 @@ |
|||
/*
|
|||
This file is part of cpp-ethereum. |
|||
|
|||
cpp-ethereum is free software: you can redistribute it and/or modify |
|||
it under the terms of the GNU General Public License as published by |
|||
the Free Software Foundation, either version 3 of the License, or |
|||
(at your option) any later version. |
|||
|
|||
cpp-ethereum is distributed in the hope that it will be useful, |
|||
but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|||
GNU General Public License for more details. |
|||
|
|||
You should have received a copy of the GNU General Public License |
|||
along with cpp-ethereum. If not, see <http://www.gnu.org/licenses/>.
|
|||
*/ |
|||
/** @file CodeLocation.h
|
|||
* @author Gav Wood <i@gavwood.com> |
|||
* @date 2014 |
|||
*/ |
|||
|
|||
#pragma once |
|||
|
|||
#include <libethsupport/Common.h> |
|||
#include <libethcore/Instruction.h> |
|||
#include "Exceptions.h" |
|||
|
|||
namespace eth |
|||
{ |
|||
|
|||
class CodeFragment; |
|||
|
|||
class CodeLocation |
|||
{ |
|||
friend class CodeFragment; |
|||
|
|||
public: |
|||
CodeLocation(CodeFragment* _f); |
|||
CodeLocation(CodeFragment* _f, unsigned _p): m_f(_f), m_pos(_p) {} |
|||
|
|||
unsigned get() const; |
|||
void increase(unsigned _val); |
|||
void set(unsigned _val); |
|||
void set(CodeLocation _loc) { assert(_loc.m_f == m_f); set(_loc.m_pos); } |
|||
void anchor(); |
|||
|
|||
CodeLocation operator+(unsigned _i) const { return CodeLocation(m_f, m_pos + _i); } |
|||
|
|||
private: |
|||
CodeFragment* m_f; |
|||
unsigned m_pos; |
|||
}; |
|||
|
|||
} |
Loading…
Reference in new issue