예제 #1
0
		public void VisitBegins(BeginMethods begin)
		{
			Log.DebugLine(this, "-----------------------------------"); 
			Log.DebugLine(this, "{0}", begin.Type);				

			m_current = new Entry();
		}
예제 #2
0
		public void VisitBegin(BeginMethods begin)
		{
			m_fields.Clear();
			m_table.Clear();
			
			foreach (FieldDefinition field in begin.Type.Fields)
			{
				if (field.IsPrivate && field.IsStatic)
				{
					string key = DoIsCollection(field.FieldType);
					if (key != null)
					{
						Log.DebugLine(this, "-----------------------------------"); 
						Log.DebugLine(this, "{0:F} has a private static collection named {1}", begin.Type, field.Name);				
				
						if (DoHasReferenceElements(field.FieldType))
						{
							Log.DebugLine(this, "and the element types are reference types");	
							m_fields.Add(field);
							m_table.Add(field, new Entry(key));
						}
					}
				}
			}
		}
예제 #3
0
		public void VisitBegin(BeginMethods begin)
		{
			Log.DebugLine(this, "-----------------------------------"); 
			Log.DebugLine(this, "{0}", begin.Type);				

			m_foundEquals = false;					
		}
예제 #4
0
		public void VisitBegin(BeginMethods begin)
		{
			Log.DebugLine(this, "-----------------------------------"); 
			Log.DebugLine(this, "{0}", begin.Type.FullName);

			m_type = begin.Type;
			m_types.Clear();
		}
예제 #5
0
		public void VisitBegin(BeginMethods begin)
		{
			Log.DebugLine(this, "-----------------------------------"); 
			Log.DebugLine(this, "{0}", begin.Type);				
			
			m_equalities.Clear();
			m_properties.Clear();
		}
예제 #6
0
		public void VisitBegin(BeginMethods begin)
		{
			m_notSerializable = !begin.Type.TypeOrBaseImplements("System.Runtime.Serialization.ISerializable", Cache);
			m_hasMethod = false;
			
			if (m_notSerializable)
			{
				Log.DebugLine(this, "-----------------------------------"); 
				Log.DebugLine(this, "{0}", begin.Type);				
			}
		}
예제 #7
0
		public void VisitBegin(BeginMethods begin)
		{
			Log.DebugLine(this, "-----------------------------------"); 
			Log.DebugLine(this, "{0}", begin.Type);				
			
			m_needsCheck = begin.Type.Methods.Count >= 4 && begin.Type.Fields.Count >= 4;
			m_type = begin.Type;
			m_method = null;
			m_valid.Clear();
			m_calls.Clear();
			m_table.Clear();
		}
예제 #8
0
		public void VisitBegin(BeginMethods begin)
		{						
			Log.DebugLine(this, "-----------------------------------"); 
			Log.DebugLine(this, "checking {0}", begin.Type);				

			m_names.Clear();

			foreach (FieldDefinition f in begin.Type.Fields)
			{
				DoAdd(f.Name);
			}
		}
예제 #9
0
		public void VisitBegin(BeginMethods begin)
		{
			Log.DebugLine(this, "-----------------------------------"); 
			Log.DebugLine(this, "{0:F}", begin.Type);				

			m_fields.Clear();

			if (begin.Type.Constructors.Count > 0)	// some of the types in the 1.9 system dll's have no ctors...
			{
				foreach (FieldDefinition field in begin.Type.Fields)
					if (field.IsPrivate && !field.IsLiteral)
						if (!field.FieldType.IsValueType && !field.IsCompilerControlled)
							m_fields.Add(field.Name);
			}
		}
예제 #10
0
		public void VisitBegin(BeginMethods begin)
		{
			m_type = begin.Type;
			m_disposable = m_type.BaseImplements("System.IDisposable", Cache) && !m_type.IsCompilerGenerated();
			
			m_hasFinalizer = false;
			m_hasDispose = false;

			m_disposeMethod = null;
			m_hasBaseCall = false;
			
			if (m_disposable)
			{
				Log.DebugLine(this, "-----------------------------------"); 
				Log.DebugLine(this, "{0}", m_type);				
			}
		}
예제 #11
0
		public void VisitBegin(BeginMethods begin)
		{
			m_disposable = false;
			
			TypeDefinition baseType = Cache.FindType(begin.Type.BaseType);
			
			if (!begin.Type.IsSealed && !begin.Type.IsNestedPrivate && !begin.Type.IsCompilerGenerated())
				if (begin.Type.TypeImplements("System.IDisposable"))
					if (baseType == null || !baseType.TypeOrBaseImplements("System.IDisposable", Cache))	// don't check types with redundent IDisposable declarations
						if (!begin.Type.IsInterface)
							m_disposable = true;
			m_hasUnaryDispose = false;
			
			if (m_disposable)
			{
				Log.DebugLine(this, "-----------------------------------"); 
				Log.DebugLine(this, "{0}", begin.Type);				
			}
		}
예제 #12
0
		public void VisitBegin(BeginMethods begin)
		{
			m_type = begin.Type;
			m_disposable = begin.Type.TypeOrBaseImplements("System.IDisposable", Cache) && !m_type.IsCompilerGenerated();
		
			m_hasFinalizer = false;
			m_supressWasCalled = false;
			m_hasVirtualDispose = false;
			m_hasPublicDispose = false;
			m_hasNonProtectedDispose = false;
			m_hasNonVirtualDispose = false;
			m_disposeThrows = false;
			m_hasNativeFields = false;
			
			m_badDisposeNames.Clear();
			m_illegalDisposeNames.Clear();

			m_disposableFields.Clear();

			m_noThrowMethods = string.Empty;
			
			m_hasNullCall = false;
			m_ownedFields.Clear();
			
			if (m_disposable)
			{
				Log.DebugLine(this, "-----------------------------------"); 
				Log.DebugLine(this, "{0}", m_type);				
			}
			
			// We can't visit fields using the dispatcher because we're kicking 
			// the visit off with BeginMethods instead of BeginType so we have 
			// to manually visit them.
			foreach (FieldDefinition field in m_type.Fields)
				VisitField(field);
		}
예제 #13
0
		public void VisitBegin(BeginMethods begin)
		{
			Log.DebugLine(this, "-----------------------------------"); 
			Log.DebugLine(this, "{0}", begin.Type);				
			
			m_needsCheck = begin.Type.Methods.Count >= 6 && begin.Type.Fields.Count >= 6;
			m_type = begin.Type;
			m_method = null;
			m_partitions.Clear();
		}
예제 #14
0
		private void DoCheckMethods(AssemblyCache cache, string[] onlyType)
		{			
			Profile.Start("CheckMethods");
			
			foreach (KeyValuePair<TypeDefinition, List<MethodInfo>> entry in cache.TypeMethods)
			{
				if (DoNameNeedsCheck(entry.Key.FullName, onlyType))
				{
					BeginMethods begin = new BeginMethods(entry.Key);
					m_checker.Dispatcher.Dispatch(begin);
				
					foreach (MethodInfo method in entry.Value)
					{
						m_checker.Check(method);
					}
	
					EndMethods end = new EndMethods(entry.Key);
					m_checker.Dispatcher.Dispatch(end);
				}
			}

			Profile.Stop("CheckMethods");
		}
예제 #15
0
		public void VisitBegin(BeginMethods begin)
		{
			Log.DebugLine(this, "-----------------------------------"); 
			Log.DebugLine(this, "{0}", begin.Type);				
		}
예제 #16
0
 internal void Dispatch(BeginMethods methods)
 {
     DoVisit(methods);
 }
예제 #17
0
		// One possible improvement is to use a real hash of the block instead of simply
		// the block length. This would significantly cut down on false matches, but it
		// also require us to revisit instructions which tends to blow. From examination
		// it appears that we compare very few blocks so a hash doesn't seem terribly
		// useful.
		public void VisitBegin(BeginMethods begin)
		{			
			Unused.Value = begin;
			
			m_table.Clear();
		}