[macruby-changes] [139] MacRuby/trunk

source_changes at macosforge.org source_changes at macosforge.org
Tue Apr 15 17:54:19 PDT 2008


Revision: 139
          http://trac.macosforge.org/projects/ruby/changeset/139
Author:   lsansonetti at apple.com
Date:     2008-04-15 17:54:17 -0700 (Tue, 15 Apr 2008)

Log Message:
-----------
fixing some regressions

Modified Paths:
--------------
    MacRuby/trunk/encoding.c
    MacRuby/trunk/file.c
    MacRuby/trunk/load.c
    MacRuby/trunk/parse.y
    MacRuby/trunk/re.c
    MacRuby/trunk/string.c

Modified: MacRuby/trunk/encoding.c
===================================================================
--- MacRuby/trunk/encoding.c	2008-04-15 08:50:03 UTC (rev 138)
+++ MacRuby/trunk/encoding.c	2008-04-16 00:54:17 UTC (rev 139)
@@ -589,6 +589,9 @@
 int
 rb_enc_internal_get_index(VALUE obj)
 {
+#if WITH_OBJC
+    return 0;
+#else
     int i;
 
     i = ENCODING_GET_INLINED(obj);
@@ -599,11 +602,13 @@
 	i = NUM2INT(iv);
     }
     return i;
+#endif
 }
 
 void
 rb_enc_internal_set_index(VALUE obj, int idx)
 {
+#if !WITH_OBJC
     if (idx < ENCODING_INLINE_MAX) {
 	ENCODING_SET_INLINED(obj, idx);
 	return;
@@ -611,6 +616,7 @@
     ENCODING_SET_INLINED(obj, ENCODING_INLINE_MAX);
     rb_ivar_set(obj, rb_id_encoding(), INT2NUM(idx));
     return;
+#endif
 }
 
 void
@@ -642,7 +648,11 @@
 rb_encoding*
 rb_enc_get(VALUE obj)
 {
+#if WITH_OBJC
+    return rb_ascii8bit_encoding(); /* FIXME */
+#else
     return rb_enc_from_index(rb_enc_get_index(obj));
+#endif
 }
 
 rb_encoding*

Modified: MacRuby/trunk/file.c
===================================================================
--- MacRuby/trunk/file.c	2008-04-15 08:50:03 UTC (rev 138)
+++ MacRuby/trunk/file.c	2008-04-16 00:54:17 UTC (rev 139)
@@ -2750,6 +2750,7 @@
 
     if (tainted) OBJ_TAINT(result);
     rb_str_set_len(result, p - buf);
+    RSTRING_SYNC(result);
     return result;
 }
 
@@ -4203,7 +4204,8 @@
 
 	rb_str_cat2(newpath, "/");
 	rb_str_cat2(newpath, p0);
-	p0 = RSTRING_PTR(path = newpath);
+	path = newpath;
+	p0 = RSTRING_PTR(path);
     }
     for (;;) {
 #ifndef S_IWOTH
@@ -4373,11 +4375,11 @@
     }
 
     if (rb_load_path) {
-	long i;
+	long i, count;
 
 	Check_Type(rb_load_path, T_ARRAY);
 	tmp = rb_ary_new();
-	for (i=0;i<RARRAY_LEN(rb_load_path);i++) {
+	for (i=0, count=RARRAY_LEN(rb_load_path);i < count;i++) {
 	    VALUE str = RARRAY_AT(rb_load_path, i);
 	    FilePathValue(str);
 	    if (RSTRING_LEN(str) > 0) {

Modified: MacRuby/trunk/load.c
===================================================================
--- MacRuby/trunk/load.c	2008-04-15 08:50:03 UTC (rev 138)
+++ MacRuby/trunk/load.c	2008-04-16 00:54:17 UTC (rev 139)
@@ -103,7 +103,7 @@
 {
     VALUE v, features, p, load_path = 0;
     const char *f, *e;
-    long i, len, elen, n;
+    long i, count, len, elen, n;
     st_table *loading_tbl;
     st_data_t data;
     int type;
@@ -120,9 +120,9 @@
 	type = 0;
     }
     features = get_loaded_features();
-    for (i = 0; i < RARRAY_LEN(features); ++i) {
+    for (i = 0, count = RARRAY_LEN(features); i < count; ++i) {
 	v = RARRAY_AT(features, i);
-	f = StringValuePtr(v);
+	f = StringValueCStr(v);
 	if ((n = RSTRING_LEN(v)) < len) continue;
 	if (strncmp(f, feature, len) != 0) {
 	    if (expanded) continue;

Modified: MacRuby/trunk/parse.y
===================================================================
--- MacRuby/trunk/parse.y	2008-04-15 08:50:03 UTC (rev 138)
+++ MacRuby/trunk/parse.y	2008-04-16 00:54:17 UTC (rev 139)
@@ -4945,6 +4945,13 @@
 {
     VALUE str;
 
+#if WITH_OBJC
+    /* Let's not create unnecessary bytestrings. */
+    long slen = strlen(p);
+    if (slen < n)
+	n = slen;
+#endif
+
     str = rb_enc_str_new(p, n, enc);
     if (!(func & STR_FUNC_REGEXP) && rb_enc_asciicompat(enc)) {
 	if (rb_enc_str_coderange(str) == ENC_CODERANGE_7BIT) {
@@ -5389,12 +5396,14 @@
 static void
 dispose_string(VALUE str)
 {
+#if WITH_OBJC
     /* TODO: should use another API? */
-#if !WITH_OBJC
+    CFRelease((CFTypeRef)str);
+#else
     if (RBASIC(str)->flags & RSTRING_NOEMBED)
 	xfree(RSTRING_PTR(str));
+    rb_gc_force_recycle(str);
 #endif
-    rb_gc_force_recycle(str);
 }
 
 static int

Modified: MacRuby/trunk/re.c
===================================================================
--- MacRuby/trunk/re.c	2008-04-15 08:50:03 UTC (rev 138)
+++ MacRuby/trunk/re.c	2008-04-16 00:54:17 UTC (rev 139)
@@ -2037,6 +2037,7 @@
 
     buf = rb_str_buf_new(0);
 
+    *fixed_enc = 0;
     if (rb_enc_asciicompat(enc))
         *fixed_enc = 0;
     else {
@@ -2286,7 +2287,7 @@
     volatile VALUE save_str = str;
     if (reg_cache && RREGEXP(reg_cache)->len == RSTRING_LEN(str)
 	&& ENCODING_GET(reg_cache) == ENCODING_GET(str)
-	&& memcmp(RREGEXP(reg_cache)->str, RSTRING_PTR(str), RSTRING_LEN(str)) == 0)
+        && memcmp(RREGEXP(reg_cache)->str, RSTRING_PTR(str), RSTRING_LEN(str)) == 0)
 	return reg_cache;
 
     return reg_cache = rb_reg_new_str(save_str, 0);

Modified: MacRuby/trunk/string.c
===================================================================
--- MacRuby/trunk/string.c	2008-04-15 08:50:03 UTC (rev 138)
+++ MacRuby/trunk/string.c	2008-04-16 00:54:17 UTC (rev 139)
@@ -184,7 +184,11 @@
 #define is_ascii_string(str) (rb_enc_str_coderange(str) == ENC_CODERANGE_7BIT)
 #define is_broken_string(str) (rb_enc_str_coderange(str) == ENC_CODERANGE_BROKEN)
 
-#define STR_ENC_GET(str) rb_enc_from_index(ENCODING_GET(str))
+#if WITH_OBJC
+# define STR_ENC_GET(str) (rb_ascii8bit_encoding()) /* TODO */
+#else
+# define STR_ENC_GET(str) rb_enc_from_index(ENCODING_GET(str))
+#endif
 
 static int
 single_byte_optimizable(VALUE str)
@@ -395,6 +399,9 @@
 int
 rb_enc_str_asciionly_p(VALUE str)
 {
+#if WITH_OBJC
+    return Qtrue;
+#else
     rb_encoding *enc = STR_ENC_GET(str);
 
     if (!rb_enc_asciicompat(enc))
@@ -402,6 +409,7 @@
     else if (rb_enc_str_coderange(str) == ENC_CODERANGE_7BIT)
         return Qtrue;
     return Qfalse;
+#endif
 }
 
 static inline void
@@ -1437,17 +1445,8 @@
 rb_str_subseq(VALUE str, long beg, long len)
 {
 #if WITH_OBJC
-    CFIndex buffer_len, buffer_used;
-    UInt8 *buffer;
-
-    buffer_len = (sizeof(UInt8) * len) + 1;
-    buffer = (UInt8 *)alloca(buffer_len);
-
-    CFStringGetBytes((CFStringRef)str, CFRangeMake(beg, len), 
-	    kCFStringEncodingUTF8, 0, false, buffer, buffer_len, &buffer_used);
-    assert(buffer_used == buffer_len - 1);
-    buffer[buffer_used] = '\0';
-    return rb_str_new5(str, (const char *)buffer, len);
+    return (VALUE)CFStringCreateWithSubstring(NULL, (CFStringRef)str, 
+	CFRangeMake(beg, len));
 #else
     VALUE str2 = rb_str_new5(str, RSTRING_PTR(str)+beg, len);
 
@@ -1671,6 +1670,12 @@
 rb_str_buf_cat(VALUE str, const char *ptr, long len)
 {
 #if WITH_OBJC
+    if (ptr[len] != '\0') {
+	char *p = alloca(len + 1);
+	memcpy(p, ptr, len);
+	p[len] = '\0';
+	ptr = p;
+    }
     CFStringAppendCString((CFMutableStringRef)str, ptr, kCFStringEncodingUTF8);
     /* FIXME ptr might be a bytestring */
 #else
@@ -4180,8 +4185,12 @@
 rb_str_inspect(VALUE str)
 {
 #if WITH_OBJC
-    /* TODO */
-    return rb_str_dup(str);
+    VALUE result = rb_str_new(NULL, 0);
+    rb_str_cat2(result, "\"");
+    rb_str_buf_append(result, str);
+    rb_str_cat2(result, "\"");
+    /* TODO needs to escape some characters */
+    return result;
 #else
     rb_encoding *enc = STR_ENC_GET(str);
     char *p, *pend;
@@ -5462,7 +5471,7 @@
 static VALUE
 rb_str_split_m(int argc, VALUE *argv, VALUE str)
 {
-#if WITH_OBJC
+#if 0//WITH_OBJC
     rb_notimplement();
 #else
     rb_encoding *enc;
@@ -5484,7 +5493,11 @@
 	i = 1;
     }
 
+#if WITH_OBJC
+    enc = rb_ascii8bit_encoding();
+#else
     enc = STR_ENC_GET(str);
+#endif
     if (NIL_P(spat)) {
 	if (!NIL_P(rb_fs)) {
 	    spat = rb_fs;
@@ -5495,7 +5508,11 @@
     else {
       fs_set:
 	if (TYPE(spat) == T_STRING) {
+#if WITH_OBJC
+	    rb_encoding *enc2 = rb_ascii8bit_encoding();
+#else
 	    rb_encoding *enc2 = STR_ENC_GET(spat);
+#endif
 
 	    if (rb_enc_mbminlen(enc2) == 1) {
 		if (RSTRING_LEN(spat) == 1 && RSTRING_PTR(spat)[0] == ' '){
@@ -6200,7 +6217,7 @@
 		break;
 	}
 	if (i < n - 1) {
-	    CFRange range = CFRangeMake(i, n);
+	    CFRange range = CFRangeMake(i + 1, n - i - 1);
 	    CFStringDelete((CFMutableStringRef)str, range);
 	    n -= range.length;	    
 	}
@@ -6213,7 +6230,7 @@
 		break;
 	}
 	if (i > 0) {
-	    CFRange range = CFRangeMake(i, n);
+	    CFRange range = CFRangeMake(0, i);
 	    CFStringDelete((CFMutableStringRef)str, range);
 	}
     }
@@ -7236,6 +7253,18 @@
 static VALUE
 sym_inspect(VALUE sym)
 {
+#if WITH_OBJC
+    ID id = SYM2ID(sym);
+    VALUE str;
+
+    sym = rb_id2str(id);
+    if (!rb_enc_symname_p(RSTRING_CPTR(sym), rb_ascii8bit_encoding())) {
+	sym = rb_str_inspect(sym);
+    }
+    str = rb_str_new(":", 1);
+    rb_str_buf_append(str, sym);
+    return str;
+#else
     VALUE str, klass = Qundef;
     ID id = SYM2ID(sym);
     rb_encoding *enc;
@@ -7246,7 +7275,7 @@
     RSTRING_PTR(str)[0] = ':';
     memcpy(RSTRING_PTR(str)+1, RSTRING_PTR(sym), RSTRING_LEN(sym));
     if (RSTRING_LEN(sym) != strlen(RSTRING_PTR(sym)) ||
-	!rb_enc_symname_p(RSTRING_PTR(sym), enc)) {
+	!rb_enc_symname_p(RSTRING_PTR(sym), enc)) {	
 	str = rb_str_inspect(str);
 	strncpy(RSTRING_PTR(str), ":\"", 2);
     }
@@ -7255,6 +7284,7 @@
 	rb_str_append(str, rb_inspect(klass));
     }
     return str;
+#endif
 }
 
 

-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.macosforge.org/pipermail/macruby-changes/attachments/20080415/5120cafe/attachment-0001.html


More information about the macruby-changes mailing list