Change encoding to address-funid and add "function" as ABI type.

This commit is contained in:
chriseth
2016-11-16 14:37:19 +01:00
parent a8e7ed37a1
commit ec31d08775
8 changed files with 33 additions and 21 deletions
+18 -13
View File
@@ -317,27 +317,32 @@ void CompilerUtils::memoryCopy()
void CompilerUtils::splitExternalFunctionType(bool _leftAligned)
{
// We have to split the left-aligned <function identifier><address> into two stack slots:
// We have to split the left-aligned <address><function identifier> into two stack slots:
// address (right aligned), function identifier (right aligned)
if (_leftAligned)
m_context << (u256(1) << 64) << Instruction::SWAP1 << Instruction::DIV;
m_context << Instruction::DUP1 << ((u256(1) << 160) - 1) << Instruction::AND << Instruction::SWAP1;
m_context << (u256(1) << 160) << Instruction::SWAP1 << Instruction::DIV;
if (!_leftAligned)
m_context << u256(0xffffffffUL) << Instruction::AND;
{
m_context << Instruction::DUP1 << (u256(1) << (64 + 32)) << Instruction::SWAP1 << Instruction::DIV;
// <input> <address>
m_context << Instruction::SWAP1 << (u256(1) << 64) << Instruction::SWAP1 << Instruction::DIV;
}
else
{
m_context << Instruction::DUP1 << (u256(1) << 32) << Instruction::SWAP1 << Instruction::DIV;
m_context << ((u256(1) << 160) - 1) << Instruction::AND << Instruction::SWAP1;
}
m_context << u256(0xffffffffUL) << Instruction::AND;
}
void CompilerUtils::combineExternalFunctionType(bool _leftAligned)
{
if (_leftAligned)
m_context << (u256(1) << 224);
else
m_context << u256(0xffffffffUL) << Instruction::AND << (u256(1) << 160);
m_context << Instruction::MUL << Instruction::SWAP1;
m_context << ((u256(1) << 160) - 1) << Instruction::AND;
// <address> <function_id>
m_context << u256(0xffffffffUL) << Instruction::AND << Instruction::SWAP1;
if (!_leftAligned)
m_context << ((u256(1) << 160) - 1) << Instruction::AND;
m_context << (u256(1) << 32) << Instruction::MUL;
m_context << Instruction::OR;
if (_leftAligned)
m_context << (u256(1) << 64) << Instruction::MUL;
m_context << Instruction::OR;
}
void CompilerUtils::pushCombinedFunctionEntryLabel(Declaration const& _function)
+1 -1
View File
@@ -115,7 +115,7 @@ public:
void memoryCopy();
/// Converts the combined and left-aligned (right-aligned if @a _rightAligned is true)
/// external function type <function identifier><address> into two stack slots:
/// external function type <address><function identifier> into two stack slots:
/// address (right aligned), function identifier (right aligned)
void splitExternalFunctionType(bool _rightAligned);
/// Performs the opposite operation of splitExternalFunctionType(_rightAligned)