1
0
mirror of https://github.com/golang/go synced 2024-11-22 08:44:41 -07:00

gc, runtime: copy([]byte, string)

R=ken2
CC=golang-dev
https://golang.org/cl/2741041
This commit is contained in:
Russ Cox 2010-10-26 08:36:07 -07:00
parent e8bde0ec19
commit 82c6f5e3d1
5 changed files with 30 additions and 2 deletions

View File

@ -33,6 +33,7 @@ char *runtimeimport =
"func \"\".stringiter (? string, ? int) int\n" "func \"\".stringiter (? string, ? int) int\n"
"func \"\".stringiter2 (? string, ? int) (retk int, retv int)\n" "func \"\".stringiter2 (? string, ? int) (retk int, retv int)\n"
"func \"\".slicecopy (to any, fr any, wid uint32) int\n" "func \"\".slicecopy (to any, fr any, wid uint32) int\n"
"func \"\".slicestringcopy (to any, fr any) int\n"
"func \"\".convI2E (elem any) any\n" "func \"\".convI2E (elem any) any\n"
"func \"\".convI2I (typ *uint8, elem any) any\n" "func \"\".convI2I (typ *uint8, elem any) any\n"
"func \"\".convT2E (typ *uint8, elem any) any\n" "func \"\".convT2E (typ *uint8, elem any) any\n"

View File

@ -48,6 +48,7 @@ func stringtosliceint(string) []int
func stringiter(string, int) int func stringiter(string, int) int
func stringiter2(string, int) (retk int, retv int) func stringiter2(string, int) (retk int, retv int)
func slicecopy(to any, fr any, wid uint32) int func slicecopy(to any, fr any, wid uint32) int
func slicestringcopy(to any, fr any) int
// interface conversions // interface conversions
func convI2E(elem any) (ret any) func convI2E(elem any) (ret any)

View File

@ -926,13 +926,18 @@ reswitch:
goto error; goto error;
defaultlit(&n->left, T); defaultlit(&n->left, T);
defaultlit(&n->right, T); defaultlit(&n->right, T);
// copy([]byte, string)
if(isslice(n->left->type) && n->left->type->type == types[TUINT8] && n->right->type->etype == TSTRING)
goto ret;
if(!isslice(n->left->type) || !isslice(n->right->type)) { if(!isslice(n->left->type) || !isslice(n->right->type)) {
if(!isslice(n->left->type) && !isslice(n->right->type)) if(!isslice(n->left->type) && !isslice(n->right->type))
yyerror("arguments to copy must be slices; have %lT, %lT", n->left->type, n->right->type); yyerror("arguments to copy must be slices; have %lT, %lT", n->left->type, n->right->type);
else if(!isslice(n->left->type)) else if(!isslice(n->left->type))
yyerror("first argument to copy should be slice; have %lT", n->left->type); yyerror("first argument to copy should be slice; have %lT", n->left->type);
else else
yyerror("second argument to copy should be slice; have %lT", n->right->type); yyerror("second argument to copy should be slice or string; have %lT", n->right->type);
goto error; goto error;
} }
if(!eqtype(n->left->type->type, n->right->type->type)) { if(!eqtype(n->left->type->type, n->right->type->type)) {

View File

@ -1261,7 +1261,10 @@ walkexpr(Node **np, NodeList **init)
goto ret; goto ret;
case OCOPY: case OCOPY:
fn = syslook("slicecopy", 1); if(n->right->type->etype == TSTRING)
fn = syslook("slicestringcopy", 1);
else
fn = syslook("slicecopy", 1);
argtype(fn, n->left->type); argtype(fn, n->left->type);
argtype(fn, n->right->type); argtype(fn, n->right->type);
n = mkcall1(fn, n->type, init, n = mkcall1(fn, n->type, init,

View File

@ -217,6 +217,24 @@ out:
} }
} }
void
·slicestringcopy(Slice to, String fm, int32 ret)
{
if(fm.len == 0 || to.len == 0) {
ret = 0;
goto out;
}
ret = fm.len;
if(to.len < ret)
ret = to.len;
memmove(to.array, fm.str, ret);
out:
FLUSH(&ret);
}
void void
·printslice(Slice a) ·printslice(Slice a)
{ {