mirror of
				https://github.com/ethereum/solidity
				synced 2023-10-03 13:03:40 +00:00 
			
		
		
		
	StandardCompiler: Don't assume that link reference always contains a colon
This commit is contained in:
		
							parent
							
								
									543f804226
								
							
						
					
					
						commit
						b97c6c55ad
					
				| @ -323,10 +323,12 @@ Json::Value formatLinkReferences(std::map<size_t, std::string> const& linkRefere | ||||
| 	for (auto const& ref: linkReferences) | ||||
| 	{ | ||||
| 		string const& fullname = ref.second; | ||||
| 
 | ||||
| 		// If the link reference does not contain a colon, assume that the file name is missing and
 | ||||
| 		// the whole string represents the library name.
 | ||||
| 		size_t colon = fullname.rfind(':'); | ||||
| 		solAssert(colon != string::npos, ""); | ||||
| 		string file = fullname.substr(0, colon); | ||||
| 		string name = fullname.substr(colon + 1); | ||||
| 		string file = (colon != string::npos ? fullname.substr(0, colon) : ""); | ||||
| 		string name = (colon != string::npos ? fullname.substr(colon + 1) : fullname); | ||||
| 
 | ||||
| 		Json::Value fileObject = ret.get(file, Json::objectValue); | ||||
| 		Json::Value libraryArray = fileObject.get(name, Json::arrayValue); | ||||
|  | ||||
| @ -0,0 +1 @@ | ||||
| --strict-assembly --libraries L:0x1234567890123456789012345678901234567890 | ||||
| @ -0,0 +1 @@ | ||||
| Warning: Yul is still experimental. Please use the output with care. | ||||
| @ -0,0 +1,5 @@ | ||||
| object "a" { | ||||
|     code { | ||||
|         let addr := linkersymbol("L") | ||||
|     } | ||||
| } | ||||
| @ -0,0 +1,16 @@ | ||||
| 
 | ||||
| ======= linking_strict_assembly_no_file_name_in_link_reference/input.yul (EVM) ======= | ||||
| 
 | ||||
| Pretty printed source: | ||||
| object "a" { | ||||
|     code { let addr := linkersymbol("L") } | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| Binary representation: | ||||
| 73123456789012345678901234567890123456789050 | ||||
| 
 | ||||
| Text representation: | ||||
|   linkerSymbol("8aa64f937099b65a4febc243a5ae0f2d6416bb9e473c30dd29c1ee498fb7c5a8") | ||||
|     /* "linking_strict_assembly_no_file_name_in_link_reference/input.yul":22:67   */ | ||||
|   pop | ||||
| @ -903,6 +903,70 @@ BOOST_AUTO_TEST_CASE(library_linking) | ||||
| 	expectLinkReferences(contractResult, {{"library2.sol", {"L2"}}}); | ||||
| } | ||||
| 
 | ||||
| BOOST_AUTO_TEST_CASE(linking_yul_empty_link_reference) | ||||
| { | ||||
| 	char const* input = R"( | ||||
| 	{ | ||||
| 		"language": "Yul", | ||||
| 		"settings": { | ||||
| 			"libraries": { | ||||
| 				"": { | ||||
| 					"": "0x4200000000000000000000000000000000000001" | ||||
| 				} | ||||
| 			}, | ||||
| 			"outputSelection": { | ||||
| 				"fileA": { | ||||
| 					"*": [ | ||||
| 						"evm.bytecode.linkReferences" | ||||
| 					] | ||||
| 				} | ||||
| 			} | ||||
| 		}, | ||||
| 		"sources": { | ||||
| 			"fileA": { | ||||
| 				"content": "object \"a\" { code { let addr := linkersymbol(\"\") } }" | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 	)"; | ||||
| 	Json::Value result = compile(input); | ||||
| 	BOOST_TEST(containsAtMostWarnings(result)); | ||||
| 	Json::Value contractResult = getContractResult(result, "fileA", "a"); | ||||
| 	expectLinkReferences(contractResult, {}); | ||||
| } | ||||
| 
 | ||||
| BOOST_AUTO_TEST_CASE(linking_yul_no_filename_in_link_reference) | ||||
| { | ||||
| 	char const* input = R"( | ||||
| 	{ | ||||
| 		"language": "Yul", | ||||
| 		"settings": { | ||||
| 			"libraries": { | ||||
| 				"": { | ||||
| 					"L": "0x4200000000000000000000000000000000000001" | ||||
| 				} | ||||
| 			}, | ||||
| 			"outputSelection": { | ||||
| 				"fileA": { | ||||
| 					"*": [ | ||||
| 						"evm.bytecode.linkReferences" | ||||
| 					] | ||||
| 				} | ||||
| 			} | ||||
| 		}, | ||||
| 		"sources": { | ||||
| 			"fileA": { | ||||
| 				"content": "object \"a\" { code { let addr := linkersymbol(\"L\") } }" | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 	)"; | ||||
| 	Json::Value result = compile(input); | ||||
| 	BOOST_TEST(containsAtMostWarnings(result)); | ||||
| 	Json::Value contractResult = getContractResult(result, "fileA", "a"); | ||||
| 	expectLinkReferences(contractResult, {}); | ||||
| } | ||||
| 
 | ||||
| BOOST_AUTO_TEST_CASE(evm_version) | ||||
| { | ||||
| 	auto inputForVersion = [](string const& _version) | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user