mirror of
				https://github.com/ethereum/solidity
				synced 2023-10-03 13:03:40 +00:00 
			
		
		
		
	Merge pull request #10579 from ethereum/supportMetaTypeNameSol2Yul
[Sol->Yul] Implementing type name.
This commit is contained in:
		
						commit
						0e32fa8209
					
				| @ -976,30 +976,20 @@ string ABIFunctions::abiEncodingFunctionStringLiteral( | |||||||
| 			Whiskers templ(R"( | 			Whiskers templ(R"( | ||||||
| 				function <functionName>(pos) -> end { | 				function <functionName>(pos) -> end { | ||||||
| 					pos := <storeLength>(pos, <length>) | 					pos := <storeLength>(pos, <length>) | ||||||
| 					<#word> | 					<storeLiteralInMemory>(pos) | ||||||
| 						mstore(add(pos, <offset>), <wordValue>) |  | ||||||
| 					</word> |  | ||||||
| 					end := add(pos, <overallSize>) | 					end := add(pos, <overallSize>) | ||||||
| 				} | 				} | ||||||
| 			)"); | 			)"); | ||||||
| 			templ("functionName", functionName); | 			templ("functionName", functionName); | ||||||
| 
 | 
 | ||||||
| 			// TODO this can make use of CODECOPY for large strings once we have that in Yul
 | 			// TODO this can make use of CODECOPY for large strings once we have that in Yul
 | ||||||
| 			size_t words = (value.size() + 31) / 32; |  | ||||||
| 			templ("length", to_string(value.size())); | 			templ("length", to_string(value.size())); | ||||||
| 			templ("storeLength", arrayStoreLengthForEncodingFunction(dynamic_cast<ArrayType const&>(_to), _options)); | 			templ("storeLength", arrayStoreLengthForEncodingFunction(dynamic_cast<ArrayType const&>(_to), _options)); | ||||||
| 			if (_options.padded) | 			if (_options.padded) | ||||||
| 				templ("overallSize", to_string(words * 32)); | 				templ("overallSize", to_string(((value.size() + 31) / 32) * 32)); | ||||||
| 			else | 			else | ||||||
| 				templ("overallSize", to_string(value.size())); | 				templ("overallSize", to_string(value.size())); | ||||||
| 
 | 			templ("storeLiteralInMemory", m_utils.storeLiteralInMemoryFunction(value)); | ||||||
| 			vector<map<string, string>> wordParams(words); |  | ||||||
| 			for (size_t i = 0; i < words; ++i) |  | ||||||
| 			{ |  | ||||||
| 				wordParams[i]["offset"] = to_string(i * 32); |  | ||||||
| 				wordParams[i]["wordValue"] = formatAsStringOrNumber(value.substr(32 * i, 32)); |  | ||||||
| 			} |  | ||||||
| 			templ("word", wordParams); |  | ||||||
| 			return templ.render(); | 			return templ.render(); | ||||||
| 		} | 		} | ||||||
| 		else | 		else | ||||||
|  | |||||||
| @ -107,6 +107,51 @@ string YulUtilFunctions::copyToMemoryFunction(bool _fromCalldata) | |||||||
| 	}); | 	}); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | string YulUtilFunctions::copyLiteralToMemoryFunction(string const& _literal) | ||||||
|  | { | ||||||
|  | 	string functionName = "copy_literal_to_memory_" + util::toHex(util::keccak256(_literal).asBytes()); | ||||||
|  | 
 | ||||||
|  | 	return m_functionCollector.createFunction(functionName, [&]() { | ||||||
|  | 		return Whiskers(R"( | ||||||
|  | 			function <functionName>() -> memPtr { | ||||||
|  | 				memPtr := <arrayAllocationFunction>(<size>) | ||||||
|  | 				<storeLiteralInMem>(add(memPtr, 32)) | ||||||
|  | 			} | ||||||
|  | 			)") | ||||||
|  | 			("functionName", functionName) | ||||||
|  | 			("arrayAllocationFunction", allocateMemoryArrayFunction(*TypeProvider::array(DataLocation::Memory, true))) | ||||||
|  | 			("size", to_string(_literal.size())) | ||||||
|  | 			("storeLiteralInMem", storeLiteralInMemoryFunction(_literal)) | ||||||
|  | 			.render(); | ||||||
|  | 	}); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | string YulUtilFunctions::storeLiteralInMemoryFunction(string const& _literal) | ||||||
|  | { | ||||||
|  | 	string functionName = "store_literal_in_memory_" + util::toHex(util::keccak256(_literal).asBytes()); | ||||||
|  | 
 | ||||||
|  | 	return m_functionCollector.createFunction(functionName, [&]() { | ||||||
|  | 		size_t words = (_literal.length() + 31) / 32; | ||||||
|  | 		vector<map<string, string>> wordParams(words); | ||||||
|  | 		for (size_t i = 0; i < words; ++i) | ||||||
|  | 		{ | ||||||
|  | 			wordParams[i]["offset"] = to_string(i * 32); | ||||||
|  | 			wordParams[i]["wordValue"] = formatAsStringOrNumber(_literal.substr(32 * i, 32)); | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		return Whiskers(R"( | ||||||
|  | 			function <functionName>(memPtr) { | ||||||
|  | 				<#word> | ||||||
|  | 					mstore(add(memPtr, <offset>), <wordValue>) | ||||||
|  | 				</word> | ||||||
|  | 			} | ||||||
|  | 			)") | ||||||
|  | 			("functionName", functionName) | ||||||
|  | 			("word", wordParams) | ||||||
|  | 			.render(); | ||||||
|  | 	}); | ||||||
|  | } | ||||||
|  | 
 | ||||||
| string YulUtilFunctions::requireOrAssertFunction(bool _assert, Type const* _messageType) | string YulUtilFunctions::requireOrAssertFunction(bool _assert, Type const* _messageType) | ||||||
| { | { | ||||||
| 	string functionName = | 	string functionName = | ||||||
| @ -3901,31 +3946,14 @@ string YulUtilFunctions::conversionFunctionSpecial(Type const& _from, Type const | |||||||
| 		} | 		} | ||||||
| 		else if (_to.category() == Type::Category::Array) | 		else if (_to.category() == Type::Category::Array) | ||||||
| 		{ | 		{ | ||||||
| 			auto const& arrayType = dynamic_cast<ArrayType const&>(_to); | 			solAssert(dynamic_cast<ArrayType const&>(_to).isByteArray(), ""); | ||||||
| 			solAssert(arrayType.isByteArray(), ""); |  | ||||||
| 			size_t words = (data.size() + 31) / 32; |  | ||||||
| 			size_t storageSize = 32 + words * 32; |  | ||||||
| 
 |  | ||||||
| 			Whiskers templ(R"( | 			Whiskers templ(R"( | ||||||
| 				function <functionName>() -> converted { | 				function <functionName>() -> converted { | ||||||
| 					converted := <allocate>(<storageSize>) | 					converted := <copyLiteralToMemory>() | ||||||
| 					mstore(converted, <size>) |  | ||||||
| 					<#word> |  | ||||||
| 						mstore(add(converted, <offset>), <wordValue>) |  | ||||||
| 					</word> |  | ||||||
| 				} | 				} | ||||||
| 			)"); | 			)"); | ||||||
| 			templ("functionName", functionName); | 			templ("functionName", functionName); | ||||||
| 			templ("allocate", allocationFunction()); | 			templ("copyLiteralToMemory", copyLiteralToMemoryFunction(data)); | ||||||
| 			templ("storageSize", to_string(storageSize)); |  | ||||||
| 			templ("size", to_string(data.size())); |  | ||||||
| 			vector<map<string, string>> wordParams(words); |  | ||||||
| 			for (size_t i = 0; i < words; ++i) |  | ||||||
| 			{ |  | ||||||
| 				wordParams[i]["offset"] = to_string(32 + i * 32); |  | ||||||
| 				wordParams[i]["wordValue"] = formatAsStringOrNumber(data.substr(32 * i, 32)); |  | ||||||
| 			} |  | ||||||
| 			templ("word", wordParams); |  | ||||||
| 			return templ.render(); | 			return templ.render(); | ||||||
| 		} | 		} | ||||||
| 		else | 		else | ||||||
|  | |||||||
| @ -72,6 +72,15 @@ public: | |||||||
| 	/// Pads with zeros and might write more than exactly length.
 | 	/// Pads with zeros and might write more than exactly length.
 | ||||||
| 	std::string copyToMemoryFunction(bool _fromCalldata); | 	std::string copyToMemoryFunction(bool _fromCalldata); | ||||||
| 
 | 
 | ||||||
|  | 	/// @returns the name of a function that copies a string literal to memory
 | ||||||
|  | 	/// and returns a pointer to the memory area containing the string literal.
 | ||||||
|  | 	/// signature: () -> memPtr
 | ||||||
|  | 	std::string copyLiteralToMemoryFunction(std::string const& _literal); | ||||||
|  | 
 | ||||||
|  | 	/// @returns the name of a function that stores a string literal at a specific location in memory
 | ||||||
|  | 	/// signature: (memPtr) ->
 | ||||||
|  | 	std::string storeLiteralInMemoryFunction(std::string const& _literal); | ||||||
|  | 
 | ||||||
| 	// @returns the name of a function that has the equivalent logic of an
 | 	// @returns the name of a function that has the equivalent logic of an
 | ||||||
| 	// `assert` or `require` call.
 | 	// `assert` or `require` call.
 | ||||||
| 	std::string requireOrAssertFunction(bool _assert, Type const* _messageType = nullptr); | 	std::string requireOrAssertFunction(bool _assert, Type const* _messageType = nullptr); | ||||||
|  | |||||||
| @ -1737,7 +1737,9 @@ void IRGeneratorForStatements::endVisit(MemberAccess const& _memberAccess) | |||||||
| 		} | 		} | ||||||
| 		else if (member == "name") | 		else if (member == "name") | ||||||
| 		{ | 		{ | ||||||
| 			solUnimplementedAssert(false, ""); | 			TypePointer arg = dynamic_cast<MagicType const&>(*_memberAccess.expression().annotation().type).typeArgument(); | ||||||
|  | 			ContractDefinition const& contract = dynamic_cast<ContractType const&>(*arg).contractDefinition(); | ||||||
|  | 			define(IRVariable(_memberAccess)) << m_utils.copyLiteralToMemoryFunction(contract.name()) << "()\n"; | ||||||
| 		} | 		} | ||||||
| 		else if (member == "interfaceId") | 		else if (member == "interfaceId") | ||||||
| 		{ | 		{ | ||||||
|  | |||||||
| @ -188,14 +188,14 @@ def examine_id_coverage(top_dir, source_id_to_file_names, new_ids_only=False): | |||||||
|     # Warning (1878): SPDX license identifier not provided in source file. .... |     # Warning (1878): SPDX license identifier not provided in source file. .... | ||||||
|     # Warning (3420): Source file does not specify required compiler version! |     # Warning (3420): Source file does not specify required compiler version! | ||||||
|     test_ids |= find_ids_in_cmdline_test_err(path.join(top_dir, "test", "cmdlineTests", "error_codes", "err")) |     test_ids |= find_ids_in_cmdline_test_err(path.join(top_dir, "test", "cmdlineTests", "error_codes", "err")) | ||||||
|     test_ids |= find_ids_in_cmdline_test_err(path.join(top_dir, "test", "cmdlineTests", "yul_unimplemented", "err")) |  | ||||||
| 
 | 
 | ||||||
|     # white list of ids which are not covered by tests |     # white list of ids which are not covered by tests | ||||||
|     white_ids = { |     white_ids = { | ||||||
|         "3805", # "This is a pre-release compiler version, please do not use it in production." |         "3805", # "This is a pre-release compiler version, please do not use it in production." | ||||||
|                 # The warning may or may not exist in a compiler build. |                 # The warning may or may not exist in a compiler build. | ||||||
|         "4591"  # "There are more than 256 warnings. Ignoring the rest." |         "4591", # "There are more than 256 warnings. Ignoring the rest." | ||||||
|                 # Due to 3805, the warning lists look different for different compiler builds. |                 # Due to 3805, the warning lists look different for different compiler builds. | ||||||
|  |         "1834"  # Unimplemented feature error, as we do not test it anymore via cmdLineTests | ||||||
|     } |     } | ||||||
|     assert len(test_ids & white_ids) == 0, "The sets are not supposed to intersect" |     assert len(test_ids & white_ids) == 0, "The sets are not supposed to intersect" | ||||||
|     test_ids |= white_ids |     test_ids |= white_ids | ||||||
|  | |||||||
| @ -87,18 +87,18 @@ object "C_59" { | |||||||
|                 if or(gt(newFreePtr, 0xffffffffffffffff), lt(newFreePtr, memPtr)) { panic_error_0x41() } |                 if or(gt(newFreePtr, 0xffffffffffffffff), lt(newFreePtr, memPtr)) { panic_error_0x41() } | ||||||
|                 mstore(64, newFreePtr) |                 mstore(64, newFreePtr) | ||||||
|             } |             } | ||||||
|             function convert_t_stringliteral_6490_to_t_string() -> converted |             function copy_literal_to_memory_64902fd228f7ef267f3b474dd6ef84bae434cf5546eee948e7ca26df3eda1927() -> memPtr | ||||||
|             { |             { | ||||||
|                 let memPtr := mload(64) |                 let memPtr_1 := mload(64) | ||||||
|                 let newFreePtr := add(memPtr, 160) |                 let newFreePtr := add(memPtr_1, 160) | ||||||
|                 if or(gt(newFreePtr, 0xffffffffffffffff), lt(newFreePtr, memPtr)) { panic_error_0x41() } |                 if or(gt(newFreePtr, 0xffffffffffffffff), lt(newFreePtr, memPtr_1)) { panic_error_0x41() } | ||||||
|                 mstore(64, newFreePtr) |                 mstore(64, newFreePtr) | ||||||
|                 converted := memPtr |                 mstore(memPtr_1, 100) | ||||||
|                 mstore(memPtr, 100) |                 memPtr := memPtr_1 | ||||||
|                 mstore(add(memPtr, 32), "longstringlongstringlongstringlo") |                 mstore(add(memPtr_1, 0x20), "longstringlongstringlongstringlo") | ||||||
|                 mstore(add(memPtr, 64), "ngstringlongstringlongstringlong") |                 mstore(add(memPtr_1, 64), "ngstringlongstringlongstringlong") | ||||||
|                 mstore(add(memPtr, 96), "stringlongstringlongstringlongst") |                 mstore(add(memPtr_1, 96), "stringlongstringlongstringlongst") | ||||||
|                 mstore(add(memPtr, 128), "ring") |                 mstore(add(memPtr_1, 128), "ring") | ||||||
|             } |             } | ||||||
|             function extract_from_storage_value_dynamict_uint256(slot_value, offset) -> value |             function extract_from_storage_value_dynamict_uint256(slot_value, offset) -> value | ||||||
|             { |             { | ||||||
| @ -120,7 +120,7 @@ object "C_59" { | |||||||
|                 sstore(slot, or(and(_5, not(mask)), and(shl(shiftBits, _4), mask))) |                 sstore(slot, or(and(_5, not(mask)), and(shl(shiftBits, _4), mask))) | ||||||
|                 let _6, _7 := storage_array_index_access$_t_struct$_S_storage(0x02, vloc) |                 let _6, _7 := storage_array_index_access$_t_struct$_S_storage(0x02, vloc) | ||||||
|                 vloc := extract_from_storage_value_dynamict_uint256(sload(_6), _7) |                 vloc := extract_from_storage_value_dynamict_uint256(sload(_6), _7) | ||||||
|                 vloc__27_mpos := convert_t_stringliteral_6490_to_t_string() |                 vloc__27_mpos := copy_literal_to_memory_64902fd228f7ef267f3b474dd6ef84bae434cf5546eee948e7ca26df3eda1927() | ||||||
|             } |             } | ||||||
|             function panic_error_0x32() |             function panic_error_0x32() | ||||||
|             { |             { | ||||||
|  | |||||||
| @ -75,6 +75,26 @@ object \"C_11\" { | |||||||
|                 mstore(64, newFreePtr) |                 mstore(64, newFreePtr) | ||||||
|             } |             } | ||||||
| 
 | 
 | ||||||
|  |             function allocate_memory_array_t_string_memory_ptr(length) -> memPtr { | ||||||
|  |                 let allocSize := array_allocation_size_t_string_memory_ptr(length) | ||||||
|  |                 memPtr := allocateMemory(allocSize) | ||||||
|  | 
 | ||||||
|  |                 mstore(memPtr, length) | ||||||
|  | 
 | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             function array_allocation_size_t_string_memory_ptr(length) -> size { | ||||||
|  |                 // Make sure we can allocate memory without overflow | ||||||
|  |                 if gt(length, 0xffffffffffffffff) { panic_error_0x41() } | ||||||
|  | 
 | ||||||
|  |                 // round up | ||||||
|  |                 size := and(add(length, 0x1f), not(0x1f)) | ||||||
|  | 
 | ||||||
|  |                 // add length slot | ||||||
|  |                 size := add(size, 0x20) | ||||||
|  | 
 | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|             function array_length_t_string_memory_ptr(value) -> length { |             function array_length_t_string_memory_ptr(value) -> length { | ||||||
| 
 | 
 | ||||||
|                 length := mload(value) |                 length := mload(value) | ||||||
| @ -87,11 +107,12 @@ object \"C_11\" { | |||||||
|             } |             } | ||||||
| 
 | 
 | ||||||
|             function convert_t_stringliteral_9f0adad0a59b05d2e04a1373342b10b9eb16c57c164c8a3bfcbf46dccee39a21_to_t_string_memory_ptr() -> converted { |             function convert_t_stringliteral_9f0adad0a59b05d2e04a1373342b10b9eb16c57c164c8a3bfcbf46dccee39a21_to_t_string_memory_ptr() -> converted { | ||||||
|                 converted := allocateMemory(64) |                 converted := copy_literal_to_memory_9f0adad0a59b05d2e04a1373342b10b9eb16c57c164c8a3bfcbf46dccee39a21() | ||||||
|                 mstore(converted, 6) |             } | ||||||
| 
 |  | ||||||
|                 mstore(add(converted, 32), \"abcabc\") |  | ||||||
| 
 | 
 | ||||||
|  |             function copy_literal_to_memory_9f0adad0a59b05d2e04a1373342b10b9eb16c57c164c8a3bfcbf46dccee39a21() -> memPtr { | ||||||
|  |                 memPtr := allocate_memory_array_t_string_memory_ptr(6) | ||||||
|  |                 store_literal_in_memory_9f0adad0a59b05d2e04a1373342b10b9eb16c57c164c8a3bfcbf46dccee39a21(add(memPtr, 32)) | ||||||
|             } |             } | ||||||
| 
 | 
 | ||||||
|             function copy_memory_to_memory(src, dst, length) { |             function copy_memory_to_memory(src, dst, length) { | ||||||
| @ -133,6 +154,12 @@ object \"C_11\" { | |||||||
| 
 | 
 | ||||||
|             } |             } | ||||||
| 
 | 
 | ||||||
|  |             function store_literal_in_memory_9f0adad0a59b05d2e04a1373342b10b9eb16c57c164c8a3bfcbf46dccee39a21(memPtr) { | ||||||
|  | 
 | ||||||
|  |                 mstore(add(memPtr, 0), \"abcabc\") | ||||||
|  | 
 | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|             function zero_value_for_split_t_string_memory_ptr() -> ret { |             function zero_value_for_split_t_string_memory_ptr() -> ret { | ||||||
|                 ret := 96 |                 ret := 96 | ||||||
|             } |             } | ||||||
|  | |||||||
| @ -75,6 +75,26 @@ object \"C_11\" { | |||||||
|                 mstore(64, newFreePtr) |                 mstore(64, newFreePtr) | ||||||
|             } |             } | ||||||
| 
 | 
 | ||||||
|  |             function allocate_memory_array_t_string_memory_ptr(length) -> memPtr { | ||||||
|  |                 let allocSize := array_allocation_size_t_string_memory_ptr(length) | ||||||
|  |                 memPtr := allocateMemory(allocSize) | ||||||
|  | 
 | ||||||
|  |                 mstore(memPtr, length) | ||||||
|  | 
 | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             function array_allocation_size_t_string_memory_ptr(length) -> size { | ||||||
|  |                 // Make sure we can allocate memory without overflow | ||||||
|  |                 if gt(length, 0xffffffffffffffff) { panic_error_0x41() } | ||||||
|  | 
 | ||||||
|  |                 // round up | ||||||
|  |                 size := and(add(length, 0x1f), not(0x1f)) | ||||||
|  | 
 | ||||||
|  |                 // add length slot | ||||||
|  |                 size := add(size, 0x20) | ||||||
|  | 
 | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|             function array_length_t_string_memory_ptr(value) -> length { |             function array_length_t_string_memory_ptr(value) -> length { | ||||||
| 
 | 
 | ||||||
|                 length := mload(value) |                 length := mload(value) | ||||||
| @ -87,15 +107,12 @@ object \"C_11\" { | |||||||
|             } |             } | ||||||
| 
 | 
 | ||||||
|             function convert_t_stringliteral_d6604f85ac07e2b33103a620b3d3d75b0473c7214912beded67b9b624d41c571_to_t_string_memory_ptr() -> converted { |             function convert_t_stringliteral_d6604f85ac07e2b33103a620b3d3d75b0473c7214912beded67b9b624d41c571_to_t_string_memory_ptr() -> converted { | ||||||
|                 converted := allocateMemory(128) |                 converted := copy_literal_to_memory_d6604f85ac07e2b33103a620b3d3d75b0473c7214912beded67b9b624d41c571() | ||||||
|                 mstore(converted, 85) |             } | ||||||
| 
 |  | ||||||
|                 mstore(add(converted, 32), \"abcdabcdcafecafeabcdabcdcafecafe\") |  | ||||||
| 
 |  | ||||||
|                 mstore(add(converted, 64), \"ffffzzzzoooo0123456789,.<,>.?:;'\") |  | ||||||
| 
 |  | ||||||
|                 mstore(add(converted, 96), \"[{]}|`~!@#$%^&*()-_=+\") |  | ||||||
| 
 | 
 | ||||||
|  |             function copy_literal_to_memory_d6604f85ac07e2b33103a620b3d3d75b0473c7214912beded67b9b624d41c571() -> memPtr { | ||||||
|  |                 memPtr := allocate_memory_array_t_string_memory_ptr(85) | ||||||
|  |                 store_literal_in_memory_d6604f85ac07e2b33103a620b3d3d75b0473c7214912beded67b9b624d41c571(add(memPtr, 32)) | ||||||
|             } |             } | ||||||
| 
 | 
 | ||||||
|             function copy_memory_to_memory(src, dst, length) { |             function copy_memory_to_memory(src, dst, length) { | ||||||
| @ -137,6 +154,16 @@ object \"C_11\" { | |||||||
| 
 | 
 | ||||||
|             } |             } | ||||||
| 
 | 
 | ||||||
|  |             function store_literal_in_memory_d6604f85ac07e2b33103a620b3d3d75b0473c7214912beded67b9b624d41c571(memPtr) { | ||||||
|  | 
 | ||||||
|  |                 mstore(add(memPtr, 0), \"abcdabcdcafecafeabcdabcdcafecafe\") | ||||||
|  | 
 | ||||||
|  |                 mstore(add(memPtr, 32), \"ffffzzzzoooo0123456789,.<,>.?:;'\") | ||||||
|  | 
 | ||||||
|  |                 mstore(add(memPtr, 64), \"[{]}|`~!@#$%^&*()-_=+\") | ||||||
|  | 
 | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|             function zero_value_for_split_t_string_memory_ptr() -> ret { |             function zero_value_for_split_t_string_memory_ptr() -> ret { | ||||||
|                 ret := 96 |                 ret := 96 | ||||||
|             } |             } | ||||||
|  | |||||||
| @ -1 +0,0 @@ | |||||||
| --ir --error-codes |  | ||||||
| @ -1,5 +0,0 @@ | |||||||
| Error (1834): Unimplemented feature error in <FILENAME REMOVED> |  | ||||||
|  --> yul_unimplemented/input.sol:6:16: |  | ||||||
|   | |  | ||||||
| 6 |         return type(test).name; |  | ||||||
|   |                ^^^^^^^^^^^^^^^ |  | ||||||
| @ -1 +0,0 @@ | |||||||
| 1 |  | ||||||
| @ -1,8 +0,0 @@ | |||||||
| // SPDX-License-Identifier: GPL-3.0 |  | ||||||
| pragma solidity >=0.0; |  | ||||||
| pragma abicoder v2; |  | ||||||
| contract test { |  | ||||||
|     function f() public pure returns (string memory) { |  | ||||||
|         return type(test).name; |  | ||||||
|     } |  | ||||||
| } |  | ||||||
| @ -101,7 +101,7 @@ BOOST_AUTO_TEST_CASE(string_storage) | |||||||
| 		if (CommonOptions::get().useABIEncoderV1) | 		if (CommonOptions::get().useABIEncoderV1) | ||||||
| 			CHECK_DEPLOY_GAS(133045, 129731, evmVersion); | 			CHECK_DEPLOY_GAS(133045, 129731, evmVersion); | ||||||
| 		else | 		else | ||||||
| 			CHECK_DEPLOY_GAS(152657, 135201, evmVersion); | 			CHECK_DEPLOY_GAS(155553, 135201, evmVersion); | ||||||
| 	} | 	} | ||||||
| 	// This is only correct on >=Constantinople.
 | 	// This is only correct on >=Constantinople.
 | ||||||
| 	else if (!CommonOptions::get().useABIEncoderV1) | 	else if (!CommonOptions::get().useABIEncoderV1) | ||||||
| @ -117,9 +117,9 @@ BOOST_AUTO_TEST_CASE(string_storage) | |||||||
| 		else | 		else | ||||||
| 		{ | 		{ | ||||||
| 			if (evmVersion < EVMVersion::istanbul()) | 			if (evmVersion < EVMVersion::istanbul()) | ||||||
| 				CHECK_DEPLOY_GAS(146671, 123969, evmVersion); | 				CHECK_DEPLOY_GAS(149567, 123969, evmVersion); | ||||||
| 			else | 			else | ||||||
| 				CHECK_DEPLOY_GAS(131591, 110969, evmVersion); | 				CHECK_DEPLOY_GAS(134123, 110969, evmVersion); | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 	else if (evmVersion < EVMVersion::istanbul()) | 	else if (evmVersion < EVMVersion::istanbul()) | ||||||
| @ -131,7 +131,7 @@ BOOST_AUTO_TEST_CASE(string_storage) | |||||||
| 	{ | 	{ | ||||||
| 		callContractFunction("f()"); | 		callContractFunction("f()"); | ||||||
| 		if (evmVersion == EVMVersion::byzantium()) | 		if (evmVersion == EVMVersion::byzantium()) | ||||||
| 			CHECK_GAS(21712, 21555, 20); | 			CHECK_GAS(21741, 21555, 20); | ||||||
| 		// This is only correct on >=Constantinople.
 | 		// This is only correct on >=Constantinople.
 | ||||||
| 		else if (!CommonOptions::get().useABIEncoderV1) | 		else if (!CommonOptions::get().useABIEncoderV1) | ||||||
| 		{ | 		{ | ||||||
| @ -145,9 +145,9 @@ BOOST_AUTO_TEST_CASE(string_storage) | |||||||
| 			else | 			else | ||||||
| 			{ | 			{ | ||||||
| 				if (evmVersion < EVMVersion::istanbul()) | 				if (evmVersion < EVMVersion::istanbul()) | ||||||
| 					CHECK_GAS(21707, 21559, 20); | 					CHECK_GAS(21736, 21559, 20); | ||||||
| 				else | 				else | ||||||
| 					CHECK_GAS(21499, 21351, 20); | 					CHECK_GAS(21528, 21351, 20); | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
| 		else if (evmVersion < EVMVersion::istanbul()) | 		else if (evmVersion < EVMVersion::istanbul()) | ||||||
|  | |||||||
| @ -13,8 +13,8 @@ contract C { | |||||||
| } | } | ||||||
| // ---- | // ---- | ||||||
| // creation: | // creation: | ||||||
| //   codeDepositCost: 376800 | //   codeDepositCost: 398400 | ||||||
| //   executionCost: 411 | //   executionCost: 436 | ||||||
| //   totalCost: 377211 | //   totalCost: 398836 | ||||||
| // external: | // external: | ||||||
| //   f(): 399 | //   f(): 428 | ||||||
|  | |||||||
| @ -22,7 +22,8 @@ contract Test is C { | |||||||
|         return type(I).name; |         return type(I).name; | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | // ==== | ||||||
|  | // compileViaYul: also | ||||||
| // ---- | // ---- | ||||||
| // c() -> 0x20, 1, "C" | // c() -> 0x20, 1, "C" | ||||||
| // a() -> 0x20, 1, "A" | // a() -> 0x20, 1, "A" | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user