Example #1
0
File: gc.c Project: 1nueve/MacRuby
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;
}
Example #2
0
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;
}
Example #3
0
 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;
 }