Commit ee3f768d authored by Cuong Manh Le's avatar Cuong Manh Le Committed by Keith Randall

internal/reflectlite: updates reflectlite to match runtime rtype/mapType

CL 191198 updated runtime rtype and mapType without adopting the changes
to reflectlite, causing mismatch between them.

This CL updates those changes to reflectlite.

Fixes #34486

Change-Id: I2bb043673d997f97bb0b12c4ad471474803b2160
Reviewed-on: https://go-review.googlesource.com/c/go/+/197559
Run-TryBot: Cuong Manh Le <cuong.manhle.vn@gmail.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: default avatarBryan C. Mills <bcmills@google.com>
Reviewed-by: default avatarKeith Randall <khr@golang.org>
parent 1cb61b80
...@@ -39,6 +39,8 @@ var implementsTests = []struct { ...@@ -39,6 +39,8 @@ var implementsTests = []struct {
{new(notASTExpr), new(ast.Expr), false}, {new(notASTExpr), new(ast.Expr), false},
{new(ast.Expr), new(notASTExpr), false}, {new(ast.Expr), new(notASTExpr), false},
{new(*notAnExpr), new(notASTExpr), true}, {new(*notAnExpr), new(notASTExpr), true},
{new(mapError), new(error), true},
{new(*mapError), new(error), true},
} }
type notAnExpr struct{} type notAnExpr struct{}
...@@ -53,6 +55,13 @@ type notASTExpr interface { ...@@ -53,6 +55,13 @@ type notASTExpr interface {
exprNode() exprNode()
} }
type mapError map[string]string
func (mapError) Error() string { return "mapError" }
var _ error = mapError{}
var _ error = new(mapError)
func TestImplements(t *testing.T) { func TestImplements(t *testing.T) {
for _, tt := range implementsTests { for _, tt := range implementsTests {
xv := TypeOf(tt.x).Elem() xv := TypeOf(tt.x).Elem()
......
...@@ -137,6 +137,10 @@ const ( ...@@ -137,6 +137,10 @@ const (
// tflagNamed means the type has a name. // tflagNamed means the type has a name.
tflagNamed tflag = 1 << 2 tflagNamed tflag = 1 << 2
// tflagRegularMemory means that equal and hash functions can treat
// this type as a single region of t.size bytes.
tflagRegularMemory tflag = 1 << 3
) )
// rtype is the common implementation of most values. // rtype is the common implementation of most values.
...@@ -151,20 +155,12 @@ type rtype struct { ...@@ -151,20 +155,12 @@ type rtype struct {
align uint8 // alignment of variable with this type align uint8 // alignment of variable with this type
fieldAlign uint8 // alignment of struct field with this type fieldAlign uint8 // alignment of struct field with this type
kind uint8 // enumeration for C kind uint8 // enumeration for C
alg *typeAlg // algorithm table
gcdata *byte // garbage collection data
str nameOff // string form
ptrToThis typeOff // type for pointer to this type, may be zero
}
// a copy of runtime.typeAlg
type typeAlg struct {
// function for hashing objects of this type
// (ptr to object, seed) -> hash
hash func(unsafe.Pointer, uintptr) uintptr
// function for comparing objects of this type // function for comparing objects of this type
// (ptr to object A, ptr to object B) -> ==? // (ptr to object A, ptr to object B) -> ==?
equal func(unsafe.Pointer, unsafe.Pointer) bool equal func(unsafe.Pointer, unsafe.Pointer) bool
gcdata *byte // garbage collection data
str nameOff // string form
ptrToThis typeOff // type for pointer to this type, may be zero
} }
// Method on non-interface type // Method on non-interface type
...@@ -246,6 +242,9 @@ type mapType struct { ...@@ -246,6 +242,9 @@ type mapType struct {
rtype rtype
key *rtype // map key type key *rtype // map key type
elem *rtype // map element (value) type elem *rtype // map element (value) type
bucket *rtype // internal bucket structure
// function for hashing keys (ptr to key, seed) -> hash
hasher func(unsafe.Pointer, uintptr) uintptr
keysize uint8 // size of key slot keysize uint8 // size of key slot
valuesize uint8 // size of value slot valuesize uint8 // size of value slot
bucketsize uint16 // size of bucket bucketsize uint16 // size of bucket
...@@ -685,7 +684,7 @@ func (t *rtype) AssignableTo(u Type) bool { ...@@ -685,7 +684,7 @@ func (t *rtype) AssignableTo(u Type) bool {
} }
func (t *rtype) Comparable() bool { func (t *rtype) Comparable() bool {
return t.alg != nil && t.alg.equal != nil return t.equal != nil
} }
// implements reports whether the type V implements the interface type T. // implements reports whether the type V implements the interface type T.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment