1
0
mirror of https://github.com/golang/go synced 2024-10-04 06:11:21 -06:00

runtime: don't use ... formal argument to deferreturn.

R=golang-dev, rsc
CC=golang-dev
https://golang.org/cl/28860043
This commit is contained in:
Keith Randall 2013-12-02 13:07:15 -08:00
parent 3278dc158e
commit c792bde9ef
2 changed files with 10 additions and 7 deletions

View File

@ -168,8 +168,13 @@ compile(Node *fn)
if(retpc)
patch(retpc, pc);
ginit();
if(hasdefer)
if(hasdefer) {
ginscall(deferreturn, 0);
// deferreturn pretends to have one uintptr argument.
// Reserve space for it so stack scanner is happy.
if(maxarg < widthptr)
maxarg = widthptr;
}
if(curfn->exit)
genlist(curfn->exit);
gclean();

View File

@ -157,14 +157,12 @@ runtime·deferproc(int32 siz, FuncVal *fn, ...)
// is called again and again until there are no more deferred functions.
// Cannot split the stack because we reuse the caller's frame to
// call the deferred function.
//
// The ... in the prototype keeps the compiler from declaring
// an argument frame size. deferreturn is a very special function,
// and if the runtime ever asks for its frame size, that means
// the traceback routines are probably broken.
// The single argument isn't actually used - it just has its address
// taken so it can be matched against pending defers.
#pragma textflag NOSPLIT
void
runtime·deferreturn(uintptr arg0, ...)
runtime·deferreturn(uintptr arg0)
{
Defer *d;
byte *argp;