Revision: 122 http://trac.macosforge.org/projects/ruby/changeset/122 Author: lsansonetti@apple.com Date: 2008-03-28 22:20:07 -0700 (Fri, 28 Mar 2008) Log Message: ----------- fixing more regressions, fixing named args -> fixing build and install Modified Paths: -------------- MacRuby/trunk/array.c MacRuby/trunk/class.c MacRuby/trunk/compile.c MacRuby/trunk/dir.c MacRuby/trunk/hash.c MacRuby/trunk/include/ruby/intern.h MacRuby/trunk/include/ruby/ruby.h MacRuby/trunk/insns.def MacRuby/trunk/io.c MacRuby/trunk/string.c MacRuby/trunk/vm_insnhelper.c Modified: MacRuby/trunk/array.c =================================================================== --- MacRuby/trunk/array.c 2008-03-28 22:38:12 UTC (rev 121) +++ MacRuby/trunk/array.c 2008-03-29 05:20:07 UTC (rev 122) @@ -48,12 +48,12 @@ }; /* This variable will always stay NULL, we only use its address. */ -static void *rb_objc_assoc_key = NULL; +static void *rb_objc_ary_assoc_key = NULL; static struct rb_objc_ary_struct * rb_objc_ary_get_struct(VALUE ary) { - return rb_objc_get_associative_ref((void *)ary, &rb_objc_assoc_key); + return rb_objc_get_associative_ref((void *)ary, &rb_objc_ary_assoc_key); } static struct rb_objc_ary_struct * @@ -64,7 +64,7 @@ s = rb_objc_ary_get_struct(ary); if (s == NULL) { s = xmalloc(sizeof(struct rb_objc_ary_struct)); - rb_objc_set_associative_ref((void *)ary, &rb_objc_assoc_key, s); + rb_objc_set_associative_ref((void *)ary, &rb_objc_ary_assoc_key, s); s->frozen = false; s->named_args = false; } @@ -1533,6 +1533,8 @@ if (n > 0) CFArrayAppendArray((CFMutableArrayRef)dup, (CFArrayRef)ary, CFRangeMake(0, n)); + if (rb_ary_is_named_args(ary)) + rb_ary_set_named_args(dup, true); #else VALUE dup = rb_ary_new2(RARRAY_LEN(ary)); @@ -3860,6 +3862,19 @@ #undef INSTALL_METHOD } + +void +rb_ary_set_named_args(VALUE ary, bool flag) +{ + rb_objc_ary_get_struct2(ary)->named_args = flag; +} + +bool +rb_ary_is_named_args(VALUE ary) +{ + struct rb_objc_ary_struct *s = rb_objc_ary_get_struct(ary); + return s != NULL && s->named_args; +} #endif /* Arrays are ordered, integer-indexed collections of any object. Modified: MacRuby/trunk/class.c =================================================================== --- MacRuby/trunk/class.c 2008-03-28 22:38:12 UTC (rev 121) +++ MacRuby/trunk/class.c 2008-03-29 05:20:07 UTC (rev 122) @@ -1088,19 +1088,8 @@ if (class_isMetaClass(ocklass)) return klass; - if (!FL_TEST(klass, FL_SINGLETON)) { + if (!FL_TEST(klass, FL_SINGLETON)) klass = rb_make_metaclass(obj, klass); -#if 0 - Class newocklass; - - newocklass = objc_allocateClassPair(ocklass, "MetaClassFoo", 0); - assert(newocklass != NULL); - objc_registerClassPair(newocklass); - rb_objc_install_array_primitives(newocklass); - *(Class *)obj = newocklass; - klass = rb_objc_import_class(newocklass); -#endif - } return klass; } #endif Modified: MacRuby/trunk/compile.c =================================================================== --- MacRuby/trunk/compile.c 2008-03-28 22:38:12 UTC (rev 121) +++ MacRuby/trunk/compile.c 2008-03-29 05:20:07 UTC (rev 122) @@ -1989,7 +1989,7 @@ iseq_add_mark_object_compile_time(iseq, ary); #if WITH_OBJC if (node_root->flags & NODE_ARRAY_NAMED_ARGS) - FL_SET(ary, RARRAY_NAMED_ARGS); + rb_ary_set_named_args(ary, true); #endif ADD_INSN1(ret, nd_line(node_root), duparray, ary); } Modified: MacRuby/trunk/dir.c =================================================================== --- MacRuby/trunk/dir.c 2008-03-28 22:38:12 UTC (rev 121) +++ MacRuby/trunk/dir.c 2008-03-29 05:20:07 UTC (rev 122) @@ -789,6 +789,7 @@ char *cwd = my_getcwd(); args.old_path = rb_tainted_str_new2(cwd); xfree(cwd); + rb_objc_retain(args.old_path); args.new_path = path; args.done = Qfalse; return rb_ensure(chdir_yield, (VALUE)&args, chdir_restore, (VALUE)&args); Modified: MacRuby/trunk/hash.c =================================================================== --- MacRuby/trunk/hash.c 2008-03-28 22:38:12 UTC (rev 121) +++ MacRuby/trunk/hash.c 2008-03-29 05:20:07 UTC (rev 122) @@ -267,12 +267,12 @@ }; /* This variable will always stay NULL, we only use its address. */ -static void *rb_objc_assoc_key = NULL; +static void *rb_objc_hash_assoc_key = NULL; static struct rb_objc_hash_struct * rb_objc_hash_get_struct(VALUE hash) { - return rb_objc_get_associative_ref((void *)hash, &rb_objc_assoc_key); + return rb_objc_get_associative_ref((void *)hash, &rb_objc_hash_assoc_key); } static struct rb_objc_hash_struct * @@ -283,7 +283,7 @@ s = rb_objc_hash_get_struct(hash); if (s == NULL) { s = xmalloc(sizeof(struct rb_objc_hash_struct)); - rb_objc_set_associative_ref((void *)hash, &rb_objc_assoc_key, s); + rb_objc_set_associative_ref((void *)hash, &rb_objc_hash_assoc_key, s); s->ifnone = Qnil; s->has_proc_default = false; s->frozen = false; Modified: MacRuby/trunk/include/ruby/intern.h =================================================================== --- MacRuby/trunk/include/ruby/intern.h 2008-03-28 22:38:12 UTC (rev 121) +++ MacRuby/trunk/include/ruby/intern.h 2008-03-29 05:20:07 UTC (rev 122) @@ -79,6 +79,8 @@ VALUE rb_get_values_at(VALUE, long, int, VALUE*, VALUE(*)(VALUE,long)); #if WITH_OBJC VALUE rb_ary_elt(VALUE, long); +void rb_ary_set_named_args(VALUE, bool); +bool rb_ary_is_named_args(VALUE); #endif /* bignum.c */ VALUE rb_big_clone(VALUE); Modified: MacRuby/trunk/include/ruby/ruby.h =================================================================== --- MacRuby/trunk/include/ruby/ruby.h 2008-03-28 22:38:12 UTC (rev 121) +++ MacRuby/trunk/include/ruby/ruby.h 2008-03-29 05:20:07 UTC (rev 122) @@ -535,9 +535,6 @@ # define RARRAY_PTR(a) (rb_ary_ptr(a)) # define RARRAY_AT(a,i) (rb_ary_elt(a, i)) #endif -#if WITH_OBJC -# define RARRAY_NAMED_ARGS FL_USER1 -#endif struct RRegexp { struct RBasic basic; @@ -728,7 +725,7 @@ #define ALLOCA_N(type,n) (type*)alloca(sizeof(type)*(n)) #define MEMZERO(p,type,n) memset((p), 0, sizeof(type)*(n)) -#if WITH_OBJC +#if 0//WITH_OBJC void *rb_gc_memmove(void *, const void *, size_t); # define MEMCPY(p1,p2,type,n) rb_gc_memmove((p1), (p2), sizeof(type)*(n)) # define MEMMOVE(p1,p2,type,n) rb_gc_memmove((p1), (p2), sizeof(type)*(n)) Modified: MacRuby/trunk/insns.def =================================================================== --- MacRuby/trunk/insns.def 2008-03-28 22:38:12 UTC (rev 121) +++ MacRuby/trunk/insns.def 2008-03-29 05:20:07 UTC (rev 122) @@ -439,7 +439,7 @@ (VALUE val) // inc += 1 - num; { val = rb_ary_new4((long)num, STACK_ADDR_FROM_TOP(num)); - FL_SET(val, RARRAY_NAMED_ARGS); + rb_ary_set_named_args(val, true); POPN(num); } @@ -464,7 +464,7 @@ (VALUE val) { val = rb_ary_dup(ary); - FL_SET(val, RARRAY_NAMED_ARGS); + rb_ary_set_named_args(val, true); } /** Modified: MacRuby/trunk/io.c =================================================================== --- MacRuby/trunk/io.c 2008-03-28 22:38:12 UTC (rev 121) +++ MacRuby/trunk/io.c 2008-03-29 05:20:07 UTC (rev 122) @@ -323,7 +323,7 @@ fptr->rbuf_capa = len; else fptr->rbuf_capa = 8192; - fptr->rbuf = ALLOC_N(char, fptr->rbuf_capa); + GC_WB(&fptr->rbuf, ALLOC_N(char, fptr->rbuf_capa)); } if (fptr->rbuf_capa < len + fptr->rbuf_len) { rb_raise(rb_eIOError, "ungetc failed"); @@ -695,7 +695,7 @@ fptr->wbuf_off = 0; fptr->wbuf_len = 0; fptr->wbuf_capa = 8192; - fptr->wbuf = ALLOC_N(char, fptr->wbuf_capa); + GC_WB(&fptr->wbuf, ALLOC_N(char, fptr->wbuf_capa)); } if ((fptr->mode & (FMODE_SYNC|FMODE_TTY)) || (fptr->wbuf && fptr->wbuf_capa <= fptr->wbuf_len + len)) { @@ -1012,7 +1012,7 @@ fptr->rbuf_off = 0; fptr->rbuf_len = 0; fptr->rbuf_capa = 8192; - fptr->rbuf = ALLOC_N(char, fptr->rbuf_capa); + GC_WB(&fptr->rbuf, ALLOC_N(char, fptr->rbuf_capa)); } if (fptr->rbuf_len == 0) { retry: @@ -3430,7 +3430,7 @@ struct pipe_list *list; list = ALLOC(struct pipe_list); - GC_GB(&list->fptr, fptr); + list->fptr = fptr; list->next = pipe_list; pipe_list = list; } Modified: MacRuby/trunk/string.c =================================================================== --- MacRuby/trunk/string.c 2008-03-28 22:38:12 UTC (rev 121) +++ MacRuby/trunk/string.c 2008-03-29 05:20:07 UTC (rev 122) @@ -359,7 +359,7 @@ str = str_alloc(klass); if (len > RSTRING_EMBED_LEN_MAX) { RSTRING(str)->as.heap.aux.capa = len; - RSTRING(str)->as.heap.ptr = ALLOC_N(char,len+1); + GC_WB(&RSTRING(str)->as.heap.ptr, ALLOC_N(char,len+1)); STR_SET_NOEMBED(str); } if (ptr) { @@ -549,7 +549,7 @@ } FL_SET(str, STR_NOEMBED); RSTRING(str)->as.heap.aux.capa = capa; - RSTRING(str)->as.heap.ptr = ALLOC_N(char, capa+1); + GC_WB(&RSTRING(str)->as.heap.ptr, ALLOC_N(char, capa+1)); RSTRING(str)->as.heap.ptr[0] = '\0'; return str; @@ -982,7 +982,7 @@ } STR_SET_NOEMBED(str); ptr[len] = 0; - RSTRING(str)->as.heap.ptr = ptr; + GC_WB(&RSTRING(str)->as.heap.ptr, ptr); RSTRING(str)->as.heap.len = len; RSTRING(str)->as.heap.aux.capa = len; STR_UNSET_NOCAPA(str); @@ -4325,7 +4325,7 @@ t += tlen; } *t = '\0'; - RSTRING(str)->as.heap.ptr = buf; + GC_WB(&RSTRING(str)->as.heap.ptr, buf); RSTRING(str)->as.heap.len = t - buf; STR_SET_NOEMBED(str); RSTRING(str)->as.heap.aux.capa = max; @@ -4389,7 +4389,7 @@ xfree(RSTRING(str)->as.heap.ptr); } *t = '\0'; - RSTRING(str)->as.heap.ptr = buf; + GC_WB(&RSTRING(str)->as.heap.ptr, buf); RSTRING(str)->as.heap.len = t - buf; STR_SET_NOEMBED(str); RSTRING(str)->as.heap.aux.capa = max; Modified: MacRuby/trunk/vm_insnhelper.c =================================================================== --- MacRuby/trunk/vm_insnhelper.c 2008-03-28 22:38:12 UTC (rev 121) +++ MacRuby/trunk/vm_insnhelper.c 2008-03-29 05:20:07 UTC (rev 122) @@ -1120,13 +1120,10 @@ NODE *mn; char buf[128]; - if (0) { -#if 0 /* FIXME */ - /* *pmn == NULL + if (/* *pmn == NULL &&*/ *pnum == 2 && TYPE(argv[1]) == T_ARRAY - && FL_TEST(argv[1], RARRAY_NAMED_ARGS)) { -#endif + && rb_ary_is_named_args(argv[1])) { unsigned i, count; @@ -1146,12 +1143,9 @@ strncat(buf, ":", sizeof buf); } -//printf("buf is %s\n", buf); - id = rb_intern(buf); if ((mn = rb_method_node(CLASS_OF(recv), id)) != NULL || (mn = rb_objc_define_objc_mid_closure(recv, id, NULL)) != NULL) { -#if 1 unsigned j, newnum = 1 + (count / 2); void **new_argv = alloca(sizeof(void *) * newnum); new_argv[0] = (void *)argv[0]; @@ -1162,7 +1156,6 @@ cfp->bp -= newnum - *pnum; memcpy(argv, new_argv, sizeof(void *) * newnum); -#endif *pmn = mn; *pid = id; *pnum = newnum;