Browse Source

work in progress in testing the new function selector in the end to end tests

cl-refactor
Lefteris Karapetsas 10 years ago
parent
commit
69a0dcfa15
  1. 6
      libsolidity/Compiler.cpp
  2. 29
      test/solidityExecutionFramework.h

6
libsolidity/Compiler.cpp

@ -124,12 +124,12 @@ void Compiler::appendFunctionSelector(ContractDefinition const& _contract)
if (interfaceFunctions.size() > 4294967295) // 2 ** 32 if (interfaceFunctions.size() > 4294967295) // 2 ** 32
BOOST_THROW_EXCEPTION(CompilerError() << errinfo_comment("More than 4294967295 public functions for contract.")); BOOST_THROW_EXCEPTION(CompilerError() << errinfo_comment("More than 4294967295 public functions for contract."));
// retrieve the first function signature hash from the calldata // retrieve the function signature hash from the calldata
m_context << u256(1) << u256(0) << u256(2.6959947e+67) // some constants m_context << u256(1) << u256(0) << u256(4294967296) * u256(4294967296) * u256(4294967296) * u256(4294967296) * u256(4294967296) * u256(4294967296) * u256(4294967296)// some constants
<< eth::dupInstruction(2) << eth::Instruction::CALLDATALOAD << eth::dupInstruction(2) << eth::Instruction::CALLDATALOAD
<< eth::Instruction::DIV; << eth::Instruction::DIV;
// stack now is: 1 0 2.6959947e+67 <funhash> // stack now is: 1 0 <funhash>
for (auto it = interfaceFunctions.begin(); it != interfaceFunctions.end(); ++it) for (auto it = interfaceFunctions.begin(); it != interfaceFunctions.end(); ++it)
{ {
callDataUnpackerEntryPoints.push_back(m_context.newTag()); callDataUnpackerEntryPoints.push_back(m_context.newTag());

29
test/solidityExecutionFramework.h

@ -29,6 +29,7 @@
#include <libethereum/State.h> #include <libethereum/State.h>
#include <libethereum/Executive.h> #include <libethereum/Executive.h>
#include <libsolidity/CompilerStack.h> #include <libsolidity/CompilerStack.h>
#include <libsolidity/AST.h>
namespace dev namespace dev
{ {
@ -48,17 +49,32 @@ public:
bytes const& compileAndRun(std::string const& _sourceCode, u256 const& _value = 0, std::string const& _contractName = "") bytes const& compileAndRun(std::string const& _sourceCode, u256 const& _value = 0, std::string const& _contractName = "")
{ {
dev::solidity::CompilerStack compiler; /* dev::solidity::CompilerStack compiler; */
compiler.compile(_sourceCode, m_optimize); m_compiler.compile(_sourceCode, m_optimize);
bytes code = compiler.getBytecode(_contractName); bytes code = m_compiler.getBytecode(_contractName);
/* m_contractDefinition = compiler.getContractDefinition(_contractName); */
sendMessage(code, true, _value); sendMessage(code, true, _value);
BOOST_REQUIRE(!m_output.empty()); BOOST_REQUIRE(!m_output.empty());
return m_output; return m_output;
} }
bytes const& callContractFunction(byte _index, bytes const& _data = bytes(), u256 const& _value = 0) bytes const& callContractFunction(byte _index, bytes const& _data = bytes(),
u256 const& _value = 0)
{ {
sendMessage(bytes(1, _index) + _data, false, _value); /* if (!_contractDef) */
/* _contractDef = m_contractDefinition; */
unsigned index = 0;
auto interfaceFunctions = m_compiler.getContractDefinition("").getInterfaceFunctions();
for (auto it = interfaceFunctions.cbegin(); it != interfaceFunctions.cend(); ++it, ++index)
if (index == _index)
{
sendMessage(it->first.asBytes() + _data, false, _value);
/* sendMessage(bytes(1, _index) + _data, false, _value); */
return m_output;
}
BOOST_FAIL("Function with index " << _index << "not found");
return m_output; return m_output;
} }
@ -149,6 +165,9 @@ protected:
bool m_optimize = false; bool m_optimize = false;
Address m_sender; Address m_sender;
Address m_contractAddress; Address m_contractAddress;
/* ContractDefinition m_contractDefinition; */
dev::solidity::CompilerStack m_compiler;
eth::State m_state; eth::State m_state;
u256 const m_gasPrice = 100 * eth::szabo; u256 const m_gasPrice = 100 * eth::szabo;
u256 const m_gas = 1000000; u256 const m_gas = 1000000;

Loading…
Cancel
Save