mirror of
				https://github.com/ethereum/solidity
				synced 2023-10-03 13:03:40 +00:00 
			
		
		
		
	Allow indexed structs in events with encoder v2.
This commit is contained in:
		
							parent
							
								
									0c2d623ee4
								
							
						
					
					
						commit
						a8d0ef4bad
					
				| @ -578,17 +578,7 @@ bool TypeChecker::visit(EventDefinition const& _eventDef) | ||||
| 	for (ASTPointer<VariableDeclaration> const& var: _eventDef.parameters()) | ||||
| 	{ | ||||
| 		if (var->isIndexed()) | ||||
| 		{ | ||||
| 			numIndexed++; | ||||
| 			if ( | ||||
| 				_eventDef.sourceUnit().annotation().experimentalFeatures.count(ExperimentalFeature::ABIEncoderV2) && | ||||
| 				dynamic_cast<ReferenceType const*>(type(*var).get()) | ||||
| 			) | ||||
| 				m_errorReporter.typeError( | ||||
| 					var->location(), | ||||
| 					"Indexed reference types cannot yet be used with ABIEncoderV2." | ||||
| 				); | ||||
| 		} | ||||
| 		if (!type(*var)->canLiveOutsideStorage()) | ||||
| 			m_errorReporter.typeError(var->location(), "Type is required to live outside storage."); | ||||
| 		if (!type(*var)->interfaceType(false)) | ||||
|  | ||||
| @ -731,6 +731,7 @@ bool ExpressionCompiler::visit(FunctionCall const& _functionCall) | ||||
| 			} | ||||
| 			arguments.front()->accept(*this); | ||||
| 			utils().fetchFreeMemoryPointer(); | ||||
| 			solAssert(function.parameterTypes().front()->isValueType(), ""); | ||||
| 			utils().packedEncode( | ||||
| 				{arguments.front()->annotation().type}, | ||||
| 				{function.parameterTypes().front()} | ||||
| @ -744,28 +745,32 @@ bool ExpressionCompiler::visit(FunctionCall const& _functionCall) | ||||
| 			_functionCall.expression().accept(*this); | ||||
| 			auto const& event = dynamic_cast<EventDefinition const&>(function.declaration()); | ||||
| 			unsigned numIndexed = 0; | ||||
| 			TypePointers paramTypes = function.parameterTypes(); | ||||
| 			// All indexed arguments go to the stack
 | ||||
| 			for (unsigned arg = arguments.size(); arg > 0; --arg) | ||||
| 				if (event.parameters()[arg - 1]->isIndexed()) | ||||
| 				{ | ||||
| 					++numIndexed; | ||||
| 					arguments[arg - 1]->accept(*this); | ||||
| 					if (auto const& arrayType = dynamic_pointer_cast<ArrayType const>(function.parameterTypes()[arg - 1])) | ||||
| 					if (auto const& referenceType = dynamic_pointer_cast<ReferenceType const>(paramTypes[arg - 1])) | ||||
| 					{ | ||||
| 						utils().fetchFreeMemoryPointer(); | ||||
| 						utils().packedEncode( | ||||
| 							{arguments[arg - 1]->annotation().type}, | ||||
| 							{arrayType} | ||||
| 							{referenceType} | ||||
| 						); | ||||
| 						utils().toSizeAfterFreeMemoryPointer(); | ||||
| 						m_context << Instruction::KECCAK256; | ||||
| 					} | ||||
| 					else | ||||
| 					{ | ||||
| 						solAssert(paramTypes[arg - 1]->isValueType(), ""); | ||||
| 						utils().convertType( | ||||
| 							*arguments[arg - 1]->annotation().type, | ||||
| 							*function.parameterTypes()[arg - 1], | ||||
| 							*paramTypes[arg - 1], | ||||
| 							true | ||||
| 						); | ||||
| 					} | ||||
| 				} | ||||
| 			if (!event.isAnonymous()) | ||||
| 			{ | ||||
| @ -782,7 +787,7 @@ bool ExpressionCompiler::visit(FunctionCall const& _functionCall) | ||||
| 				{ | ||||
| 					arguments[arg]->accept(*this); | ||||
| 					nonIndexedArgTypes.push_back(arguments[arg]->annotation().type); | ||||
| 					nonIndexedParamTypes.push_back(function.parameterTypes()[arg]); | ||||
| 					nonIndexedParamTypes.push_back(paramTypes[arg]); | ||||
| 				} | ||||
| 			utils().fetchFreeMemoryPointer(); | ||||
| 			utils().abiEncode(nonIndexedArgTypes, nonIndexedParamTypes); | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user