From 758ff64c69e34965f8af5b2d6ffd65e8d7ab2150 Mon Sep 17 00:00:00 2001 From: Ondřej Surý Date: Mon, 14 Feb 2011 13:23:51 +0100 Subject: Imported Upstream version 2011-02-01.1 --- src/pkg/runtime/cgocall.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) (limited to 'src/pkg/runtime/cgocall.c') diff --git a/src/pkg/runtime/cgocall.c b/src/pkg/runtime/cgocall.c index 80ae97e7a..e6ece9542 100644 --- a/src/pkg/runtime/cgocall.c +++ b/src/pkg/runtime/cgocall.c @@ -53,12 +53,13 @@ runtime·cgocall(void (*fn)(void*), void *arg) // (arg/argsize) on to the stack, calls the function, copies the // arguments back where they came from, and finally returns to the old // stack. -void +uintptr runtime·cgocallback(void (*fn)(void), void *arg, int32 argsize) { Gobuf oldsched, oldg1sched; G *g1; void *sp; + uintptr ret; if(g != m->g0) runtime·throw("bad g in cgocallback"); @@ -70,11 +71,11 @@ runtime·cgocallback(void (*fn)(void), void *arg, int32 argsize) runtime·startcgocallback(g1); sp = g1->sched.sp - argsize; - if(sp < g1->stackguard) + if(sp < g1->stackguard - StackGuard + 4) // +4 for return address runtime·throw("g stack overflow in cgocallback"); runtime·mcpy(sp, arg, argsize); - runtime·runcgocallback(g1, sp, fn); + ret = runtime·runcgocallback(g1, sp, fn); runtime·mcpy(arg, sp, argsize); @@ -82,6 +83,8 @@ runtime·cgocallback(void (*fn)(void), void *arg, int32 argsize) m->sched = oldsched; g1->sched = oldg1sched; + + return ret; } void -- cgit v1.2.3