[svn:parrot] r48384 - branches/unshared_buffers/src/string/encoding

darbelo at svn.parrot.org darbelo at svn.parrot.org
Tue Aug 10 21:02:21 UTC 2010


Author: darbelo
Date: Tue Aug 10 21:02:21 2010
New Revision: 48384
URL: https://trac.parrot.org/parrot/changeset/48384

Log:
Make utf8 not depend on str_new.

Modified:
   branches/unshared_buffers/src/string/encoding/utf8.c

Modified: branches/unshared_buffers/src/string/encoding/utf8.c
==============================================================================
--- branches/unshared_buffers/src/string/encoding/utf8.c	Tue Aug 10 19:51:09 2010	(r48383)
+++ branches/unshared_buffers/src/string/encoding/utf8.c	Tue Aug 10 21:02:21 2010	(r48384)
@@ -678,21 +678,26 @@
 get_codepoints(PARROT_INTERP, ARGIN(const STRING *src), UINTVAL offset, UINTVAL count)
 {
     ASSERT_ARGS(get_codepoints)
+    const UINTVAL flags = PObj_get_FLAGS(src) & ~PObj_external_FLAG;
+    STRING * const dst  = Parrot_gc_new_string_header(interp, flags);
     String_iter    iter;
-    UINTVAL        start;
+    UINTVAL        start, size;
 
     iter_init(interp, src, &iter);
+    iter.set_position(interp, &iter, offset);
+    start = iter.bytepos;
+    iter.set_position(interp, &iter, offset + count);
+    size = iter.bytepos - start;
+
+    Parrot_gc_allocate_string_storage(interp, dst, size);
+    mem_sys_memcopy(Buffer_bufstart(dst), Buffer_bufstart(src) + start, size);
+
+    dst->encoding = src->encoding;
+    dst->charset  = src->charset;
+    dst->strlen   = count;
+    dst->bufused  = size;
 
-    if (offset)
-        iter.set_position(interp, &iter, offset);
-
-    start                   = iter.bytepos;
-
-    if (count)
-        iter.set_position(interp, &iter, offset + count);
-
-    return Parrot_str_new_init(interp, (char *)Buffer_bufstart(src) + start,
-        iter.bytepos - start, src->encoding, src->charset, PObj_get_FLAGS(src));
+    return dst;
 }
 
 /*


More information about the parrot-commits mailing list