mirror of
				https://github.com/ethereum/solidity
				synced 2023-10-03 13:03:40 +00:00 
			
		
		
		
	Merge pull request #3724 from ethereum/externalFunctionsInLibraries
Make external library functions accessible.
This commit is contained in:
		
						commit
						61d9f88c0e
					
				| @ -7,8 +7,9 @@ Bugfixes: | ||||
|  * Code Generator: Properly skip unneeded storgae array cleanup when not reducing length. | ||||
|  * Code Generator: Bugfix in modifier lookup in libraries. | ||||
|  * Commandline interface: Support ``--evm-version constantinople`` properly. | ||||
|  * Standard JSON: Support ``constantinople`` as ``evmVersion`` properly. | ||||
|  * DocString Parser: Fix error message for empty descriptions. | ||||
|  * Standard JSON: Support ``constantinople`` as ``evmVersion`` properly. | ||||
|  * Type System: Make external library functions accessible. | ||||
| 
 | ||||
| ### 0.4.21 (2018-03-07) | ||||
| 
 | ||||
|  | ||||
| @ -203,6 +203,7 @@ public: | ||||
| 	bool isPublic() const { return visibility() >= Visibility::Public; } | ||||
| 	virtual bool isVisibleInContract() const { return visibility() != Visibility::External; } | ||||
| 	bool isVisibleInDerivedContracts() const { return isVisibleInContract() && visibility() >= Visibility::Internal; } | ||||
| 	bool isVisibleAsLibraryMember() const { return visibility() >= Visibility::Internal; } | ||||
| 
 | ||||
| 	std::string fullyQualifiedName() const { return sourceUnitName() + ":" + name(); } | ||||
| 
 | ||||
|  | ||||
| @ -304,7 +304,7 @@ MemberList::MemberMap Type::boundFunctions(Type const& _type, ContractDefinition | ||||
| 			); | ||||
| 			for (FunctionDefinition const* function: library.definedFunctions()) | ||||
| 			{ | ||||
| 				if (!function->isVisibleInDerivedContracts() || seenFunctions.count(function)) | ||||
| 				if (!function->isVisibleAsLibraryMember() || seenFunctions.count(function)) | ||||
| 					continue; | ||||
| 				seenFunctions.insert(function); | ||||
| 				FunctionType funType(*function, false); | ||||
| @ -2875,7 +2875,7 @@ MemberList::MemberMap TypeType::nativeMembers(ContractDefinition const* _current | ||||
| 		} | ||||
| 		if (contract.isLibrary()) | ||||
| 			for (FunctionDefinition const* function: contract.definedFunctions()) | ||||
| 				if (function->isVisibleInDerivedContracts()) | ||||
| 				if (function->isVisibleAsLibraryMember()) | ||||
| 					members.push_back(MemberList::Member( | ||||
| 						function->name(), | ||||
| 						FunctionType(*function).asMemberFunction(true), | ||||
|  | ||||
| @ -7024,6 +7024,21 @@ BOOST_AUTO_TEST_CASE(library_call) | ||||
| 	ABI_CHECK(callContractFunction("f(uint256)", u256(33)), encodeArgs(u256(33) * 9)); | ||||
| } | ||||
| 
 | ||||
| BOOST_AUTO_TEST_CASE(library_function_external) | ||||
| { | ||||
| 	char const* sourceCode = R"( | ||||
| 		library Lib { function m(bytes b) external pure returns (byte) { return b[2]; } } | ||||
| 		contract Test { | ||||
| 			function f(bytes b) public pure returns (byte) { | ||||
| 				return Lib.m(b); | ||||
| 			} | ||||
| 		} | ||||
| 	)"; | ||||
| 	compileAndRun(sourceCode, 0, "Lib"); | ||||
| 	compileAndRun(sourceCode, 0, "Test", bytes(), map<string, Address>{{"Lib", m_contractAddress}}); | ||||
| 	ABI_CHECK(callContractFunction("f(bytes)", u256(0x20), u256(5), "abcde"), encodeArgs("c")); | ||||
| } | ||||
| 
 | ||||
| BOOST_AUTO_TEST_CASE(library_stray_values) | ||||
| { | ||||
| 	char const* sourceCode = R"( | ||||
|  | ||||
| @ -0,0 +1,14 @@ | ||||
| library L { | ||||
|     function f(uint) pure external {} | ||||
| } | ||||
| 
 | ||||
| contract C { | ||||
|     using L for *; | ||||
| 
 | ||||
|     function f() public pure { | ||||
|         L.f(2); | ||||
|         uint x; | ||||
|         x.f(); | ||||
|     } | ||||
| } | ||||
| // ---- | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user