aboutsummaryrefslogtreecommitdiffstats
path: root/Compiler.cpp
diff options
context:
space:
mode:
authorChristian <c@ethdev.com>2015-02-14 08:22:44 +0800
committerChristian <c@ethdev.com>2015-02-17 02:25:24 +0800
commitf7ba85e0ecb6f690d62bcf66e0f0525f2ed97337 (patch)
treebbd2b50913748f78b311b6cbea27bb6ba5ec9c9e /Compiler.cpp
parent3e29ec2cb2075fc6734a0f350503c393fbeeb3d6 (diff)
downloaddexon-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.cpp23
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());