public static object EachObject(BlockParam block, RubyModule /*!*/ self, [NotNull] RubyClass /*!*/ theClass) { if (!theClass.HasAncestor(self.Context.ModuleClass)) { throw RubyExceptions.CreateRuntimeError("each_object only supported for objects of type Class or Module"); } if (block == null) { throw RubyExceptions.NoBlockGiven(); } int matches = 0; List <RubyModule> visitedModules = new List <RubyModule>(); Stack <RubyModule> pendingModules = new Stack <RubyModule>(); pendingModules.Push(theClass.Context.ObjectClass); while (pendingModules.Count > 0) { RubyModule next = pendingModules.Pop(); visitedModules.Add(next); if (theClass.Context.IsKindOf(next, theClass)) { matches++; object result; if (block.Yield(next, out result)) { return(result); } } using (theClass.Context.ClassHierarchyLocker()) { next.EnumerateConstants(delegate(RubyModule module, string name, object value) { RubyModule constAsModule = value as RubyModule; if (constAsModule != null && !visitedModules.Contains(constAsModule)) { pendingModules.Push(constAsModule); } return(false); }); } } return(matches); }
public static RubyArray /*!*/ GetDefinedConstants(RubyModule /*!*/ self, [DefaultParameterValue(true)] bool inherited) { var result = new RubyArray(); if (inherited) { var visited = new Dictionary <string, bool>(); bool hideGlobalConstants = !self.IsObjectClass; using (self.Context.ClassHierarchyLocker()) { self.ForEachConstant(true, delegate(RubyModule /*!*/ module, string name, object value) { if (name == null) { // terminate enumeration when Object is reached return(hideGlobalConstants && module.IsObjectClass); } if (!visited.ContainsKey(name)) { if (Tokenizer.IsConstantName(name)) { result.Add(self.Context.StringifyIdentifier(name)); } visited.Add(name, true); } return(false); }); } } else { using (self.Context.ClassHierarchyLocker()) { self.EnumerateConstants((module, name, value) => { if (Tokenizer.IsConstantName(name)) { result.Add(self.Context.StringifyIdentifier(name)); } return(false); }); } } return(result); }
public static object EachObject(BlockParam block, RubyModule /*!*/ self, [NotNull] RubyClass /*!*/ theClass) { Type classType = theClass.GetType(); bool isClass = (classType == typeof(RubyClass)); if (!isClass && classType != typeof(RubyModule)) { throw new NotSupportedException("each_object only supported for objects of type Class or Module"); } if (block == null) { throw RubyExceptions.NoBlockGiven(); } Dictionary <RubyModule, object> visited = new Dictionary <RubyModule, object>(); Stack <RubyModule> modules = new Stack <RubyModule>(); modules.Push(theClass.Context.ObjectClass); while (modules.Count > 0) { RubyModule next = modules.Pop(); RubyClass asClass = next as RubyClass; if (!isClass || asClass != null) { object result; if (block.Yield(next, out result)) { return(result); } } next.EnumerateConstants(delegate(RubyModule module, string name, object value) { RubyModule constAsModule = (value as RubyModule); if (constAsModule != null && !visited.ContainsKey(constAsModule)) { modules.Push(constAsModule); visited[module] = null; } return(false); }); } return(visited.Count); }
public static RubyArray/*!*/ GetDefinedConstants(RubyModule/*!*/ self, [DefaultParameterValue(true)]bool inherited) { var result = new RubyArray(); if (inherited) { var visited = new Dictionary<string, bool>(); bool hideGlobalConstants = !self.IsObjectClass; using (self.Context.ClassHierarchyLocker()) { self.ForEachConstant(true, delegate(RubyModule/*!*/ module, string name, object value) { if (name == null) { // terminate enumeration when Object is reached return hideGlobalConstants && module.IsObjectClass; } if (!visited.ContainsKey(name)) { if (Tokenizer.IsConstantName(name)) { result.Add(self.Context.StringifyIdentifier(name)); } visited.Add(name, true); } return false; }); } } else { using (self.Context.ClassHierarchyLocker()) { self.EnumerateConstants((module, name, value) => { if (Tokenizer.IsConstantName(name)) { result.Add(self.Context.StringifyIdentifier(name)); } return false; }); } } return result; }