diff options
Diffstat (limited to 'src/pkg/exp/eval')
-rw-r--r-- | src/pkg/exp/eval/bridge.go | 91 | ||||
-rwxr-xr-x | src/pkg/exp/eval/eval | bin | 0 -> 3500057 bytes | |||
-rw-r--r-- | src/pkg/exp/eval/eval_test.go | 8 | ||||
-rw-r--r-- | src/pkg/exp/eval/stmt.go | 13 | ||||
-rw-r--r-- | src/pkg/exp/eval/stmt_test.go | 2 | ||||
-rw-r--r-- | src/pkg/exp/eval/type.go | 2 |
6 files changed, 56 insertions, 60 deletions
diff --git a/src/pkg/exp/eval/bridge.go b/src/pkg/exp/eval/bridge.go index 12835c4c0..d1efa2eb6 100644 --- a/src/pkg/exp/eval/bridge.go +++ b/src/pkg/exp/eval/bridge.go @@ -34,54 +34,49 @@ func TypeFromNative(t reflect.Type) Type { } var et Type - switch t := t.(type) { - case *reflect.BoolType: + switch t.Kind() { + case reflect.Bool: et = BoolType - case *reflect.FloatType: - switch t.Kind() { - case reflect.Float32: - et = Float32Type - case reflect.Float64: - et = Float64Type - } - case *reflect.IntType: - switch t.Kind() { - case reflect.Int16: - et = Int16Type - case reflect.Int32: - et = Int32Type - case reflect.Int64: - et = Int64Type - case reflect.Int8: - et = Int8Type - case reflect.Int: - et = IntType - } - case *reflect.UintType: - switch t.Kind() { - case reflect.Uint16: - et = Uint16Type - case reflect.Uint32: - et = Uint32Type - case reflect.Uint64: - et = Uint64Type - case reflect.Uint8: - et = Uint8Type - case reflect.Uint: - et = UintType - case reflect.Uintptr: - et = UintptrType - } - case *reflect.StringType: + + case reflect.Float32: + et = Float32Type + case reflect.Float64: + et = Float64Type + + case reflect.Int16: + et = Int16Type + case reflect.Int32: + et = Int32Type + case reflect.Int64: + et = Int64Type + case reflect.Int8: + et = Int8Type + case reflect.Int: + et = IntType + + case reflect.Uint16: + et = Uint16Type + case reflect.Uint32: + et = Uint32Type + case reflect.Uint64: + et = Uint64Type + case reflect.Uint8: + et = Uint8Type + case reflect.Uint: + et = UintType + case reflect.Uintptr: + et = UintptrType + + case reflect.String: et = StringType - case *reflect.ArrayType: + case reflect.Array: et = NewArrayType(int64(t.Len()), TypeFromNative(t.Elem())) - case *reflect.ChanType: + case reflect.Chan: log.Panicf("%T not implemented", t) - case *reflect.FuncType: + case reflect.Func: nin := t.NumIn() // Variadic functions have DotDotDotType at the end - variadic := t.DotDotDot() + variadic := t.IsVariadic() if variadic { nin-- } @@ -94,15 +89,15 @@ func TypeFromNative(t reflect.Type) Type { out[i] = TypeFromNative(t.Out(i)) } et = NewFuncType(in, variadic, out) - case *reflect.InterfaceType: + case reflect.Interface: log.Panicf("%T not implemented", t) - case *reflect.MapType: + case reflect.Map: log.Panicf("%T not implemented", t) - case *reflect.PtrType: + case reflect.Ptr: et = NewPtrType(TypeFromNative(t.Elem())) - case *reflect.SliceType: + case reflect.Slice: et = NewSliceType(TypeFromNative(t.Elem())) - case *reflect.StructType: + case reflect.Struct: n := t.NumField() fields := make([]StructField, n) for i := 0; i < n; i++ { @@ -113,7 +108,7 @@ func TypeFromNative(t reflect.Type) Type { fields[i].Anonymous = sf.Anonymous } et = NewStructType(fields) - case *reflect.UnsafePointerType: + case reflect.UnsafePointer: log.Panicf("%T not implemented", t) default: log.Panicf("unexpected reflect.Type: %T", t) diff --git a/src/pkg/exp/eval/eval b/src/pkg/exp/eval/eval Binary files differnew file mode 100755 index 000000000..20231f2e2 --- /dev/null +++ b/src/pkg/exp/eval/eval diff --git a/src/pkg/exp/eval/eval_test.go b/src/pkg/exp/eval/eval_test.go index ff28cf1a9..541d3feb7 100644 --- a/src/pkg/exp/eval/eval_test.go +++ b/src/pkg/exp/eval/eval_test.go @@ -39,9 +39,13 @@ type job struct { } func runTests(t *testing.T, baseName string, tests []test) { - for i, test := range tests { + delta := 1 + if testing.Short() { + delta = 16 + } + for i := 0; i < len(tests); i += delta { name := fmt.Sprintf("%s[%d]", baseName, i) - test.run(t, name) + tests[i].run(t, name) } } diff --git a/src/pkg/exp/eval/stmt.go b/src/pkg/exp/eval/stmt.go index 5c5d4338a..f6b7c1cda 100644 --- a/src/pkg/exp/eval/stmt.go +++ b/src/pkg/exp/eval/stmt.go @@ -287,9 +287,6 @@ func (a *stmtCompiler) compile(s ast.Stmt) { case *ast.SwitchStmt: a.compileSwitchStmt(s) - case *ast.TypeCaseClause: - notimpl = true - case *ast.TypeSwitchStmt: notimpl = true @@ -1012,13 +1009,13 @@ func (a *stmtCompiler) compileSwitchStmt(s *ast.SwitchStmt) { a.diagAt(clause.Pos(), "switch statement must contain case clauses") continue } - if clause.Values == nil { + if clause.List == nil { if hasDefault { a.diagAt(clause.Pos(), "switch statement contains more than one default case") } hasDefault = true } else { - ncases += len(clause.Values) + ncases += len(clause.List) } } @@ -1030,7 +1027,7 @@ func (a *stmtCompiler) compileSwitchStmt(s *ast.SwitchStmt) { if !ok { continue } - for _, v := range clause.Values { + for _, v := range clause.List { e := condbc.compileExpr(condbc.block, false, v) switch { case e == nil: @@ -1077,8 +1074,8 @@ func (a *stmtCompiler) compileSwitchStmt(s *ast.SwitchStmt) { // Save jump PC's pc := a.nextPC() - if clause.Values != nil { - for _ = range clause.Values { + if clause.List != nil { + for _ = range clause.List { casePCs[i] = &pc i++ } diff --git a/src/pkg/exp/eval/stmt_test.go b/src/pkg/exp/eval/stmt_test.go index 4a883ef5e..a8a3e1620 100644 --- a/src/pkg/exp/eval/stmt_test.go +++ b/src/pkg/exp/eval/stmt_test.go @@ -27,7 +27,7 @@ var stmtTests = []test{ CErr("i, u := 1, 2", atLeastOneDecl), Val2("i, x := 2, f", "i", 2, "x", 1.0), // Various errors - CErr("1 := 2", "left side of := must be a name"), + CErr("1 := 2", "expected identifier"), CErr("c, a := 1, 1", "cannot assign"), // Unpacking Val2("x, y := oneTwo()", "x", 1, "y", 2), diff --git a/src/pkg/exp/eval/type.go b/src/pkg/exp/eval/type.go index 3f272ce4b..0d6dfe923 100644 --- a/src/pkg/exp/eval/type.go +++ b/src/pkg/exp/eval/type.go @@ -86,7 +86,7 @@ func hashTypeArray(key []Type) uintptr { if t == nil { continue } - addr := reflect.NewValue(t).(*reflect.PtrValue).Get() + addr := reflect.NewValue(t).Pointer() hash ^= addr } return hash |