[macruby-changes] [1197] MacRuby/branches/experimental

source_changes at macosforge.org source_changes at macosforge.org
Thu Mar 26 21:21:40 PDT 2009


Revision: 1197
          http://trac.macosforge.org/projects/ruby/changeset/1197
Author:   lsansonetti at apple.com
Date:     2009-03-26 21:21:39 -0700 (Thu, 26 Mar 2009)
Log Message:
-----------
fixed +[NSObject new:] + minor things

Modified Paths:
--------------
    MacRuby/branches/experimental/class.c
    MacRuby/branches/experimental/include/ruby/ruby.h
    MacRuby/branches/experimental/objc.m
    MacRuby/branches/experimental/object.c
    MacRuby/branches/experimental/roxor.cpp
    MacRuby/branches/experimental/roxor.h
    MacRuby/branches/experimental/string.c
    MacRuby/branches/experimental/vm_method.c

Modified: MacRuby/branches/experimental/class.c
===================================================================
--- MacRuby/branches/experimental/class.c	2009-03-27 01:35:40 UTC (rev 1196)
+++ MacRuby/branches/experimental/class.c	2009-03-27 04:21:39 UTC (rev 1197)
@@ -99,12 +99,13 @@
 
 VALUE rb_obj_init_copy(VALUE, SEL, VALUE);
 
+VALUE rb_class_new_instance_imp(VALUE klass, SEL sel, int argc, VALUE *argv);
+
 void
 rb_define_object_special_methods(VALUE klass)
 {
     rb_objc_define_method(*(VALUE *)klass, "alloc", rb_class_allocate_instance, 0);
     RCLASS_SET_VERSION(*(VALUE *)klass, (RCLASS_VERSION(*(VALUE *)klass) | RCLASS_HAS_ROBJECT_ALLOC));
-    VALUE rb_class_new_instance_imp(VALUE klass, SEL sel, int argc, VALUE *argv);
     rb_objc_define_method(*(VALUE *)klass, "new", rb_class_new_instance_imp, -1);
     rb_objc_define_method(*(VALUE *)klass, "__new__", rb_class_new_instance_imp, -1);
     rb_objc_define_method(klass, "dup", rb_obj_dup, 0);
@@ -166,8 +167,9 @@
 
     DLOG("DEFC", "%s < %s (version=%d)", ocname, class_getName(class_getSuperclass((Class)ocklass)), version_flag);
 
-    if (klass != 0)
+    if (klass != 0) {
 	rb_objc_install_primitives(ocklass, (Class)super);
+    }
 
     return (VALUE)ocklass;
 }
@@ -1050,28 +1052,39 @@
     return sel_registerName(name);
 }
 
-void
-rb_objc_add_method(VALUE klass, const char *name, void *imp, const int arity, const int noex)
+static void
+rb_objc_add_method(VALUE klass, const char *name, void *imp, const int arity,
+		   const int noex, bool direct)
 {
-    assert(name[strlen(name) - 1] != ':');
+    if (!direct) {
+	assert(name[strlen(name) - 1] != ':');
+    }
 
     NODE *node = NEW_CFUNC(imp, arity);
     NODE *body = NEW_FBODY(NEW_METHOD(node, klass, noex), 0);
     rb_objc_retain(body);
 
-    rb_vm_define_method((Class)klass, name_to_sel(name, arity), (IMP)imp, body);
+    rb_vm_define_method((Class)klass, name_to_sel(name, arity), (IMP)imp,				body, direct);
 }
 
 void
+rb_objc_define_direct_method(VALUE klass, const char *name, void *imp,
+			     const int arity)
+{
+    rb_objc_add_method(klass, name, imp, arity, NOEX_PUBLIC, true);
+}
+
+void
 rb_objc_define_method(VALUE klass, const char *name, void *imp, const int arity)
 {
-    rb_objc_add_method(klass, name, imp, arity, NOEX_PUBLIC);
+    rb_objc_add_method(klass, name, imp, arity, NOEX_PUBLIC, false);
 }
 
 void
-rb_objc_define_private_method(VALUE klass, const char *name, void *imp, const int arity)
+rb_objc_define_private_method(VALUE klass, const char *name, void *imp,
+			      const int arity)
 {
-    rb_objc_add_method(klass, name, imp, arity, NOEX_PRIVATE);
+    rb_objc_add_method(klass, name, imp, arity, NOEX_PRIVATE, false);
 }
 
 void

Modified: MacRuby/branches/experimental/include/ruby/ruby.h
===================================================================
--- MacRuby/branches/experimental/include/ruby/ruby.h	2009-03-27 01:35:40 UTC (rev 1196)
+++ MacRuby/branches/experimental/include/ruby/ruby.h	2009-03-27 04:21:39 UTC (rev 1197)
@@ -873,6 +873,7 @@
 void rb_define_attr(VALUE,const char*,int,int);
 
 void rb_objc_define_method(VALUE klass, const char *name, void *imp, const int arity);
+void rb_objc_define_direct_method(VALUE klass, const char *name, void *imp, const int arity);
 void rb_objc_define_private_method(VALUE klass, const char *name, void *imp, const int arity);
 void rb_objc_undef_method(VALUE klass, const char *name);
 

Modified: MacRuby/branches/experimental/objc.m
===================================================================
--- MacRuby/branches/experimental/objc.m	2009-03-27 01:35:40 UTC (rev 1196)
+++ MacRuby/branches/experimental/objc.m	2009-03-27 04:21:39 UTC (rev 1197)
@@ -3595,6 +3595,7 @@
     old_imp_isaForAutonotifying = method_getImplementation(m);
     method_setImplementation(m, (IMP)rb_obj_imp_isaForAutonotifying);
 
+#if 0
     {
 	VALUE klass;
 	NODE *node, *body;
@@ -3606,6 +3607,7 @@
 	closure = rb_ruby_to_objc_closure("@@:@", 1, body->nd_body);
 	assert(class_addMethod((Class)klass, @selector(new:), (IMP)closure, "@@:@"));
     }
+#endif
     
     _objc_msgForward_addr = &_objc_msgForward;
         

Modified: MacRuby/branches/experimental/object.c
===================================================================
--- MacRuby/branches/experimental/object.c	2009-03-27 01:35:40 UTC (rev 1196)
+++ MacRuby/branches/experimental/object.c	2009-03-27 04:21:39 UTC (rev 1197)
@@ -2679,9 +2679,13 @@
 
     void rb_include_module2(VALUE klass, VALUE module, int check, int add_methods);
 
+    // At this point, methods defined on Class or Module will be automatically
+    // added to NSObject's metaclass.
     rb_include_module2(*(VALUE *)rb_cNSObject, rb_cClass, 0, 0);
     rb_include_module2(*(VALUE *)rb_cNSObject, rb_cModule, 0, 0);
 
+    rb_objc_define_direct_method(*(VALUE *)rb_cNSObject, "new:", rb_class_new_instance_imp, -1);
+
     rb_objc_define_private_method(rb_cNSObject, "initialize", rb_obj_dummy, 0);
     rb_objc_define_method(rb_cNSObject, "==", rb_obj_equal, 1);
     rb_objc_define_method(rb_cNSObject, "equal?", rb_obj_equal, 1);

Modified: MacRuby/branches/experimental/roxor.cpp
===================================================================
--- MacRuby/branches/experimental/roxor.cpp	2009-03-27 01:35:40 UTC (rev 1196)
+++ MacRuby/branches/experimental/roxor.cpp	2009-03-27 04:21:39 UTC (rev 1197)
@@ -4603,7 +4603,7 @@
 
     IMP imp = GET_VM()->compile(func);
 
-    rb_vm_define_method(klass, sel, imp, node);
+    rb_vm_define_method(klass, sel, imp, node, false);
 }
 
 extern "C"
@@ -4667,7 +4667,7 @@
 	NODE *body = NEW_FBODY(NEW_METHOD(node, klass, noex), 0);
 	rb_objc_retain(body);
 
-	rb_vm_define_method(klass, sel_registerName(name), imp, body);
+	rb_vm_define_method(klass, sel_registerName(name), imp, body, false);
     }
 
     if (write) {
@@ -4679,7 +4679,7 @@
 	rb_objc_retain(body);
 
 	snprintf(buf, sizeof buf, "%s=:", name);
-	rb_vm_define_method(klass, sel_registerName(buf), imp, body);
+	rb_vm_define_method(klass, sel_registerName(buf), imp, body, false);
     }
 
     delete compiler;
@@ -4687,20 +4687,19 @@
 
 extern "C"
 void 
-rb_vm_define_method(Class klass, SEL sel, IMP imp, NODE *node)
+rb_vm_define_method(Class klass, SEL sel, IMP imp, NODE *node, bool direct)
 {
+    assert(klass != NULL);
     assert(node != NULL);
 
     const rb_vm_arity_t arity = rb_vm_node_arity(node);
     assert(arity.real < MAX_ARITY);
 
-    assert(klass != NULL);
-
     const char *sel_name = sel_getName(sel);
     const bool genuine_selector = sel_name[strlen(sel_name) - 1] == ':';
 
     int oc_arity = genuine_selector ? arity.real : 0;
-    bool redefined = false;
+    bool redefined = direct;
 
 define_method:
     char *types;
@@ -5110,11 +5109,12 @@
 	}
 
 #if ROXOR_VM_DEBUG
-	printf("objc dispatch %c[<%s %p> %s] (cached=%s)\n",
+	printf("objc dispatch %c[<%s %p> %s] imp=%p (cached=%s)\n",
 		class_isMetaClass(klass) ? '+' : '-',
 		class_getName(klass),
 		(void *)self,
 		sel_getName(sel),
+		ocache.imp,
 		cached ? "true" : "false");
 #endif
 

Modified: MacRuby/branches/experimental/roxor.h
===================================================================
--- MacRuby/branches/experimental/roxor.h	2009-03-27 01:35:40 UTC (rev 1196)
+++ MacRuby/branches/experimental/roxor.h	2009-03-27 04:21:39 UTC (rev 1197)
@@ -21,7 +21,7 @@
 void rb_vm_const_is_defined(ID path);
 bool rb_vm_lookup_method(Class klass, SEL sel, IMP *pimp, NODE **pnode);
 bool rb_vm_lookup_method2(Class klass, ID mid, SEL *psel, IMP *pimp, NODE **pnode);
-void rb_vm_define_method(Class klass, SEL sel, IMP imp, NODE *node);
+void rb_vm_define_method(Class klass, SEL sel, IMP imp, NODE *node, bool direct);
 void rb_vm_define_attr(Class klass, const char *name, bool read, bool write, int noex);
 void rb_vm_alias(VALUE klass, ID name, ID def);
 VALUE rb_vm_call(VALUE self, SEL sel, int argc, const VALUE *args, bool super);

Modified: MacRuby/branches/experimental/string.c
===================================================================
--- MacRuby/branches/experimental/string.c	2009-03-27 01:35:40 UTC (rev 1196)
+++ MacRuby/branches/experimental/string.c	2009-03-27 04:21:39 UTC (rev 1197)
@@ -5156,7 +5156,7 @@
 	(IMP)imp_rb_str_fastestEncodingInCFStringEncoding);
     rb_objc_install_method2(klass, "isEqual:", (IMP)imp_rb_str_isEqual);
     
-    rb_define_alloc_func((VALUE)klass, str_alloc);
+    rb_objc_define_method(*(VALUE *)klass, "alloc", str_alloc, 0);
 }
 
 static CFIndex

Modified: MacRuby/branches/experimental/vm_method.c
===================================================================
--- MacRuby/branches/experimental/vm_method.c	2009-03-27 01:35:40 UTC (rev 1196)
+++ MacRuby/branches/experimental/vm_method.c	2009-03-27 04:21:39 UTC (rev 1197)
@@ -789,7 +789,7 @@
 	    rb_bug("undefined method `%s'; can't happen", rb_id2name(id));
 	}
 
-	rb_vm_define_method(*(Class *)module, sel, imp, node);
+	rb_vm_define_method(*(Class *)module, sel, imp, node, false);
     }
 
     return module;
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/macruby-changes/attachments/20090326/603e9551/attachment-0001.html>


More information about the macruby-changes mailing list