mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
Merge pull request #798 from LefterisJP/natspec_OnContractCreation
Natspec Popup Authentication on transaction
This commit is contained in:
commit
1515f140b3
@ -50,10 +50,9 @@ void Compiler::compileContract(ContractDefinition const& _contract, vector<Magic
|
|||||||
function->accept(*this);
|
function->accept(*this);
|
||||||
|
|
||||||
// Swap the runtime context with the creation-time context
|
// Swap the runtime context with the creation-time context
|
||||||
CompilerContext runtimeContext;
|
swap(m_context, m_runtimeContext);
|
||||||
swap(m_context, runtimeContext);
|
|
||||||
initializeContext(_contract, _magicGlobals, _contracts);
|
initializeContext(_contract, _magicGlobals, _contracts);
|
||||||
packIntoContractCreator(_contract, runtimeContext);
|
packIntoContractCreator(_contract, m_runtimeContext);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Compiler::initializeContext(ContractDefinition const& _contract, vector<MagicVariableDeclaration const*> const& _magicGlobals,
|
void Compiler::initializeContext(ContractDefinition const& _contract, vector<MagicVariableDeclaration const*> const& _magicGlobals,
|
||||||
|
@ -35,6 +35,7 @@ public:
|
|||||||
void compileContract(ContractDefinition const& _contract, std::vector<MagicVariableDeclaration const*> const& _magicGlobals,
|
void compileContract(ContractDefinition const& _contract, std::vector<MagicVariableDeclaration const*> const& _magicGlobals,
|
||||||
std::map<ContractDefinition const*, bytes const*> const& _contracts);
|
std::map<ContractDefinition const*, bytes const*> const& _contracts);
|
||||||
bytes getAssembledBytecode() { return m_context.getAssembledBytecode(m_optimize); }
|
bytes getAssembledBytecode() { return m_context.getAssembledBytecode(m_optimize); }
|
||||||
|
bytes getRuntimeBytecode() { return m_runtimeContext.getAssembledBytecode(m_optimize);}
|
||||||
void streamAssembly(std::ostream& _stream) const { m_context.streamAssembly(_stream); }
|
void streamAssembly(std::ostream& _stream) const { m_context.streamAssembly(_stream); }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
@ -70,6 +71,7 @@ private:
|
|||||||
|
|
||||||
bool const m_optimize;
|
bool const m_optimize;
|
||||||
CompilerContext m_context;
|
CompilerContext m_context;
|
||||||
|
CompilerContext m_runtimeContext;
|
||||||
std::vector<eth::AssemblyItem> m_breakTags; ///< tag to jump to for a "break" statement
|
std::vector<eth::AssemblyItem> m_breakTags; ///< tag to jump to for a "break" statement
|
||||||
std::vector<eth::AssemblyItem> m_continueTags; ///< tag to jump to for a "continue" statement
|
std::vector<eth::AssemblyItem> m_continueTags; ///< tag to jump to for a "continue" statement
|
||||||
eth::AssemblyItem m_returnTag; ///< tag to jump to for a "return" statement
|
eth::AssemblyItem m_returnTag; ///< tag to jump to for a "return" statement
|
||||||
|
@ -30,6 +30,8 @@
|
|||||||
#include <libsolidity/CompilerStack.h>
|
#include <libsolidity/CompilerStack.h>
|
||||||
#include <libsolidity/InterfaceHandler.h>
|
#include <libsolidity/InterfaceHandler.h>
|
||||||
|
|
||||||
|
#include <libdevcrypto/SHA3.h>
|
||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
|
||||||
namespace dev
|
namespace dev
|
||||||
@ -117,6 +119,7 @@ void CompilerStack::compile(bool _optimize)
|
|||||||
contractBytecode);
|
contractBytecode);
|
||||||
Contract& compiledContract = m_contracts[contract->getName()];
|
Contract& compiledContract = m_contracts[contract->getName()];
|
||||||
compiledContract.bytecode = compiler->getAssembledBytecode();
|
compiledContract.bytecode = compiler->getAssembledBytecode();
|
||||||
|
compiledContract.runtimeBytecode = compiler->getRuntimeBytecode();
|
||||||
compiledContract.compiler = move(compiler);
|
compiledContract.compiler = move(compiler);
|
||||||
contractBytecode[compiledContract.contract] = &compiledContract.bytecode;
|
contractBytecode[compiledContract.contract] = &compiledContract.bytecode;
|
||||||
}
|
}
|
||||||
@ -134,6 +137,16 @@ bytes const& CompilerStack::getBytecode(string const& _contractName) const
|
|||||||
return getContract(_contractName).bytecode;
|
return getContract(_contractName).bytecode;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bytes const& CompilerStack::getRuntimeBytecode(string const& _contractName) const
|
||||||
|
{
|
||||||
|
return getContract(_contractName).runtimeBytecode;
|
||||||
|
}
|
||||||
|
|
||||||
|
dev::h256 CompilerStack::getContractCodeHash(string const& _contractName) const
|
||||||
|
{
|
||||||
|
return dev::sha3(getRuntimeBytecode(_contractName));
|
||||||
|
}
|
||||||
|
|
||||||
void CompilerStack::streamAssembly(ostream& _outStream, string const& _contractName) const
|
void CompilerStack::streamAssembly(ostream& _outStream, string const& _contractName) const
|
||||||
{
|
{
|
||||||
getContract(_contractName).compiler->streamAssembly(_outStream);
|
getContract(_contractName).compiler->streamAssembly(_outStream);
|
||||||
|
@ -28,6 +28,7 @@
|
|||||||
#include <memory>
|
#include <memory>
|
||||||
#include <boost/noncopyable.hpp>
|
#include <boost/noncopyable.hpp>
|
||||||
#include <libdevcore/Common.h>
|
#include <libdevcore/Common.h>
|
||||||
|
#include <libdevcore/FixedHash.h>
|
||||||
|
|
||||||
namespace dev {
|
namespace dev {
|
||||||
namespace solidity {
|
namespace solidity {
|
||||||
@ -75,7 +76,13 @@ public:
|
|||||||
/// @returns the compiled bytecode
|
/// @returns the compiled bytecode
|
||||||
bytes const& compile(std::string const& _sourceCode, bool _optimize = false);
|
bytes const& compile(std::string const& _sourceCode, bool _optimize = false);
|
||||||
|
|
||||||
|
/// @returns the assembled bytecode for a contract.
|
||||||
bytes const& getBytecode(std::string const& _contractName = "") const;
|
bytes const& getBytecode(std::string const& _contractName = "") const;
|
||||||
|
/// @returns the runtime bytecode for the contract, i.e. the code that is returned by the constructor.
|
||||||
|
bytes const& getRuntimeBytecode(std::string const& _contractName = "") const;
|
||||||
|
/// @returns hash of the runtime bytecode for the contract, i.e. the code that is returned by the constructor.
|
||||||
|
dev::h256 getContractCodeHash(std::string const& _contractName = "") const;
|
||||||
|
|
||||||
/// Streams a verbose version of the assembly to @a _outStream.
|
/// Streams a verbose version of the assembly to @a _outStream.
|
||||||
/// Prerequisite: Successful compilation.
|
/// Prerequisite: Successful compilation.
|
||||||
void streamAssembly(std::ostream& _outStream, std::string const& _contractName = "") const;
|
void streamAssembly(std::ostream& _outStream, std::string const& _contractName = "") const;
|
||||||
@ -121,6 +128,7 @@ private:
|
|||||||
ContractDefinition const* contract = nullptr;
|
ContractDefinition const* contract = nullptr;
|
||||||
std::shared_ptr<Compiler> compiler;
|
std::shared_ptr<Compiler> compiler;
|
||||||
bytes bytecode;
|
bytes bytecode;
|
||||||
|
bytes runtimeBytecode;
|
||||||
std::shared_ptr<InterfaceHandler> interfaceHandler;
|
std::shared_ptr<InterfaceHandler> interfaceHandler;
|
||||||
mutable std::unique_ptr<std::string const> interface;
|
mutable std::unique_ptr<std::string const> interface;
|
||||||
mutable std::unique_ptr<std::string const> solidityInterface;
|
mutable std::unique_ptr<std::string const> solidityInterface;
|
||||||
|
@ -106,7 +106,7 @@ std::unique_ptr<std::string> InterfaceHandler::getUserDocumentation(ContractDefi
|
|||||||
if (!m_notice.empty())
|
if (!m_notice.empty())
|
||||||
{// since @notice is the only user tag if missing function should not appear
|
{// since @notice is the only user tag if missing function should not appear
|
||||||
user["notice"] = Json::Value(m_notice);
|
user["notice"] = Json::Value(m_notice);
|
||||||
methods[it.second->getName()] = user;
|
methods[it.second->getCanonicalSignature()] = user;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -162,7 +162,7 @@ std::unique_ptr<std::string> InterfaceHandler::getDevDocumentation(ContractDefin
|
|||||||
method["return"] = m_return;
|
method["return"] = m_return;
|
||||||
|
|
||||||
if (!method.empty()) // add the function, only if we have any documentation to add
|
if (!method.empty()) // add the function, only if we have any documentation to add
|
||||||
methods[it.second->getName()] = method;
|
methods[it.second->getCanonicalSignature()] = method;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
doc["methods"] = methods;
|
doc["methods"] = methods;
|
||||||
|
Loading…
Reference in New Issue
Block a user