Browse Source

Detect unavailable items and do not optimise the chunk in that case.

cl-refactor
chriseth 9 years ago
parent
commit
2d8e135df9
  1. 5
      libevmasm/Assembly.cpp
  2. 11
      libevmasm/CommonSubexpressionEliminator.cpp
  3. 1
      libevmasm/Exceptions.h

5
libevmasm/Assembly.cpp

@ -337,6 +337,11 @@ Assembly& Assembly::optimise(bool _enable, bool _isCreation, size_t _runs)
// This might happen if the opcode reconstruction is not as efficient
// as the hand-crafted code.
}
catch (ItemNotAvailableException const&)
{
// This might happen if e.g. associativity and commutativity rules
// reorganise the expression tree, but not all leaves are available.
}
if (shouldReplace)
{

11
libevmasm/CommonSubexpressionEliminator.cpp

@ -220,6 +220,12 @@ void CSECodeGenerator::addDependencies(Id _c)
if (m_neededBy.count(_c))
return; // we already computed the dependencies for _c
ExpressionClasses::Expression expr = m_expressionClasses.representative(_c);
if (expr.item->type() == UndefinedItem)
BOOST_THROW_EXCEPTION(
// If this exception happens, we need to find a different way to generate the
// compound expression.
ItemNotAvailableException() << errinfo_comment("Undefined item requested but not available.")
);
for (Id argument: expr.arguments)
{
addDependencies(argument);
@ -317,6 +323,11 @@ void CSECodeGenerator::generateClassElement(Id _c, bool _allowSequenced)
"Sequence constrained operation requested out of sequence."
);
assertThrow(expr.item, OptimizerException, "Non-generated expression without item.");
assertThrow(
expr.item->type() != UndefinedItem,
OptimizerException,
"Undefined item requested but not available."
);
vector<Id> const& arguments = expr.arguments;
for (Id arg: boost::adaptors::reverse(arguments))
generateClassElement(arg);

1
libevmasm/Exceptions.h

@ -31,6 +31,7 @@ namespace eth
struct AssemblyException: virtual Exception {};
struct OptimizerException: virtual AssemblyException {};
struct StackTooDeepException: virtual OptimizerException {};
struct ItemNotAvailableException: virtual OptimizerException {};
}
}

Loading…
Cancel
Save