[macruby-changes] [4153] MacRuby/trunk

source_changes at macosforge.org source_changes at macosforge.org
Tue May 25 17:28:21 PDT 2010


Revision: 4153
          http://trac.macosforge.org/projects/ruby/changeset/4153
Author:   lsansonetti at apple.com
Date:     2010-05-25 17:28:19 -0700 (Tue, 25 May 2010)
Log Message:
-----------
a more efficient class flags mechanism, reduced the number of default slots in RubyObjects to 4, misc fixes

Modified Paths:
--------------
    MacRuby/trunk/class.c
    MacRuby/trunk/class.h
    MacRuby/trunk/eval.c
    MacRuby/trunk/object.c
    MacRuby/trunk/vm.cpp
    MacRuby/trunk/vm.h

Modified: MacRuby/trunk/class.c
===================================================================
--- MacRuby/trunk/class.c	2010-05-26 00:19:26 UTC (rev 4152)
+++ MacRuby/trunk/class.c	2010-05-26 00:28:19 UTC (rev 4153)
@@ -42,7 +42,7 @@
 rb_obj_imp_allocWithZone(void *rcv, SEL sel, void *zone)
 {
     // XXX honor zone?
-    return (void *)rb_robject_allocate_instance((VALUE)rcv);
+    return (void *)rb_vm_new_rb_object((VALUE)rcv);
 }
 
 static void *
@@ -1253,32 +1253,14 @@
     return 0;
 }
 
-static void *rb_class_flags_key = NULL;
+rb_class_flags_cache_t *rb_class_flags;
 
-static unsigned long
-rb_class_get_mask(Class k)
-{
-    return (unsigned long)rb_objc_get_associative_ref(k, &rb_class_flags_key);
-}
-
-static void
-rb_class_set_mask(Class k, unsigned long mask)
-{
-    rb_objc_set_associative_ref(k, &rb_class_flags_key, (void *)mask);
-}
-
-#define RCLASS_MASK_TYPE_SHIFT 16
-
-unsigned long
-rb_class_get_flags(Class k)
-{
-    return rb_class_get_mask(k) >> RCLASS_MASK_TYPE_SHIFT;
-}
-
 void
-rb_class_set_flags(Class k, unsigned long flags)
+Init_PreClass(void)
 {
-    rb_class_set_mask(k, flags << RCLASS_MASK_TYPE_SHIFT);
+    rb_class_flags = (rb_class_flags_cache_t *)calloc(CACHE_SIZE,
+	    sizeof(rb_class_flags_cache_t));
+    assert(rb_class_flags != NULL);
 }
 
 static int

Modified: MacRuby/trunk/class.h
===================================================================
--- MacRuby/trunk/class.h	2010-05-26 00:19:26 UTC (rev 4152)
+++ MacRuby/trunk/class.h	2010-05-26 00:28:19 UTC (rev 4153)
@@ -24,9 +24,75 @@
 #define RCLASS_SCOPE_MOD_FUNC	     (1<<14)  /* class opened for module_function methods */
 #define RCLASS_KVO_CHECK_DONE	     (1<<15)  /* class created by KVO and flags merged */
 
-unsigned long rb_class_get_flags(Class k);
-void rb_class_set_flags(Class k, unsigned long flags);
+typedef struct rb_class_flags_cache {
+    Class klass;
+    unsigned long value;
+    struct rb_class_flags_cache *next;
+} rb_class_flags_cache_t;
 
+#define CACHE_SIZE 0x1000
+
+extern rb_class_flags_cache_t *rb_class_flags;
+
+static unsigned int
+rb_class_flags_hash(Class k)
+{
+    return ((unsigned long)k >> 2) & (CACHE_SIZE - 1);
+}
+
+static inline unsigned long
+rb_class_get_mask(Class k)
+{
+    rb_class_flags_cache_t *e = &rb_class_flags[rb_class_flags_hash(k)];
+    while (e != NULL) {
+	if (e->klass == k) {
+	    return e->value;
+	}
+	e = e->next;
+    }
+    return 0;
+}
+
+static inline void
+rb_class_set_mask(Class k, unsigned long mask)
+{
+    rb_class_flags_cache_t *e = &rb_class_flags[rb_class_flags_hash(k)];
+again:
+    if (e->klass == k) {
+set_value:
+	e->value = mask;
+	return;
+    }
+    if (e->klass == 0) {
+	e->klass = k;
+	goto set_value;
+    }
+    if (e->next != NULL) {
+	e = e->next;
+	goto again;
+    }
+    rb_class_flags_cache_t *ne = (rb_class_flags_cache_t *)malloc(
+	    sizeof(rb_class_flags_cache_t));
+    ne->klass = k;
+    ne->value = mask;
+    ne->next = NULL;
+    e->next = ne;
+}
+
+#define RCLASS_MASK_TYPE_SHIFT 16
+
+static inline unsigned long
+rb_class_get_flags(Class k)
+{
+    return rb_class_get_mask(k) >> RCLASS_MASK_TYPE_SHIFT;
+}
+
+static inline void
+rb_class_set_flags(Class k, unsigned long flags)
+{
+    rb_class_set_mask(k, flags << RCLASS_MASK_TYPE_SHIFT);
+}
+
 #define RCLASS_VERSION(m) (rb_class_get_flags((Class)m))
 #define RCLASS_SET_VERSION(m,f) (rb_class_set_flags((Class)m, (unsigned long)f))
 #define RCLASS_SET_VERSION_FLAG(m,f) (RCLASS_SET_VERSION((Class)m, (RCLASS_VERSION(m) | f)))

Modified: MacRuby/trunk/eval.c
===================================================================
--- MacRuby/trunk/eval.c	2010-05-26 00:19:26 UTC (rev 4152)
+++ MacRuby/trunk/eval.c	2010-05-26 00:28:19 UTC (rev 4153)
@@ -39,6 +39,7 @@
 void Init_ext(void);
 void Init_PreGC(void);
 void Init_PreVM(void);
+void Init_PreClass(void);
 void Init_PreGCD(void);
 void Init_PreEncoding(void);
 
@@ -74,6 +75,7 @@
 	}
     }
 
+    Init_PreClass();	// requires nothing
     Init_PreGC(); 	// requires nothing
     Init_PreVM(); 	// requires nothing
     Init_PreGCD(); 	// requires nothing

Modified: MacRuby/trunk/object.c
===================================================================
--- MacRuby/trunk/object.c	2010-05-26 00:19:26 UTC (rev 4152)
+++ MacRuby/trunk/object.c	2010-05-26 00:28:19 UTC (rev 4153)
@@ -362,7 +362,7 @@
 	return (VALUE)objc_msgSend((id)obj, selCopy); 
     }
 
-    VALUE copy = rb_robject_allocate_instance(klass);
+    VALUE copy = rb_vm_new_rb_object(klass);
     rb_obj_init_copy(copy, 0, (VALUE)obj);
     return copy;
 }
@@ -1894,7 +1894,7 @@
 
     if ((RCLASS_VERSION(*(void **)klass) & RCLASS_HAS_ROBJECT_ALLOC) == RCLASS_HAS_ROBJECT_ALLOC) {
 	// Fast path!
-	return rb_robject_allocate_instance(klass);
+	return rb_vm_new_rb_object(klass);
     }
     return rb_vm_call_with_cache(allocCache, klass, selAlloc, 0, NULL);
 }

Modified: MacRuby/trunk/vm.cpp
===================================================================
--- MacRuby/trunk/vm.cpp	2010-05-26 00:19:26 UTC (rev 4152)
+++ MacRuby/trunk/vm.cpp	2010-05-26 00:28:19 UTC (rev 4153)
@@ -1022,7 +1022,7 @@
 		    sel_getName(sel));
 #endif
 	    assert(val != NULL);
-	    *(bool *)val = true;
+	    *(unsigned char *)val = 1;
 	}
     }
 
@@ -1039,8 +1039,8 @@
 	VALUE included_in_classes = rb_attr_get((VALUE)klass, 
 		idIncludedInClasses);
 	if (included_in_classes != Qnil) {
-	    int i, count = RARRAY_LEN(included_in_classes);
-	    for (i = 0; i < count; i++) {
+	    for (int i = 0, count = RARRAY_LEN(included_in_classes);
+		    i < count; i++) {
 		VALUE mod = RARRAY_AT(included_in_classes, i);
 #if ROXOR_VM_DEBUG
 		printf("forward %c[%s %s] with imp %p node %p types %s\n",
@@ -1781,7 +1781,7 @@
     if (iter == objc_to_ruby_stubs.end()) {
 	Function *objc_func = RoxorCompiler::shared->compile_objc_stub(func,
 		imp, arity, types);
-	objc_imp = compile(objc_func, false);
+	objc_imp = compile(objc_func);
 	objc_to_ruby_stubs[imp] = objc_imp;
     }
     else {
@@ -4695,8 +4695,8 @@
     url = CFBundleCopyResourcesDirectoryURL(bundle);
     *path = '-'; 
     *(path+1) = 'I';
-    assert(CFURLGetFileSystemRepresentation(
-		url, true, (UInt8 *)&path[2], len - 2));
+    assert(CFURLGetFileSystemRepresentation(url, true, (UInt8 *)&path[2],
+		len - 2));
     CFRelease(url);
 
     return path;

Modified: MacRuby/trunk/vm.h
===================================================================
--- MacRuby/trunk/vm.h	2010-05-26 00:19:26 UTC (rev 4152)
+++ MacRuby/trunk/vm.h	2010-05-26 00:28:19 UTC (rev 4153)
@@ -343,6 +343,8 @@
 #define SLOT_CACHE_VIRGIN	-2
 #define SLOT_CACHE_CANNOT	-1
 
+#define RB_OBJECT_DEFAULT_NUM_SLOTS	4
+
 typedef struct {
     struct RBasic basic;
     rb_object_ivar_slot_t *slots;
@@ -386,9 +388,9 @@
 }
 
 static inline VALUE
-rb_robject_allocate_instance(VALUE klass)
+rb_vm_new_rb_object(VALUE klass)
 {
-    const int num_slots = 10;
+    const int num_slots = RB_OBJECT_DEFAULT_NUM_SLOTS;
 
     rb_object_t *obj = (rb_object_t *)rb_objc_newobj(sizeof(rb_object_t));
     GC_WB(&obj->slots, xmalloc(sizeof(rb_object_ivar_slot_t) * num_slots));
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/macruby-changes/attachments/20100525/bd84f640/attachment.html>


More information about the macruby-changes mailing list