aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--libevmasm/ExpressionClasses.cpp32
-rw-r--r--libevmasm/ExpressionClasses.h6
2 files changed, 22 insertions, 16 deletions
diff --git a/libevmasm/ExpressionClasses.cpp b/libevmasm/ExpressionClasses.cpp
index b903ae04..fccac1b0 100644
--- a/libevmasm/ExpressionClasses.cpp
+++ b/libevmasm/ExpressionClasses.cpp
@@ -185,7 +185,7 @@ class Rules: public boost::noncopyable
public:
Rules();
void resetMatchGroups() { m_matchGroups.clear(); }
- vector<pair<Pattern, function<Pattern()>>> rules() const { return m_rules; }
+ vector<pair<Pattern, function<Pattern()>>> const& rules() const { return m_rules; }
private:
using Expression = ExpressionClasses::Expression;
@@ -417,8 +417,7 @@ ExpressionClasses::Id ExpressionClasses::rebuildExpression(ExpressionTemplate co
Pattern::Pattern(Instruction _instruction, std::vector<Pattern> const& _arguments):
m_type(Operation),
- m_requireDataMatch(true),
- m_data(_instruction),
+ m_instruction(_instruction),
m_arguments(_arguments)
{
}
@@ -449,7 +448,10 @@ bool Pattern::matches(Expression const& _expr, ExpressionClasses const& _classes
AssemblyItem Pattern::toAssemblyItem(SourceLocation const& _location) const
{
- return AssemblyItem(m_type, m_data, _location);
+ if (m_type == Operation)
+ return AssemblyItem(m_instruction, _location);
+ else
+ return AssemblyItem(m_type, data(), _location);
}
string Pattern::toString() const
@@ -458,16 +460,16 @@ string Pattern::toString() const
switch (m_type)
{
case Operation:
- s << instructionInfo(Instruction(unsigned(m_data))).name;
+ s << instructionInfo(m_instruction).name;
break;
case Push:
- s << "PUSH " << hex << m_data;
+ s << "PUSH " << hex << data();
break;
case UndefinedItem:
s << "ANY";
break;
default:
- s << "t=" << dec << m_type << " d=" << hex << m_data;
+ s << "t=" << dec << m_type << " d=" << hex << data();
break;
}
if (!m_requireDataMatch)
@@ -489,13 +491,10 @@ bool Pattern::matchesBaseItem(AssemblyItem const* _item) const
return false;
if (m_type != _item->type())
return false;
- if (m_requireDataMatch)
- {
- if (m_type == Operation)
- return m_data == u256(byte(_item->instruction()));
- else
- return m_data == _item->data();
- }
+ else if (m_type == Operation)
+ return m_instruction == _item->instruction();
+ else if (m_requireDataMatch)
+ return data() == _item->data();
return true;
}
@@ -507,6 +506,11 @@ Pattern::Expression const& Pattern::matchGroupValue() const
return *(*m_matchGroups)[m_matchGroup];
}
+u256 const& Pattern::data() const
+{
+ assertThrow(m_data, OptimizerException, "");
+ return *m_data;
+}
ExpressionTemplate::ExpressionTemplate(Pattern const& _pattern, SourceLocation const& _location)
{
diff --git a/libevmasm/ExpressionClasses.h b/libevmasm/ExpressionClasses.h
index 11a698dd..c91b227f 100644
--- a/libevmasm/ExpressionClasses.h
+++ b/libevmasm/ExpressionClasses.h
@@ -135,7 +135,7 @@ public:
// Matches a specific constant value.
Pattern(unsigned _value): Pattern(u256(_value)) {}
// Matches a specific constant value.
- Pattern(u256 const& _value): m_type(Push), m_requireDataMatch(true), m_data(_value) {}
+ Pattern(u256 const& _value): m_type(Push), m_requireDataMatch(true), m_data(std::make_shared<u256>(_value)) {}
// Matches a specific assembly item type or anything if not given.
Pattern(AssemblyItemType _type = UndefinedItem): m_type(_type) {}
// Matches a given instruction with given arguments
@@ -160,10 +160,12 @@ public:
private:
bool matchesBaseItem(AssemblyItem const* _item) const;
Expression const& matchGroupValue() const;
+ u256 const& data() const;
AssemblyItemType m_type;
bool m_requireDataMatch = false;
- u256 m_data = 0;
+ Instruction m_instruction; ///< Only valid if m_type is Operation
+ std::shared_ptr<u256> m_data; ///< Only valid if m_type is not Operation
std::vector<Pattern> m_arguments;
unsigned m_matchGroup = 0;
std::map<unsigned, Expression const*>* m_matchGroups = nullptr;