bool HandleExtraInstructions(Instruction instruction, MetaMidRepresentationOperationFactory operationFactory, string opcodeStr, ClosureEntities closureEntities) { if (instruction.OpCode == OpCodes.Ret) { var isVoid = _method.GetReturnType().IsVoid(); operationFactory.Return(isVoid); return(true); } if (opcodeStr == "constrained.") { operationFactory.ConstrainedClass = (Type)instruction.Operand; return(true); } if (opcodeStr.StartsWith("conv.")) { if (ConversionOperations(instruction, operationFactory)) { return(true); } return(true); } if (instruction.OpCode == OpCodes.Dup) { operationFactory.Dup(); return(true); } if (instruction.OpCode == OpCodes.Pop) { operationFactory.Pop(); return(true); } if (HandleArrayOperations(instruction, operationFactory, opcodeStr)) { return(true); } if (HandleLoadStoreInstructions(instruction, operationFactory, opcodeStr, closureEntities)) { return(true); } if (opcodeStr.StartsWith("initobj")) { //TODO: load the address into evaluation stack operationFactory.InitObject(); return(true); } if (opcodeStr == "volatile.") //TODO: handle this { operationFactory.PushDouble(0); return(true); } return(false); }
private bool HandleExtraInstructions(Instruction instruction, MetaMidRepresentationOperationFactory operationFactory, string opcodeStr, ClosureEntities closureEntities) { if (opcodeStr == "constrained.") { operationFactory.ConstrainedClass = (Type)instruction.Operand; return(true); } if (instruction.OpCode == OpCodes.Ret) { var isVoid = _method.GetReturnType().IsVoid(); operationFactory.Return(isVoid); return(true); } if (opcodeStr.StartsWith("conv.")) { if (ConversionOperations(opcodeStr, operationFactory)) { return(true); } return(true); } if (instruction.OpCode == OpCodes.Dup) { operationFactory.Dup(); return(true); } if (instruction.OpCode == OpCodes.Pop) { operationFactory.Pop(); return(true); } if (HandleArrayOperations(instruction, operationFactory, opcodeStr)) { return(true); } if (instruction.OpCode == OpCodes.Ldtoken) { operationFactory.SetToken((FieldInfo)instruction.Operand); return(true); } if (instruction.OpCode == OpCodes.Ldftn) { operationFactory.LoadFunction((MethodBase)instruction.Operand); return(true); } if (instruction.OpCode == OpCodes.Switch) { operationFactory.Switch((Instruction[])instruction.Operand); return(true); } if (instruction.OpCode == OpCodes.Sizeof) { operationFactory.SizeOf((Type)instruction.Operand); return(true); } if (instruction.OpCode == OpCodes.Ldsfld) { operationFactory.LoadStaticField((FieldInfo)instruction.Operand); return(true); } if (instruction.OpCode == OpCodes.Stsfld) { operationFactory.StoreStaticField((FieldInfo)instruction.Operand); return(true); } if (opcodeStr == "ldloca.s" || opcodeStr == "ldloca") { //TODO: load the address into evaluation stack var index = instruction.Operand; operationFactory.LoadAddressIntoEvaluationStack((LocalVariableInfo)index); return(true); } if (opcodeStr == "ldflda.s" || opcodeStr == "ldflda") { var fieldInfo = (FieldInfo)instruction.Operand; operationFactory.LoadFieldAddressIntoEvaluationStack(fieldInfo); return(true); } if (opcodeStr == "ldelema") { var ldElemTypeDefinition = (Type)instruction.Operand; operationFactory.LoadAddressOfArrayItemIntoStack(ldElemTypeDefinition); return(true); } if (opcodeStr.StartsWith("stind.")) { //TODO: load the address into evaluation stack operationFactory.StoresValueFromAddress(); return(true); } if (opcodeStr.StartsWith("ldind.")) { //TODO: load the address into evaluation stack operationFactory.LoadValueFromAddress(closureEntities); return(true); } if (opcodeStr.StartsWith("initobj")) { //TODO: load the address into evaluation stack operationFactory.InitObject(); return(true); } if (opcodeStr == "volatile.") //TODO: handle this { operationFactory.PushDouble(0); return(true); } return(false); }