static int rb_objc_yield_classes(VALUE of) { const int count = objc_getClassList(NULL, 0); assert(count > 0); Class *buf = (Class *)alloca(sizeof(Class) * count); objc_getClassList(buf, count); const bool only_modules = of == rb_cModule; int rcount = 0; for (int i = 0; i < count; i++) { Class k = buf[i]; if (class_getName(k)[0] == '_') { continue; } if (only_modules) { if (!RCLASS_MODULE(k)) { continue; } } else { bool nsobject_based = false; Class sk = k; do { sk = (Class)RCLASS_SUPER(sk); if (sk == (Class)rb_cNSObject) { nsobject_based = true; break; } } while (sk != NULL); if (!nsobject_based) { continue; } } rb_yield((VALUE)k); RETURN_IF_BROKEN(); rcount++; } return rcount; }
static int rb_objc_yield_classes(VALUE of) { int i, count, rcount; Class *buf; count = objc_getClassList(NULL, 0); assert(count > 0); buf = (Class *)alloca(sizeof(Class) * count); objc_getClassList(buf, count); for (i = rcount = 0; i < count; i++) { Class sk, k = buf[i]; bool nsobject_based; if (class_getName(k)[0] == '_') continue; if (of == rb_cModule && !RCLASS_MODULE(k)) continue; nsobject_based = false; sk = k; do { sk = (Class)RCLASS_SUPER(sk); if (sk == (Class)rb_cNSObject) { nsobject_based = true; break; } } while (sk != NULL); if (nsobject_based) { rb_yield((VALUE)k); RETURN_IF_BROKEN(); rcount++; } } return rcount; }
bool Update() { // TODO: find out if class list has changed and update if needed if (m_objc_class_ptrs == NULL) { m_size = objc_getClassList(NULL, 0); if (m_size > 0) { // Allocate the class pointers m_objc_class_ptrs = (Class *)safe_malloc (m_size * sizeof(Class)); m_size = objc_getClassList(m_objc_class_ptrs, m_size); // Sort Class pointers for quick lookup ::qsort (m_objc_class_ptrs, m_size, sizeof(Class), compare_void_ptr); } else return false; } return true; }