mirror of
https://github.com/golang/go
synced 2024-11-25 07:07:57 -07:00
runtime: better checks for syscall.NewCallback parameter
R=golang-dev, rsc CC=golang-dev https://golang.org/cl/4859042
This commit is contained in:
parent
d118905c2c
commit
c8ee9c60d2
@ -347,16 +347,26 @@ static Callbacks cbs;
|
||||
byte *
|
||||
runtime·compilecallback(Eface fn, bool cleanstack)
|
||||
{
|
||||
Func *f;
|
||||
int32 argsize, n;
|
||||
FuncType *ft;
|
||||
Type *t;
|
||||
int32 argsize, i, n;
|
||||
byte *p;
|
||||
Callback *c;
|
||||
|
||||
if(fn.type->kind != KindFunc)
|
||||
runtime·panicstring("not a function");
|
||||
if((f = runtime·findfunc((uintptr)fn.data)) == nil)
|
||||
runtime·throw("cannot find function");
|
||||
argsize = (f->args-2) * 4;
|
||||
if(fn.type == nil || fn.type->kind != KindFunc)
|
||||
runtime·panicstring("compilecallback: not a function");
|
||||
ft = (FuncType*)fn.type;
|
||||
if(ft->out.len != 1)
|
||||
runtime·panicstring("compilecallback: function must have one output parameter");
|
||||
if(((Type**)ft->out.array)[0]->size != sizeof(uintptr))
|
||||
runtime·panicstring("compilecallback: output parameter size is wrong");
|
||||
argsize = 0;
|
||||
for(i=0; i<ft->in.len; i++) {
|
||||
t = ((Type**)ft->in.array)[i];
|
||||
if(t->size != sizeof(uintptr))
|
||||
runtime·panicstring("compilecallback: input parameter size is wrong");
|
||||
argsize += t->size;
|
||||
}
|
||||
|
||||
// compute size of new fn.
|
||||
// must match code laid out below.
|
||||
|
Loading…
Reference in New Issue
Block a user