[macruby-changes] [411] MacRuby/branches/lrz_unstable

source_changes at macosforge.org source_changes at macosforge.org
Wed Aug 6 01:49:30 PDT 2008


Revision: 411
          http://trac.macosforge.org/projects/ruby/changeset/411
Author:   lsansonetti at apple.com
Date:     2008-08-06 01:49:29 -0700 (Wed, 06 Aug 2008)
Log Message:
-----------
wip

Modified Paths:
--------------
    MacRuby/branches/lrz_unstable/class.c
    MacRuby/branches/lrz_unstable/ext/syck/rubyext.c
    MacRuby/branches/lrz_unstable/include/ruby/ruby.h
    MacRuby/branches/lrz_unstable/insns.def
    MacRuby/branches/lrz_unstable/lib/fileutils.rb
    MacRuby/branches/lrz_unstable/numeric.c
    MacRuby/branches/lrz_unstable/objc.m
    MacRuby/branches/lrz_unstable/object.c
    MacRuby/branches/lrz_unstable/struct.c
    MacRuby/branches/lrz_unstable/vm_eval.c

Modified: MacRuby/branches/lrz_unstable/class.c
===================================================================
--- MacRuby/branches/lrz_unstable/class.c	2008-08-06 02:18:19 UTC (rev 410)
+++ MacRuby/branches/lrz_unstable/class.c	2008-08-06 08:49:29 UTC (rev 411)
@@ -56,21 +56,25 @@
 }
 
 static VALUE
+rb_class_allocate_instance(VALUE klass)
+{
+    NEWOBJ(obj, struct RObject);
+    OBJSETUP(obj, klass, T_OBJECT);
+    return (VALUE)obj;
+}
+
+static VALUE
 rb_objc_alloc_class(const char *name, VALUE super, VALUE flags, VALUE klass)
 {
-    Class ocsuper, ocklass;
+    Class ocklass;
     char ocname[128];
+    int version_flag;
 
     if (name == NULL) {
 	static long anon_count = 1;
     	snprintf(ocname, sizeof ocname, "RBAnonymous%ld", ++anon_count);
     }
     else {
-	if (super == rb_cNSObject && strcmp(name, "Object") != 0) {
-	    rb_warn("Do not subclass NSObject directly, please subclass " \
-		    "Object instead.");
-	    super = rb_cObject; 
-	}
 	if (objc_getClass(name) != NULL) {
 	    long count = 1;
 	    snprintf(ocname, sizeof ocname, "RB%s", name);
@@ -84,24 +88,31 @@
 	}
     }
 
-    ocsuper = super == 0 ? (Class)rb_cObject : (Class)super;
-    ocklass = objc_allocateClassPair(ocsuper, ocname, sizeof(id));
+    if (super == 0)
+	super = rb_cObject;
+
+    ocklass = objc_allocateClassPair((Class)super, ocname, sizeof(id));
     assert(ocklass != NULL);
 
-    int version_flag;
-
     version_flag = RCLASS_IS_RUBY_CLASS;
-    if (flags == T_MODULE)
+    if (flags == T_MODULE) {
 	version_flag |= RCLASS_IS_MODULE;
-    if ((RCLASS_VERSION(ocsuper) & RCLASS_IS_OBJECT_SUBCLASS) == RCLASS_IS_OBJECT_SUBCLASS)
+    }
+    if (super == rb_cObject) {
 	version_flag |= RCLASS_IS_OBJECT_SUBCLASS;
+	rb_define_alloc_func((VALUE)ocklass, rb_class_allocate_instance);
+	rb_define_singleton_method((VALUE)ocklass, "new", rb_class_new_instance, -1);
+    }
+    else if ((RCLASS_VERSION(super) & RCLASS_IS_OBJECT_SUBCLASS) == RCLASS_IS_OBJECT_SUBCLASS) {
+	version_flag |= RCLASS_IS_OBJECT_SUBCLASS;
+    }
 
     class_setVersion(ocklass, version_flag);
 
     DLOG("DEFC", "%s < %s (version=%d)", ocname, class_getName(class_getSuperclass((Class)ocklass)), version_flag);
 
     if (klass != 0)
-	rb_objc_install_primitives(ocklass, ocsuper);
+	rb_objc_install_primitives(ocklass, (Class)super);
 
     return (VALUE)ocklass;
 }

Modified: MacRuby/branches/lrz_unstable/ext/syck/rubyext.c
===================================================================
--- MacRuby/branches/lrz_unstable/ext/syck/rubyext.c	2008-08-06 02:18:19 UTC (rev 410)
+++ MacRuby/branches/lrz_unstable/ext/syck/rubyext.c	2008-08-06 08:49:29 UTC (rev 411)
@@ -22,11 +22,11 @@
 #endif
     struct RBasic  basic;
     struct RObject object;
-    struct RClass  klass;
     /*struct RFloat  flonum;*/
     /*struct RString string;*/
     /*struct RRegexp regexp;*/
 #if !WITH_OBJC
+    struct RClass  klass;
     struct RArray  array;
     struct RHash   hash;
 #endif

Modified: MacRuby/branches/lrz_unstable/include/ruby/ruby.h
===================================================================
--- MacRuby/branches/lrz_unstable/include/ruby/ruby.h	2008-08-06 02:18:19 UTC (rev 410)
+++ MacRuby/branches/lrz_unstable/include/ruby/ruby.h	2008-08-06 08:49:29 UTC (rev 411)
@@ -1092,10 +1092,7 @@
 static inline bool
 rb_is_native(VALUE obj) {
     Class k = *(Class *)obj;
-    return k != NULL
-	   && k != (Class)rb_cBignum
-	   && k != (Class)rb_cFloat
-	   && (RCLASS_VERSION(k) & RCLASS_IS_OBJECT_SUBCLASS) != RCLASS_IS_OBJECT_SUBCLASS;
+    return k != NULL && (RCLASS_VERSION(k) & RCLASS_IS_OBJECT_SUBCLASS) != RCLASS_IS_OBJECT_SUBCLASS;
 }
 #define NATIVE(obj) (rb_is_native((VALUE)obj))
 
@@ -1213,6 +1210,7 @@
 	    || (RCLASS_VERSION(k) & RCLASS_IS_HASH_SUBCLASS) 
 		== RCLASS_IS_HASH_SUBCLASS)
 	    return T_HASH;
+	if (k == (Class)rb_cFixnum) return T_FIXNUM;
 	if (NATIVE(obj)) return T_NATIVE;
     }
 #endif

Modified: MacRuby/branches/lrz_unstable/insns.def
===================================================================
--- MacRuby/branches/lrz_unstable/insns.def	2008-08-06 02:18:19 UTC (rev 410)
+++ MacRuby/branches/lrz_unstable/insns.def	2008-08-06 08:49:29 UTC (rev 411)
@@ -812,9 +812,21 @@
 	break;
       case DEFINED_METHOD:{
 	  VALUE klass = CLASS_OF(v);
+#if WITH_OBJC
+	  NODE *method;
+	  IMP imp;
+
+	  method = rb_objc_method_node(klass, SYM2ID(obj), &imp, NULL);
+
+	  if (method == NULL && imp != NULL) {
+	      expr_type = "method";
+	  }
+	  else if (method != NULL) {
+#else
 	  NODE *method = (NODE *) rb_method_node(klass, SYM2ID(obj));
 
 	  if (method) {
+#endif
 	      if (!(method->nd_noex & NOEX_PRIVATE)) {
 		  if (!((method->nd_noex & NOEX_PROTECTED) &&
 			!rb_obj_is_kind_of(GET_SELF(),

Modified: MacRuby/branches/lrz_unstable/lib/fileutils.rb
===================================================================
--- MacRuby/branches/lrz_unstable/lib/fileutils.rb	2008-08-06 02:18:19 UTC (rev 410)
+++ MacRuby/branches/lrz_unstable/lib/fileutils.rb	2008-08-06 08:49:29 UTC (rev 411)
@@ -1507,8 +1507,8 @@
   end
 
   METHODS = singleton_methods() - [:private_module_function,
-      :commands, :options, :have_option?, :options_of, :collect_method]
-  METHODS -= NSObject.methods
+      :commands, :options, :have_option?, :options_of, 
+      :collect_method] - NSObject.methods
 
   # 
   # This module has all methods of FileUtils module, but it outputs messages

Modified: MacRuby/branches/lrz_unstable/numeric.c
===================================================================
--- MacRuby/branches/lrz_unstable/numeric.c	2008-08-06 02:18:19 UTC (rev 410)
+++ MacRuby/branches/lrz_unstable/numeric.c	2008-08-06 08:49:29 UTC (rev 411)
@@ -3216,6 +3216,7 @@
 #if WITH_OBJC
     rb_cCFNumber = (VALUE)objc_getClass("NSCFNumber");
     rb_cNumeric = rb_define_class("Numeric", (VALUE)objc_getClass("NSNumber"));
+    RCLASS_SET_VERSION_FLAG(rb_cNumeric, RCLASS_IS_OBJECT_SUBCLASS);
     /* overriding NSObject methods */
     rb_define_method(rb_cNumeric, "class", rb_obj_class, 0);
     rb_define_method(rb_cNumeric, "dup", rb_obj_dup, 0);

Modified: MacRuby/branches/lrz_unstable/objc.m
===================================================================
--- MacRuby/branches/lrz_unstable/objc.m	2008-08-06 02:18:19 UTC (rev 410)
+++ MacRuby/branches/lrz_unstable/objc.m	2008-08-06 08:49:29 UTC (rev 411)
@@ -1522,27 +1522,23 @@
     DLOG("DEFM", "%c[%s %s] types=%s arity=%d body=%p override=%d direct_override=%d",
 	   class_isMetaClass((Class)mod) ? '+' : '-', class_getName((Class)mod), (char *)sel, types, arity, body, method != NULL, direct_override);
 
-    if (node == NULL) {
-	assert(class_addMethod((Class)mod, sel, NULL, types));
-	forward_method_definition(included_in_classes, sel, NULL, types);
+    imp = body == NULL ? NULL : rb_ruby_to_objc_closure(types, oc_arity, body);
+
+    if (method != NULL && direct_override) {
+	method_setImplementation(method, imp);
     }
     else {
+	assert(class_addMethod((Class)mod, sel, imp, types));
+    }
+    forward_method_definition(included_in_classes, sel, imp, types);
+
+    if (node != NULL) {
 	const char *sel_str = (const char *)sel;
 	const size_t sel_len = strlen(sel_str);
 	SEL new_sel;
 	char *new_types;
 	bool override;
 
-	imp = rb_ruby_to_objc_closure(types, oc_arity, body);
-
-	if (method != NULL && direct_override) {
-	    method_setImplementation(method, imp);
-	}
-	else {
-	    assert(class_addMethod((Class)mod, sel, imp, types));
-	}
-	forward_method_definition(included_in_classes, sel, imp, types);
-
 	if (sel_str[sel_len - 1] == ':') {
 	    char buf[512];
 	    strlcpy(buf, sel_str, sizeof buf);
@@ -1580,22 +1576,6 @@
     }
 }
 
-VALUE
-rb_mod_objc_ancestors(VALUE recv)
-{
-    Class klass;
-    VALUE ary;
-
-    ary = rb_ary_new();
-
-    for (klass = (Class)recv; klass != NULL; 
-	 klass = class_getSuperclass(klass)) {
-	rb_ary_push(ary, rb_str_new2(class_getName(klass)));		
-    }
-
-    return ary;
-}
-
 static bool
 rb_objc_resourceful(VALUE obj)
 {

Modified: MacRuby/branches/lrz_unstable/object.c
===================================================================
--- MacRuby/branches/lrz_unstable/object.c	2008-08-06 02:18:19 UTC (rev 410)
+++ MacRuby/branches/lrz_unstable/object.c	2008-08-06 08:49:29 UTC (rev 411)
@@ -1589,6 +1589,7 @@
     return obj;
 }
 
+#if !WITH_OBJC
 static VALUE
 rb_class_allocate_instance(VALUE klass)
 {
@@ -1596,6 +1597,7 @@
     OBJSETUP(obj, klass, T_OBJECT);
     return (VALUE)obj;
 }
+#endif
 
 /*
  *  call-seq:
@@ -2583,10 +2585,9 @@
 Init_Object(void)
 {
 #if WITH_OBJC
-    rb_cNSObject = (VALUE)objc_getClass("NSObject");
-    rb_cObject = boot_defclass("Object", rb_cNSObject);
+    rb_cNSObject = rb_cObject = (VALUE)objc_getClass("NSObject");
+    rb_const_set(rb_cObject, rb_intern("Object"), rb_cNSObject);
     rb_cBasicObject = rb_cObject; // TODO
-    RCLASS_SET_VERSION_FLAG(rb_cObject, RCLASS_IS_OBJECT_SUBCLASS);
     rb_cModule = boot_defclass("Module", rb_cObject);
     rb_cClass =  boot_defclass("Class",  rb_cModule);
     RCLASS_SUPER(*(Class *)rb_cNSObject) = rb_cClass;
@@ -2605,17 +2606,13 @@
 #endif
 
     rb_define_private_method(rb_cBasicObject, "initialize", rb_obj_dummy, 0);
-    rb_define_alloc_func(rb_cBasicObject, rb_class_allocate_instance);
 #if WITH_OBJC
-    // required because otherwise NSObject.new will be first in the method chain.
-    rb_define_singleton_method(rb_cBasicObject, "new", rb_class_new_instance, -1);
-#endif
-#if WITH_OBJC
     rb_define_method(rb_cNSObject, "==", rb_obj_equal, 1);
     rb_define_method(rb_cNSObject, "equal?", rb_obj_equal, 1);
     rb_define_method(rb_cNSObject, "!", rb_obj_not, 0);
     rb_define_method(rb_cNSObject, "!=", rb_obj_not_equal, 1);
 #else
+    rb_define_alloc_func(rb_cBasicObject, rb_class_allocate_instance);
     rb_define_method(rb_cBasicObject, "==", rb_obj_equal, 1);
     rb_define_method(rb_cBasicObject, "equal?", rb_obj_equal, 1);
     rb_define_method(rb_cBasicObject, "!", rb_obj_not, 0);
@@ -2627,11 +2624,7 @@
     rb_define_private_method(rb_cBasicObject, "singleton_method_undefined", rb_obj_dummy, 1);
 
     rb_mKernel = rb_define_module("Kernel");
-#if WITH_OBJC
-    rb_include_module(rb_cNSObject, rb_mKernel);
-#else
     rb_include_module(rb_cObject, rb_mKernel);
-#endif
     rb_define_private_method(rb_cClass, "inherited", rb_obj_dummy, 1);
     rb_define_private_method(rb_cModule, "included", rb_obj_dummy, 1);
     rb_define_private_method(rb_cModule, "extended", rb_obj_dummy, 1);
@@ -2646,7 +2639,7 @@
     rb_define_method(rb_mKernel, "eql?", rb_obj_equal, 1);
 
 #if !WITH_OBJC 
-    // #class is already defined in NSObject
+    /* NSObject#class already exists */
     rb_define_method(rb_mKernel, "class", rb_obj_class, 0);
 #endif
 
@@ -2730,7 +2723,6 @@
     rb_define_method(rb_cModule, "name", rb_mod_name, 0);  /* in variable.c */
     rb_define_method(rb_cModule, "ancestors", rb_mod_ancestors, 0); /* in class.c */
 #if WITH_OBJC
-    rb_define_method(rb_cModule, "objc_ancestors", rb_mod_objc_ancestors, 0); /* in objc.m */
     rb_define_private_method(rb_cModule, "ib_outlet", rb_mod_objc_ib_outlet, -1); /* in objc.m */
 #endif
 
@@ -2770,6 +2762,7 @@
     rb_define_method(rb_cClass, "initialize", rb_class_initialize, -1);
     rb_define_method(rb_cClass, "initialize_copy", rb_class_init_copy, 1); /* in class.c */
 #if !WITH_OBJC
+    /* already defined */
     rb_define_method(rb_cClass, "superclass", rb_class_superclass, 0);
 #endif
     rb_define_alloc_func(rb_cClass, rb_class_s_alloc);

Modified: MacRuby/branches/lrz_unstable/struct.c
===================================================================
--- MacRuby/branches/lrz_unstable/struct.c	2008-08-06 02:18:19 UTC (rev 410)
+++ MacRuby/branches/lrz_unstable/struct.c	2008-08-06 08:49:29 UTC (rev 411)
@@ -181,7 +181,9 @@
     OBJ_FREEZE(members);
     if (NIL_P(name)) {
 	nstr = rb_class_new(klass);
+#if !WITH_OBJC
 	rb_make_metaclass(nstr, RBASIC(klass)->klass);
+#endif
 	rb_class_inherited(klass, nstr);
     }
     else {

Modified: MacRuby/branches/lrz_unstable/vm_eval.c
===================================================================
--- MacRuby/branches/lrz_unstable/vm_eval.c	2008-08-06 02:18:19 UTC (rev 410)
+++ MacRuby/branches/lrz_unstable/vm_eval.c	2008-08-06 08:49:29 UTC (rev 411)
@@ -197,7 +197,7 @@
     IMP imp;
     SEL sel;
 
-    if (argc > 0) {
+    if (argc > 0 && mid != ID_ALLOCATOR) {
 	char buf[512];
 	strncpy(buf, rb_id2name(mid), sizeof buf);
 	if (buf[strlen(buf) - 1] != ':')
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.macosforge.org/pipermail/macruby-changes/attachments/20080806/1abf407a/attachment-0001.html 


More information about the macruby-changes mailing list