public TransformDisplayClassUsages(IInstructionWithVariableOperand targetLoad, BlockContainer captureScope, List <ILInstruction> orphanedVariableInits)
 {
     this.targetLoad            = targetLoad;
     this.captureScope          = captureScope;
     this.orphanedVariableInits = orphanedVariableInits;
     this.targetAndCopies.Add(targetLoad.Variable);
 }
 public TransformDisplayClassUsages(ILFunction function, IInstructionWithVariableOperand targetLoad, BlockContainer captureScope, List <ILInstruction> orphanedVariableInits, HashSet <ITypeDefinition> translatedDisplayClasses)
 {
     this.currentFunction          = function;
     this.targetLoad               = targetLoad;
     this.captureScope             = captureScope;
     this.orphanedVariableInits    = orphanedVariableInits;
     this.translatedDisplayClasses = translatedDisplayClasses;
     this.targetAndCopies.Add(targetLoad.Variable);
 }
Beispiel #3
0
 void HandleLoad(IInstructionWithVariableOperand inst)
 {
     if (IsAnalyzedVariable(inst.Variable))
     {
         if (IsPotentiallyUninitialized(state, inst.Variable))
         {
             uninitVariableUsage.Add(inst);
         }
         foreach (var store in GetStores(state, inst.Variable))
         {
             unionFind.Merge(inst, (IInstructionWithVariableOperand)store);
         }
     }
 }
Beispiel #4
0
            /// <summary>
            /// Gets the new variable for a LdLoc, StLoc or TryCatchHandler instruction.
            /// </summary>
            internal ILVariable GetNewVariable(IInstructionWithVariableOperand inst)
            {
                var        representative = unionFind.Find(inst);
                ILVariable v;

                if (!newVariables.TryGetValue(representative, out v))
                {
                    v                   = new ILVariable(inst.Variable.Kind, inst.Variable.Type, inst.Variable.StackType, inst.Variable.Index);
                    v.Name              = inst.Variable.Name;
                    v.HasGeneratedName  = inst.Variable.HasGeneratedName;
                    v.StateMachineField = inst.Variable.StateMachineField;
                    v.HasInitialValue   = false;                   // we'll set HasInitialValue when we encounter an uninit load
                    newVariables.Add(representative, v);
                    inst.Variable.Function.Variables.Add(v);
                }
                if (inst.Variable.HasInitialValue && uninitVariableUsage.TryGetValue(inst.Variable, out var uninitLoad) && uninitLoad == inst)
                {
                    v.HasInitialValue = true;
                }
                return(v);
            }
Beispiel #5
0
 void HandleLoad(IInstructionWithVariableOperand inst)
 {
     if (IsAnalyzedVariable(inst.Variable))
     {
         if (IsPotentiallyUninitialized(state, inst.Variable))
         {
             // merge all uninit loads together:
             if (uninitVariableUsage.TryGetValue(inst.Variable, out var uninitLoad))
             {
                 unionFind.Merge(inst, uninitLoad);
             }
             else
             {
                 uninitVariableUsage.Add(inst.Variable, inst);
             }
         }
         foreach (var store in GetStores(state, inst.Variable))
         {
             unionFind.Merge(inst, (IInstructionWithVariableOperand)store);
         }
     }
 }