Skip to content

Commit

Permalink
reflect: use cgo.Incomplete instead of go:notinheap in tests
Browse files Browse the repository at this point in the history
go:notinheap will be replaced by runtime/internal/sys.NotInHeap, and for
longer term, we want to restrict all of its usages inside the runtime
package only.

Updates #46731

Change-Id: I267adc2a19f0dc8a1ed29b5b4aeec1a7dc7318d5
Reviewed-on: https://go-review.googlesource.com/c/go/+/421880
Run-TryBot: Cuong Manh Le <cuong.manhle.vn@gmail.com>
Reviewed-by: Keith Randall <khr@golang.org>
Reviewed-by: David Chase <drchase@google.com>
Reviewed-by: Keith Randall <khr@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
  • Loading branch information
cuonglm committed Aug 31, 2022
1 parent bd56cb9 commit ee0e40a
Show file tree
Hide file tree
Showing 4 changed files with 43 additions and 27 deletions.
22 changes: 0 additions & 22 deletions src/reflect/all_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -8003,28 +8003,6 @@ func TestSetIter(t *testing.T) {
}
}

//go:notinheap
type nih struct{ x int }

var global_nih = nih{x: 7}

func TestNotInHeapDeref(t *testing.T) {
// See issue 48399.
v := ValueOf((*nih)(nil))
v.Elem()
shouldPanic("reflect: call of reflect.Value.Field on zero Value", func() { v.Elem().Field(0) })

v = ValueOf(&global_nih)
if got := v.Elem().Field(0).Int(); got != 7 {
t.Fatalf("got %d, want 7", got)
}

v = ValueOf((*nih)(unsafe.Pointer(new(int))))
shouldPanic("reflect: reflect.Value.Elem on an invalid notinheap pointer", func() { v.Elem() })
shouldPanic("reflect: reflect.Value.Pointer on an invalid notinheap pointer", func() { v.Pointer() })
shouldPanic("reflect: reflect.Value.UnsafePointer on an invalid notinheap pointer", func() { v.UnsafePointer() })
}

func TestMethodCallValueCodePtr(t *testing.T) {
m := ValueOf(Point{}).Method(1)
want := MethodValueCallCodePtr()
Expand Down
6 changes: 3 additions & 3 deletions src/reflect/deepequal.go
Original file line number Diff line number Diff line change
Expand Up @@ -40,9 +40,9 @@ func deepValueEqual(v1, v2 Value, visited map[visit]bool) bool {
switch v1.Kind() {
case Pointer:
if v1.typ.ptrdata == 0 {
// go:notinheap pointers can't be cyclic.
// At least, all of our current uses of go:notinheap have
// that property. The runtime ones aren't cyclic (and we don't use
// not-in-heap pointers can't be cyclic.
// At least, all of our current uses of runtime/internal/sys.NotInHeap
// have that property. The runtime ones aren't cyclic (and we don't use
// DeepEqual on them anyway), and the cgo-generated ones are
// all empty structs.
return false
Expand Down
38 changes: 38 additions & 0 deletions src/reflect/nih_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
// Copyright 2009 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

//go:build cgo

package reflect_test

import (
. "reflect"
"runtime/cgo"
"testing"
"unsafe"
)

type nih struct {
_ cgo.Incomplete
x int
}

var global_nih = nih{x: 7}

func TestNotInHeapDeref(t *testing.T) {
// See issue 48399.
v := ValueOf((*nih)(nil))
v.Elem()
shouldPanic("reflect: call of reflect.Value.Field on zero Value", func() { v.Elem().Field(0) })

v = ValueOf(&global_nih)
if got := v.Elem().Field(1).Int(); got != 7 {
t.Fatalf("got %d, want 7", got)
}

v = ValueOf((*nih)(unsafe.Pointer(new(int))))
shouldPanic("reflect: reflect.Value.Elem on an invalid notinheap pointer", func() { v.Elem() })
shouldPanic("reflect: reflect.Value.Pointer on an invalid notinheap pointer", func() { v.Pointer() })
shouldPanic("reflect: reflect.Value.UnsafePointer on an invalid notinheap pointer", func() { v.UnsafePointer() })
}
4 changes: 2 additions & 2 deletions src/reflect/value.go
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,7 @@ func (f flag) ro() flag {

// pointer returns the underlying pointer represented by v.
// v.Kind() must be Pointer, Map, Chan, Func, or UnsafePointer
// if v.Kind() == Pointer, the base type must not be go:notinheap.
// if v.Kind() == Pointer, the base type must not be not-in-heap.
func (v Value) pointer() unsafe.Pointer {
if v.typ.size != goarch.PtrSize || !v.typ.pointers() {
panic("can't call pointer on a non-pointer Value")
Expand Down Expand Up @@ -3156,7 +3156,7 @@ func New(typ Type) Value {
t := typ.(*rtype)
pt := t.ptrTo()
if ifaceIndir(pt) {
// This is a pointer to a go:notinheap type.
// This is a pointer to a not-in-heap type.
panic("reflect: New of type that may not be allocated in heap (possibly undefined cgo C type)")
}
ptr := unsafe_New(t)
Expand Down

0 comments on commit ee0e40a

Please sign in to comment.