mirror of
				https://github.com/ethereum/solidity
				synced 2023-10-03 13:03:40 +00:00 
			
		
		
		
	Merge pull request #11739 from ethereum/refactor_yul_conversion
solyul: Refactor conversion function.
This commit is contained in:
		
						commit
						35e1ab2c6f
					
				| @ -3258,6 +3258,7 @@ string YulUtilFunctions::conversionFunction(Type const& _from, Type const& _to) | |||||||
| 		switch (fromCategory) | 		switch (fromCategory) | ||||||
| 		{ | 		{ | ||||||
| 		case Type::Category::Address: | 		case Type::Category::Address: | ||||||
|  | 		case Type::Category::Contract: | ||||||
| 			body = | 			body = | ||||||
| 				Whiskers("converted := <convert>(value)") | 				Whiskers("converted := <convert>(value)") | ||||||
| 					("convert", conversionFunction(IntegerType(160), _to)) | 					("convert", conversionFunction(IntegerType(160), _to)) | ||||||
| @ -3265,61 +3266,44 @@ string YulUtilFunctions::conversionFunction(Type const& _from, Type const& _to) | |||||||
| 			break; | 			break; | ||||||
| 		case Type::Category::Integer: | 		case Type::Category::Integer: | ||||||
| 		case Type::Category::RationalNumber: | 		case Type::Category::RationalNumber: | ||||||
| 		case Type::Category::Contract: |  | ||||||
| 		{ | 		{ | ||||||
|  | 			solAssert(_from.mobileType(), ""); | ||||||
| 			if (RationalNumberType const* rational = dynamic_cast<RationalNumberType const*>(&_from)) | 			if (RationalNumberType const* rational = dynamic_cast<RationalNumberType const*>(&_from)) | ||||||
| 				solUnimplementedAssert(!rational->isFractional(), "Not yet implemented - FixedPointType."); | 				if (rational->isFractional()) | ||||||
|  | 					solAssert(toCategory == Type::Category::FixedPoint, ""); | ||||||
|  | 
 | ||||||
| 			if (toCategory == Type::Category::FixedBytes) | 			if (toCategory == Type::Category::FixedBytes) | ||||||
| 			{ | 			{ | ||||||
| 				solAssert( |  | ||||||
| 					fromCategory == Type::Category::Integer || fromCategory == Type::Category::RationalNumber, |  | ||||||
| 					"Invalid conversion to FixedBytesType requested." |  | ||||||
| 				); |  | ||||||
| 				FixedBytesType const& toBytesType = dynamic_cast<FixedBytesType const&>(_to); | 				FixedBytesType const& toBytesType = dynamic_cast<FixedBytesType const&>(_to); | ||||||
| 				body = | 				body = | ||||||
| 					Whiskers("converted := <shiftLeft>(<clean>(value))") | 					Whiskers("converted := <shiftLeft>(<clean>(value))") | ||||||
| 						("shiftLeft", shiftLeftFunction(256 - toBytesType.numBytes() * 8)) | 					("shiftLeft", shiftLeftFunction(256 - toBytesType.numBytes() * 8)) | ||||||
| 						("clean", cleanupFunction(_from)) | 					("clean", cleanupFunction(_from)) | ||||||
| 						.render(); | 					.render(); | ||||||
| 			} | 			} | ||||||
| 			else if (toCategory == Type::Category::Enum) | 			else if (toCategory == Type::Category::Enum) | ||||||
| 			{ |  | ||||||
| 				solAssert(_from.mobileType(), ""); |  | ||||||
| 				body = | 				body = | ||||||
| 					Whiskers("converted := <cleanEnum>(<cleanInt>(value))") | 					Whiskers("converted := <cleanEnum>(<cleanInt>(value))") | ||||||
| 					("cleanEnum", cleanupFunction(_to)) | 					("cleanEnum", cleanupFunction(_to)) | ||||||
| 					// "mobileType()" returns integer type for rational
 | 					("cleanInt", cleanupFunction(_from)) | ||||||
| 					("cleanInt", cleanupFunction(*_from.mobileType())) |  | ||||||
| 					.render(); | 					.render(); | ||||||
| 			} |  | ||||||
| 			else if (toCategory == Type::Category::FixedPoint) | 			else if (toCategory == Type::Category::FixedPoint) | ||||||
| 				solUnimplemented("Not yet implemented - FixedPointType."); | 				solUnimplemented("Not yet implemented - FixedPointType."); | ||||||
| 			else if (toCategory == Type::Category::Address) | 			else if (toCategory == Type::Category::Address || toCategory == Type::Category::Contract) | ||||||
| 				body = | 				body = | ||||||
| 					Whiskers("converted := <convert>(value)") | 					Whiskers("converted := <convert>(value)") | ||||||
| 						("convert", conversionFunction(_from, IntegerType(160))) | 					("convert", conversionFunction(_from, IntegerType(160))) | ||||||
| 						.render(); | 					.render(); | ||||||
| 			else | 			else if (toCategory == Type::Category::Integer) | ||||||
| 			{ | 			{ | ||||||
| 				solAssert( | 				IntegerType const& to = dynamic_cast<IntegerType const&>(_to); | ||||||
| 					toCategory == Type::Category::Integer || |  | ||||||
| 					toCategory == Type::Category::Contract, |  | ||||||
| 				""); |  | ||||||
| 				IntegerType const addressType(160); |  | ||||||
| 				IntegerType const& to = |  | ||||||
| 					toCategory == Type::Category::Integer ? |  | ||||||
| 					dynamic_cast<IntegerType const&>(_to) : |  | ||||||
| 					addressType; |  | ||||||
| 
 | 
 | ||||||
| 				// Clean according to the "to" type, except if this is
 | 				// Clean according to the "to" type, except if this is
 | ||||||
| 				// a widening conversion.
 | 				// a widening conversion.
 | ||||||
| 				IntegerType const* cleanupType = &to; | 				IntegerType const* cleanupType = &to; | ||||||
| 				if (fromCategory != Type::Category::RationalNumber) | 				if (fromCategory == Type::Category::Integer) | ||||||
| 				{ | 				{ | ||||||
| 					IntegerType const& from = | 					IntegerType const& from = dynamic_cast<IntegerType const&>(_from); | ||||||
| 						fromCategory == Type::Category::Integer ? |  | ||||||
| 						dynamic_cast<IntegerType const&>(_from) : |  | ||||||
| 						addressType; |  | ||||||
| 					if (to.numBits() > from.numBits()) | 					if (to.numBits() > from.numBits()) | ||||||
| 						cleanupType = &from; | 						cleanupType = &from; | ||||||
| 				} | 				} | ||||||
| @ -3328,6 +3312,8 @@ string YulUtilFunctions::conversionFunction(Type const& _from, Type const& _to) | |||||||
| 					("cleanInt", cleanupFunction(*cleanupType)) | 					("cleanInt", cleanupFunction(*cleanupType)) | ||||||
| 					.render(); | 					.render(); | ||||||
| 			} | 			} | ||||||
|  | 			else | ||||||
|  | 				solAssert(false, ""); | ||||||
| 			break; | 			break; | ||||||
| 		} | 		} | ||||||
| 		case Type::Category::Bool: | 		case Type::Category::Bool: | ||||||
|  | |||||||
| @ -275,11 +275,7 @@ object \"C_54\" { | |||||||
|             } |             } | ||||||
| 
 | 
 | ||||||
|             function convert_t_contract$_C_$54_to_t_address(value) -> converted { |             function convert_t_contract$_C_$54_to_t_address(value) -> converted { | ||||||
|                 converted := convert_t_contract$_C_$54_to_t_uint160(value) |                 converted := convert_t_uint160_to_t_address(value) | ||||||
|             } |  | ||||||
| 
 |  | ||||||
|             function convert_t_contract$_C_$54_to_t_uint160(value) -> converted { |  | ||||||
|                 converted := cleanup_t_uint160(value) |  | ||||||
|             } |             } | ||||||
| 
 | 
 | ||||||
|             function convert_t_int256_to_t_int256(value) -> converted { |             function convert_t_int256_to_t_int256(value) -> converted { | ||||||
| @ -290,6 +286,14 @@ object \"C_54\" { | |||||||
|                 converted := cleanup_t_int256(value) |                 converted := cleanup_t_int256(value) | ||||||
|             } |             } | ||||||
| 
 | 
 | ||||||
|  |             function convert_t_uint160_to_t_address(value) -> converted { | ||||||
|  |                 converted := convert_t_uint160_to_t_uint160(value) | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             function convert_t_uint160_to_t_uint160(value) -> converted { | ||||||
|  |                 converted := cleanup_t_uint160(value) | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|             function extract_from_storage_value_dynamict_int256(slot_value, offset) -> value { |             function extract_from_storage_value_dynamict_int256(slot_value, offset) -> value { | ||||||
|                 value := cleanup_from_storage_t_int256(shift_right_unsigned_dynamic(mul(offset, 8), slot_value)) |                 value := cleanup_from_storage_t_int256(shift_right_unsigned_dynamic(mul(offset, 8), slot_value)) | ||||||
|             } |             } | ||||||
| @ -875,11 +879,7 @@ object \"D_72\" { | |||||||
|             } |             } | ||||||
| 
 | 
 | ||||||
|             function convert_t_contract$_C_$54_to_t_address(value) -> converted { |             function convert_t_contract$_C_$54_to_t_address(value) -> converted { | ||||||
|                 converted := convert_t_contract$_C_$54_to_t_uint160(value) |                 converted := convert_t_uint160_to_t_address(value) | ||||||
|             } |  | ||||||
| 
 |  | ||||||
|             function convert_t_contract$_C_$54_to_t_uint160(value) -> converted { |  | ||||||
|                 converted := cleanup_t_uint160(value) |  | ||||||
|             } |             } | ||||||
| 
 | 
 | ||||||
|             function convert_t_int256_to_t_int256(value) -> converted { |             function convert_t_int256_to_t_int256(value) -> converted { | ||||||
| @ -890,6 +890,14 @@ object \"D_72\" { | |||||||
|                 converted := cleanup_t_int256(value) |                 converted := cleanup_t_int256(value) | ||||||
|             } |             } | ||||||
| 
 | 
 | ||||||
|  |             function convert_t_uint160_to_t_address(value) -> converted { | ||||||
|  |                 converted := convert_t_uint160_to_t_uint160(value) | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             function convert_t_uint160_to_t_uint160(value) -> converted { | ||||||
|  |                 converted := cleanup_t_uint160(value) | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|             function extract_from_storage_value_dynamict_int256(slot_value, offset) -> value { |             function extract_from_storage_value_dynamict_int256(slot_value, offset) -> value { | ||||||
|                 value := cleanup_from_storage_t_int256(shift_right_unsigned_dynamic(mul(offset, 8), slot_value)) |                 value := cleanup_from_storage_t_int256(shift_right_unsigned_dynamic(mul(offset, 8), slot_value)) | ||||||
|             } |             } | ||||||
|  | |||||||
| @ -27,5 +27,5 @@ contract C { | |||||||
| // compileViaYul: also | // compileViaYul: also | ||||||
| // ---- | // ---- | ||||||
| // test() -> 9, 7 | // test() -> 9, 7 | ||||||
| // gas legacy: 121594 | // gas legacy: 125064 | ||||||
| // t2() -> 9 | // t2() -> 9 | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user