abstract private GetClass ( TargetMemoryAccess target ) : |
||
target | TargetMemoryAccess | |
return |
public static MemberExpression FindMember(Thread target, TargetStructType stype, TargetStructObject instance, string name, bool search_static, bool search_instance) { again: TargetClass klass = stype.GetClass (target); if (klass != null) { TargetMemberInfo member = klass.FindMember ( target, name, search_static, search_instance); if (member != null) return new StructAccessExpression (stype, instance, member); ArrayList methods = new ArrayList (); bool is_instance = false; bool is_static = false; TargetMethodInfo[] klass_methods = klass.GetMethods (target); if (klass_methods != null) { foreach (TargetMethodInfo method in klass_methods) { if (method.IsStatic && !search_static) continue; if (!method.IsStatic && !search_instance) continue; if (method.Name != name) continue; methods.Add (method.Type); if (method.IsStatic) is_static = true; else is_instance = true; } } if (methods.Count > 0) { TargetFunctionType[] funcs = new TargetFunctionType [methods.Count]; methods.CopyTo (funcs, 0); return new MethodGroupExpression ( stype, instance, name, funcs, is_instance, is_static); } } TargetClassType ctype = stype as TargetClassType; if (ctype != null) { TargetMemberInfo member = ctype.FindMember ( name, search_static, search_instance); if (member != null) return new StructAccessExpression (ctype, instance, member); ArrayList methods = new ArrayList (); bool is_instance = false; bool is_static = false; if (name == ".ctor") { foreach (TargetMethodInfo method in ctype.Constructors) { if (method.IsStatic) continue; methods.Add (method.Type); is_instance = true; } } else if (name == ".cctor") { foreach (TargetMethodInfo method in ctype.Constructors) { if (!method.IsStatic) continue; methods.Add (method.Type); is_static = true; } } else { foreach (TargetMethodInfo method in ctype.Methods) { if (method.IsStatic && !search_static) continue; if (!method.IsStatic && !search_instance) continue; if (method.Name != name) continue; methods.Add (method.Type); if (method.IsStatic) is_static = true; else is_instance = true; } } if (methods.Count > 0) { TargetFunctionType[] funcs = new TargetFunctionType [methods.Count]; methods.CopyTo (funcs, 0); return new MethodGroupExpression ( ctype, instance, name, funcs, is_instance, is_static); } } if (stype.HasParent) { stype = stype.GetParentType (target); if (instance != null) { instance = instance.GetParentObject (target); if (instance == null) return null; } goto again; } return null; }