mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
Remove clone feature.
This commit is contained in:
1 parent
d33e5683f5
commit
71e26f6adb
9 files changed
+3
-122
No files matched your search
@@ -46,19 +46,6 @@ void Compiler::compileContract(
|
||||
m_context.optimise(m_optimize, m_optimizeRuns);
|
||||
}
|
||||
|
||||
void Compiler::compileClone(
|
||||
ContractDefinition const& _contract,
|
||||
map<ContractDefinition const*, eth::Assembly const*> const& _contracts
|
||||
)
|
||||
{
|
||||
solAssert(!_contract.isLibrary(), "");
|
||||
ContractCompiler runtimeCompiler(nullptr, m_runtimeContext, m_optimize);
|
||||
ContractCompiler cloneCompiler(&runtimeCompiler, m_context, m_optimize);
|
||||
m_runtimeSub = cloneCompiler.compileClone(_contract, _contracts);
|
||||
|
||||
m_context.optimise(m_optimize, m_optimizeRuns);
|
||||
}
|
||||
|
||||
eth::AssemblyItem Compiler::functionEntryLabel(FunctionDefinition const& _function) const
|
||||
{
|
||||
return m_runtimeContext.functionEntryLabelIfExists(_function);
|
||||
|
||||
@@ -50,12 +50,6 @@ public:
|
||||
std::map<ContractDefinition const*, eth::Assembly const*> const& _contracts,
|
||||
bytes const& _metadata
|
||||
);
|
||||
/// Compiles a contract that uses DELEGATECALL to call into a pre-deployed version of the given
|
||||
/// contract at runtime, but contains the full creation-time code.
|
||||
void compileClone(
|
||||
ContractDefinition const& _contract,
|
||||
std::map<ContractDefinition const*, eth::Assembly const*> const& _contracts
|
||||
);
|
||||
/// @returns Entire assembly.
|
||||
eth::Assembly const& assembly() const { return m_context.assembly(); }
|
||||
/// @returns The entire assembled object (with constructor).
|
||||
|
||||
@@ -94,27 +94,6 @@ size_t ContractCompiler::compileConstructor(
|
||||
}
|
||||
}
|
||||
|
||||
size_t ContractCompiler::compileClone(
|
||||
ContractDefinition const& _contract,
|
||||
map<ContractDefinition const*, eth::Assembly const*> const& _contracts
|
||||
)
|
||||
{
|
||||
initializeContext(_contract, _contracts);
|
||||
|
||||
appendInitAndConstructorCode(_contract);
|
||||
|
||||
//@todo determine largest return size of all runtime functions
|
||||
auto runtimeSub = m_context.addSubroutine(cloneRuntime());
|
||||
|
||||
// stack contains sub size
|
||||
m_context << Instruction::DUP1 << runtimeSub << u256(0) << Instruction::CODECOPY;
|
||||
m_context << u256(0) << Instruction::RETURN;
|
||||
|
||||
appendMissingFunctions();
|
||||
|
||||
return size_t(runtimeSub.data());
|
||||
}
|
||||
|
||||
void ContractCompiler::initializeContext(
|
||||
ContractDefinition const& _contract,
|
||||
map<ContractDefinition const*, eth::Assembly const*> const& _compiledContracts
|
||||
@@ -980,29 +959,6 @@ void ContractCompiler::compileExpression(Expression const& _expression, TypePoin
|
||||
CompilerUtils(m_context).convertType(*_expression.annotation().type, *_targetType);
|
||||
}
|
||||
|
||||
eth::AssemblyPointer ContractCompiler::cloneRuntime() const
|
||||
{
|
||||
eth::Assembly a;
|
||||
a << Instruction::CALLDATASIZE;
|
||||
a << u256(0) << Instruction::DUP1 << Instruction::CALLDATACOPY;
|
||||
//@todo adjust for larger return values, make this dynamic.
|
||||
a << u256(0x20) << u256(0) << Instruction::CALLDATASIZE;
|
||||
a << u256(0);
|
||||
// this is the address which has to be substituted by the linker.
|
||||
//@todo implement as special "marker" AssemblyItem.
|
||||
a << u256("0xcafecafecafecafecafecafecafecafecafecafe");
|
||||
a << u256(eth::GasCosts::callGas(m_context.evmVersion()) + 10) << Instruction::GAS << Instruction::SUB;
|
||||
a << Instruction::DELEGATECALL;
|
||||
//Propagate error condition (if DELEGATECALL pushes 0 on stack).
|
||||
a << Instruction::ISZERO;
|
||||
a << Instruction::ISZERO;
|
||||
eth::AssemblyItem afterTag = a.appendJumpI().tag();
|
||||
a << Instruction::INVALID << afterTag;
|
||||
//@todo adjust for larger return values, make this dynamic.
|
||||
a << u256(0x20) << u256(0) << Instruction::RETURN;
|
||||
return make_shared<eth::Assembly>(a);
|
||||
}
|
||||
|
||||
void ContractCompiler::popScopedVariables(ASTNode const* _node)
|
||||
{
|
||||
unsigned blockHeight = m_scopeStackHeight.at(m_modifierDepth).at(_node);
|
||||
|
||||
@@ -56,13 +56,6 @@ public:
|
||||
ContractDefinition const& _contract,
|
||||
std::map<ContractDefinition const*, eth::Assembly const*> const& _contracts
|
||||
);
|
||||
/// Compiles a contract that uses DELEGATECALL to call into a pre-deployed version of the given
|
||||
/// contract at runtime, but contains the full creation-time code.
|
||||
/// @returns the identifier of the runtime sub-assembly.
|
||||
size_t compileClone(
|
||||
ContractDefinition const& _contract,
|
||||
std::map<ContractDefinition const*, eth::Assembly const*> const& _contracts
|
||||
);
|
||||
|
||||
private:
|
||||
/// Registers the non-function objects inside the contract with the context and stores the basic
|
||||
@@ -122,9 +115,6 @@ private:
|
||||
void appendStackVariableInitialisation(VariableDeclaration const& _variable);
|
||||
void compileExpression(Expression const& _expression, TypePointer const& _targetType = TypePointer());
|
||||
|
||||
/// @returns the runtime assembly for clone contracts.
|
||||
eth::AssemblyPointer cloneRuntime() const;
|
||||
|
||||
/// Frees the variables of a certain scope (to be used when leaving).
|
||||
void popScopedVariables(ASTNode const* _node);
|
||||
|
||||
|
||||
Reference in new issue
Block a user