[macruby-changes] [2868] MacRuby/trunk/string.c

source_changes at macosforge.org source_changes at macosforge.org
Tue Oct 20 15:11:45 PDT 2009


Revision: 2868
          http://trac.macosforge.org/projects/ruby/changeset/2868
Author:   lsansonetti at apple.com
Date:     2009-10-20 15:11:43 -0700 (Tue, 20 Oct 2009)
Log Message:
-----------
removed buggy implementation of String#dump and use #inspect for now

Modified Paths:
--------------
    MacRuby/trunk/string.c

Modified: MacRuby/trunk/string.c
===================================================================
--- MacRuby/trunk/string.c	2009-10-20 08:09:07 UTC (rev 2867)
+++ MacRuby/trunk/string.c	2009-10-20 22:11:43 UTC (rev 2868)
@@ -2619,7 +2619,11 @@
     }
     __append(out, '"');
 
-    return (VALUE)CFMakeCollectable(out);
+    VALUE res = (VALUE)CFMakeCollectable(out);
+    if (OBJ_TAINTED(str)) {
+	OBJ_TAINT(res);
+    }
+    return res;
 }
 
 #define IS_EVSTR(p,e) ((p) < (e) && (*(p) == '$' || *(p) == '@' || *(p) == '{'))
@@ -2635,117 +2639,13 @@
 static VALUE
 rb_str_dump(VALUE str, SEL sel)
 {
-    rb_encoding *enc0 = rb_enc_get(str);
-    long len;
-    const char *p, *pend;
-    char *q, *qend;
-
-    len = 2;			/* "" */
-    p = RSTRING_PTR(str); 
-    pend = p + RSTRING_LEN(str);
-    while (p < pend) {
-	unsigned char c = *p++;
-	switch (c) {
-	  case '"':  case '\\':
-	  case '\n': case '\r':
-	  case '\t': case '\f':
-	  case '\013': case '\010': case '\007': case '\033':
-	    len += 2;
-	    break;
-
-	  case '#':
-	    len += IS_EVSTR(p, pend) ? 2 : 1;
-	    break;
-
-	  default:
-	    if (ISPRINT(c)) {
-		len++;
-	    }
-	    else {
-		len += 4;		/* \xNN */
-	    }
-	    break;
-	}
-    }
-    if (!rb_enc_asciicompat(enc0)) {
-	len += 19;		/* ".force_encoding('')" */
-	len += strlen(rb_enc_name(enc0));
-    }
-
-    p = RSTRING_PTR(str);
-    pend = p + RSTRING_LEN(str);
-
-    char *q_beg = q = (char *)alloca(len);
-    qend = q + len;
-
-    *q++ = '"';
-    while (p < pend) {
-	unsigned char c = *p++;
-
-	if (c == '"' || c == '\\') {
-	    *q++ = '\\';
-	    *q++ = c;
-	}
-	else if (c == '#') {
-	    if (IS_EVSTR(p, pend)) *q++ = '\\';
-	    *q++ = '#';
-	}
-	else if (c == '\n') {
-	    *q++ = '\\';
-	    *q++ = 'n';
-	}
-	else if (c == '\r') {
-	    *q++ = '\\';
-	    *q++ = 'r';
-	}
-	else if (c == '\t') {
-	    *q++ = '\\';
-	    *q++ = 't';
-	}
-	else if (c == '\f') {
-	    *q++ = '\\';
-	    *q++ = 'f';
-	}
-	else if (c == '\013') {
-	    *q++ = '\\';
-	    *q++ = 'v';
-	}
-	else if (c == '\010') {
-	    *q++ = '\\';
-	    *q++ = 'b';
-	}
-	else if (c == '\007') {
-	    *q++ = '\\';
-	    *q++ = 'a';
-	}
-	else if (c == '\033') {
-	    *q++ = '\\';
-	    *q++ = 'e';
-	}
-	else if (ISPRINT(c)) {
-	    *q++ = c;
-	}
-	else {
-	    *q++ = '\\';
-	    sprintf(q, "x%02X", c);
-	    q += 3;
-	}
-    }
-    *q++ = '"';
-    if (!rb_enc_asciicompat(enc0)) {
-	sprintf(q, ".force_encoding(\"%s\")", rb_enc_name(enc0));
-    }
-
-    /* result from dump is ASCII */
-
-    VALUE res = rb_str_new5(str, q_beg, strlen(q_beg));
-    if (OBJ_TAINTED(str)) {
-	OBJ_TAINT(res);
-    }
+    // XXX #dump and #inspect have some slight differences, let's fix that
+    // later.
+    VALUE res = rb_str_inspect(str, 0);
+    *(VALUE *)res = *(VALUE *)str;
     return res;
 }
 
-
 /*
  *  call-seq:
  *     str.upcase!   => str or nil
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/macruby-changes/attachments/20091020/164879d9/attachment.html>


More information about the macruby-changes mailing list