diff options
author | Christian <c@ethdev.com> | 2015-01-27 21:32:59 +0800 |
---|---|---|
committer | Christian <c@ethdev.com> | 2015-01-29 07:29:43 +0800 |
commit | c3cc5b737a94df8e5f2ecce17a1ca26a744c538d (patch) | |
tree | a532f70e6ca226b863235eb92187eb5357ba0e32 | |
parent | 4e67aa413e16a00c5056eb388bcf3bb011a7be57 (diff) | |
download | dexon-solidity-c3cc5b737a94df8e5f2ecce17a1ca26a744c538d.tar.gz dexon-solidity-c3cc5b737a94df8e5f2ecce17a1ca26a744c538d.tar.zst dexon-solidity-c3cc5b737a94df8e5f2ecce17a1ca26a744c538d.zip |
Super keyword.
-rw-r--r-- | SolidityCompiler.cpp | 2 | ||||
-rw-r--r-- | SolidityEndToEndTest.cpp | 24 | ||||
-rw-r--r-- | SolidityExpressionCompiler.cpp | 8 |
3 files changed, 30 insertions, 4 deletions
diff --git a/SolidityCompiler.cpp b/SolidityCompiler.cpp index 53daa9df..e7e64805 100644 --- a/SolidityCompiler.cpp +++ b/SolidityCompiler.cpp @@ -111,8 +111,8 @@ BOOST_AUTO_TEST_CASE(smoke_test) BOOST_AUTO_TEST_CASE(different_argument_numbers) { char const* sourceCode = "contract test {\n" - " function f(uint a, uint b, uint c) returns(uint d) { return b; }\n" " function g() returns (uint e, uint h) { h = f(1, 2, 3); }\n" + " function f(uint a, uint b, uint c) returns(uint d) { return b; }\n" "}\n"; bytes code = compileContract(sourceCode); unsigned shift = 103; diff --git a/SolidityEndToEndTest.cpp b/SolidityEndToEndTest.cpp index 1ddb2273..1450095a 100644 --- a/SolidityEndToEndTest.cpp +++ b/SolidityEndToEndTest.cpp @@ -1930,6 +1930,30 @@ BOOST_AUTO_TEST_CASE(crazy_elementary_typenames_on_stack) BOOST_CHECK(callContractFunction("f()") == encodeArgs(u256(-7))); } +BOOST_AUTO_TEST_CASE(super) +{ + char const* sourceCode = R"( + contract A { function f() returns (uint r) { return 1; } } + contract B is A { function f() returns (uint r) { return super.f() | 2; } } + contract C is A { function f() returns (uint r) { return super.f() | 4; } } + contract D is B, C { function f() returns (uint r) { return super.f() | 8; } } + )"; + compileAndRun(sourceCode, 0, "D"); + BOOST_CHECK(callContractFunction("f()") == encodeArgs(1 | 2 | 4 | 8)); +} + +BOOST_AUTO_TEST_CASE(super_in_constructor) +{ + char const* sourceCode = R"( + contract A { function f() returns (uint r) { return 1; } } + contract B is A { function f() returns (uint r) { return super.f() | 2; } } + contract C is A { function f() returns (uint r) { return super.f() | 4; } } + contract D is B, C { uint data; function D() { data = super.f() | 8; } function f() returns (uint r) { return data; } } + )"; + compileAndRun(sourceCode, 0, "D"); + BOOST_CHECK(callContractFunction("f()") == encodeArgs(1 | 2 | 4 | 8)); +} + BOOST_AUTO_TEST_SUITE_END() } diff --git a/SolidityExpressionCompiler.cpp b/SolidityExpressionCompiler.cpp index 06c252db..a0cca3a3 100644 --- a/SolidityExpressionCompiler.cpp +++ b/SolidityExpressionCompiler.cpp @@ -86,7 +86,8 @@ Declaration const& resolveDeclaration(vector<string> const& _namespacedName, } bytes compileFirstExpression(const string& _sourceCode, vector<vector<string>> _functions = {}, - vector<vector<string>> _localVariables = {}, vector<shared_ptr<MagicVariableDeclaration const>> _globalDeclarations = {}) + vector<vector<string>> _localVariables = {}, + vector<shared_ptr<MagicVariableDeclaration const>> _globalDeclarations = {}) { Parser parser; ASTPointer<SourceUnit> sourceUnit; @@ -99,10 +100,12 @@ bytes compileFirstExpression(const string& _sourceCode, vector<vector<string>> _ NameAndTypeResolver resolver(declarations); resolver.registerDeclarations(*sourceUnit); + vector<ContractDefinition const*> inheritanceHierarchy; for (ASTPointer<ASTNode> const& node: sourceUnit->getNodes()) if (ContractDefinition* contract = dynamic_cast<ContractDefinition*>(node.get())) { BOOST_REQUIRE_NO_THROW(resolver.resolveNamesAndTypes(*contract)); + inheritanceHierarchy = vector<ContractDefinition const*>(1, contract); } for (ASTPointer<ASTNode> const& node: sourceUnit->getNodes()) if (ContractDefinition* contract = dynamic_cast<ContractDefinition*>(node.get())) @@ -116,8 +119,7 @@ bytes compileFirstExpression(const string& _sourceCode, vector<vector<string>> _ BOOST_REQUIRE(extractor.getExpression() != nullptr); CompilerContext context; - for (vector<string> const& function: _functions) - context.addFunction(dynamic_cast<FunctionDefinition const&>(resolveDeclaration(function, resolver))); + context.setInheritanceHierarchy(inheritanceHierarchy); unsigned parametersSize = _localVariables.size(); // assume they are all one slot on the stack context.adjustStackOffset(parametersSize); for (vector<string> const& variable: _localVariables) |