[macruby-changes] [2777] MacRuby/trunk

source_changes at macosforge.org source_changes at macosforge.org
Fri Oct 9 19:38:26 PDT 2009


Revision: 2777
          http://trac.macosforge.org/projects/ruby/changeset/2777
Author:   lsansonetti at apple.com
Date:     2009-10-09 19:38:26 -0700 (Fri, 09 Oct 2009)
Log Message:
-----------
fixed bugs post KVO

Modified Paths:
--------------
    MacRuby/trunk/include/ruby/ruby.h
    MacRuby/trunk/objc.m
    MacRuby/trunk/variable.c

Modified: MacRuby/trunk/include/ruby/ruby.h
===================================================================
--- MacRuby/trunk/include/ruby/ruby.h	2009-10-10 00:23:24 UTC (rev 2776)
+++ MacRuby/trunk/include/ruby/ruby.h	2009-10-10 02:38:26 UTC (rev 2777)
@@ -555,6 +555,7 @@
 # define RCLASS_SCOPE_PRIVATE	      (1<<24)  /* class opened for private methods */
 # define RCLASS_SCOPE_PROTECTED	      (1<<25)  /* class opened for protected methods */
 # define RCLASS_SCOPE_MOD_FUNC	      (1<<26)  /* class opened for module_function methods */
+# define RCLASS_KVO_CHECK_DONE	      (1<<27)  /* class created by KVO and flags merged */
 # if defined(__LP64__)
 #  define _PTR_TYPE uint64_t
 #  define RCLASS_VERSION(m) (class_getVersion((Class)m))

Modified: MacRuby/trunk/objc.m
===================================================================
--- MacRuby/trunk/objc.m	2009-10-10 00:23:24 UTC (rev 2776)
+++ MacRuby/trunk/objc.m	2009-10-10 02:38:26 UTC (rev 2777)
@@ -592,13 +592,11 @@
 static Class
 rb_obj_imp_isaForAutonotifying(void *rcv, SEL sel)
 {
-    Class ret;
     long ret_version;
 
-#define KVO_CHECK_DONE 0x100000
+    Class ret = ((Class (*)(void *, SEL))old_imp_isaForAutonotifying)(rcv, sel);
 
-    ret = ((Class (*)(void *, SEL)) old_imp_isaForAutonotifying)(rcv, sel);
-    if (ret != NULL && ((ret_version = RCLASS_VERSION(ret)) & KVO_CHECK_DONE) == 0) {
+    if (ret != NULL && ((ret_version = RCLASS_VERSION(ret)) & RCLASS_KVO_CHECK_DONE) == 0) {
 	const char *name = class_getName(ret);
 	if (strncmp(name, "NSKVONotifying_", 15) == 0) {
 	    Class ret_orig;
@@ -612,10 +610,9 @@
 		if ((orig_v & RCLASS_IS_RUBY_CLASS) == RCLASS_IS_RUBY_CLASS) {
 		    ret_version |= RCLASS_IS_RUBY_CLASS;
 		}
-		// XXX merge more flags?
 	    }
 	}
-	ret_version |= KVO_CHECK_DONE;
+	ret_version |= RCLASS_KVO_CHECK_DONE;
 	RCLASS_SET_VERSION(ret, ret_version);
     }
     return ret;

Modified: MacRuby/trunk/variable.c
===================================================================
--- MacRuby/trunk/variable.c	2009-10-10 00:23:24 UTC (rev 2776)
+++ MacRuby/trunk/variable.c	2009-10-10 02:38:26 UTC (rev 2777)
@@ -961,6 +961,14 @@
     CFMakeCollectable(clone_dict);
 }
 
+static inline bool
+rb_class_has_ivar_dict(VALUE mod)
+{
+    const long v = RCLASS_VERSION(mod);
+    return (v & RCLASS_IS_RUBY_CLASS) == RCLASS_IS_RUBY_CLASS
+	&& (v & RCLASS_KVO_CHECK_DONE) != RCLASS_KVO_CHECK_DONE;
+}
+
 #define RCLASS_RUBY_IVAR_DICT(mod) \
     (*(CFMutableDictionaryRef *) \
      	((void *)mod + class_getInstanceSize(*(Class *)RCLASS_SUPER(mod))))
@@ -970,7 +978,7 @@
 {
     CFMutableDictionaryRef dict;
 
-    if (RCLASS_RUBY(mod)) {
+    if (rb_class_has_ivar_dict(mod)) {
 	dict = RCLASS_RUBY_IVAR_DICT(mod);
     }
     else {
@@ -986,7 +994,7 @@
 void
 rb_class_ivar_set_dict(VALUE mod, CFMutableDictionaryRef dict)
 {
-    if (RCLASS_RUBY(mod)) {
+    if (rb_class_has_ivar_dict(mod)) {
 	CFMutableDictionaryRef old_dict = RCLASS_RUBY_IVAR_DICT(mod);
 	if (old_dict != dict) {
 	    if (old_dict != NULL) {
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/macruby-changes/attachments/20091009/b9345eec/attachment-0001.html>


More information about the macruby-changes mailing list