Revision: 194 http://trac.macosforge.org/projects/ruby/changeset/194 Author: lsansonetti@apple.com Date: 2008-05-15 15:04:42 -0700 (Thu, 15 May 2008) Log Message: ----------- fixing some marshal bugs Modified Paths: -------------- MacRuby/trunk/array.c MacRuby/trunk/encoding.c MacRuby/trunk/hash.c MacRuby/trunk/include/ruby/encoding.h MacRuby/trunk/include/ruby/intern.h MacRuby/trunk/marshal.c MacRuby/trunk/parse.y MacRuby/trunk/string.c Modified: MacRuby/trunk/array.c =================================================================== --- MacRuby/trunk/array.c 2008-05-15 19:11:55 UTC (rev 193) +++ MacRuby/trunk/array.c 2008-05-15 22:04:42 UTC (rev 194) @@ -3847,7 +3847,7 @@ #define RESTORE_RCV(x) \ *(Class *)x = old; -static bool +bool rb_objc_ary_is_pure(VALUE ary) { return *(Class *)ary == NSCFARRAY(); Modified: MacRuby/trunk/encoding.c =================================================================== --- MacRuby/trunk/encoding.c 2008-05-15 19:11:55 UTC (rev 193) +++ MacRuby/trunk/encoding.c 2008-05-15 22:04:42 UTC (rev 194) @@ -1409,16 +1409,23 @@ #endif } -const char * -rb_enc_name(rb_encoding *enc) +VALUE +rb_enc_name2(rb_encoding *enc) { CFStringRef str; if (enc != NULL && (str = CFStringConvertEncodingToIANACharSetName(*enc)) != NULL) - return RSTRING_CPTR(str); - return NULL; + return str; + return Qnil; } +const char * +rb_enc_name(rb_encoding *enc) +{ + CFStringRef str = rb_enc_name2(enc); + return str == Qnil ? NULL : RSTRING_CPTR(str); +} + long rb_enc_mbminlen(rb_encoding *enc) { Modified: MacRuby/trunk/hash.c =================================================================== --- MacRuby/trunk/hash.c 2008-05-15 19:11:55 UTC (rev 193) +++ MacRuby/trunk/hash.c 2008-05-15 22:04:42 UTC (rev 194) @@ -2890,15 +2890,25 @@ #if WITH_OBJC static Class __nscfdictionary = NULL; + +#define NSCFDICTIONARY() \ + (__nscfdictionary == NULL \ + ? __nscfdictionary = (Class)objc_getClass("NSCFDictionary") \ + : __nscfdictionary) + #define PREPARE_RCV(x) \ - Class old = *(Class *)x; \ - if (__nscfdictionary == NULL) \ - __nscfdictionary = (Class)objc_getClass("NSCFDictionary"); \ - *(Class *)x = __nscfdictionary; + Class old = *(Class *)x; \ + *(Class *)x = __nscfdictionary; #define RESTORE_RCV(x) \ - *(Class *)x = old; + *(Class *)x = old; +bool +rb_objc_hash_is_pure(VALUE ary) +{ + return *(Class *)ary == NSCFDICTIONARY(); +} + static CFIndex imp_rb_hash_count(void *rcv, SEL sel) { Modified: MacRuby/trunk/include/ruby/encoding.h =================================================================== --- MacRuby/trunk/include/ruby/encoding.h 2008-05-15 19:11:55 UTC (rev 193) +++ MacRuby/trunk/include/ruby/encoding.h 2008-05-15 22:04:42 UTC (rev 194) @@ -123,6 +123,7 @@ /* encoding -> name */ #if WITH_OBJC const char *rb_enc_name(rb_encoding *); +VALUE rb_enc_name2(rb_encoding *); #else #define rb_enc_name(enc) (enc)->name #endif Modified: MacRuby/trunk/include/ruby/intern.h =================================================================== --- MacRuby/trunk/include/ruby/intern.h 2008-05-15 19:11:55 UTC (rev 193) +++ MacRuby/trunk/include/ruby/intern.h 2008-05-15 22:04:42 UTC (rev 194) @@ -81,7 +81,7 @@ VALUE rb_ary_elt(VALUE, long); void rb_ary_set_named_args(VALUE, bool); bool rb_ary_is_named_args(VALUE); -VALUE rb_ary_clone(VALUE); +bool rb_objc_ary_is_pure(VALUE); #endif /* bignum.c */ VALUE rb_big_clone(VALUE); @@ -363,7 +363,7 @@ int rb_path_check(const char*); int rb_env_path_tainted(void); #if WITH_OBJC -VALUE rb_hash_clone(VALUE); +bool rb_objc_hash_is_pure(VALUE); #endif /* io.c */ #define rb_defout rb_stdout @@ -573,6 +573,9 @@ VALUE rb_str_intern(VALUE); VALUE rb_sym_to_s(VALUE); VALUE rb_str_length(VALUE); +#if WITH_OBJC +bool rb_objc_str_is_pure(VALUE); +#endif /* struct.c */ VALUE rb_struct_new(VALUE, ...); VALUE rb_struct_define(const char*, ...); Modified: MacRuby/trunk/marshal.c =================================================================== --- MacRuby/trunk/marshal.c 2008-05-15 19:11:55 UTC (rev 193) +++ MacRuby/trunk/marshal.c 2008-05-15 22:04:42 UTC (rev 194) @@ -443,18 +443,24 @@ } static void +#if WITH_OBJC +w_uclass(VALUE obj, bool is_pure, struct dump_arg *arg) +#else w_uclass(VALUE obj, VALUE super, struct dump_arg *arg) +#endif { VALUE klass = CLASS_OF(obj); w_extended(klass, arg, Qtrue); klass = rb_class_real(klass); -#if 0 +#if WITH_OBJC + if (!is_pure) { +#else if (klass != super) { +#endif w_byte(TYPE_UCLASS, arg); w_unique(RSTRING_CPTR(class2path(klass)), arg); } -#endif } static int @@ -471,14 +477,14 @@ { rb_encoding *enc = 0; #if WITH_OBJC - const char *name; + VALUE name; enc = rb_enc_get(obj); if (enc == NULL) { w_long(num, arg->arg); return; } - name = rb_enc_name(enc); + name = rb_enc_name2(enc); #else int encidx = rb_enc_get_index(obj); st_data_t name; @@ -694,7 +700,11 @@ break; case T_STRING: +#if WITH_OBJC + w_uclass(obj, rb_objc_str_is_pure(obj), arg); +#else w_uclass(obj, rb_cString, arg); +#endif w_byte(TYPE_STRING, arg); w_bytes(RSTRING_CPTR(obj), RSTRING_CLEN(obj), arg); break; @@ -707,7 +717,11 @@ break; case T_ARRAY: +#if WITH_OBJC + w_uclass(obj, rb_objc_ary_is_pure(obj), arg); +#else w_uclass(obj, rb_cArray, arg); +#endif w_byte(TYPE_ARRAY, arg); { long len = RARRAY_LEN(obj); @@ -729,9 +743,14 @@ break; case T_HASH: +#if WITH_OBJC + w_uclass(obj, rb_objc_hash_is_pure(obj), arg); +#else w_uclass(obj, rb_cHash, arg); +#endif #if WITH_OBJC w_byte(TYPE_HASH, arg); + /* TODO: encode ifnone too */ #else if (NIL_P(RHASH(obj)->ifnone)) { w_byte(TYPE_HASH, arg); @@ -1121,15 +1140,14 @@ while (len--) { ID id = r_symbol(arg); VALUE val = r_object(arg); -#if WITH_OBJC - if (0) { -#else +#if !WITH_OBJC if (id == rb_id_encoding()) { -#endif int idx = rb_enc_find_index(StringValueCStr(val)); if (idx > 0) rb_enc_associate_index(obj, idx); } - else { + else +#endif + { rb_ivar_set(obj, id, val); } } @@ -1234,12 +1252,19 @@ format_error: rb_raise(rb_eArgError, "dump format error (user class)"); } - if (TYPE(v) == T_MODULE || !RTEST(rb_class_inherited_p(c, RBASIC(v)->klass))) { - VALUE tmp = rb_obj_alloc(c); +#if WITH_OBJC + if (rb_objc_is_non_native(v)) { + *(Class *)v = RCLASS_OCID(c); + } + else { +#endif + if (TYPE(v) == T_MODULE || !RTEST(rb_class_inherited_p(c, RBASIC(v)->klass))) { + VALUE tmp = rb_obj_alloc(c); - if (TYPE(v) != TYPE(tmp)) goto format_error; + if (TYPE(v) != TYPE(tmp)) goto format_error; + } + RBASIC(v)->klass = c; } - RBASIC(v)->klass = c; } break; @@ -1284,7 +1309,7 @@ else { char *e; d = strtod(ptr, &e); - d = load_mantissa(d, e, RSTRING_CLEN(str) - (e - ptr)); + d = load_mantissa(d, e, strlen(ptr) - (e - ptr)); } v = DOUBLE2NUM(d); v = r_entry(v, arg); Modified: MacRuby/trunk/parse.y =================================================================== --- MacRuby/trunk/parse.y 2008-05-15 19:11:55 UTC (rev 193) +++ MacRuby/trunk/parse.y 2008-05-15 22:04:42 UTC (rev 194) @@ -9055,7 +9055,7 @@ if (m < e && is_identchar(m, e, enc)) { if (!ISASCII(*m)) mb = 1; #if WITH_OBJC - m += e-m; + m += 1; #else m += rb_enc_mbclen(m, e, enc); #endif @@ -9160,7 +9160,7 @@ if (m >= e || (*m != '_' && !rb_enc_isalpha(*m, enc) && ISASCII(*m))) return Qfalse; #if WITH_OBJC - while (m < e && is_identchar(m, e, enc)) m += e-m; + while (m < e && is_identchar(m, e, enc)) m += 1; #else while (m < e && is_identchar(m, e, enc)) m += rb_enc_mbclen(m, e, enc); #endif @@ -9272,7 +9272,6 @@ } break; } -#if !WITH_OBJC mb = 0; if (!rb_enc_isdigit(*m, enc)) { while (m <= name + last && is_identchar(m, e, enc)) { @@ -9281,11 +9280,16 @@ } else { mb = 1; +#if WITH_OBJC + m += 1; +#else m += rb_enc_mbclen(m, e, enc); +#endif } } } if (m - name < len) id = ID_JUNK; +#if !WITH_OBJC if (enc != rb_usascii_encoding()) { /* * this clause makes sense only when called from other than Modified: MacRuby/trunk/string.c =================================================================== --- MacRuby/trunk/string.c 2008-05-15 19:11:55 UTC (rev 193) +++ MacRuby/trunk/string.c 2008-05-15 22:04:42 UTC (rev 194) @@ -2396,7 +2396,7 @@ } #if WITH_OBJC -static bool rb_objc_str_is_pure(VALUE); +bool rb_objc_str_is_pure(VALUE); #endif /* @@ -8253,7 +8253,7 @@ #define RESTORE_RCV(x) \ *(Class *)x = old; -static bool +bool rb_objc_str_is_pure(VALUE str) { return *(Class *)str == NSCFSTRING();
participants (1)
-
source_changes@macosforge.org