void runtime·deferreturn(uintptr arg0) { Defer *d; byte *argp; FuncVal *fn; d = g->defer; if(d == nil) return; argp = (byte*)&arg0; if(d->argp != argp) return; // Moving arguments around. // Do not allow preemption here, because the garbage collector // won't know the form of the arguments until the jmpdefer can // flip the PC over to fn. m->locks++; runtime·memmove(argp, d->args, d->siz); fn = d->fn; g->defer = d->link; freedefer(d); m->locks--; if(m->locks == 0 && g->preempt) g->stackguard0 = StackPreempt; runtime·jmpdefer(fn, argp); }
void runtime·deferreturn(uintptr arg0) { Defer *d; byte *argp, *fn; d = g->defer; if(d == nil) return; argp = (byte*)&arg0; if(d->argp != argp) return; runtime·mcpy(argp, d->args, d->siz); g->defer = d->link; fn = d->fn; runtime·free(d); runtime·jmpdefer(fn, argp); }
void runtime·deferreturn(uintptr arg0) { Defer *d; byte *argp; FuncVal *fn; d = g->defer; if(d == nil) return; argp = (byte*)&arg0; if(d->argp != argp) return; runtime·memmove(argp, d->args, d->siz); fn = d->fn; popdefer(); freedefer(d); runtime·jmpdefer(fn, argp); }