]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: change functype's in and out fields to []*_type
authorMatthew Dempsky <mdempsky@google.com>
Wed, 21 Oct 2015 17:40:39 +0000 (10:40 -0700)
committerMatthew Dempsky <mdempsky@google.com>
Wed, 21 Oct 2015 18:37:45 +0000 (18:37 +0000)
Allows removing a few gratuitous unsafe.Pointer conversions and
parallels the type of reflect.funcType's in and out fields ([]*rtype).

Change-Id: Ie5ca230a94407301a854dfd8782a3180d5054bc4
Reviewed-on: https://go-review.googlesource.com/16163
Run-TryBot: Matthew Dempsky <mdempsky@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Ian Lance Taylor <iant@golang.org>
src/runtime/mfinal.go
src/runtime/syscall_windows.go
src/runtime/type.go

index 7e1773c88caf403b968636a4c3ce39f1a26c5a6f..a753ceda5241a4dc3a53b68faf015947cae85c22 100644 (file)
@@ -327,11 +327,10 @@ func SetFinalizer(obj interface{}, finalizer interface{}) {
                throw("runtime.SetFinalizer: second argument is " + *ftyp._string + ", not a function")
        }
        ft := (*functype)(unsafe.Pointer(ftyp))
-       ins := *(*[]*_type)(unsafe.Pointer(&ft.in))
-       if ft.dotdotdot || len(ins) != 1 {
+       if ft.dotdotdot || len(ft.in) != 1 {
                throw("runtime.SetFinalizer: cannot pass " + *etyp._string + " to finalizer " + *ftyp._string)
        }
-       fint := ins[0]
+       fint := ft.in[0]
        switch {
        case fint == etyp:
                // ok - same type
@@ -356,7 +355,7 @@ func SetFinalizer(obj interface{}, finalizer interface{}) {
 okarg:
        // compute size needed for return parameters
        nret := uintptr(0)
-       for _, t := range *(*[]*_type)(unsafe.Pointer(&ft.out)) {
+       for _, t := range ft.out {
                nret = round(nret, uintptr(t.align)) + uintptr(t.size)
        }
        nret = round(nret, ptrSize)
index 8e069cdb15f82a014f969eeda8120d9e4b5d743d..e2ff7a8a0fbc7ae66c278b6940547b4322032a80 100644 (file)
@@ -45,16 +45,16 @@ func compileCallback(fn eface, cleanstack bool) (code uintptr) {
                panic("compileCallback: not a function")
        }
        ft := (*functype)(unsafe.Pointer(fn._type))
-       if ft.out.len != 1 {
+       if len(ft.out) != 1 {
                panic("compileCallback: function must have one output parameter")
        }
        uintptrSize := unsafe.Sizeof(uintptr(0))
-       if t := (**_type)(unsafe.Pointer(ft.out.array)); (*t).size != uintptrSize {
+       if ft.out[0].size != uintptrSize {
                panic("compileCallback: output parameter size is wrong")
        }
        argsize := uintptr(0)
-       for _, t := range (*[1024](*_type))(unsafe.Pointer(ft.in.array))[:ft.in.len] {
-               if (*t).size > uintptrSize {
+       for _, t := range ft.in {
+               if t.size > uintptrSize {
                        panic("compileCallback: input parameter size is wrong")
                }
                argsize += uintptrSize
index 033f12fd428240bf9082fa2cb41f0bbc2216502d..c8d7554fca8a03810d27384fdbeb2e0d40270d45 100644 (file)
@@ -84,8 +84,8 @@ type slicetype struct {
 type functype struct {
        typ       _type
        dotdotdot bool
-       in        slice
-       out       slice
+       in        []*_type
+       out       []*_type
 }
 
 type ptrtype struct {