mirror of https://github.com/golang/go.git
undo CL 105260044 / afd6f214cc81
The go:nosplit change wasn't the problem, reinstating. ««« original CL description undo CL 93380044 / 7f0999348917 Partial undo, just of go:nosplit annotation. Somehow it is breaking the windows builders. TBR=bradfitz ««« original CL description runtime: implement string ops in Go Also implement go:nosplit annotation. Not really needed for now, but we'll definitely need it for other conversions. benchmark old ns/op new ns/op delta BenchmarkRuneIterate 534 474 -11.24% BenchmarkRuneIterate2 535 470 -12.15% LGTM=bradfitz R=golang-codereviews, dave, bradfitz, minux CC=golang-codereviews https://golang.org/cl/93380044 »»» TBR=bradfitz CC=golang-codereviews https://golang.org/cl/105260044 »»» TBR=bradfitz R=bradfitz, golang-codereviews CC=golang-codereviews https://golang.org/cl/103490043
This commit is contained in:
parent
f2147cd740
commit
5ce6d3e03e
|
|
@ -649,7 +649,7 @@ typefmt(Fmt *fp, Type *t)
|
|||
|
||||
if(t->funarg) {
|
||||
fmtstrcpy(fp, "(");
|
||||
if(fmtmode == FTypeId || fmtmode == FErr) { // no argument names on function signature, and no "noescape" tags
|
||||
if(fmtmode == FTypeId || fmtmode == FErr) { // no argument names on function signature, and no "noescape"/"nosplit" tags
|
||||
for(t1=t->type; t1!=T; t1=t1->down)
|
||||
if(t1->down)
|
||||
fmtprint(fp, "%hT, ", t1);
|
||||
|
|
|
|||
|
|
@ -269,6 +269,7 @@ struct Node
|
|||
uchar colas; // OAS resulting from :=
|
||||
uchar diag; // already printed error about this
|
||||
uchar noescape; // func arguments do not escape
|
||||
uchar nosplit; // func should not execute on separate stack
|
||||
uchar builtin; // built-in name, like len or close
|
||||
uchar walkdef;
|
||||
uchar typecheck;
|
||||
|
|
@ -980,6 +981,7 @@ EXTERN char* flag_installsuffix;
|
|||
EXTERN int flag_race;
|
||||
EXTERN int flag_largemodel;
|
||||
EXTERN int noescape;
|
||||
EXTERN int nosplit;
|
||||
EXTERN int debuglive;
|
||||
EXTERN Link* ctxt;
|
||||
|
||||
|
|
|
|||
|
|
@ -1311,6 +1311,7 @@ xfndcl:
|
|||
$$->nbody = $3;
|
||||
$$->endlineno = lineno;
|
||||
$$->noescape = noescape;
|
||||
$$->nosplit = nosplit;
|
||||
funcbody($$);
|
||||
}
|
||||
|
||||
|
|
@ -1495,6 +1496,7 @@ xdcl_list:
|
|||
testdclstack();
|
||||
nointerface = 0;
|
||||
noescape = 0;
|
||||
nosplit = 0;
|
||||
}
|
||||
|
||||
vardcl_list:
|
||||
|
|
|
|||
|
|
@ -1592,6 +1592,10 @@ go:
|
|||
noescape = 1;
|
||||
goto out;
|
||||
}
|
||||
if(strcmp(lexbuf, "go:nosplit") == 0) {
|
||||
nosplit = 1;
|
||||
goto out;
|
||||
}
|
||||
|
||||
out:
|
||||
return c;
|
||||
|
|
|
|||
|
|
@ -229,6 +229,8 @@ compile(Node *fn)
|
|||
ptxt->TEXTFLAG |= WRAPPER;
|
||||
if(fn->needctxt)
|
||||
ptxt->TEXTFLAG |= NEEDCTXT;
|
||||
if(fn->nosplit)
|
||||
ptxt->TEXTFLAG |= NOSPLIT;
|
||||
|
||||
// Clumsy but important.
|
||||
// See test/recover.go for test cases and src/pkg/reflect/value.go
|
||||
|
|
|
|||
|
|
@ -3828,6 +3828,7 @@ yyreduce:
|
|||
(yyval.node)->nbody = (yyvsp[(3) - (3)].list);
|
||||
(yyval.node)->endlineno = lineno;
|
||||
(yyval.node)->noescape = noescape;
|
||||
(yyval.node)->nosplit = nosplit;
|
||||
funcbody((yyval.node));
|
||||
}
|
||||
break;
|
||||
|
|
@ -4037,6 +4038,7 @@ yyreduce:
|
|||
testdclstack();
|
||||
nointerface = 0;
|
||||
noescape = 0;
|
||||
nosplit = 0;
|
||||
}
|
||||
break;
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue