diff options
author | Christian <c@ethdev.com> | 2015-02-14 08:22:44 +0800 |
---|---|---|
committer | Christian <c@ethdev.com> | 2015-02-17 02:25:24 +0800 |
commit | f7ba85e0ecb6f690d62bcf66e0f0525f2ed97337 (patch) | |
tree | bbd2b50913748f78b311b6cbea27bb6ba5ec9c9e /Compiler.cpp | |
parent | 3e29ec2cb2075fc6734a0f350503c393fbeeb3d6 (diff) | |
download | dexon-solidity-f7ba85e0ecb6f690d62bcf66e0f0525f2ed97337.tar dexon-solidity-f7ba85e0ecb6f690d62bcf66e0f0525f2ed97337.tar.gz dexon-solidity-f7ba85e0ecb6f690d62bcf66e0f0525f2ed97337.tar.bz2 dexon-solidity-f7ba85e0ecb6f690d62bcf66e0f0525f2ed97337.tar.lz dexon-solidity-f7ba85e0ecb6f690d62bcf66e0f0525f2ed97337.tar.xz dexon-solidity-f7ba85e0ecb6f690d62bcf66e0f0525f2ed97337.tar.zst dexon-solidity-f7ba85e0ecb6f690d62bcf66e0f0525f2ed97337.zip |
No write access to parameters of external functions.
Diffstat (limited to 'Compiler.cpp')
-rw-r--r-- | Compiler.cpp | 23 |
1 files changed, 17 insertions, 6 deletions
diff --git a/Compiler.cpp b/Compiler.cpp index dad79bb0..4dbcbbfe 100644 --- a/Compiler.cpp +++ b/Compiler.cpp @@ -255,12 +255,22 @@ bool Compiler::visit(FunctionDefinition const& _function) // stack upon entry: [return address] [arg0] [arg1] ... [argn] // reserve additional slots: [retarg0] ... [retargm] [localvar0] ... [localvarp] - unsigned parametersSize = CompilerUtils::getSizeOnStack(_function.getParameters()); - m_context.adjustStackOffset(parametersSize); - for (ASTPointer<VariableDeclaration const> const& variable: _function.getParameters()) + if (_function.getVisibility() != Declaration::Visibility::External) { - m_context.addVariable(*variable, parametersSize); - parametersSize -= variable->getType()->getSizeOnStack(); + unsigned parametersSize = CompilerUtils::getSizeOnStack(_function.getParameters()); + m_context.adjustStackOffset(parametersSize); + for (ASTPointer<VariableDeclaration const> const& variable: _function.getParameters()) + { + m_context.addVariable(*variable, parametersSize); + parametersSize -= variable->getType()->getSizeOnStack(); + } + } + else + { + unsigned calldataPos = CompilerUtils::dataStartOffset; + // calldatapos is _always_ dynamic. + for (ASTPointer<VariableDeclaration const> const& variable: _function.getParameters()) + m_context.addCalldataVariable(*variable, calldataPos); } for (ASTPointer<VariableDeclaration const> const& variable: _function.getReturnParameters()) m_context.addAndInitializeVariable(*variable); @@ -277,7 +287,8 @@ bool Compiler::visit(FunctionDefinition const& _function) // Note that the fact that the return arguments are of increasing index is vital for this // algorithm to work. - unsigned const c_argumentsSize = CompilerUtils::getSizeOnStack(_function.getParameters()); + unsigned const c_argumentsSize = (_function.getVisibility() == Declaration::Visibility::External + ? 0 : CompilerUtils::getSizeOnStack(_function.getParameters())); unsigned const c_returnValuesSize = CompilerUtils::getSizeOnStack(_function.getReturnParameters()); unsigned const c_localVariablesSize = CompilerUtils::getSizeOnStack(_function.getLocalVariables()); |