mirror of
https://github.com/golang/go
synced 2024-11-22 07:04:40 -07:00
insert type assertions when narrowing.
R=r OCL=24349 CL=24913
This commit is contained in:
parent
7cd24361bd
commit
49e2087848
@ -75,7 +75,7 @@ func (j *_Array) Elem(i int) Json {
|
|||||||
if i < 0 || i >= j.a.Len() {
|
if i < 0 || i >= j.a.Len() {
|
||||||
return Null
|
return Null
|
||||||
}
|
}
|
||||||
return j.a.At(i)
|
return j.a.At(i).(Json)
|
||||||
}
|
}
|
||||||
func (j *_Array) String() string {
|
func (j *_Array) String() string {
|
||||||
s := "[";
|
s := "[";
|
||||||
@ -232,7 +232,7 @@ func (b *_JsonBuilder) Get() Json {
|
|||||||
case b.ptr != nil:
|
case b.ptr != nil:
|
||||||
return *b.ptr;
|
return *b.ptr;
|
||||||
case b.a != nil:
|
case b.a != nil:
|
||||||
return b.a.At(b.i);
|
return b.a.At(b.i).(Json);
|
||||||
case b.m != nil:
|
case b.m != nil:
|
||||||
return b.m[b.k];
|
return b.m[b.k];
|
||||||
}
|
}
|
||||||
|
@ -122,7 +122,7 @@ func (b *_StructBuilder) Array() {
|
|||||||
pv := v.(reflect.PtrValue);
|
pv := v.(reflect.PtrValue);
|
||||||
psubtype := pv.Type().(reflect.PtrType).Sub();
|
psubtype := pv.Type().(reflect.PtrType).Sub();
|
||||||
if pv.Get() == nil && psubtype.Kind() == reflect.ArrayKind {
|
if pv.Get() == nil && psubtype.Kind() == reflect.ArrayKind {
|
||||||
av := reflect.NewSliceValue(psubtype, 0, 8);
|
av := reflect.NewSliceValue(psubtype.(reflect.ArrayType), 0, 8);
|
||||||
pv.SetSub(av);
|
pv.SetSub(av);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -148,7 +148,7 @@ func (b *_StructBuilder) Elem(i int) Builder {
|
|||||||
for n <= i {
|
for n <= i {
|
||||||
n *= 2
|
n *= 2
|
||||||
}
|
}
|
||||||
av1 := reflect.NewSliceValue(av.Type(), av.Len(), n);
|
av1 := reflect.NewSliceValue(av.Type().(reflect.ArrayType), av.Len(), n);
|
||||||
av1.CopyFrom(av, av.Len());
|
av1.CopyFrom(av, av.Len());
|
||||||
pv.SetSub(av1);
|
pv.SetSub(av1);
|
||||||
av = av1;
|
av = av1;
|
||||||
|
@ -270,7 +270,7 @@ func TestAll(tt *testing.T) { // TODO(r): wrap up better
|
|||||||
assert(typ.String(), "[]uint32");
|
assert(typ.String(), "[]uint32");
|
||||||
|
|
||||||
t = reflect.ParseTypeString("", "[]int32");
|
t = reflect.ParseTypeString("", "[]int32");
|
||||||
v := reflect.NewSliceValue(t, 5, 10);
|
v := reflect.NewSliceValue(t.(ArrayType), 5, 10);
|
||||||
t1 := reflect.ParseTypeString("", "*[]int32");
|
t1 := reflect.ParseTypeString("", "*[]int32");
|
||||||
v1 := reflect.NewInitValue(t1);
|
v1 := reflect.NewInitValue(t1);
|
||||||
if v1 == nil { panic("V1 is nil"); }
|
if v1 == nil { panic("V1 is nil"); }
|
||||||
@ -308,7 +308,7 @@ func TestCopyArray(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
for tocopy := 1; tocopy <= 7; tocopy++ {
|
for tocopy := 1; tocopy <= 7; tocopy++ {
|
||||||
vb.(PtrValue).Sub().(ArrayValue).CopyFrom(va.(PtrValue).Sub(), tocopy);
|
vb.(PtrValue).Sub().(ArrayValue).CopyFrom(va.(PtrValue).Sub().(ArrayValue), tocopy);
|
||||||
for i := 0; i < tocopy; i++ {
|
for i := 0; i < tocopy; i++ {
|
||||||
if a[i] != b[i] {
|
if a[i] != b[i] {
|
||||||
t.Errorf("1 tocopy=%d a[%d]=%d, b[%d]=%d",
|
t.Errorf("1 tocopy=%d a[%d]=%d, b[%d]=%d",
|
||||||
|
@ -105,9 +105,9 @@ func TypeToString(typ Type, expand bool) string {
|
|||||||
}
|
}
|
||||||
return str + TypeToString(c.Elem(), false);
|
return str + TypeToString(c.Elem(), false);
|
||||||
case StructKind:
|
case StructKind:
|
||||||
return "struct{" + typeFieldsToString(typ, ";") + "}";
|
return "struct{" + typeFieldsToString(typ.(StructType), ";") + "}";
|
||||||
case InterfaceKind:
|
case InterfaceKind:
|
||||||
return "interface{" + typeFieldsToString(typ, ";") + "}";
|
return "interface{" + typeFieldsToString(typ.(InterfaceType), ";") + "}";
|
||||||
case FuncKind:
|
case FuncKind:
|
||||||
f := typ.(FuncType);
|
f := typ.(FuncType);
|
||||||
str = "(" + typeFieldsToString(f.In(), ",") + ")";
|
str = "(" + typeFieldsToString(f.In(), ",") + ")";
|
||||||
|
@ -149,6 +149,12 @@ func (t *stubType) Get() Type {
|
|||||||
// -- Pointer
|
// -- Pointer
|
||||||
|
|
||||||
type PtrType interface {
|
type PtrType interface {
|
||||||
|
// TODO: Type;
|
||||||
|
Kind() int;
|
||||||
|
Name() string;
|
||||||
|
String() string;
|
||||||
|
Size() int;
|
||||||
|
|
||||||
Sub() Type
|
Sub() Type
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -168,6 +174,12 @@ func (t *ptrTypeStruct) Sub() Type {
|
|||||||
// -- Array
|
// -- Array
|
||||||
|
|
||||||
type ArrayType interface {
|
type ArrayType interface {
|
||||||
|
// TODO: Type;
|
||||||
|
Kind() int;
|
||||||
|
Name() string;
|
||||||
|
String() string;
|
||||||
|
Size() int;
|
||||||
|
|
||||||
IsSlice() bool;
|
IsSlice() bool;
|
||||||
Len() int;
|
Len() int;
|
||||||
Elem() Type;
|
Elem() Type;
|
||||||
@ -207,6 +219,12 @@ func (t *arrayTypeStruct) Elem() Type {
|
|||||||
// -- Map
|
// -- Map
|
||||||
|
|
||||||
type MapType interface {
|
type MapType interface {
|
||||||
|
// TODO: Type;
|
||||||
|
Kind() int;
|
||||||
|
Name() string;
|
||||||
|
String() string;
|
||||||
|
Size() int;
|
||||||
|
|
||||||
Key() Type;
|
Key() Type;
|
||||||
Elem() Type;
|
Elem() Type;
|
||||||
}
|
}
|
||||||
@ -232,6 +250,12 @@ func (t *mapTypeStruct) Elem() Type {
|
|||||||
// -- Chan
|
// -- Chan
|
||||||
|
|
||||||
type ChanType interface {
|
type ChanType interface {
|
||||||
|
// TODO: Type;
|
||||||
|
Kind() int;
|
||||||
|
Name() string;
|
||||||
|
String() string;
|
||||||
|
Size() int;
|
||||||
|
|
||||||
Dir() int;
|
Dir() int;
|
||||||
Elem() Type;
|
Elem() Type;
|
||||||
}
|
}
|
||||||
@ -263,6 +287,12 @@ func (t *chanTypeStruct) Elem() Type {
|
|||||||
// -- Struct
|
// -- Struct
|
||||||
|
|
||||||
type StructType interface {
|
type StructType interface {
|
||||||
|
// TODO: Type;
|
||||||
|
Kind() int;
|
||||||
|
Name() string;
|
||||||
|
String() string;
|
||||||
|
Size() int;
|
||||||
|
|
||||||
Field(int) (name string, typ Type, tag string, offset int);
|
Field(int) (name string, typ Type, tag string, offset int);
|
||||||
Len() int;
|
Len() int;
|
||||||
}
|
}
|
||||||
@ -323,6 +353,12 @@ func (t *structTypeStruct) Len() int {
|
|||||||
// -- Interface
|
// -- Interface
|
||||||
|
|
||||||
type InterfaceType interface {
|
type InterfaceType interface {
|
||||||
|
// TODO: Type;
|
||||||
|
Kind() int;
|
||||||
|
Name() string;
|
||||||
|
String() string;
|
||||||
|
Size() int;
|
||||||
|
|
||||||
Field(int) (name string, typ Type, tag string, offset int);
|
Field(int) (name string, typ Type, tag string, offset int);
|
||||||
Len() int;
|
Len() int;
|
||||||
}
|
}
|
||||||
@ -349,6 +385,12 @@ var nilInterface = newInterfaceTypeStruct("nil", "", make([]structField, 0));
|
|||||||
// -- Func
|
// -- Func
|
||||||
|
|
||||||
type FuncType interface {
|
type FuncType interface {
|
||||||
|
// TODO: Type;
|
||||||
|
Kind() int;
|
||||||
|
Name() string;
|
||||||
|
String() string;
|
||||||
|
Size() int;
|
||||||
|
|
||||||
In() StructType;
|
In() StructType;
|
||||||
Out() StructType;
|
Out() StructType;
|
||||||
}
|
}
|
||||||
|
@ -66,9 +66,11 @@ type creatorFn func(typ Type, addr Addr) Value
|
|||||||
// -- Missing
|
// -- Missing
|
||||||
|
|
||||||
type MissingValue interface {
|
type MissingValue interface {
|
||||||
|
// TODO: Value;
|
||||||
Kind() int;
|
Kind() int;
|
||||||
Type() Type;
|
Type() Type;
|
||||||
Addr() Addr;
|
Addr() Addr;
|
||||||
|
Interface() interface {};
|
||||||
}
|
}
|
||||||
|
|
||||||
type missingValueStruct struct {
|
type missingValueStruct struct {
|
||||||
@ -82,10 +84,14 @@ func missingCreator(typ Type, addr Addr) Value {
|
|||||||
// -- Int
|
// -- Int
|
||||||
|
|
||||||
type IntValue interface {
|
type IntValue interface {
|
||||||
|
// TODO: Value;
|
||||||
Kind() int;
|
Kind() int;
|
||||||
|
Type() Type;
|
||||||
|
Addr() Addr;
|
||||||
|
Interface() interface {};
|
||||||
|
|
||||||
Get() int;
|
Get() int;
|
||||||
Set(int);
|
Set(int);
|
||||||
Type() Type;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
type intValueStruct struct {
|
type intValueStruct struct {
|
||||||
@ -107,10 +113,14 @@ func (v *intValueStruct) Set(i int) {
|
|||||||
// -- Int8
|
// -- Int8
|
||||||
|
|
||||||
type Int8Value interface {
|
type Int8Value interface {
|
||||||
|
// TODO: Value;
|
||||||
Kind() int;
|
Kind() int;
|
||||||
|
Type() Type;
|
||||||
|
Addr() Addr;
|
||||||
|
Interface() interface {};
|
||||||
|
|
||||||
Get() int8;
|
Get() int8;
|
||||||
Set(int8);
|
Set(int8);
|
||||||
Type() Type;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
type int8ValueStruct struct {
|
type int8ValueStruct struct {
|
||||||
@ -132,10 +142,14 @@ func (v *int8ValueStruct) Set(i int8) {
|
|||||||
// -- Int16
|
// -- Int16
|
||||||
|
|
||||||
type Int16Value interface {
|
type Int16Value interface {
|
||||||
|
// TODO: Value;
|
||||||
Kind() int;
|
Kind() int;
|
||||||
|
Type() Type;
|
||||||
|
Addr() Addr;
|
||||||
|
Interface() interface {};
|
||||||
|
|
||||||
Get() int16;
|
Get() int16;
|
||||||
Set(int16);
|
Set(int16);
|
||||||
Type() Type;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
type int16ValueStruct struct {
|
type int16ValueStruct struct {
|
||||||
@ -157,10 +171,14 @@ func (v *int16ValueStruct) Set(i int16) {
|
|||||||
// -- Int32
|
// -- Int32
|
||||||
|
|
||||||
type Int32Value interface {
|
type Int32Value interface {
|
||||||
|
// TODO: Value;
|
||||||
Kind() int;
|
Kind() int;
|
||||||
|
Type() Type;
|
||||||
|
Addr() Addr;
|
||||||
|
Interface() interface {};
|
||||||
|
|
||||||
Get() int32;
|
Get() int32;
|
||||||
Set(int32);
|
Set(int32);
|
||||||
Type() Type;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
type int32ValueStruct struct {
|
type int32ValueStruct struct {
|
||||||
@ -182,10 +200,14 @@ func (v *int32ValueStruct) Set(i int32) {
|
|||||||
// -- Int64
|
// -- Int64
|
||||||
|
|
||||||
type Int64Value interface {
|
type Int64Value interface {
|
||||||
|
// TODO: Value;
|
||||||
Kind() int;
|
Kind() int;
|
||||||
|
Type() Type;
|
||||||
|
Addr() Addr;
|
||||||
|
Interface() interface {};
|
||||||
|
|
||||||
Get() int64;
|
Get() int64;
|
||||||
Set(int64);
|
Set(int64);
|
||||||
Type() Type;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
type int64ValueStruct struct {
|
type int64ValueStruct struct {
|
||||||
@ -207,10 +229,14 @@ func (v *int64ValueStruct) Set(i int64) {
|
|||||||
// -- Uint
|
// -- Uint
|
||||||
|
|
||||||
type UintValue interface {
|
type UintValue interface {
|
||||||
|
// TODO: Value;
|
||||||
Kind() int;
|
Kind() int;
|
||||||
|
Type() Type;
|
||||||
|
Addr() Addr;
|
||||||
|
Interface() interface {};
|
||||||
|
|
||||||
Get() uint;
|
Get() uint;
|
||||||
Set(uint);
|
Set(uint);
|
||||||
Type() Type;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
type uintValueStruct struct {
|
type uintValueStruct struct {
|
||||||
@ -232,10 +258,14 @@ func (v *uintValueStruct) Set(i uint) {
|
|||||||
// -- Uint8
|
// -- Uint8
|
||||||
|
|
||||||
type Uint8Value interface {
|
type Uint8Value interface {
|
||||||
|
// TODO: Value;
|
||||||
Kind() int;
|
Kind() int;
|
||||||
|
Type() Type;
|
||||||
|
Addr() Addr;
|
||||||
|
Interface() interface {};
|
||||||
|
|
||||||
Get() uint8;
|
Get() uint8;
|
||||||
Set(uint8);
|
Set(uint8);
|
||||||
Type() Type;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
type uint8ValueStruct struct {
|
type uint8ValueStruct struct {
|
||||||
@ -257,10 +287,14 @@ func (v *uint8ValueStruct) Set(i uint8) {
|
|||||||
// -- Uint16
|
// -- Uint16
|
||||||
|
|
||||||
type Uint16Value interface {
|
type Uint16Value interface {
|
||||||
|
// TODO: Value;
|
||||||
Kind() int;
|
Kind() int;
|
||||||
|
Type() Type;
|
||||||
|
Addr() Addr;
|
||||||
|
Interface() interface {};
|
||||||
|
|
||||||
Get() uint16;
|
Get() uint16;
|
||||||
Set(uint16);
|
Set(uint16);
|
||||||
Type() Type;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
type uint16ValueStruct struct {
|
type uint16ValueStruct struct {
|
||||||
@ -282,10 +316,14 @@ func (v *uint16ValueStruct) Set(i uint16) {
|
|||||||
// -- Uint32
|
// -- Uint32
|
||||||
|
|
||||||
type Uint32Value interface {
|
type Uint32Value interface {
|
||||||
|
// TODO: Value;
|
||||||
Kind() int;
|
Kind() int;
|
||||||
|
Type() Type;
|
||||||
|
Addr() Addr;
|
||||||
|
Interface() interface {};
|
||||||
|
|
||||||
Get() uint32;
|
Get() uint32;
|
||||||
Set(uint32);
|
Set(uint32);
|
||||||
Type() Type;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
type uint32ValueStruct struct {
|
type uint32ValueStruct struct {
|
||||||
@ -307,10 +345,14 @@ func (v *uint32ValueStruct) Set(i uint32) {
|
|||||||
// -- Uint64
|
// -- Uint64
|
||||||
|
|
||||||
type Uint64Value interface {
|
type Uint64Value interface {
|
||||||
|
// TODO: Value;
|
||||||
Kind() int;
|
Kind() int;
|
||||||
|
Type() Type;
|
||||||
|
Addr() Addr;
|
||||||
|
Interface() interface {};
|
||||||
|
|
||||||
Get() uint64;
|
Get() uint64;
|
||||||
Set(uint64);
|
Set(uint64);
|
||||||
Type() Type;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
type uint64ValueStruct struct {
|
type uint64ValueStruct struct {
|
||||||
@ -332,10 +374,14 @@ func (v *uint64ValueStruct) Set(i uint64) {
|
|||||||
// -- Uintptr
|
// -- Uintptr
|
||||||
|
|
||||||
type UintptrValue interface {
|
type UintptrValue interface {
|
||||||
|
// TODO: Value;
|
||||||
Kind() int;
|
Kind() int;
|
||||||
|
Type() Type;
|
||||||
|
Addr() Addr;
|
||||||
|
Interface() interface {};
|
||||||
|
|
||||||
Get() uintptr;
|
Get() uintptr;
|
||||||
Set(uintptr);
|
Set(uintptr);
|
||||||
Type() Type;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
type uintptrValueStruct struct {
|
type uintptrValueStruct struct {
|
||||||
@ -357,10 +403,14 @@ func (v *uintptrValueStruct) Set(i uintptr) {
|
|||||||
// -- Float
|
// -- Float
|
||||||
|
|
||||||
type FloatValue interface {
|
type FloatValue interface {
|
||||||
|
// TODO: Value;
|
||||||
Kind() int;
|
Kind() int;
|
||||||
|
Type() Type;
|
||||||
|
Addr() Addr;
|
||||||
|
Interface() interface {};
|
||||||
|
|
||||||
Get() float;
|
Get() float;
|
||||||
Set(float);
|
Set(float);
|
||||||
Type() Type;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
type floatValueStruct struct {
|
type floatValueStruct struct {
|
||||||
@ -382,10 +432,14 @@ func (v *floatValueStruct) Set(f float) {
|
|||||||
// -- Float32
|
// -- Float32
|
||||||
|
|
||||||
type Float32Value interface {
|
type Float32Value interface {
|
||||||
|
// TODO: Value;
|
||||||
Kind() int;
|
Kind() int;
|
||||||
|
Type() Type;
|
||||||
|
Addr() Addr;
|
||||||
|
Interface() interface {};
|
||||||
|
|
||||||
Get() float32;
|
Get() float32;
|
||||||
Set(float32);
|
Set(float32);
|
||||||
Type() Type;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
type float32ValueStruct struct {
|
type float32ValueStruct struct {
|
||||||
@ -407,10 +461,14 @@ func (v *float32ValueStruct) Set(f float32) {
|
|||||||
// -- Float64
|
// -- Float64
|
||||||
|
|
||||||
type Float64Value interface {
|
type Float64Value interface {
|
||||||
|
// TODO: Value;
|
||||||
Kind() int;
|
Kind() int;
|
||||||
|
Type() Type;
|
||||||
|
Addr() Addr;
|
||||||
|
Interface() interface {};
|
||||||
|
|
||||||
Get() float64;
|
Get() float64;
|
||||||
Set(float64);
|
Set(float64);
|
||||||
Type() Type;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
type float64ValueStruct struct {
|
type float64ValueStruct struct {
|
||||||
@ -432,10 +490,14 @@ func (v *float64ValueStruct) Set(f float64) {
|
|||||||
// -- Float80
|
// -- Float80
|
||||||
|
|
||||||
type Float80Value interface {
|
type Float80Value interface {
|
||||||
|
// TODO: Value;
|
||||||
Kind() int;
|
Kind() int;
|
||||||
|
Type() Type;
|
||||||
|
Addr() Addr;
|
||||||
|
Interface() interface {};
|
||||||
|
|
||||||
Get() float80;
|
Get() float80;
|
||||||
Set(float80);
|
Set(float80);
|
||||||
Type() Type;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
type float80ValueStruct struct {
|
type float80ValueStruct struct {
|
||||||
@ -460,10 +522,14 @@ func (v *Float80ValueStruct) Set(f float80) {
|
|||||||
// -- String
|
// -- String
|
||||||
|
|
||||||
type StringValue interface {
|
type StringValue interface {
|
||||||
|
// TODO: Value;
|
||||||
Kind() int;
|
Kind() int;
|
||||||
|
Type() Type;
|
||||||
|
Addr() Addr;
|
||||||
|
Interface() interface {};
|
||||||
|
|
||||||
Get() string;
|
Get() string;
|
||||||
Set(string);
|
Set(string);
|
||||||
Type() Type;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
type stringValueStruct struct {
|
type stringValueStruct struct {
|
||||||
@ -485,10 +551,14 @@ func (v *stringValueStruct) Set(s string) {
|
|||||||
// -- Bool
|
// -- Bool
|
||||||
|
|
||||||
type BoolValue interface {
|
type BoolValue interface {
|
||||||
|
// TODO: Value;
|
||||||
Kind() int;
|
Kind() int;
|
||||||
|
Type() Type;
|
||||||
|
Addr() Addr;
|
||||||
|
Interface() interface {};
|
||||||
|
|
||||||
Get() bool;
|
Get() bool;
|
||||||
Set(bool);
|
Set(bool);
|
||||||
Type() Type;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
type boolValueStruct struct {
|
type boolValueStruct struct {
|
||||||
@ -510,8 +580,12 @@ func (v *boolValueStruct) Set(b bool) {
|
|||||||
// -- Pointer
|
// -- Pointer
|
||||||
|
|
||||||
type PtrValue interface {
|
type PtrValue interface {
|
||||||
|
// TODO: Value;
|
||||||
Kind() int;
|
Kind() int;
|
||||||
Type() Type;
|
Type() Type;
|
||||||
|
Addr() Addr;
|
||||||
|
Interface() interface {};
|
||||||
|
|
||||||
Sub() Value;
|
Sub() Value;
|
||||||
Get() Addr;
|
Get() Addr;
|
||||||
SetSub(Value);
|
SetSub(Value);
|
||||||
@ -547,8 +621,12 @@ func ptrCreator(typ Type, addr Addr) Value {
|
|||||||
// Slices and arrays are represented by the same interface.
|
// Slices and arrays are represented by the same interface.
|
||||||
|
|
||||||
type ArrayValue interface {
|
type ArrayValue interface {
|
||||||
|
// TODO: Value;
|
||||||
Kind() int;
|
Kind() int;
|
||||||
Type() Type;
|
Type() Type;
|
||||||
|
Addr() Addr;
|
||||||
|
Interface() interface {};
|
||||||
|
|
||||||
IsSlice() bool;
|
IsSlice() bool;
|
||||||
Len() int;
|
Len() int;
|
||||||
Cap() int;
|
Cap() int;
|
||||||
@ -681,8 +759,12 @@ func arrayCreator(typ Type, addr Addr) Value {
|
|||||||
// -- Map TODO: finish and test
|
// -- Map TODO: finish and test
|
||||||
|
|
||||||
type MapValue interface {
|
type MapValue interface {
|
||||||
|
// TODO: Value;
|
||||||
Kind() int;
|
Kind() int;
|
||||||
Type() Type;
|
Type() Type;
|
||||||
|
Addr() Addr;
|
||||||
|
Interface() interface {};
|
||||||
|
|
||||||
Len() int;
|
Len() int;
|
||||||
Elem(key Value) Value;
|
Elem(key Value) Value;
|
||||||
}
|
}
|
||||||
@ -707,8 +789,11 @@ func (v *mapValueStruct) Elem(key Value) Value {
|
|||||||
// -- Chan
|
// -- Chan
|
||||||
|
|
||||||
type ChanValue interface {
|
type ChanValue interface {
|
||||||
|
// TODO: Value;
|
||||||
Kind() int;
|
Kind() int;
|
||||||
Type() Type;
|
Type() Type;
|
||||||
|
Addr() Addr;
|
||||||
|
Interface() interface {};
|
||||||
}
|
}
|
||||||
|
|
||||||
type chanValueStruct struct {
|
type chanValueStruct struct {
|
||||||
@ -722,8 +807,12 @@ func chanCreator(typ Type, addr Addr) Value {
|
|||||||
// -- Struct
|
// -- Struct
|
||||||
|
|
||||||
type StructValue interface {
|
type StructValue interface {
|
||||||
|
// TODO: Value;
|
||||||
Kind() int;
|
Kind() int;
|
||||||
Type() Type;
|
Type() Type;
|
||||||
|
Addr() Addr;
|
||||||
|
Interface() interface {};
|
||||||
|
|
||||||
Len() int;
|
Len() int;
|
||||||
Field(i int) Value;
|
Field(i int) Value;
|
||||||
}
|
}
|
||||||
@ -757,8 +846,12 @@ func structCreator(typ Type, addr Addr) Value {
|
|||||||
// -- Interface
|
// -- Interface
|
||||||
|
|
||||||
type InterfaceValue interface {
|
type InterfaceValue interface {
|
||||||
|
// TODO: Value;
|
||||||
Kind() int;
|
Kind() int;
|
||||||
Type() Type;
|
Type() Type;
|
||||||
|
Addr() Addr;
|
||||||
|
Interface() interface {};
|
||||||
|
|
||||||
Get() interface {};
|
Get() interface {};
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -777,8 +870,11 @@ func interfaceCreator(typ Type, addr Addr) Value {
|
|||||||
// -- Func
|
// -- Func
|
||||||
|
|
||||||
type FuncValue interface {
|
type FuncValue interface {
|
||||||
|
// TODO: Value;
|
||||||
Kind() int;
|
Kind() int;
|
||||||
Type() Type;
|
Type() Type;
|
||||||
|
Addr() Addr;
|
||||||
|
Interface() interface {};
|
||||||
}
|
}
|
||||||
|
|
||||||
type funcValueStruct struct {
|
type funcValueStruct struct {
|
||||||
@ -860,7 +956,7 @@ func NewSliceValue(typ ArrayType, len, cap int) ArrayValue {
|
|||||||
array.len = uint32(len);
|
array.len = uint32(len);
|
||||||
array.cap = uint32(cap);
|
array.cap = uint32(cap);
|
||||||
|
|
||||||
return newValueAddr(typ, Addr(array));
|
return newValueAddr(typ, Addr(array)).(ArrayValue);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Works on both slices and arrays
|
// Works on both slices and arrays
|
||||||
|
@ -126,7 +126,7 @@ func put(dat item, out *dch){
|
|||||||
func get(in *dch) *rat {
|
func get(in *dch) *rat {
|
||||||
seqno++;
|
seqno++;
|
||||||
in.req <- seqno;
|
in.req <- seqno;
|
||||||
return <-in.dat;
|
return (<-in.dat).(*rat);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get one item from each of n demand channels
|
// Get one item from each of n demand channels
|
||||||
@ -332,9 +332,9 @@ func Add(U, V PS) PS{
|
|||||||
for {
|
for {
|
||||||
<-Z.req;
|
<-Z.req;
|
||||||
uv = get2(U,V);
|
uv = get2(U,V);
|
||||||
switch end(uv[0])+2*end(uv[1]) {
|
switch end(uv[0].(*rat))+2*end(uv[1].(*rat)) {
|
||||||
case 0:
|
case 0:
|
||||||
Z.dat <- add(uv[0], uv[1]);
|
Z.dat <- add(uv[0].(*rat), uv[1].(*rat));
|
||||||
case 1:
|
case 1:
|
||||||
Z.dat <- uv[1];
|
Z.dat <- uv[1];
|
||||||
copy(V,Z);
|
copy(V,Z);
|
||||||
@ -448,13 +448,13 @@ func Mul(U, V PS) PS{
|
|||||||
go func(U, V, Z PS){
|
go func(U, V, Z PS){
|
||||||
<-Z.req;
|
<-Z.req;
|
||||||
uv := get2(U,V);
|
uv := get2(U,V);
|
||||||
if end(uv[0])!=0 || end(uv[1]) != 0 {
|
if end(uv[0].(*rat))!=0 || end(uv[1].(*rat)) != 0 {
|
||||||
Z.dat <- finis;
|
Z.dat <- finis;
|
||||||
} else {
|
} else {
|
||||||
Z.dat <- mul(uv[0],uv[1]);
|
Z.dat <- mul(uv[0].(*rat),uv[1].(*rat));
|
||||||
UU := Split(U);
|
UU := Split(U);
|
||||||
VV := Split(V);
|
VV := Split(V);
|
||||||
W := Add(Cmul(uv[0],VV[0]),Cmul(uv[1],UU[0]));
|
W := Add(Cmul(uv[0].(*rat),VV[0]),Cmul(uv[1].(*rat),UU[0]));
|
||||||
<-Z.req;
|
<-Z.req;
|
||||||
Z.dat <- get(W);
|
Z.dat <- get(W);
|
||||||
copy(Add(W,Mul(UU[1],VV[1])),Z);
|
copy(Add(W,Mul(UU[1],VV[1])),Z);
|
||||||
|
@ -46,7 +46,7 @@ func main() {
|
|||||||
v.Insert(i0);
|
v.Insert(i0);
|
||||||
for i := 0; i < v.nelem; i++ {
|
for i := 0; i < v.nelem; i++ {
|
||||||
var x *I;
|
var x *I;
|
||||||
x = v.At(i);
|
x = v.At(i).(*I);
|
||||||
print(i, " ", x.val, "\n"); // prints correct list
|
print(i, " ", x.val, "\n"); // prints correct list
|
||||||
}
|
}
|
||||||
for i := 0; i < v.nelem; i++ {
|
for i := 0; i < v.nelem; i++ {
|
||||||
|
@ -23,10 +23,7 @@ type TStruct struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (s *TStruct) field(i int) *TStruct {
|
func (s *TStruct) field(i int) *TStruct {
|
||||||
// works if we say
|
return s.fields.At(i).(*TStruct);
|
||||||
// t := s.fields.At(i);
|
|
||||||
// return t;
|
|
||||||
return s.fields.At(i);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
|
@ -17,5 +17,5 @@ var i2 I2;
|
|||||||
func
|
func
|
||||||
main()
|
main()
|
||||||
{
|
{
|
||||||
i2 = e(); // bug089.go:16: fatal error: agen_inter i2i
|
i2 = e().(I2); // bug089.go:16: fatal error: agen_inter i2i
|
||||||
}
|
}
|
||||||
|
@ -11,10 +11,10 @@ func foo2(i int32) int32 { return i }
|
|||||||
func main() {
|
func main() {
|
||||||
var i I;
|
var i I;
|
||||||
i = 1;
|
i = 1;
|
||||||
var v1 int = i;
|
var v1 = i.(int);
|
||||||
if foo1(v1) != 1 { panicln(1) }
|
if foo1(v1) != 1 { panicln(1) }
|
||||||
var v2 int32 = int32(i.(int));
|
var v2 = int32(i.(int));
|
||||||
if foo2(v2) != 1 { panicln(2) }
|
if foo2(v2) != 1 { panicln(2) }
|
||||||
var v3 int32 = i; // This implicit type conversion should fail at runtime.
|
var v3 = i.(int32); // This type conversion should fail at runtime.
|
||||||
if foo2(v3) != 1 { panicln(3) }
|
if foo2(v3) != 1 { panicln(3) }
|
||||||
}
|
}
|
||||||
|
@ -17,7 +17,7 @@ func main() {
|
|||||||
var i I;
|
var i I;
|
||||||
var e interface {};
|
var e interface {};
|
||||||
e = s;
|
e = s;
|
||||||
i = e;
|
i = e.(I);
|
||||||
}
|
}
|
||||||
|
|
||||||
// hide S down here to avoid static warning
|
// hide S down here to avoid static warning
|
||||||
|
@ -12,10 +12,21 @@ var t *T
|
|||||||
type I interface { M() }
|
type I interface { M() }
|
||||||
var i I
|
var i I
|
||||||
|
|
||||||
|
type I2 interface { M(); N(); }
|
||||||
|
var i2 I2;
|
||||||
|
|
||||||
|
var e interface { };
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
|
e = t; // ok
|
||||||
|
t = e; // ERROR "need explicit"
|
||||||
|
|
||||||
// neither of these can work,
|
// neither of these can work,
|
||||||
// because i has an extra method
|
// because i has an extra method
|
||||||
// that t does not, so i cannot contain a t.
|
// that t does not, so i cannot contain a t.
|
||||||
i = t; // ERROR "missing|incompatible"
|
i = t; // ERROR "missing|incompatible|is not"
|
||||||
t = i; // ERROR "missing|incompatible"
|
t = i; // ERROR "missing|incompatible|is not"
|
||||||
|
|
||||||
|
i = i2; // ok
|
||||||
|
i2 = i; // ERROR "need explicit"
|
||||||
}
|
}
|
||||||
|
@ -214,7 +214,7 @@ main()
|
|||||||
|
|
||||||
// run it thru an interface
|
// run it thru an interface
|
||||||
i = s;
|
i = s;
|
||||||
s = i;
|
s = i.(*S);
|
||||||
|
|
||||||
// same as t3
|
// same as t3
|
||||||
if s.test1() != s.a1 { panicln("t4", 1) }
|
if s.test1() != s.a1 { panicln("t4", 1) }
|
||||||
|
@ -85,21 +85,21 @@ main()
|
|||||||
u32 = 4455; ia[11] = u32;
|
u32 = 4455; ia[11] = u32;
|
||||||
u64 = 765432; ia[12] = u64;
|
u64 = 765432; ia[12] = u64;
|
||||||
|
|
||||||
s = ia[0]; if s != "xxx" { panicln(0,s); }
|
s = ia[0].(string); if s != "xxx" { panicln(0,s); }
|
||||||
i32 = int32(ia[1].(int));
|
i32 = int32(ia[1].(int));
|
||||||
if i32 != 12345 { panicln(1,i32); }
|
if i32 != 12345 { panicln(1,i32); }
|
||||||
b = ia[2]; if b != true { panicln(2,b); }
|
b = ia[2].(bool); if b != true { panicln(2,b); }
|
||||||
|
|
||||||
s = ia[3]; if s != "now is" { panicln(3,s); }
|
s = ia[3].(string); if s != "now is" { panicln(3,s); }
|
||||||
b = ia[4]; if b != false { panicln(4,b); }
|
b = ia[4].(bool); if b != false { panicln(4,b); }
|
||||||
|
|
||||||
i8 = ia[5]; if i8 != 29 { panicln(5,i8); }
|
i8 = ia[5].(int8); if i8 != 29 { panicln(5,i8); }
|
||||||
i16 = ia[6]; if i16 != 994 { panicln(6,i16); }
|
i16 = ia[6].(int16); if i16 != 994 { panicln(6,i16); }
|
||||||
i32 = ia[7]; if i32 != 3434 { panicln(7,i32); }
|
i32 = ia[7].(int32); if i32 != 3434 { panicln(7,i32); }
|
||||||
i64 = ia[8]; if i64 != 1234567 { panicln(8,i64); }
|
i64 = ia[8].(int64); if i64 != 1234567 { panicln(8,i64); }
|
||||||
|
|
||||||
u8 = ia[9]; if u8 != 12 { panicln(5,u8); }
|
u8 = ia[9].(uint8); if u8 != 12 { panicln(5,u8); }
|
||||||
u16 = ia[10]; if u16 != 799 { panicln(6,u16); }
|
u16 = ia[10].(uint16); if u16 != 799 { panicln(6,u16); }
|
||||||
u32 = ia[11]; if u32 != 4455 { panicln(7,u32); }
|
u32 = ia[11].(uint32); if u32 != 4455 { panicln(7,u32); }
|
||||||
u64 = ia[12]; if u64 != 765432 { panicln(8,u64); }
|
u64 = ia[12].(uint64); if u64 != 765432 { panicln(8,u64); }
|
||||||
}
|
}
|
||||||
|
@ -49,16 +49,16 @@ main()
|
|||||||
if s.g() != 6 { panic(12); }
|
if s.g() != 6 { panic(12); }
|
||||||
|
|
||||||
i1 = s; // convert S to I1
|
i1 = s; // convert S to I1
|
||||||
i2 = i1; // convert I1 to I2
|
i2 = i1.(I2); // convert I1 to I2
|
||||||
|
|
||||||
// call interface
|
// call interface
|
||||||
if i1.f() != 5 { panic(21); }
|
if i1.f() != 5 { panic(21); }
|
||||||
if i2.f() != 5 { panic(22); }
|
if i2.f() != 5 { panic(22); }
|
||||||
if i2.g() != 6 { panic(23); }
|
if i2.g() != 6 { panic(23); }
|
||||||
|
|
||||||
g = i1; // convert I1 to S
|
g = i1.(*S); // convert I1 to S
|
||||||
if g != s { panic(31); }
|
if g != s { panic(31); }
|
||||||
|
|
||||||
g = i2; // convert I2 to S
|
g = i2.(*S); // convert I2 to S
|
||||||
if g != s { panic(32); }
|
if g != s { panic(32); }
|
||||||
}
|
}
|
||||||
|
@ -299,7 +299,7 @@ func (P *Parser) parseIdentList() AST.Expr {
|
|||||||
x = last;
|
x = last;
|
||||||
} else {
|
} else {
|
||||||
last.Y = P.newBinaryExpr(pos, Scanner.COMMA, last.Y, y);
|
last.Y = P.newBinaryExpr(pos, Scanner.COMMA, last.Y, y);
|
||||||
last = last.Y;
|
last = last.Y.(*AST.BinaryExpr);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -987,7 +987,7 @@ func (P *Parser) parseCompositeElements() AST.Expr {
|
|||||||
x = last;
|
x = last;
|
||||||
} else {
|
} else {
|
||||||
last.Y = P.newBinaryExpr(pos, Scanner.COMMA, last.Y, y);
|
last.Y = P.newBinaryExpr(pos, Scanner.COMMA, last.Y, y);
|
||||||
last = last.Y;
|
last = last.Y.(*AST.BinaryExpr);
|
||||||
}
|
}
|
||||||
|
|
||||||
if P.tok == Scanner.COMMA {
|
if P.tok == Scanner.COMMA {
|
||||||
|
Loading…
Reference in New Issue
Block a user