Ejemplo n.º 1
0
 public YieldData(YieldStateMachineVersion stateMachineVersion, HashSet <InstructionBlock> yieldReturns, HashSet <InstructionBlock> yieldBreaks,
                  YieldFieldsInformation fieldsInfo,
                  List <YieldExceptionHandlerInfo> exceptionHandlers)
 {
     StateMachineVersion = stateMachineVersion;
     YieldReturns        = yieldReturns;
     YieldBreaks         = yieldBreaks;
     FieldsInfo          = fieldsInfo;
     ExceptionHandlers   = exceptionHandlers.ToArray();
     FieldAssignmentData = new Dictionary <FieldDefinition, AssignmentType>();
 }
Ejemplo n.º 2
0
 public YieldData(YieldStateMachineVersion stateMachineVersion, HashSet<InstructionBlock> yieldReturns, HashSet<InstructionBlock> yieldBreaks,
     YieldFieldsInformation fieldsInfo,
     List<YieldExceptionHandlerInfo> exceptionHandlers)
 {
     StateMachineVersion = stateMachineVersion;
     YieldReturns = yieldReturns;
     YieldBreaks = yieldBreaks;
     FieldsInfo = fieldsInfo;
     ExceptionHandlers = exceptionHandlers.ToArray();
     FieldAssignmentData = new Dictionary<FieldDefinition, AssignmentType>();
 }
        protected override bool ProcessCFG()
        {
            StateMachineDisposeAnalyzer disposeAnalyzer = new StateMachineDisposeAnalyzer(moveNextMethodContext.Method);
            StateControllerRemover controllerRemover;
            YieldStateMachineVersion machineVersion = disposeAnalyzer.ProcessDisposeMethod();
            if (machineVersion == YieldStateMachineVersion.V1)
            {
                controllerRemover = new StateControllerRemover(moveNextMethodContext);
            }
            else if (machineVersion == YieldStateMachineVersion.V2)
            {
                controllerRemover = new DisposingStateControllerRemover(moveNextMethodContext, disposeAnalyzer.StateField, disposeAnalyzer.DisposingField);
                StateMachineDoFinallyCheckRemover doFinallyCheckRemover = new StateMachineDoFinallyCheckRemover(moveNextMethodContext);
                if (!doFinallyCheckRemover.MarkFinallyConditionsForRemoval())
                {
                    return false;
                }
                toBeRemoved.UnionWith(doFinallyCheckRemover.BlocksMarkedForRemoval);
            }
            else
            {
                return false;
            }

            if (!controllerRemover.RemoveStateMachineController())
            {
                return false;
            }

            toBeRemoved.UnionWith(controllerRemover.BlocksMarkedForRemoval);

            SwitchData switchData = controllerRemover.SwitchData;
            YieldStateMachineControlFlowRebuilder controlFlowRebuilder =
                new YieldStateMachineControlFlowRebuilder(moveNextMethodContext, switchData, controllerRemover.StateField);

            if (!controlFlowRebuilder.ProcessEndBlocks())
            {
                return false;
            }

            toBeRemoved.UnionWith(controlFlowRebuilder.BlocksMarkedForRemoval);
            StateMachineCFGCleaner cfgCleaner = new StateMachineCFGCleaner(theCFG, switchData, switchData.OrderedCasesArray[0]);

            if (!cfgCleaner.CleanUpTheCFG(toBeRemoved))
            {
                return false;
            }

            YieldFieldsInformation fieldsInfo = new YieldFieldsInformation(controllerRemover.StateField,
                    controlFlowRebuilder.CurrentItemField, controlFlowRebuilder.ReturnFlagVariable);

            this.moveNextMethodContext.YieldData =
                new YieldData(machineVersion, controlFlowRebuilder.YieldReturnBlocks,
                    controlFlowRebuilder.YieldBreakBlocks, fieldsInfo, disposeAnalyzer.YieldsExceptionData);
            return true;
        }
Ejemplo n.º 4
0
 public YieldData(YieldStateMachineVersion stateMachineVersion, HashSet <InstructionBlock> yieldReturns, HashSet <InstructionBlock> yieldBreaks, YieldFieldsInformation fieldsInfo, List <YieldExceptionHandlerInfo> exceptionHandlers)
 {
     base();
     this.set_StateMachineVersion(stateMachineVersion);
     this.set_YieldReturns(yieldReturns);
     this.set_YieldBreaks(yieldBreaks);
     this.set_FieldsInfo(fieldsInfo);
     this.set_ExceptionHandlers(exceptionHandlers.ToArray());
     this.set_FieldAssignmentData(new Dictionary <FieldDefinition, AssignmentType>());
     return;
 }