go/ssa/interp: don't run encoding/pem tests in interpreter
since they use quick.Check, which requires the unimplemented
(reflect.Value).SetString.
Also:
- Add reflect.Type.{In,NumIn} methods, whose absence
  was only the proximate cause of the failed test.
- Delete bodies of reflect.Value methods so that it's obvious a
  function that should be intrinsic is missing.
Change-Id: Ib64b8f4953a913f4ead90e376bda70419adb87cb
Reviewed-on: https://go-review.googlesource.com/10796
Reviewed-by: Robert Griesemer <gri@golang.org>
			
			
This commit is contained in:
		
							parent
							
								
									f0b0213b21
								
							
						
					
					
						commit
						ac303766f5
					
				|  | @ -59,8 +59,10 @@ func init() { | ||||||
| 		"(reflect.rtype).Bits":             ext۰reflect۰rtype۰Bits, | 		"(reflect.rtype).Bits":             ext۰reflect۰rtype۰Bits, | ||||||
| 		"(reflect.rtype).Elem":             ext۰reflect۰rtype۰Elem, | 		"(reflect.rtype).Elem":             ext۰reflect۰rtype۰Elem, | ||||||
| 		"(reflect.rtype).Field":            ext۰reflect۰rtype۰Field, | 		"(reflect.rtype).Field":            ext۰reflect۰rtype۰Field, | ||||||
|  | 		"(reflect.rtype).In":               ext۰reflect۰rtype۰In, | ||||||
| 		"(reflect.rtype).Kind":             ext۰reflect۰rtype۰Kind, | 		"(reflect.rtype).Kind":             ext۰reflect۰rtype۰Kind, | ||||||
| 		"(reflect.rtype).NumField":         ext۰reflect۰rtype۰NumField, | 		"(reflect.rtype).NumField":         ext۰reflect۰rtype۰NumField, | ||||||
|  | 		"(reflect.rtype).NumIn":            ext۰reflect۰rtype۰NumIn, | ||||||
| 		"(reflect.rtype).NumMethod":        ext۰reflect۰rtype۰NumMethod, | 		"(reflect.rtype).NumMethod":        ext۰reflect۰rtype۰NumMethod, | ||||||
| 		"(reflect.rtype).NumOut":           ext۰reflect۰rtype۰NumOut, | 		"(reflect.rtype).NumOut":           ext۰reflect۰rtype۰NumOut, | ||||||
| 		"(reflect.rtype).Out":              ext۰reflect۰rtype۰Out, | 		"(reflect.rtype).Out":              ext۰reflect۰rtype۰Out, | ||||||
|  | @ -84,6 +86,7 @@ func init() { | ||||||
| 		"reflect.SliceOf":                  ext۰reflect۰SliceOf, | 		"reflect.SliceOf":                  ext۰reflect۰SliceOf, | ||||||
| 		"reflect.TypeOf":                   ext۰reflect۰TypeOf, | 		"reflect.TypeOf":                   ext۰reflect۰TypeOf, | ||||||
| 		"reflect.ValueOf":                  ext۰reflect۰ValueOf, | 		"reflect.ValueOf":                  ext۰reflect۰ValueOf, | ||||||
|  | 		"reflect.Zero":                     ext۰reflect۰Zero, | ||||||
| 		"reflect.init":                     ext۰reflect۰Init, | 		"reflect.init":                     ext۰reflect۰Init, | ||||||
| 		"reflect.valueInterface":           ext۰reflect۰valueInterface, | 		"reflect.valueInterface":           ext۰reflect۰valueInterface, | ||||||
| 		"runtime.Breakpoint":               ext۰runtime۰Breakpoint, | 		"runtime.Breakpoint":               ext۰runtime۰Breakpoint, | ||||||
|  |  | ||||||
|  | @ -157,8 +157,8 @@ var gorootSrcTests = []string{ | ||||||
| 	"encoding/ascii85", | 	"encoding/ascii85", | ||||||
| 	"encoding/csv", | 	"encoding/csv", | ||||||
| 	"encoding/hex", | 	"encoding/hex", | ||||||
| 	"encoding/pem", | 	// "encoding/pem", // TODO(adonovan): implement (reflect.Value).SetString
 | ||||||
| 	// "testing", // TODO(adonovan): implement runtime.Goexit correctly
 | 	// "testing",      // TODO(adonovan): implement runtime.Goexit correctly
 | ||||||
| 	"text/scanner", | 	"text/scanner", | ||||||
| 	"unicode", | 	"unicode", | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -106,6 +106,12 @@ func ext۰reflect۰rtype۰Field(fr *frame, args []value) value { | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | func ext۰reflect۰rtype۰In(fr *frame, args []value) value { | ||||||
|  | 	// Signature: func (t reflect.rtype, i int) int
 | ||||||
|  | 	i := args[1].(int) | ||||||
|  | 	return makeReflectType(rtype{args[0].(rtype).t.(*types.Signature).Params().At(i).Type()}) | ||||||
|  | } | ||||||
|  | 
 | ||||||
| func ext۰reflect۰rtype۰Kind(fr *frame, args []value) value { | func ext۰reflect۰rtype۰Kind(fr *frame, args []value) value { | ||||||
| 	// Signature: func (t reflect.rtype) uint
 | 	// Signature: func (t reflect.rtype) uint
 | ||||||
| 	return uint(reflectKind(args[0].(rtype).t)) | 	return uint(reflectKind(args[0].(rtype).t)) | ||||||
|  | @ -116,6 +122,11 @@ func ext۰reflect۰rtype۰NumField(fr *frame, args []value) value { | ||||||
| 	return args[0].(rtype).t.Underlying().(*types.Struct).NumFields() | 	return args[0].(rtype).t.Underlying().(*types.Struct).NumFields() | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | func ext۰reflect۰rtype۰NumIn(fr *frame, args []value) value { | ||||||
|  | 	// Signature: func (t reflect.rtype) int
 | ||||||
|  | 	return args[0].(rtype).t.(*types.Signature).Params().Len() | ||||||
|  | } | ||||||
|  | 
 | ||||||
| func ext۰reflect۰rtype۰NumMethod(fr *frame, args []value) value { | func ext۰reflect۰rtype۰NumMethod(fr *frame, args []value) value { | ||||||
| 	// Signature: func (t reflect.rtype) int
 | 	// Signature: func (t reflect.rtype) int
 | ||||||
| 	return fr.i.prog.MethodSets.MethodSet(args[0].(rtype).t).Len() | 	return fr.i.prog.MethodSets.MethodSet(args[0].(rtype).t).Len() | ||||||
|  | @ -165,6 +176,12 @@ func ext۰reflect۰ValueOf(fr *frame, args []value) value { | ||||||
| 	return makeReflectValue(itf.t, itf.v) | 	return makeReflectValue(itf.t, itf.v) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | func ext۰reflect۰Zero(fr *frame, args []value) value { | ||||||
|  | 	// Signature: func (t reflect.Type) reflect.Value
 | ||||||
|  | 	t := args[0].(iface).v.(rtype).t | ||||||
|  | 	return makeReflectValue(t, zero(t)) | ||||||
|  | } | ||||||
|  | 
 | ||||||
| func reflectKind(t types.Type) reflect.Kind { | func reflectKind(t types.Type) reflect.Kind { | ||||||
| 	switch t := t.(type) { | 	switch t := t.(type) { | ||||||
| 	case *types.Named: | 	case *types.Named: | ||||||
|  | @ -523,6 +540,13 @@ func initReflect(i *interpreter) { | ||||||
| 	// information leaks into other packages.
 | 	// information leaks into other packages.
 | ||||||
| 	if r := i.prog.ImportedPackage("reflect"); r != nil { | 	if r := i.prog.ImportedPackage("reflect"); r != nil { | ||||||
| 		rV := r.Object.Scope().Lookup("Value").Type().(*types.Named) | 		rV := r.Object.Scope().Lookup("Value").Type().(*types.Named) | ||||||
|  | 
 | ||||||
|  | 		// delete bodies of the old methods
 | ||||||
|  | 		mset := i.prog.MethodSets.MethodSet(rV) | ||||||
|  | 		for j := 0; j < mset.Len(); j++ { | ||||||
|  | 			i.prog.Method(mset.At(j)).Blocks = nil | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
| 		tEface := types.NewInterface(nil, nil).Complete() | 		tEface := types.NewInterface(nil, nil).Complete() | ||||||
| 		rV.SetUnderlying(types.NewStruct([]*types.Var{ | 		rV.SetUnderlying(types.NewStruct([]*types.Var{ | ||||||
| 			types.NewField(token.NoPos, r.Object, "t", tEface, false), // a lie
 | 			types.NewField(token.NoPos, r.Object, "t", tEface, false), // a lie
 | ||||||
|  | @ -534,8 +558,10 @@ func initReflect(i *interpreter) { | ||||||
| 		"Bits":      newMethod(i.reflectPackage, rtypeType, "Bits"), | 		"Bits":      newMethod(i.reflectPackage, rtypeType, "Bits"), | ||||||
| 		"Elem":      newMethod(i.reflectPackage, rtypeType, "Elem"), | 		"Elem":      newMethod(i.reflectPackage, rtypeType, "Elem"), | ||||||
| 		"Field":     newMethod(i.reflectPackage, rtypeType, "Field"), | 		"Field":     newMethod(i.reflectPackage, rtypeType, "Field"), | ||||||
|  | 		"In":        newMethod(i.reflectPackage, rtypeType, "In"), | ||||||
| 		"Kind":      newMethod(i.reflectPackage, rtypeType, "Kind"), | 		"Kind":      newMethod(i.reflectPackage, rtypeType, "Kind"), | ||||||
| 		"NumField":  newMethod(i.reflectPackage, rtypeType, "NumField"), | 		"NumField":  newMethod(i.reflectPackage, rtypeType, "NumField"), | ||||||
|  | 		"NumIn":     newMethod(i.reflectPackage, rtypeType, "NumIn"), | ||||||
| 		"NumMethod": newMethod(i.reflectPackage, rtypeType, "NumMethod"), | 		"NumMethod": newMethod(i.reflectPackage, rtypeType, "NumMethod"), | ||||||
| 		"NumOut":    newMethod(i.reflectPackage, rtypeType, "NumOut"), | 		"NumOut":    newMethod(i.reflectPackage, rtypeType, "NumOut"), | ||||||
| 		"Out":       newMethod(i.reflectPackage, rtypeType, "Out"), | 		"Out":       newMethod(i.reflectPackage, rtypeType, "Out"), | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue