mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
Remove some errors checks from code generation (was moved to analysis already).
This commit is contained in:
parent
580921b329
commit
4755757c00
@ -50,11 +50,6 @@ struct GeneratorState
|
|||||||
GeneratorState(ErrorList& _errors, eth::Assembly& _assembly):
|
GeneratorState(ErrorList& _errors, eth::Assembly& _assembly):
|
||||||
errors(_errors), assembly(_assembly) {}
|
errors(_errors), assembly(_assembly) {}
|
||||||
|
|
||||||
void addError(Error::Type _type, std::string const& _description, SourceLocation const& _location = SourceLocation())
|
|
||||||
{
|
|
||||||
errors.push_back(make_shared<Error>(_type, _description, _location));
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t newLabelId()
|
size_t newLabelId()
|
||||||
{
|
{
|
||||||
return assemblyTagToIdentifier(assembly.newTag());
|
return assemblyTagToIdentifier(assembly.newTag());
|
||||||
@ -99,23 +94,7 @@ public:
|
|||||||
|
|
||||||
int deposit = m_state.assembly.deposit() - m_initialDeposit;
|
int deposit = m_state.assembly.deposit() - m_initialDeposit;
|
||||||
|
|
||||||
// issue warnings for stack height discrepancies
|
solAssert(deposit == 0, "Invalid stack height at end of block.");
|
||||||
if (deposit < 0)
|
|
||||||
{
|
|
||||||
m_state.addError(
|
|
||||||
Error::Type::Warning,
|
|
||||||
"Inline assembly block is not balanced. It takes " + toString(-deposit) + " item(s) from the stack.",
|
|
||||||
_block.location
|
|
||||||
);
|
|
||||||
}
|
|
||||||
else if (deposit > 0)
|
|
||||||
{
|
|
||||||
m_state.addError(
|
|
||||||
Error::Type::Warning,
|
|
||||||
"Inline assembly block is not balanced. It leaves " + toString(deposit) + " item(s) on the stack.",
|
|
||||||
_block.location
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void operator()(assembly::Instruction const& _instruction)
|
void operator()(assembly::Instruction const& _instruction)
|
||||||
@ -161,23 +140,10 @@ public:
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
solAssert(
|
solAssert(
|
||||||
m_identifierAccess.resolve && m_identifierAccess.generateCode,
|
m_identifierAccess.generateCode,
|
||||||
"Identifier not found and no external access available."
|
"Identifier not found and no external access available."
|
||||||
);
|
);
|
||||||
// @TODO refactor: Store resolved identifier.
|
m_identifierAccess.generateCode(_identifier, IdentifierContext::RValue, m_state.assembly);
|
||||||
size_t size = m_identifierAccess.resolve(_identifier, IdentifierContext::RValue);
|
|
||||||
if (size != size_t(-1))
|
|
||||||
m_identifierAccess.generateCode(_identifier, IdentifierContext::RValue, m_state.assembly);
|
|
||||||
else
|
|
||||||
{
|
|
||||||
m_state.addError(
|
|
||||||
Error::Type::DeclarationError,
|
|
||||||
"Identifier not found or not unique",
|
|
||||||
_identifier.location
|
|
||||||
);
|
|
||||||
for (size_t i = 0; i < size; ++i)
|
|
||||||
m_state.assembly.append(u256(0));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
void operator()(FunctionalInstruction const& _instr)
|
void operator()(FunctionalInstruction const& _instr)
|
||||||
{
|
{
|
||||||
@ -242,21 +208,14 @@ private:
|
|||||||
if (int heightDiff = variableHeightDiff(_var, _location, true))
|
if (int heightDiff = variableHeightDiff(_var, _location, true))
|
||||||
m_state.assembly.append(solidity::swapInstruction(heightDiff - 1));
|
m_state.assembly.append(solidity::swapInstruction(heightDiff - 1));
|
||||||
m_state.assembly.append(solidity::Instruction::POP);
|
m_state.assembly.append(solidity::Instruction::POP);
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
solAssert(
|
|
||||||
m_identifierAccess.resolve && m_identifierAccess.generateCode,
|
|
||||||
"Identifier not found and no external access available."
|
|
||||||
);
|
|
||||||
size_t size = m_identifierAccess.resolve(_variableName, IdentifierContext::LValue);
|
|
||||||
if (size != size_t(-1))
|
|
||||||
m_identifierAccess.generateCode(_variableName, IdentifierContext::LValue, m_state.assembly);
|
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
m_state.addError(
|
solAssert(
|
||||||
Error::Type::DeclarationError,
|
m_identifierAccess.generateCode,
|
||||||
"Identifier \"" + string(_variableName.name) + "\" not found, not unique or not lvalue."
|
"Identifier not found and no external access available."
|
||||||
);
|
);
|
||||||
|
m_identifierAccess.generateCode(_variableName, IdentifierContext::LValue, m_state.assembly);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -268,11 +227,12 @@ private:
|
|||||||
int heightDiff = m_state.assembly.deposit() - _var.stackHeight;
|
int heightDiff = m_state.assembly.deposit() - _var.stackHeight;
|
||||||
if (heightDiff <= (_forSwap ? 1 : 0) || heightDiff > (_forSwap ? 17 : 16))
|
if (heightDiff <= (_forSwap ? 1 : 0) || heightDiff > (_forSwap ? 17 : 16))
|
||||||
{
|
{
|
||||||
m_state.addError(
|
//@TODO move this to analysis phase.
|
||||||
|
m_state.errors.push_back(make_shared<Error>(
|
||||||
Error::Type::TypeError,
|
Error::Type::TypeError,
|
||||||
"Variable inaccessible, too deep inside stack (" + boost::lexical_cast<string>(heightDiff) + ")",
|
"Variable inaccessible, too deep inside stack (" + boost::lexical_cast<string>(heightDiff) + ")",
|
||||||
_location
|
_location
|
||||||
);
|
));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
Loading…
Reference in New Issue
Block a user