internal void AddOverloadedMembers(MemberInfoList mems, ClassScope scope, BindingFlags attrs){ JSMemberField field = this; while (field != null){ MethodInfo meth = ((JSMemberField)field).GetAsMethod(scope); if (meth.IsStatic){ if ((attrs & BindingFlags.Static) == 0) goto next; }else{ if ((attrs & BindingFlags.Instance) == 0) goto next; } if (meth.IsPublic){ if ((attrs & BindingFlags.Public) == 0) goto next; }else{ if ((attrs & BindingFlags.NonPublic) == 0) goto next; } mems.Add(meth); next: field = field.nextOverload; } if ((attrs & BindingFlags.DeclaredOnly) != 0 && (attrs&BindingFlags.FlattenHierarchy) == 0) return; IReflect superClass = scope.GetSuperType(); MemberInfo[] supMembers = superClass.GetMember(this.Name, attrs&~BindingFlags.DeclaredOnly); foreach (MemberInfo supMember in supMembers) if (supMember.MemberType == MemberTypes.Method) mems.Add(supMember); }
internal TypeReflector(Type type) : base(null){ this.defaultMembers = null; ArrayList memberLookupTable = new ArrayList(512); int count = 0; SimpleHashtable staticMembers = new SimpleHashtable(256); foreach (MemberInfo member in type.GetMembers(BindingFlags.Public|BindingFlags.Static|BindingFlags.FlattenHierarchy)){ String name = member.Name; Object ob = staticMembers[name]; if (ob == null){ staticMembers[name] = count++; //Avoid allocating an array until needed memberLookupTable.Add(member); }else{ int index = (int)ob; ob = memberLookupTable[index]; MemberInfo firstMember = ob as MemberInfo; if (firstMember != null){ MemberInfoList mems = new MemberInfoList(); //Allocate a flexarray of MemberInfo, and turn it into a fixed array when GetMember is called for this name mems.Add(firstMember); mems.Add(member); memberLookupTable[index] = mems; }else ((MemberInfoList)ob).Add(member); } } this.staticMembers = staticMembers; SimpleHashtable instanceMembers = new SimpleHashtable(256); foreach (MemberInfo member in type.GetMembers(BindingFlags.Public|BindingFlags.Instance)){ String name = member.Name; Object ob = instanceMembers[name]; if (ob == null){ instanceMembers[name] = count++; //Avoid allocating an array until needed memberLookupTable.Add(member); }else{ int index = (int)ob; ob = memberLookupTable[index]; MemberInfo firstMember = ob as MemberInfo; if (firstMember != null){ MemberInfoList mems = new MemberInfoList(); mems.Add(firstMember); mems.Add(member); memberLookupTable[index] = mems; }else ((MemberInfoList)ob).Add(member); } } this.instanceMembers = instanceMembers; this.memberLookupTable = memberLookupTable; this.memberInfos = new MemberInfo[count][]; this.type = type; this.implementsIReflect = null; this.hashCode = (uint)type.GetHashCode(); this.next = null; }
internal void AddOverloadedMembers(MemberInfoList mems, ClassScope scope, BindingFlags attrs) { for (JSMemberField field = this; field != null; field = field.nextOverload) { MethodInfo asMethod = field.GetAsMethod(scope); if (asMethod.IsStatic) { if ((attrs & BindingFlags.Static) != BindingFlags.Default) { goto Label_0020; } continue; } if ((attrs & BindingFlags.Instance) == BindingFlags.Default) { continue; } Label_0020: if (asMethod.IsPublic) { if ((attrs & BindingFlags.Public) != BindingFlags.Default) { goto Label_0036; } continue; } if ((attrs & BindingFlags.NonPublic) == BindingFlags.Default) { continue; } Label_0036: mems.Add(asMethod); } if (((attrs & BindingFlags.DeclaredOnly) == BindingFlags.Default) || ((attrs & BindingFlags.FlattenHierarchy) != BindingFlags.Default)) { foreach (MemberInfo info2 in scope.GetSuperType().GetMember(this.Name, attrs & ~BindingFlags.DeclaredOnly)) { if (info2.MemberType == MemberTypes.Method) { mems.Add(info2); } } } }
//Called when class is used as a base class. Need to give the same information as the type would, once this is compiled to IL. //However, bindingAttr is ignored because this method is never legitimately called by something other than the compiler. public override MemberInfo[] GetMembers(BindingFlags bindingAttr) { MemberInfoList mems = new MemberInfoList(); IEnumerator enu = this.field_table.GetEnumerator(); while (enu.MoveNext()) { FieldInfo field = (FieldInfo)enu.Current; if (field.IsLiteral && field is JSMemberField) { Object val = null; if ((val = ((JSMemberField)field).value) is FunctionObject) { if (((FunctionObject)val).isConstructor) { continue; //Suppress constructors, they are awkward to handle. The compiler always obtains them via GetConstructor } ((JSMemberField)field).AddOverloadedMembers(mems, this, BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static | BindingFlags.DeclaredOnly); } else if (val is JSProperty) { mems.Add((MemberInfo)val); } else { mems.Add(field); } } else { mems.Add(field); } } if (this.parent != null) //Add any members found on the prototype { mems.AddRange(this.parent.GetMembers(bindingAttr)); } return(mems.ToArray()); }
internal TypeReflector(Type type) : base(null){ this.defaultMembers = null; SimpleHashtable staticMembers = new SimpleHashtable(256); foreach (MemberInfo member in type.GetMembers(BindingFlags.Public|BindingFlags.Static|BindingFlags.FlattenHierarchy)){ String name = member.Name; Object ob = staticMembers[name]; if (ob == null) staticMembers[name] = member; //Avoid allocating an array until needed else if (ob is MemberInfo){ MemberInfoList mems = new MemberInfoList(); //Allocate a flexarray of MemberInfo, and turn it into a fixed array when GetMember is called for this name mems.Add((MemberInfo)ob); mems.Add(member); staticMembers[name] = mems; }else ((MemberInfoList)ob).Add(member); } this.staticMembers = staticMembers; SimpleHashtable instanceMembers = new SimpleHashtable(256); foreach (MemberInfo member in type.GetMembers(BindingFlags.Public|BindingFlags.Instance)){ String name = member.Name; Object ob = instanceMembers[name]; if (ob == null) instanceMembers[name] = member; //Avoid allocating an array until needed else if (ob is MemberInfo){ MemberInfoList mems = new MemberInfoList(); mems.Add((MemberInfo)ob); mems.Add(member); instanceMembers[name] = mems; }else ((MemberInfoList)ob).Add(member); } this.instanceMembers = instanceMembers; this.memberInfos = new MemberInfo[staticMembers.count+instanceMembers.count][]; this.count = 0; this.type = type; this.implementsIReflect = null; this.hashCode = (uint)type.GetHashCode(); this.next = null; }
public override MemberInfo[] GetMembers(BindingFlags bindingAttr) { MemberInfoList mems = new MemberInfoList(); IEnumerator enumerator = base.field_table.GetEnumerator(); while (enumerator.MoveNext()) { FieldInfo current = (FieldInfo)enumerator.Current; if (current.IsLiteral && (current is JSMemberField)) { object obj2 = null; if ((obj2 = ((JSMemberField)current).value) is FunctionObject) { if (!((FunctionObject)obj2).isConstructor) { ((JSMemberField)current).AddOverloadedMembers(mems, this, BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Static | BindingFlags.Instance | BindingFlags.DeclaredOnly); } } else if (obj2 is JSProperty) { mems.Add((MemberInfo)obj2); } else { mems.Add(current); } } else { mems.Add(current); } } if (base.parent != null) { mems.AddRange(base.parent.GetMembers(bindingAttr)); } return(mems.ToArray()); }
public override MemberInfo[] GetMembers(BindingFlags bindingAttr) { if (this.recursive) { return new MemberInfo[0]; } MemberInfoList list = new MemberInfoList(); if (this.isComponentScope) { MemberInfo[] members = Globals.TypeRefs.ToReferenceContext(base.GetType()).GetMembers(bindingAttr | BindingFlags.DeclaredOnly); if (members != null) { foreach (MemberInfo info in members) { list.Add(info); } } } else { if (this.componentScopes != null) { int num = 0; int count = this.componentScopes.Count; while (num < count) { GlobalScope scope = (GlobalScope) this.componentScopes[num]; this.recursive = true; MemberInfo[] infoArray2 = null; try { infoArray2 = scope.GetMembers(bindingAttr); } finally { this.recursive = false; } if (infoArray2 != null) { foreach (MemberInfo info2 in infoArray2) { list.Add(info2); } } num++; } } IEnumerator enumerator = base.field_table.GetEnumerator(); while (enumerator.MoveNext()) { FieldInfo current = (FieldInfo) enumerator.Current; list.Add(current); } } if ((base.parent != null) && (this.isComponentScope || ((bindingAttr & BindingFlags.DeclaredOnly) == BindingFlags.Default))) { this.recursive = true; MemberInfo[] infoArray3 = null; try { infoArray3 = base.parent.GetMembers(bindingAttr); } finally { this.recursive = false; } if (infoArray3 != null) { foreach (MemberInfo info4 in infoArray3) { list.Add(info4); } } } return list.ToArray(); }
internal static MemberInfo[] GetInterfaceMembers(String name, Type t){ BindingFlags flags = BindingFlags.Public|BindingFlags.Instance|BindingFlags.Static|BindingFlags.DeclaredOnly; MemberInfo[] members = t.GetMember(name, flags); Type[] baseInts = t.GetInterfaces(); if (baseInts == null || baseInts.Length == 0) return members; ArrayList baseInterfaces = new ArrayList(baseInts); MemberInfoList result = new MemberInfoList(); result.AddRange(members); for (int i = 0; i < baseInterfaces.Count; i++){ Type bi = (Type)baseInterfaces[i]; members = bi.GetMember(name, flags); if (members != null) result.AddRange(members); foreach (Type bbi in bi.GetInterfaces()){ if (baseInterfaces.IndexOf(bbi) == -1) baseInterfaces.Add(bbi); } } return result.ToArray(); }
internal TypeReflector(Type type) : base(null) { this.defaultMembers = null; ArrayList list = new ArrayList(0x200); int num = 0; SimpleHashtable hashtable = new SimpleHashtable(0x100); foreach (MemberInfo info in type.GetMembers(BindingFlags.FlattenHierarchy | BindingFlags.Public | BindingFlags.Static)) { string name = info.Name; object obj2 = hashtable[name]; if (obj2 == null) { hashtable[name] = num++; list.Add(info); } else { int num2 = (int)obj2; obj2 = list[num2]; MemberInfo elem = obj2 as MemberInfo; if (elem != null) { MemberInfoList list2 = new MemberInfoList(); list2.Add(elem); list2.Add(info); list[num2] = list2; } else { ((MemberInfoList)obj2).Add(info); } } } this.staticMembers = hashtable; SimpleHashtable hashtable2 = new SimpleHashtable(0x100); foreach (MemberInfo info3 in type.GetMembers(BindingFlags.Public | BindingFlags.Instance)) { string str2 = info3.Name; object obj3 = hashtable2[str2]; if (obj3 == null) { hashtable2[str2] = num++; list.Add(info3); } else { int num3 = (int)obj3; obj3 = list[num3]; MemberInfo info4 = obj3 as MemberInfo; if (info4 != null) { MemberInfoList list3 = new MemberInfoList(); list3.Add(info4); list3.Add(info3); list[num3] = list3; } else { ((MemberInfoList)obj3).Add(info3); } } } this.instanceMembers = hashtable2; this.memberLookupTable = list; this.memberInfos = new MemberInfo[num][]; this.type = type; this.implementsIReflect = null; this.is__ComObject = null; this.hashCode = (uint)type.GetHashCode(); this.next = null; }
internal static MemberInfo[] GetInterfaceMembers(string name, Type t) { BindingFlags bindingAttr = BindingFlags.Public | BindingFlags.Static | BindingFlags.Instance | BindingFlags.DeclaredOnly; MemberInfo[] member = t.GetMember(name, bindingAttr); Type[] interfaces = t.GetInterfaces(); if ((interfaces == null) || (interfaces.Length == 0)) { return member; } ArrayList list = new ArrayList(interfaces); MemberInfoList list2 = new MemberInfoList(); list2.AddRange(member); for (int i = 0; i < list.Count; i++) { Type type = (Type) list[i]; member = type.GetMember(name, bindingAttr); if (member != null) { list2.AddRange(member); } foreach (Type type2 in type.GetInterfaces()) { if (list.IndexOf(type2) == -1) { list.Add(type2); } } } return list2.ToArray(); }
public override MemberInfo[] GetMembers(BindingFlags bindingAttr){ if (this.recursive) return new MemberInfo[0]; MemberInfoList result = new MemberInfoList(); if (this.isComponentScope){ MemberInfo[] mems = this.GetType().GetMembers(bindingAttr | BindingFlags.DeclaredOnly); if (mems != null) foreach (MemberInfo mem in mems) result.Add(mem); }else{ if (this.componentScopes != null){ for (int i = 0, n = this.componentScopes.Count; i < n; i++){ GlobalScope sc = (GlobalScope)this.componentScopes[i]; this.recursive = true; MemberInfo[] mems = null; try{ mems = sc.GetMembers(bindingAttr); }finally{ this.recursive = false; } if (mems != null) foreach (MemberInfo mem in mems) result.Add(mem); } } IEnumerator enu = this.field_table.GetEnumerator(); while (enu.MoveNext()){ FieldInfo field = (FieldInfo)enu.Current; result.Add(field); } } if (this.parent != null && (this.isComponentScope || ((bindingAttr & BindingFlags.DeclaredOnly) == 0)) ){ this.recursive = true; MemberInfo[] mems = null; try{ mems = ((ScriptObject)this.parent).GetMembers(bindingAttr); }finally{ this.recursive = false; } if (mems != null) foreach (MemberInfo mem in mems) result.Add(mem); } return result.ToArray(); }
internal ListIter(MemberInfoList list) { current = list.Head; }
public override MemberInfo[] GetMember(String name, BindingFlags bindingAttr) { MemberInfoList mems = new MemberInfoList(); FieldInfo field = (FieldInfo)(this.name_table[name]); if (field != null) { if (field.IsPublic) { if ((bindingAttr & BindingFlags.Public) == 0) { goto parent; } } else { if ((bindingAttr & BindingFlags.NonPublic) == 0) { goto parent; } } if (field.IsLiteral) { Object val = ((JSMemberField)field).value; if (val is FunctionObject) { FunctionObject func = (FunctionObject)val; if (func.isConstructor) { return(new MemberInfo[0]); //Suppress constructors, they are awkward to handle. The compiler always obtains them via GetConstructor } if (func.isExpandoMethod) { if ((bindingAttr & BindingFlags.Instance) == 0) { goto parent; } mems.Add(field); } else { ((JSMemberField)field).AddOverloadedMembers(mems, this, bindingAttr | BindingFlags.DeclaredOnly); } goto parent; } else if (val is JSProperty) { JSProperty prop = (JSProperty)val; MethodInfo getterOrSetter = prop.getter != null ? prop.getter : prop.setter; if (getterOrSetter.IsStatic) { if ((bindingAttr & BindingFlags.Static) == 0) { goto parent; } } else { if ((bindingAttr & BindingFlags.Instance) == 0) { goto parent; } } mems.Add(prop); goto parent; } else if (val is ClassScope) { if ((bindingAttr & BindingFlags.Instance) != 0) { if (!((ClassScope)val).owner.isStatic) { mems.Add(field); goto parent; } } } } if (field.IsStatic) { if ((bindingAttr & BindingFlags.Static) == 0) { goto parent; } } else { if ((bindingAttr & BindingFlags.Instance) == 0) { goto parent; } } mems.Add(field); } parent: if (this.owner != null && this.owner.isInterface && ((bindingAttr & BindingFlags.DeclaredOnly) == 0)) { return(this.owner.GetInterfaceMember(name)); } if (this.parent != null && ((bindingAttr & BindingFlags.DeclaredOnly) == 0)) //Add any members found on the superclass { MemberInfo[] supMembers = this.parent.GetMember(name, bindingAttr); if (supMembers != null) { foreach (MemberInfo mem in supMembers) { if (mem.MemberType == MemberTypes.Field) { field = (FieldInfo)mem; if (!field.IsStatic && !field.IsLiteral && !(field is JSWrappedField)) { field = new JSWrappedField(field, this.parent); } mems.Add(field); } else { mems.Add(ScriptObject.WrapMember(mem, this.parent)); } } } } return(mems.ToArray()); }
public override MemberInfo[] GetMembers(BindingFlags bindingAttr) { if (this.recursive) { return(new MemberInfo[0]); } MemberInfoList result = new MemberInfoList(); if (this.isComponentScope) { MemberInfo[] mems = Globals.TypeRefs.ToReferenceContext(this.GetType()).GetMembers(bindingAttr | BindingFlags.DeclaredOnly); if (mems != null) { foreach (MemberInfo mem in mems) { result.Add(mem); } } } else { if (this.componentScopes != null) { for (int i = 0, n = this.componentScopes.Count; i < n; i++) { GlobalScope sc = (GlobalScope)this.componentScopes[i]; this.recursive = true; MemberInfo[] mems = null; try { mems = sc.GetMembers(bindingAttr); } finally { this.recursive = false; } if (mems != null) { foreach (MemberInfo mem in mems) { result.Add(mem); } } } } IEnumerator enu = this.field_table.GetEnumerator(); while (enu.MoveNext()) { FieldInfo field = (FieldInfo)enu.Current; result.Add(field); } } if (this.parent != null && (this.isComponentScope || ((bindingAttr & BindingFlags.DeclaredOnly) == 0))) { this.recursive = true; MemberInfo[] mems = null; try { mems = ((ScriptObject)this.parent).GetMembers(bindingAttr); } finally { this.recursive = false; } if (mems != null) { foreach (MemberInfo mem in mems) { result.Add(mem); } } } return(result.ToArray()); }
internal ChainHash(int size) { bucket = new MemberInfoList [size]; for (int i = 0; i < size; i++) bucket [i] = new MemberInfoList (); }
//Called when class is used as a base class. Need to give the same information as the type would, once this is compiled to IL. //However, bindingAttr is ignored because this method is never legitimately called by something other than the compiler. public override MemberInfo[] GetMembers(BindingFlags bindingAttr){ MemberInfoList mems = new MemberInfoList(); IEnumerator enu = this.field_table.GetEnumerator(); while (enu.MoveNext()){ FieldInfo field = (FieldInfo)enu.Current; if (field.IsLiteral && field is JSMemberField){ Object val = null; if ((val = ((JSMemberField)field).value) is FunctionObject){ if (((FunctionObject)val).isConstructor) continue; //Suppress constructors, they are awkward to handle. The compiler always obtains them via GetConstructor ((JSMemberField)field).AddOverloadedMembers(mems, this, BindingFlags.Public|BindingFlags.NonPublic|BindingFlags.Instance|BindingFlags.Static|BindingFlags.DeclaredOnly); }else if (val is JSProperty){ mems.Add((MemberInfo)val); }else mems.Add(field); }else mems.Add(field); } if (this.parent != null) //Add any members found on the prototype mems.AddRange(this.parent.GetMembers(bindingAttr)); return mems.ToArray(); }
public override MemberInfo[] GetMembers(BindingFlags bindingAttr) { MemberInfoList mems = new MemberInfoList(); IEnumerator enumerator = base.field_table.GetEnumerator(); while (enumerator.MoveNext()) { FieldInfo current = (FieldInfo) enumerator.Current; if (current.IsLiteral && (current is JSMemberField)) { object obj2 = null; if ((obj2 = ((JSMemberField) current).value) is FunctionObject) { if (!((FunctionObject) obj2).isConstructor) { ((JSMemberField) current).AddOverloadedMembers(mems, this, BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Static | BindingFlags.Instance | BindingFlags.DeclaredOnly); } } else if (obj2 is JSProperty) { mems.Add((MemberInfo) obj2); } else { mems.Add(current); } } else { mems.Add(current); } } if (base.parent != null) { mems.AddRange(base.parent.GetMembers(bindingAttr)); } return mems.ToArray(); }
public override MemberInfo[] GetMembers(BindingFlags bindingAttr){ MemberInfoList mems = new MemberInfoList(); SimpleHashtable uniqueMems = new SimpleHashtable(32); if (!this.noExpando && this.field_table != null){ //Add any expando properties IEnumerator enu = this.field_table.GetEnumerator(); while (enu.MoveNext()){ FieldInfo field = (FieldInfo)enu.Current; mems.Add(field); uniqueMems[field.Name] = field; } } //Add the public members of the built-in objects if they don't already exist if (this.isASubClass){ MemberInfo[] ilMembers = this.GetType().GetMembers(bindingAttr & ~BindingFlags.NonPublic); //Never expose non public members of old style objects for (int i = 0, n = ilMembers.Length; i < n; i++){ MemberInfo ilMem = ilMembers[i]; //Hide any infrastructure stuff in JSObject if (!ilMem.DeclaringType.IsAssignableFrom(Typeob.JSObject) && uniqueMems[ilMem.Name] == null){ MethodInfo method = ilMem as MethodInfo; if (method == null || !method.IsSpecialName){ mems.Add(ilMem); uniqueMems[ilMem.Name] = ilMem; } } } } //Add parent members if they don't already exist if (this.parent != null){ SimpleHashtable cache = this.parent.wrappedMemberCache; if (cache == null) cache = this.parent.wrappedMemberCache = new SimpleHashtable(8); MemberInfo[] parentMems = ScriptObject.WrapMembers(((IReflect)this.parent).GetMembers(bindingAttr & ~BindingFlags.NonPublic), this.parent, cache); for(int i = 0, n = parentMems.Length; i < n; i++){ MemberInfo parentMem = parentMems[i]; if(uniqueMems[parentMem.Name] == null){ mems.Add(parentMem); //uniqueMems[parentMem.Name] = parentMem; //No need to add to lookup table - no one else will be looking. } } } return mems.ToArray(); }
public override MemberInfo[] GetMembers(BindingFlags bindingAttr) { if (this.recursive) { return(new MemberInfo[0]); } MemberInfoList list = new MemberInfoList(); if (this.isComponentScope) { MemberInfo[] members = Globals.TypeRefs.ToReferenceContext(base.GetType()).GetMembers(bindingAttr | BindingFlags.DeclaredOnly); if (members != null) { foreach (MemberInfo info in members) { list.Add(info); } } } else { if (this.componentScopes != null) { int num = 0; int count = this.componentScopes.Count; while (num < count) { GlobalScope scope = (GlobalScope)this.componentScopes[num]; this.recursive = true; MemberInfo[] infoArray2 = null; try { infoArray2 = scope.GetMembers(bindingAttr); } finally { this.recursive = false; } if (infoArray2 != null) { foreach (MemberInfo info2 in infoArray2) { list.Add(info2); } } num++; } } IEnumerator enumerator = base.field_table.GetEnumerator(); while (enumerator.MoveNext()) { FieldInfo current = (FieldInfo)enumerator.Current; list.Add(current); } } if ((base.parent != null) && (this.isComponentScope || ((bindingAttr & BindingFlags.DeclaredOnly) == BindingFlags.Default))) { this.recursive = true; MemberInfo[] infoArray3 = null; try { infoArray3 = base.parent.GetMembers(bindingAttr); } finally { this.recursive = false; } if (infoArray3 != null) { foreach (MemberInfo info4 in infoArray3) { list.Add(info4); } } } return(list.ToArray()); }
//Returns a list of member infos that are sorted by declaring type. Superclass members always follow derived class members. private MemberInfoList GetAllKnownInstanceBindingsForThisName(){ IReflect[] classes = this.GetAllEligibleClasses(); MemberInfoList result = new MemberInfoList(); foreach (IReflect c in classes){ if (c is ClassScope){ if (((ClassScope)c).ParentIsInSamePackage()) result.AddRange(c.GetMember(name, BindingFlags.Public|BindingFlags.NonPublic|BindingFlags.Instance|BindingFlags.DeclaredOnly)); else result.AddRange(c.GetMember(name, BindingFlags.Public|BindingFlags.NonPublic|BindingFlags.Instance)); }else result.AddRange(c.GetMember(name, BindingFlags.Public|BindingFlags.Instance)); } return result; }
internal TypeReflector(Type type) : base(null) { this.defaultMembers = null; ArrayList list = new ArrayList(0x200); int num = 0; SimpleHashtable hashtable = new SimpleHashtable(0x100); foreach (MemberInfo info in type.GetMembers(BindingFlags.FlattenHierarchy | BindingFlags.Public | BindingFlags.Static)) { string name = info.Name; object obj2 = hashtable[name]; if (obj2 == null) { hashtable[name] = num++; list.Add(info); } else { int num2 = (int) obj2; obj2 = list[num2]; MemberInfo elem = obj2 as MemberInfo; if (elem != null) { MemberInfoList list2 = new MemberInfoList(); list2.Add(elem); list2.Add(info); list[num2] = list2; } else { ((MemberInfoList) obj2).Add(info); } } } this.staticMembers = hashtable; SimpleHashtable hashtable2 = new SimpleHashtable(0x100); foreach (MemberInfo info3 in type.GetMembers(BindingFlags.Public | BindingFlags.Instance)) { string str2 = info3.Name; object obj3 = hashtable2[str2]; if (obj3 == null) { hashtable2[str2] = num++; list.Add(info3); } else { int num3 = (int) obj3; obj3 = list[num3]; MemberInfo info4 = obj3 as MemberInfo; if (info4 != null) { MemberInfoList list3 = new MemberInfoList(); list3.Add(info4); list3.Add(info3); list[num3] = list3; } else { ((MemberInfoList) obj3).Add(info3); } } } this.instanceMembers = hashtable2; this.memberLookupTable = list; this.memberInfos = new MemberInfo[num][]; this.type = type; this.implementsIReflect = null; this.is__ComObject = null; this.hashCode = (uint) type.GetHashCode(); this.next = null; }
public override MemberInfo[] GetMember(String name, BindingFlags bindingAttr){ MemberInfoList mems = new MemberInfoList(); FieldInfo field = (FieldInfo)(this.name_table[name]); if (field != null){ if (field.IsPublic){ if ((bindingAttr & BindingFlags.Public) == 0) goto parent; }else{ if ((bindingAttr & BindingFlags.NonPublic) == 0) goto parent; } if (field.IsLiteral){ Object val = ((JSMemberField)field).value; if (val is FunctionObject){ FunctionObject func = (FunctionObject)val; if (func.isConstructor) return new MemberInfo[0]; //Suppress constructors, they are awkward to handle. The compiler always obtains them via GetConstructor if (func.isExpandoMethod){ if ((bindingAttr & BindingFlags.Instance) == 0) goto parent; mems.Add(field); }else ((JSMemberField)field).AddOverloadedMembers(mems, this, bindingAttr|BindingFlags.DeclaredOnly); goto parent; }else if (val is JSProperty){ JSProperty prop = (JSProperty)val; MethodInfo getterOrSetter = prop.getter != null ? prop.getter : prop.setter; if (getterOrSetter.IsStatic){ if ((bindingAttr & BindingFlags.Static) == 0) goto parent; }else{ if ((bindingAttr & BindingFlags.Instance) == 0) goto parent; } mems.Add(prop); goto parent; }else if (val is ClassScope){ if ((bindingAttr & BindingFlags.Instance) != 0){ if (!((ClassScope)val).owner.isStatic){ mems.Add(field); goto parent; } } } } if (field.IsStatic){ if ((bindingAttr & BindingFlags.Static) == 0) goto parent; }else{ if ((bindingAttr & BindingFlags.Instance) == 0) goto parent; } mems.Add(field); } parent: if (this.owner != null && this.owner.isInterface && ((bindingAttr & BindingFlags.DeclaredOnly) == 0)) return this.owner.GetInterfaceMember(name); if (this.parent != null && ((bindingAttr & BindingFlags.DeclaredOnly) == 0)){ //Add any members found on the superclass MemberInfo[] supMembers = this.parent.GetMember(name, bindingAttr); if (supMembers != null) foreach (MemberInfo mem in supMembers){ if (mem.MemberType == MemberTypes.Field){ field = (FieldInfo)mem; if (!field.IsStatic && !field.IsLiteral && !(field is JSWrappedField)) field = new JSWrappedField(field, this.parent); mems.Add(field); }else mems.Add(ScriptObject.WrapMember(mem, this.parent)); } } return mems.ToArray(); }
public override MemberInfo[] GetMember(string name, BindingFlags bindingAttr) { MemberInfoList mems = new MemberInfoList(); FieldInfo elem = (FieldInfo)base.name_table[name]; if (elem == null) { goto Label_0139; } if (elem.IsPublic) { if ((bindingAttr & BindingFlags.Public) != BindingFlags.Default) { goto Label_0040; } goto Label_0139; } if ((bindingAttr & BindingFlags.NonPublic) == BindingFlags.Default) { goto Label_0139; } Label_0040: if (!elem.IsLiteral) { goto Label_011E; } object obj2 = ((JSMemberField)elem).value; if (obj2 is FunctionObject) { FunctionObject obj3 = (FunctionObject)obj2; if (obj3.isConstructor) { return(new MemberInfo[0]); } if (obj3.isExpandoMethod) { if ((bindingAttr & BindingFlags.Instance) != BindingFlags.Default) { mems.Add(elem); } } else { ((JSMemberField)elem).AddOverloadedMembers(mems, this, bindingAttr | BindingFlags.DeclaredOnly); } goto Label_0139; } if (!(obj2 is JSProperty)) { if (((obj2 is ClassScope) && ((bindingAttr & BindingFlags.Instance) != BindingFlags.Default)) && !((ClassScope)obj2).owner.isStatic) { mems.Add(elem); goto Label_0139; } goto Label_011E; } JSProperty property = (JSProperty)obj2; MethodInfo info2 = (property.getter != null) ? property.getter : property.setter; if (info2.IsStatic) { if ((bindingAttr & BindingFlags.Static) != BindingFlags.Default) { goto Label_00EC; } goto Label_0139; } if ((bindingAttr & BindingFlags.Instance) == BindingFlags.Default) { goto Label_0139; } Label_00EC: mems.Add(property); goto Label_0139; Label_011E: if (elem.IsStatic) { if ((bindingAttr & BindingFlags.Static) != BindingFlags.Default) { goto Label_0132; } goto Label_0139; } if ((bindingAttr & BindingFlags.Instance) == BindingFlags.Default) { goto Label_0139; } Label_0132: mems.Add(elem); Label_0139: if (((this.owner != null) && this.owner.isInterface) && ((bindingAttr & BindingFlags.DeclaredOnly) == BindingFlags.Default)) { return(this.owner.GetInterfaceMember(name)); } if ((base.parent != null) && ((bindingAttr & BindingFlags.DeclaredOnly) == BindingFlags.Default)) { MemberInfo[] member = base.parent.GetMember(name, bindingAttr); if (member != null) { foreach (MemberInfo info3 in member) { if (info3.MemberType == MemberTypes.Field) { elem = (FieldInfo)info3; if ((!elem.IsStatic && !elem.IsLiteral) && !(elem is JSWrappedField)) { elem = new JSWrappedField(elem, base.parent); } mems.Add(elem); } else { mems.Add(ScriptObject.WrapMember(info3, base.parent)); } } } } return(mems.ToArray()); }
internal TypeReflector(Type type) : base(null) { this.defaultMembers = null; ArrayList memberLookupTable = new ArrayList(512); int count = 0; SimpleHashtable staticMembers = new SimpleHashtable(256); foreach (MemberInfo member in type.GetMembers(BindingFlags.Public | BindingFlags.Static | BindingFlags.FlattenHierarchy)) { String name = member.Name; Object ob = staticMembers[name]; if (ob == null) { staticMembers[name] = count++; //Avoid allocating an array until needed memberLookupTable.Add(member); } else { int index = (int)ob; ob = memberLookupTable[index]; MemberInfo firstMember = ob as MemberInfo; if (firstMember != null) { MemberInfoList mems = new MemberInfoList(); //Allocate a flexarray of MemberInfo, and turn it into a fixed array when GetMember is called for this name mems.Add(firstMember); mems.Add(member); memberLookupTable[index] = mems; } else { ((MemberInfoList)ob).Add(member); } } } this.staticMembers = staticMembers; SimpleHashtable instanceMembers = new SimpleHashtable(256); foreach (MemberInfo member in type.GetMembers(BindingFlags.Public | BindingFlags.Instance)) { String name = member.Name; Object ob = instanceMembers[name]; if (ob == null) { instanceMembers[name] = count++; //Avoid allocating an array until needed memberLookupTable.Add(member); } else { int index = (int)ob; ob = memberLookupTable[index]; MemberInfo firstMember = ob as MemberInfo; if (firstMember != null) { MemberInfoList mems = new MemberInfoList(); mems.Add(firstMember); mems.Add(member); memberLookupTable[index] = mems; } else { ((MemberInfoList)ob).Add(member); } } } this.instanceMembers = instanceMembers; this.memberLookupTable = memberLookupTable; this.memberInfos = new MemberInfo[count][]; this.type = type; this.implementsIReflect = null; this.hashCode = (uint)type.GetHashCode(); this.next = null; }
public override MemberInfo[] GetMember(string name, BindingFlags bindingAttr) { MemberInfoList mems = new MemberInfoList(); FieldInfo elem = (FieldInfo) base.name_table[name]; if (elem == null) { goto Label_0139; } if (elem.IsPublic) { if ((bindingAttr & BindingFlags.Public) != BindingFlags.Default) { goto Label_0040; } goto Label_0139; } if ((bindingAttr & BindingFlags.NonPublic) == BindingFlags.Default) { goto Label_0139; } Label_0040: if (!elem.IsLiteral) { goto Label_011E; } object obj2 = ((JSMemberField) elem).value; if (obj2 is FunctionObject) { FunctionObject obj3 = (FunctionObject) obj2; if (obj3.isConstructor) { return new MemberInfo[0]; } if (obj3.isExpandoMethod) { if ((bindingAttr & BindingFlags.Instance) != BindingFlags.Default) { mems.Add(elem); } } else { ((JSMemberField) elem).AddOverloadedMembers(mems, this, bindingAttr | BindingFlags.DeclaredOnly); } goto Label_0139; } if (!(obj2 is JSProperty)) { if (((obj2 is ClassScope) && ((bindingAttr & BindingFlags.Instance) != BindingFlags.Default)) && !((ClassScope) obj2).owner.isStatic) { mems.Add(elem); goto Label_0139; } goto Label_011E; } JSProperty property = (JSProperty) obj2; MethodInfo info2 = (property.getter != null) ? property.getter : property.setter; if (info2.IsStatic) { if ((bindingAttr & BindingFlags.Static) != BindingFlags.Default) { goto Label_00EC; } goto Label_0139; } if ((bindingAttr & BindingFlags.Instance) == BindingFlags.Default) { goto Label_0139; } Label_00EC: mems.Add(property); goto Label_0139; Label_011E: if (elem.IsStatic) { if ((bindingAttr & BindingFlags.Static) != BindingFlags.Default) { goto Label_0132; } goto Label_0139; } if ((bindingAttr & BindingFlags.Instance) == BindingFlags.Default) { goto Label_0139; } Label_0132: mems.Add(elem); Label_0139: if (((this.owner != null) && this.owner.isInterface) && ((bindingAttr & BindingFlags.DeclaredOnly) == BindingFlags.Default)) { return this.owner.GetInterfaceMember(name); } if ((base.parent != null) && ((bindingAttr & BindingFlags.DeclaredOnly) == BindingFlags.Default)) { MemberInfo[] member = base.parent.GetMember(name, bindingAttr); if (member != null) { foreach (MemberInfo info3 in member) { if (info3.MemberType == MemberTypes.Field) { elem = (FieldInfo) info3; if ((!elem.IsStatic && !elem.IsLiteral) && !(elem is JSWrappedField)) { elem = new JSWrappedField(elem, base.parent); } mems.Add(elem); } else { mems.Add(ScriptObject.WrapMember(info3, base.parent)); } } } } return mems.ToArray(); }