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:
Alan Donovan 2015-06-05 18:37:20 -04:00
parent f0b0213b21
commit ac303766f5
3 changed files with 31 additions and 2 deletions

View File

@ -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,

View File

@ -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",

View File

@ -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"),