From 35a9a25100101a4956eaeea9cc9d5ffc89f73a0a Mon Sep 17 00:00:00 2001 From: Russ Cox Date: Thu, 25 Feb 2010 15:11:07 -0800 Subject: gc: implement []int(string) and []byte(string) R=ken2 CC=golang-dev http://codereview.appspot.com/224060 --- src/pkg/runtime/string.cgo | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) (limited to 'src/pkg/runtime/string.cgo') diff --git a/src/pkg/runtime/string.cgo b/src/pkg/runtime/string.cgo index 4c85766c2..2cb518c6f 100644 --- a/src/pkg/runtime/string.cgo +++ b/src/pkg/runtime/string.cgo @@ -4,6 +4,7 @@ package runtime #include "runtime.h" +#include "malloc.h" String emptystring; @@ -210,6 +211,12 @@ func slicebytetostring(b Slice) (s String) { mcpy(s.str, b.array, s.len); } +func stringtoslicebyte(s String) (b Slice) { + b.array = mallocgc(s.len, RefNoPointers, 1, 1); + b.len = s.len; + b.cap = s.len; + mcpy(b.array, s.str, s.len); +} func sliceinttostring(b Slice) (s String) { int32 siz1, siz2, i; @@ -233,6 +240,30 @@ func sliceinttostring(b Slice) (s String) { s.len = siz2; } +func stringtosliceint(s String) (b Slice) { + int32 n; + int32 dum, *r; + uint8 *p, *ep; + + // two passes. + // unlike sliceinttostring, no race because strings are immutable. + p = s.str; + ep = s.str+s.len; + n = 0; + while(p < ep) { + p += charntorune(&dum, p, ep-p); + n++; + } + + b.array = mallocgc(n*sizeof(r[0]), RefNoPointers, 1, 1); + b.len = n; + b.cap = n; + p = s.str; + r = (int32*)b.array; + while(p < ep) + p += charntorune(r++, p, ep-p); +} + enum { Runeself = 0x80, -- cgit v1.2.3