[macruby-changes] [422] MacRuby/branches/lrz_unstable
source_changes at macosforge.org
source_changes at macosforge.org
Tue Aug 12 18:10:30 PDT 2008
Revision: 422
http://trac.macosforge.org/projects/ruby/changeset/422
Author: lsansonetti at apple.com
Date: 2008-08-12 18:10:29 -0700 (Tue, 12 Aug 2008)
Log Message:
-----------
wip
Modified Paths:
--------------
MacRuby/branches/lrz_unstable/class.c
MacRuby/branches/lrz_unstable/compile.c
MacRuby/branches/lrz_unstable/include/ruby/ruby.h
MacRuby/branches/lrz_unstable/objc.m
MacRuby/branches/lrz_unstable/object.c
MacRuby/branches/lrz_unstable/variable.c
MacRuby/branches/lrz_unstable/vm_eval.c
MacRuby/branches/lrz_unstable/vm_insnhelper.c
Modified: MacRuby/branches/lrz_unstable/class.c
===================================================================
--- MacRuby/branches/lrz_unstable/class.c 2008-08-12 06:00:09 UTC (rev 421)
+++ MacRuby/branches/lrz_unstable/class.c 2008-08-13 01:10:29 UTC (rev 422)
@@ -121,7 +121,6 @@
VALUE klass;
klass = rb_objc_alloc_class(name, super, T_CLASS, rb_cClass);
-
objc_registerClassPair((Class)klass);
if (RCLASS_SUPER(klass) == rb_cNSObject) {
@@ -230,28 +229,30 @@
rb_mod_init_copy(VALUE clone, VALUE orig)
{
rb_obj_init_copy(clone, orig);
+#if !WITH_OBJC
if (!RCLASS_SINGLETON(CLASS_OF(clone))) {
RBASIC(clone)->klass = rb_singleton_class_clone(orig);
}
+#endif
#if WITH_OBJC
{
- Class ocsuper;
+ VALUE super;
int version_flag;
if (orig == rb_cNSMutableString
|| orig == rb_cNSMutableArray
|| orig == rb_cNSMutableHash) {
- ocsuper = (Class)orig;
+ super = orig;
rb_warn("cloning class `%s' is not supported, creating a " \
"subclass instead", rb_class2name(orig));
}
else {
- ocsuper = class_getSuperclass((Class)orig);
+ super = RCLASS_SUPER(orig);
}
- class_setSuperclass((Class)clone, ocsuper);
+ RCLASS_SUPER(clone) = super;
version_flag = RCLASS_IS_RUBY_CLASS;
- if ((RCLASS_VERSION(ocsuper) & RCLASS_IS_OBJECT_SUBCLASS) == RCLASS_IS_OBJECT_SUBCLASS)
+ if ((RCLASS_VERSION(super) & RCLASS_IS_OBJECT_SUBCLASS) == RCLASS_IS_OBJECT_SUBCLASS)
version_flag |= RCLASS_IS_OBJECT_SUBCLASS;
class_setVersion((Class)clone, version_flag);
@@ -370,26 +371,21 @@
return rb_cClass;
}
else {
-// VALUE metasuper;
VALUE klass;
klass = rb_class_boot(super);
RBASIC(obj)->klass = klass;
#if WITH_OBJC
- //RCLASS_SET_SINGLETON(klass);
+ if (super == rb_cNSObject) {
+ RCLASS_VERSION(klass) ^= RCLASS_IS_OBJECT_SUBCLASS;
+ }
+ RCLASS_SET_VERSION_FLAG(klass, RCLASS_IS_SINGLETON);
#else
FL_SET(klass, FL_SINGLETON);
#endif
rb_singleton_class_attached(klass, obj);
-#if 0
- metasuper = RBASIC(rb_class_real(super))->klass;
- /* metaclass of a superclass may be NULL at boot time */
- if (metasuper) {
- RBASIC(klass)->klass = metasuper;
- }
-#endif
return klass;
}
}
@@ -1190,29 +1186,22 @@
}
DEFER_INTS;
-#if WITH_OBJC
- if (NATIVE(obj)) {
- Class ocklass;
-
- ocklass = *(Class *)obj;
- klass = (VALUE)ocklass;
- if (class_isMetaClass(ocklass))
- return klass;
-
- if (!RCLASS_SINGLETON(ocklass))
- klass = rb_make_metaclass(obj, (VALUE)ocklass);
-
- return klass;
- }
- if (TYPE(obj) == T_CLASS)
- return obj;
-#endif
if (RCLASS_SINGLETON(RBASIC(obj)->klass) &&
rb_iv_get(RBASIC(obj)->klass, "__attached__") == obj) {
klass = RBASIC(obj)->klass;
}
else {
- klass = rb_make_metaclass(obj, RBASIC(obj)->klass);
+#if WITH_OBJC
+ switch (TYPE(obj)) {
+ case T_CLASS:
+ case T_MODULE:
+ klass = *(VALUE *)obj;
+ break;
+ default:
+ klass = rb_make_metaclass(obj, RBASIC(obj)->klass);
+ break;
+ }
+#endif
}
#if 0
if (OBJ_TAINTED(obj)) {
Modified: MacRuby/branches/lrz_unstable/compile.c
===================================================================
--- MacRuby/branches/lrz_unstable/compile.c 2008-08-12 06:00:09 UTC (rev 421)
+++ MacRuby/branches/lrz_unstable/compile.c 2008-08-13 01:10:29 UTC (rev 422)
@@ -732,7 +732,7 @@
mcache->as.rcall.sel = sel_registerName(buf);
}
}
- operands[4] = (VALUE)mcache;
+ GC_WB(&operands[4], mcache);
iobj = new_insn_core(iseq, line_no, BIN(send), 5, operands);
return iobj;
}
Modified: MacRuby/branches/lrz_unstable/include/ruby/ruby.h
===================================================================
--- MacRuby/branches/lrz_unstable/include/ruby/ruby.h 2008-08-12 06:00:09 UTC (rev 421)
+++ MacRuby/branches/lrz_unstable/include/ruby/ruby.h 2008-08-13 01:10:29 UTC (rev 422)
@@ -499,7 +499,7 @@
# define RCLASS_IS_OBJECT_SUBCLASS 0x100 /* class is a true RBObject subclass */
# define RCLASS_IS_RUBY_CLASS 0x200 /* class was created from Ruby */
# define RCLASS_IS_MODULE 0x400 /* class represents a Ruby Module */
-# define RCLASS_IS_SINGLETON 0x800 /* class represents a singleton/metaclass */
+# define RCLASS_IS_SINGLETON 0x800 /* class represents a singleton */
# define RCLASS_IS_FROZEN 0x1000 /* class is frozen */
# define RCLASS_IS_TAINTED 0x2000 /* class is tainted */
# define RCLASS_IS_STRING_SUBCLASS 0x10000 /* class is a subclass of NSCFString */
@@ -509,16 +509,17 @@
# define RCLASS_VERSION(m) (class_getVersion((Class)m))
# define RCLASS_SET_VERSION_FLAG(m,f) (class_setVersion((Class)m, (RCLASS_VERSION(m) | f)))
# define RCLASS_SUPER(m) (class_getSuperclass((Class)m))
-# define RCLASS_SINGLETON(m) (class_isMetaclass((Class)m))
+# define RCLASS_META(m) (class_isMetaclass((Class)m))
# else
# define RCLASS_VERSION(m) (*(long *)((void *)m + (sizeof(void *) * 3)))
# define RCLASS_SET_VERSION_FLAG(m,f) (RCLASS_VERSION(m) |= f)
# define RCLASS_SUPER(m) (*(VALUE *)((void *)m + (sizeof(void *) * 1)))
# define _RCLASS_INFO(m) (*(long *)((void *)m + (sizeof(void *) * 4)))
-# define RCLASS_SINGLETON(m) (_RCLASS_INFO(m) & CLS_META)
+# define RCLASS_META(m) (_RCLASS_INFO(m) & CLS_META)
# endif
# define RCLASS_RUBY(m) ((RCLASS_VERSION(m) & RCLASS_IS_RUBY_CLASS) == RCLASS_IS_RUBY_CLASS)
# define RCLASS_MODULE(m) ((RCLASS_VERSION(m) & RCLASS_IS_MODULE) == RCLASS_IS_MODULE)
+# define RCLASS_SINGLETON(m) ((RCLASS_VERSION(m) & RCLASS_IS_SINGLETON) == RCLASS_IS_SINGLETON)
CFMutableDictionaryRef rb_class_ivar_dict(VALUE);
CFMutableDictionaryRef rb_class_ivar_dict_or_create(VALUE);
void rb_class_ivar_set_dict(VALUE, CFMutableDictionaryRef);
@@ -1181,7 +1182,7 @@
}
#if WITH_OBJC
else if ((k = *(Class *)obj) != NULL) {
- if (RCLASS_SINGLETON(k)) {
+ if (RCLASS_META(k)) {
if (RCLASS_MODULE(obj)) return T_MODULE;
else return T_CLASS;
}
Modified: MacRuby/branches/lrz_unstable/objc.m
===================================================================
--- MacRuby/branches/lrz_unstable/objc.m 2008-08-12 06:00:09 UTC (rev 421)
+++ MacRuby/branches/lrz_unstable/objc.m 2008-08-13 01:10:29 UTC (rev 422)
@@ -1722,12 +1722,25 @@
static ID
rb_bs_struct_field_ivar_id(void)
{
+ const char *frame_str;
char ivar_name[128];
- int len;
+ size_t len;
- len = snprintf(ivar_name, sizeof ivar_name, "@%s",
- rb_id2name(rb_frame_this_func()));
- if (ivar_name[len - 1] == '=')
+ frame_str = rb_id2name(rb_frame_this_func());
+ if (strlen(frame_str) >= 5
+ && frame_str[0] == 's'
+ && frame_str[1] == 'e'
+ && frame_str[2] == 't'
+ && isupper(frame_str[3])) {
+
+ len = snprintf(ivar_name, sizeof ivar_name, "@%s", &frame_str[3]);
+ ivar_name[1] = tolower(ivar_name[1]);
+ }
+ else {
+ len = snprintf(ivar_name, sizeof ivar_name, "@%s", frame_str);
+ }
+
+ if (ivar_name[len - 1] == '=' || ivar_name[len - 1] == ':')
ivar_name[len - 1] = '\0';
return rb_intern(ivar_name);
Modified: MacRuby/branches/lrz_unstable/object.c
===================================================================
--- MacRuby/branches/lrz_unstable/object.c 2008-08-12 06:00:09 UTC (rev 421)
+++ MacRuby/branches/lrz_unstable/object.c 2008-08-13 01:10:29 UTC (rev 422)
@@ -131,6 +131,11 @@
rb_class_real(VALUE cl)
{
#if WITH_OBJC
+ if (cl == 0)
+ return 0;
+ while (RCLASS_SINGLETON(cl)) {
+ cl = RCLASS_SUPER(cl);
+ }
return cl;
#else
if (cl == 0)
@@ -937,6 +942,7 @@
|| rb_objc_flag_check((const void *)obj, FL_FREEZE)
? Qtrue : Qfalse;
case T_CLASS:
+ case T_ICLASS:
case T_MODULE:
return (RCLASS_VERSION(obj) & RCLASS_IS_FROZEN) == RCLASS_IS_FROZEN ? Qtrue : Qfalse;
default:
@@ -2508,6 +2514,12 @@
{
return NATIVE(recv) ? Qtrue : Qfalse;
}
+
+static VALUE
+rb_class_is_meta(VALUE klass)
+{
+ return RCLASS_META(klass) ? Qtrue : Qfalse;
+}
#endif
/*
@@ -2729,6 +2741,7 @@
rb_define_method(rb_cModule, "ancestors", rb_mod_ancestors, 0); /* in class.c */
#if WITH_OBJC
rb_define_private_method(rb_cModule, "ib_outlet", rb_mod_objc_ib_outlet, -1); /* in objc.m */
+ rb_define_method(rb_cClass, "__meta__?", rb_class_is_meta, 0);
#endif
rb_define_private_method(rb_cModule, "attr", rb_mod_attr, -1);
Modified: MacRuby/branches/lrz_unstable/variable.c
===================================================================
--- MacRuby/branches/lrz_unstable/variable.c 2008-08-12 06:00:09 UTC (rev 421)
+++ MacRuby/branches/lrz_unstable/variable.c 2008-08-13 01:10:29 UTC (rev 422)
@@ -1246,7 +1246,7 @@
if (!CFDictionaryGetValueIfPresent(
(CFDictionaryRef)ROBJECT(obj)->ivars.as.tbl,
(const void *)id,
- (const void **)val))
+ (const void **)&val))
val = Qundef;
break;
}
@@ -1259,6 +1259,7 @@
if (len <= index) break;
val = ptr[index];
#endif
+
if (val != Qundef)
return val;
break;
@@ -1363,6 +1364,7 @@
xfree(ROBJECT(obj)->ivars.as.ary);
GC_WB(&ROBJECT(obj)->ivars.as.tbl, tbl);
+ CFMakeCollectable(tbl);
RB_IVAR_SET_TYPE(ROBJECT(obj)->ivars, RB_IVAR_TBL);
}
else {
@@ -2427,6 +2429,10 @@
#endif
tmp = klass;
+#if WITH_OBJC
+ if (!RCLASS_META(klass))
+ tmp = klass = *(VALUE *)klass;
+#endif
CVAR_LOOKUP(0, {if (!front) front = klass; target = klass;});
if (target) {
if (front && target != front) {
@@ -2461,6 +2467,10 @@
#endif
tmp = klass;
+#if WITH_OBJC
+ if (!RCLASS_META(klass))
+ tmp = klass = *(VALUE *)klass;
+#endif
CVAR_LOOKUP(&value, {if (!front) front = klass; target = klass;});
if (!target) {
rb_name_error(id,"uninitialized class variable %s in %s",
@@ -2492,6 +2502,10 @@
CFMutableDictionaryRef iv_dict;
#endif
if (!klass) return Qfalse;
+#if WITH_OBJC
+ if (!RCLASS_META(klass))
+ klass = *(VALUE *)klass;
+#endif
CVAR_LOOKUP(0,return Qtrue);
return Qfalse;
}
Modified: MacRuby/branches/lrz_unstable/vm_eval.c
===================================================================
--- MacRuby/branches/lrz_unstable/vm_eval.c 2008-08-12 06:00:09 UTC (rev 421)
+++ MacRuby/branches/lrz_unstable/vm_eval.c 2008-08-13 01:10:29 UTC (rev 422)
@@ -198,10 +198,25 @@
SEL sel;
if (argc > 0 && mid != ID_ALLOCATOR) {
+ const char *mid_str;
char buf[512];
- strncpy(buf, rb_id2name(mid), sizeof buf);
- if (buf[strlen(buf) - 1] != ':')
- strlcat(buf, ":", sizeof buf);
+ size_t len;
+
+ mid_str = rb_id2name(mid);
+ len = strlen(mid_str);
+ if (len > 1 && mid_str[len - 1] == '=' && isalpha(mid_str[len - 2])) {
+ assert(len + 3 < sizeof(buf));
+ buf[0] = 's';
+ buf[1] = 'e';
+ buf[2] = 't';
+ buf[3] = toupper(mid_str[0]);
+ strlcpy(&buf[4], &mid_str[1], len - 1);
+ buf[len + 2] = ':';
+ buf[len + 3] = '\0';
+ }
+ else if (mid_str[len - 1] != ':') {
+ snprintf(buf, sizeof buf, "%s:", mid_str);
+ }
mid = rb_intern(buf);
}
Modified: MacRuby/branches/lrz_unstable/vm_insnhelper.c
===================================================================
--- MacRuby/branches/lrz_unstable/vm_insnhelper.c 2008-08-12 06:00:09 UTC (rev 421)
+++ MacRuby/branches/lrz_unstable/vm_insnhelper.c 2008-08-13 01:10:29 UTC (rev 422)
@@ -674,7 +674,7 @@
SEL sel;
IMP imp;
mn = rb_objc_method_node(klass, id, &imp, &sel);
- if (imp != NULL) {
+ if (mn == NULL && imp != NULL) {
static struct rb_method_cache mcache_s;
mcache = &mcache_s;
mcache->as.ocall.sel = sel;
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.macosforge.org/pipermail/macruby-changes/attachments/20080812/e53c6537/attachment-0001.html
More information about the macruby-changes
mailing list