コード例 #1
0
 public void VisitStore2(StoreStaticField store)
 {
     if (store.Untyped.Previous.OpCode.Code != Code.Ldnull)
     {
         Unused.Value = m_fields.Remove(store.Field.Name);
     }
 }
コード例 #2
0
 public void VisitStoreStaticField(StoreStaticField store)
 {
     if (m_offset < 0 && store.Index > 0)
     {
         StoreStaticField prev = m_info.Instructions[store.Index - 1] as StoreStaticField;
         if (prev != null && prev.Field.Name == store.Field.Name)
         {
             m_offset = store.Untyped.Offset;
             Log.DebugLine(this, "Matched at {0:X2}", m_offset);
         }
     }
 }
コード例 #3
0
ファイル: StaticSetterRule.cs プロジェクト: dbremner/smokey
 public void VisitStoreStatic(StoreStaticField store)
 {
     if (m_wasStatic && !m_setsState)
     {
         if (store.Field.DeclaringType.MetadataToken == m_info.Type.MetadataToken)
         {
             if (!DoAtomicField(store.Field) || !DoVolatileStore(store))
             {
                 Log.DebugLine(this, "found store at {0:X2}", store.Untyped.Offset);
                 m_setsState = true;
             }
         }
     }
 }
コード例 #4
0
 public void VisitStoreStaticField(StoreStaticField store)
 {
     if (m_needsCheck)
     {
         Log.Indent();
         LoadArg load = m_info.Instructions[store.Index - 1] as LoadArg;
         if (load != null && m_types[load.Arg] != null)
         {
             TypeReference type = store.Field.FieldType;
             DoUseArg(load.Arg, store.Untyped.Offset, type);
         }
         Log.Unindent();
     }
 }
コード例 #5
0
        // Find the following in the count instructions starting at index:
        //		newobj     xxx
        //		stsfld     field
        private bool DoFindNew(int index, int count)
        {
            Log.DebugLine(this, "checking {0} instructions starting at {1:X2} for a new", count, m_info.Instructions[index].Untyped.Offset);

            for (int i = index; i < index + count; ++i)
            {
                StoreStaticField store = m_info.Instructions[i] as StoreStaticField;
                if (store != null && store.Field == m_field)
                {
                    NewObj newer = m_info.Instructions[i - 1] as NewObj;
                    if (newer != null)
                    {
                        Log.DebugLine(this, "found a new at {0:X2}", store.Untyped.Offset);
                        return(true);
                    }
                }
            }

            return(false);
        }
コード例 #6
0
ファイル: SchizoidTypeRule.cs プロジェクト: dbremner/smokey
 public void VisitSStoreField(StoreStaticField store)
 {
     DoAddField(store.Field);
 }
コード例 #7
0
 public void VisitStoreStaticField(StoreStaticField field)
 {
     DoAdd(field.Field.FieldType);
 }
コード例 #8
0
ファイル: StaticSetterRule.cs プロジェクト: dbremner/smokey
        // ldarg.0
        // volatile.
        // stsfld bool Smokey.Tests.StaticSetterTest/Static::ms_vatomic
        private bool DoVolatileStore(StoreStaticField store)
        {
            TypedInstruction prior = m_info.Instructions[store.Index - 1];

            return(prior.Untyped.OpCode.Code == Code.Volatile);
        }