private MemberInfo[] GetLocalMember(String name, BindingFlags bindingAttr, bool wrapMembers) { MemberInfo[] result = null; FieldInfo field = this.name_table == null ? null : (FieldInfo)this.name_table[name]; if (field == null && this.isASubClass) { if (this.memberCache != null) { result = (MemberInfo[])this.memberCache[name]; if (result != null) { return(result); } } bindingAttr &= ~BindingFlags.NonPublic; //Never expose non public fields of old style objects result = this.subClassIR.GetMember(name, bindingAttr); if (result.Length == 0) { result = this.subClassIR.GetMember(name, (bindingAttr & ~BindingFlags.Instance) | BindingFlags.Static); } int n = result.Length; if (n > 0) { //Suppress any members that are declared in JSObject or earlier. But keep the ones in Object. int hiddenMembers = 0; foreach (MemberInfo mem in result) { if (JSObject.IsHiddenMember(mem)) { hiddenMembers++; } } if (hiddenMembers > 0 && !(n == 1 && this is ObjectPrototype && name == "ToString")) { MemberInfo[] newResult = new MemberInfo[n - hiddenMembers]; int j = 0; foreach (MemberInfo mem in result) { if (!JSObject.IsHiddenMember(mem)) { newResult[j++] = mem; } } result = newResult; } } if ((result == null || result.Length == 0) && (bindingAttr & BindingFlags.Public) != 0 && (bindingAttr & BindingFlags.Instance) != 0) { BindingFlags flags = (bindingAttr & BindingFlags.IgnoreCase) | BindingFlags.Public | BindingFlags.Instance; if (this is StringObject) { result = TypeReflector.GetTypeReflectorFor(Typeob.String).GetMember(name, flags); } else if (this is NumberObject) { result = TypeReflector.GetTypeReflectorFor(((NumberObject)this).baseType).GetMember(name, flags); } else if (this is BooleanObject) { result = TypeReflector.GetTypeReflectorFor(Typeob.Boolean).GetMember(name, flags); } else if (this is StringConstructor) { result = TypeReflector.GetTypeReflectorFor(Typeob.String).GetMember(name, (flags | BindingFlags.Static) & ~BindingFlags.Instance); } else if (this is BooleanConstructor) { result = TypeReflector.GetTypeReflectorFor(Typeob.Boolean).GetMember(name, (flags | BindingFlags.Static) & ~BindingFlags.Instance); } else if (this is ArrayWrapper) { result = TypeReflector.GetTypeReflectorFor(Typeob.Array).GetMember(name, flags); } } if (result != null && result.Length > 0) { if (wrapMembers) { result = ScriptObject.WrapMembers(result, this); } if (this.memberCache == null) { this.memberCache = new SimpleHashtable(32); } this.memberCache[name] = result; return(result); } } if ((bindingAttr & BindingFlags.IgnoreCase) != 0 && (result == null || result.Length == 0)) { result = null; IDictionaryEnumerator e = this.name_table.GetEnumerator(); while (e.MoveNext()) { if (String.Compare(e.Key.ToString(), name, StringComparison.OrdinalIgnoreCase) == 0) { field = (FieldInfo)e.Value; break; } } } if (field != null) { return new MemberInfo[] { field } } ; if (result == null) { result = new MemberInfo[0]; } return(result); }
private MemberInfo[] GetMember(string name, BindingFlags bindingAttr, bool calledFromParent) { if (!this.recursive) { MemberInfo[] members = null; if (!this.isComponentScope) { MemberInfo[] member = base.GetMember(name, bindingAttr | BindingFlags.DeclaredOnly); if (member.Length > 0) { return(member); } if (this.componentScopes != null) { int num = 0; int count = this.componentScopes.Count; while (num < count) { members = ((GlobalScope)this.componentScopes[num]).GetMember(name, bindingAttr | BindingFlags.DeclaredOnly, true); if (members.Length > 0) { return(members); } num++; } } if (this.globalObject != null) { members = this.globalObjectTR.GetMember(name, (bindingAttr & ~BindingFlags.NonPublic) | BindingFlags.Static); } if ((members != null) && (members.Length > 0)) { return(ScriptObject.WrapMembers(members, this.globalObject)); } } else { members = this.typeReflector.GetMember(name, (bindingAttr & ~BindingFlags.NonPublic) | BindingFlags.Static); int length = members.Length; if (length > 0) { int num4 = 0; MemberInfo[] infoArray3 = new MemberInfo[length]; for (int i = 0; i < length; i++) { MemberInfo info = infoArray3[i] = members[i]; if (info.DeclaringType.IsAssignableFrom(Typeob.GlobalScope)) { infoArray3[i] = null; num4++; } else if (info is FieldInfo) { FieldInfo info2 = (FieldInfo)info; if (info2.IsStatic && (info2.FieldType == Typeob.Type)) { Type type = (Type)info2.GetValue(null); if (type != null) { infoArray3[i] = type; } } } } if (num4 == 0) { return(members); } if (num4 == length) { return(new MemberInfo[0]); } MemberInfo[] infoArray4 = new MemberInfo[length - num4]; int num6 = 0; foreach (MemberInfo info3 in infoArray3) { if (info3 != null) { infoArray4[num6++] = info3; } } return(infoArray4); } } if (((base.parent != null) && !calledFromParent) && (((bindingAttr & BindingFlags.DeclaredOnly) == BindingFlags.Default) || this.isComponentScope)) { this.recursive = true; try { members = base.parent.GetMember(name, bindingAttr); } finally { this.recursive = false; } if ((members != null) && (members.Length > 0)) { return(members); } } } return(new MemberInfo[0]); }
private MemberInfo[] GetLocalMember(string name, BindingFlags bindingAttr, bool wrapMembers) { MemberInfo[] members = null; FieldInfo info = (this.name_table == null) ? null : ((FieldInfo)this.name_table[name]); if ((info == null) && this.isASubClass) { if (this.memberCache != null) { members = (MemberInfo[])this.memberCache[name]; if (members != null) { return(members); } } bindingAttr &= ~BindingFlags.NonPublic; members = this.subClassIR.GetMember(name, bindingAttr); if (members.Length == 0) { members = this.subClassIR.GetMember(name, (bindingAttr & ~BindingFlags.Instance) | BindingFlags.Static); } int length = members.Length; if (length > 0) { int num2 = 0; foreach (MemberInfo info2 in members) { if (IsHiddenMember(info2)) { num2++; } } if ((num2 > 0) && (((length != 1) || !(this is ObjectPrototype)) || (name != "ToString"))) { MemberInfo[] infoArray2 = new MemberInfo[length - num2]; int num3 = 0; foreach (MemberInfo info3 in members) { if (!IsHiddenMember(info3)) { infoArray2[num3++] = info3; } } members = infoArray2; } } if (((members == null) || (members.Length == 0)) && (((bindingAttr & BindingFlags.Public) != BindingFlags.Default) && ((bindingAttr & BindingFlags.Instance) != BindingFlags.Default))) { BindingFlags flags = ((bindingAttr & BindingFlags.IgnoreCase) | BindingFlags.Public) | BindingFlags.Instance; if (this is StringObject) { members = TypeReflector.GetTypeReflectorFor(Typeob.String).GetMember(name, flags); } else if (this is NumberObject) { members = TypeReflector.GetTypeReflectorFor(((NumberObject)this).baseType).GetMember(name, flags); } else if (this is BooleanObject) { members = TypeReflector.GetTypeReflectorFor(Typeob.Boolean).GetMember(name, flags); } else if (this is StringConstructor) { members = TypeReflector.GetTypeReflectorFor(Typeob.String).GetMember(name, (flags | BindingFlags.Static) & ~BindingFlags.Instance); } else if (this is BooleanConstructor) { members = TypeReflector.GetTypeReflectorFor(Typeob.Boolean).GetMember(name, (flags | BindingFlags.Static) & ~BindingFlags.Instance); } else if (this is ArrayWrapper) { members = TypeReflector.GetTypeReflectorFor(Typeob.Array).GetMember(name, flags); } } if ((members != null) && (members.Length > 0)) { if (wrapMembers) { members = ScriptObject.WrapMembers(members, this); } if (this.memberCache == null) { this.memberCache = new SimpleHashtable(0x20); } this.memberCache[name] = members; return(members); } } if (((bindingAttr & BindingFlags.IgnoreCase) != BindingFlags.Default) && ((members == null) || (members.Length == 0))) { members = null; IDictionaryEnumerator enumerator = this.name_table.GetEnumerator(); while (enumerator.MoveNext()) { if (string.Compare(enumerator.Key.ToString(), name, StringComparison.OrdinalIgnoreCase) == 0) { info = (FieldInfo)enumerator.Value; break; } } } if (info != null) { return(new MemberInfo[] { info }); } if (members == null) { members = new MemberInfo[0]; } return(members); }
internal MemberInfo[] GetMember(string name, BindingFlags bindingAttr, bool forceInstanceLookup) { IReflect reflect; Type type = null; BindingFlags flags = bindingAttr; if ((forceInstanceLookup && this.isSuperType) && ((bindingAttr & BindingFlags.FlattenHierarchy) == BindingFlags.Default)) { flags |= BindingFlags.Instance; } object obj2 = this.contained_object; Label_0020: if (obj2 is IReflect) { reflect = (IReflect)obj2; if ((obj2 is Type) && !this.isSuperType) { flags &= ~BindingFlags.Instance; } } else { reflect = type = Globals.TypeRefs.ToReferenceContext(obj2.GetType()); } MemberInfo[] member = reflect.GetMember(name, flags & ~BindingFlags.DeclaredOnly); if (member.Length > 0) { return(ScriptObject.WrapMembers(member, obj2)); } if ((obj2 is Type) && !this.isSuperType) { member = Typeob.Type.GetMember(name, BindingFlags.Public | BindingFlags.Instance); } if (member.Length > 0) { return(ScriptObject.WrapMembers(member, obj2)); } if ((type != null) && type.IsNestedPublic) { try { new ReflectionPermission(ReflectionPermissionFlag.MemberAccess | ReflectionPermissionFlag.TypeInformation).Assert(); FieldInfo field = type.GetField("outer class instance", BindingFlags.NonPublic | BindingFlags.Instance); if (field != null) { obj2 = field.GetValue(obj2); goto Label_0020; } } finally { CodeAccessPermission.RevertAssert(); } } if (member.Length > 0) { return(ScriptObject.WrapMembers(member, obj2)); } return(new MemberInfo[0]); }
private MemberInfo[] GetMember(String name, BindingFlags bindingAttr, bool calledFromParent) { if (this.recursive) { return(new MemberInfo[0]); } MemberInfo[] result = null; if (!this.isComponentScope) { //Look for an expando MemberInfo[] members = base.GetMember(name, bindingAttr | BindingFlags.DeclaredOnly); if (members.Length > 0) { return(members); } if (this.componentScopes != null) { for (int i = 0, n = this.componentScopes.Count; i < n; i++) { GlobalScope sc = (GlobalScope)this.componentScopes[i]; result = sc.GetMember(name, bindingAttr | BindingFlags.DeclaredOnly, true); if (result.Length > 0) { return(result); } } } if (this.globalObject != null) { result = this.globalObjectTR.GetMember(name, bindingAttr & ~BindingFlags.NonPublic | BindingFlags.Static); } if (result != null && result.Length > 0) { return(ScriptObject.WrapMembers(result, this.globalObject)); } } else { //Look for global variables represented as static fields on subclass of GlobalScope. I.e. the script block case. result = this.typeReflector.GetMember(name, bindingAttr & ~BindingFlags.NonPublic | BindingFlags.Static); int n = result.Length; if (n > 0) { int toBeHidden = 0; MemberInfo[] newResult = new MemberInfo[n]; for (int i = 0; i < n; i++) { MemberInfo mem = newResult[i] = result[i]; if (mem.DeclaringType.IsAssignableFrom(Typeob.GlobalScope)) { newResult[i] = null; toBeHidden++; } else if (mem is FieldInfo) { FieldInfo field = (FieldInfo)mem; if (field.IsStatic && field.FieldType == Typeob.Type) { Type t = (Type)field.GetValue(null); if (t != null) { newResult[i] = t; } } } } if (toBeHidden == 0) { return(result); } if (toBeHidden == n) { return(new MemberInfo[0]); } MemberInfo[] remainingMembers = new MemberInfo[n - toBeHidden]; int j = 0; foreach (MemberInfo mem in newResult) { if (mem != null) { remainingMembers[j++] = mem; } } return(remainingMembers); } } if (this.parent != null && !calledFromParent && ((bindingAttr & BindingFlags.DeclaredOnly) == 0 || this.isComponentScope)) { this.recursive = true; try{ result = ((ScriptObject)this.parent).GetMember(name, bindingAttr); }finally{ this.recursive = false; } if (result != null && result.Length > 0) { return(result); } } return(new MemberInfo[0]); }