use embedded types to save boilerplate - almost 300 lines' worth
R=rsc
DELTA=427 (53 added, 302 deleted, 72 changed)
OCL=17857
CL=17868
diff --git a/src/lib/reflect/type.go b/src/lib/reflect/type.go
index 506a1a0..c70ad79 100644
--- a/src/lib/reflect/type.go
+++ b/src/lib/reflect/type.go
@@ -47,28 +47,33 @@
Size() uint64;
}
-// -- Basic
-
-type BasicType struct{
+// Fields and methods common to all types
+type Common struct {
kind int;
name string;
size uint64;
}
+func (c *Common) Name() string {
+ return c.name
+}
+
+func (c *Common) Kind() int {
+ return c.kind
+}
+
+func (c *Common) Size() uint64 {
+ return c.size
+}
+
+// -- Basic
+
+type BasicType struct {
+ Common
+}
+
func NewBasicType(name string, kind int, size uint64) Type {
- return &BasicType{kind, name, size}
-}
-
-func (t *BasicType) Name() string {
- return t.name
-}
-
-func (t *BasicType) Kind() int {
- return t.kind
-}
-
-func (t *BasicType) Size() uint64 {
- return t.size
+ return &BasicType{ Common{kind, name, size} }
}
// Prebuilt basic types
@@ -114,24 +119,12 @@
}
type PtrTypeStruct struct {
- name string;
+ Common;
sub *StubType;
}
func NewPtrTypeStruct(name string, sub *StubType) *PtrTypeStruct {
- return &PtrTypeStruct{name, sub}
-}
-
-func (t *PtrTypeStruct) Kind() int {
- return PtrKind
-}
-
-func (t *PtrTypeStruct) Name() string {
- return t.name
-}
-
-func (t *PtrTypeStruct) Size() uint64 {
- return ptrsize
+ return &PtrTypeStruct{ Common{PtrKind, name, ptrsize}, sub}
}
func (t *PtrTypeStruct) Sub() Type {
@@ -147,22 +140,14 @@
}
type ArrayTypeStruct struct {
- name string;
+ Common;
elem *StubType;
open bool; // otherwise fixed size
len uint64;
}
func NewArrayTypeStruct(name string, open bool, len uint64, elem *StubType) *ArrayTypeStruct {
- return &ArrayTypeStruct{name, elem, open, len}
-}
-
-func (t *ArrayTypeStruct) Kind() int {
- return ArrayKind
-}
-
-func (t *ArrayTypeStruct) Name() string {
- return t.name
+ return &ArrayTypeStruct{ Common{ArrayKind, name, 0}, elem, open, len}
}
func (t *ArrayTypeStruct) Size() uint64 {
@@ -193,21 +178,13 @@
}
type MapTypeStruct struct {
- name string;
+ Common;
key *StubType;
elem *StubType;
}
func NewMapTypeStruct(name string, key, elem *StubType) *MapTypeStruct {
- return &MapTypeStruct{name, key, elem}
-}
-
-func (t *MapTypeStruct) Kind() int {
- return MapKind
-}
-
-func (t *MapTypeStruct) Name() string {
- return t.name
+ return &MapTypeStruct{ Common{MapKind, name, 0}, key, elem}
}
func (t *MapTypeStruct) Size() uint64 {
@@ -237,21 +214,13 @@
)
type ChanTypeStruct struct {
- name string;
+ Common;
elem *StubType;
dir int;
}
func NewChanTypeStruct(name string, dir int, elem *StubType) *ChanTypeStruct {
- return &ChanTypeStruct{name, elem, dir}
-}
-
-func (t *ChanTypeStruct) Kind() int {
- return ChanKind
-}
-
-func (t *ChanTypeStruct) Name() string {
- return t.name
+ return &ChanTypeStruct{ Common{ChanKind, name, 0}, elem, dir}
}
func (t *ChanTypeStruct) Size() uint64 {
@@ -260,7 +229,6 @@
}
func (t *ChanTypeStruct) Dir() int {
- // -1 is open array? TODO
return t.dir
}
@@ -283,24 +251,19 @@
}
type StructTypeStruct struct {
- name string;
+ Common;
field *[]Field;
}
func NewStructTypeStruct(name string, field *[]Field) *StructTypeStruct {
- return &StructTypeStruct{name, field}
-}
-
-func (t *StructTypeStruct) Kind() int {
- return StructKind
-}
-
-func (t *StructTypeStruct) Name() string {
- return t.name
+ return &StructTypeStruct{ Common{StructKind, name, 0}, field}
}
// TODO: not portable; depends on 6g
func (t *StructTypeStruct) Size() uint64 {
+ if t.size > 0 {
+ return t.size
+ }
size := uint64(0);
for i := 0; i < len(t.field); i++ {
elemsize := t.field[i].typ.Get().Size();
@@ -316,6 +279,7 @@
size += elemsize;
}
size = (size + 7) & ((1<<64 - 1) & ^7);
+ t.size = size;
return size;
}
@@ -338,12 +302,12 @@
}
type InterfaceTypeStruct struct {
- name string;
+ Common;
field *[]Field;
}
func NewInterfaceTypeStruct(name string, field *[]Field) *InterfaceTypeStruct {
- return &InterfaceTypeStruct{name, field}
+ return &InterfaceTypeStruct{ Common{InterfaceKind, name, interfacesize}, field }
}
func (t *InterfaceTypeStruct) Field(i int) (name string, typ Type, offset uint64) {
@@ -354,18 +318,6 @@
return len(t.field)
}
-func (t *InterfaceTypeStruct) Kind() int {
- return InterfaceKind
-}
-
-func (t *InterfaceTypeStruct) Name() string {
- return t.name
-}
-
-func (t *InterfaceTypeStruct) Size() uint64 {
- return interfacesize
-}
-
// -- Func
export type FuncType interface {
@@ -374,21 +326,13 @@
}
type FuncTypeStruct struct {
- name string;
+ Common;
in *StructTypeStruct;
out *StructTypeStruct;
}
func NewFuncTypeStruct(name string, in, out *StructTypeStruct) *FuncTypeStruct {
- return &FuncTypeStruct{name, in, out}
-}
-
-func (t *FuncTypeStruct) Kind() int {
- return FuncKind
-}
-
-func (t *FuncTypeStruct) Name() string {
- return t.name
+ return &FuncTypeStruct{ Common{FuncKind, name, 0}, in, out }
}
func (t *FuncTypeStruct) Size() uint64 {
diff --git a/src/lib/reflect/value.go b/src/lib/reflect/value.go
index 80ad46e..890fd9b 100644
--- a/src/lib/reflect/value.go
+++ b/src/lib/reflect/value.go
@@ -19,6 +19,22 @@
Type() Type;
}
+// Common fields and functionality for all values
+
+type CommonV struct { // BUG: want to call this Common but 6g does not hide the name
+ kind int;
+ typ Type;
+ addr Addr;
+}
+
+func (c *CommonV) Kind() int {
+ return c.kind
+}
+
+func (c *CommonV) Type() Type {
+ return c.typ
+}
+
func NewValueAddr(typ Type, addr Addr) Value
type Creator *(typ Type, addr Addr) Value
@@ -50,19 +66,11 @@
}
type Int8ValueStruct struct {
- addr Addr
+ CommonV
}
func Int8Creator(typ Type, addr Addr) Value {
- return &Int8ValueStruct{addr}
-}
-
-func (v *Int8ValueStruct) Kind() int {
- return Int8Kind
-}
-
-func (v *Int8ValueStruct) Type() Type {
- return Int8
+ return &Int8ValueStruct{ CommonV{Int8Kind, typ, addr} }
}
func (v *Int8ValueStruct) Get() int8 {
@@ -83,19 +91,11 @@
}
type Int16ValueStruct struct {
- addr Addr
+ CommonV
}
func Int16Creator(typ Type, addr Addr) Value {
- return &Int16ValueStruct{addr}
-}
-
-func (v *Int16ValueStruct) Kind() int {
- return Int16Kind
-}
-
-func (v *Int16ValueStruct) Type() Type {
- return Int16
+ return &Int16ValueStruct{ CommonV{Int16Kind, typ, addr} }
}
func (v *Int16ValueStruct) Get() int16 {
@@ -116,19 +116,11 @@
}
type Int32ValueStruct struct {
- addr Addr
+ CommonV
}
func Int32Creator(typ Type, addr Addr) Value {
- return &Int32ValueStruct{addr}
-}
-
-func (v *Int32ValueStruct) Type() Type {
- return Int32
-}
-
-func (v *Int32ValueStruct) Kind() int {
- return Int32Kind
+ return &Int32ValueStruct{ CommonV{Int32Kind, typ, addr} }
}
func (v *Int32ValueStruct) Get() int32 {
@@ -149,19 +141,11 @@
}
type Int64ValueStruct struct {
- addr Addr
+ CommonV
}
func Int64Creator(typ Type, addr Addr) Value {
- return &Int64ValueStruct{addr}
-}
-
-func (v *Int64ValueStruct) Kind() int {
- return Int64Kind
-}
-
-func (v *Int64ValueStruct) Type() Type {
- return Int64
+ return &Int64ValueStruct{ CommonV{Int64Kind, typ, addr} }
}
func (v *Int64ValueStruct) Get() int64 {
@@ -182,19 +166,11 @@
}
type Uint8ValueStruct struct {
- addr Addr
+ CommonV
}
func Uint8Creator(typ Type, addr Addr) Value {
- return &Uint8ValueStruct{addr}
-}
-
-func (v *Uint8ValueStruct) Kind() int {
- return Uint8Kind
-}
-
-func (v *Uint8ValueStruct) Type() Type {
- return Uint8
+ return &Uint8ValueStruct{ CommonV{Uint8Kind, typ, addr} }
}
func (v *Uint8ValueStruct) Get() uint8 {
@@ -215,19 +191,11 @@
}
type Uint16ValueStruct struct {
- addr Addr
+ CommonV
}
func Uint16Creator(typ Type, addr Addr) Value {
- return &Uint16ValueStruct{addr}
-}
-
-func (v *Uint16ValueStruct) Kind() int {
- return Uint16Kind
-}
-
-func (v *Uint16ValueStruct) Type() Type {
- return Uint16
+ return &Uint16ValueStruct{ CommonV{Uint16Kind, typ, addr} }
}
func (v *Uint16ValueStruct) Get() uint16 {
@@ -248,19 +216,11 @@
}
type Uint32ValueStruct struct {
- addr Addr
+ CommonV
}
func Uint32Creator(typ Type, addr Addr) Value {
- return &Uint32ValueStruct{addr}
-}
-
-func (v *Uint32ValueStruct) Kind() int {
- return Uint32Kind
-}
-
-func (v *Uint32ValueStruct) Type() Type {
- return Uint32
+ return &Uint32ValueStruct{ CommonV{Uint32Kind, typ, addr} }
}
func (v *Uint32ValueStruct) Get() uint32 {
@@ -281,19 +241,11 @@
}
type Uint64ValueStruct struct {
- addr Addr
+ CommonV
}
func Uint64Creator(typ Type, addr Addr) Value {
- return &Uint64ValueStruct{addr}
-}
-
-func (v *Uint64ValueStruct) Kind() int {
- return Uint64Kind
-}
-
-func (v *Uint64ValueStruct) Type() Type {
- return Uint64
+ return &Uint64ValueStruct{ CommonV{Uint64Kind, typ, addr} }
}
func (v *Uint64ValueStruct) Get() uint64 {
@@ -314,19 +266,11 @@
}
type Float32ValueStruct struct {
- addr Addr
+ CommonV
}
func Float32Creator(typ Type, addr Addr) Value {
- return &Float32ValueStruct{addr}
-}
-
-func (v *Float32ValueStruct) Kind() int {
- return Float32Kind
-}
-
-func (v *Float32ValueStruct) Type() Type {
- return Float32
+ return &Float32ValueStruct{ CommonV{Float32Kind, typ, addr} }
}
func (v *Float32ValueStruct) Get() float32 {
@@ -347,19 +291,11 @@
}
type Float64ValueStruct struct {
- addr Addr
+ CommonV
}
func Float64Creator(typ Type, addr Addr) Value {
- return &Float64ValueStruct{addr}
-}
-
-func (v *Float64ValueStruct) Kind() int {
- return Float64Kind
-}
-
-func (v *Float64ValueStruct) Type() Type {
- return Float64
+ return &Float64ValueStruct{ CommonV{Float64Kind, typ, addr} }
}
func (v *Float64ValueStruct) Get() float64 {
@@ -380,19 +316,11 @@
}
type Float80ValueStruct struct {
- addr Addr
+ CommonV
}
func Float80Creator(typ Type, addr Addr) Value {
- return &Float80ValueStruct{addr}
-}
-
-func (v *Float80ValueStruct) Kind() int {
- return Float80Kind
-}
-
-func (v *Float80ValueStruct) Type() Type {
- return Float80
+ return &Float80ValueStruct{ CommonV{Float80Kind, typ, addr} }
}
/*
@@ -417,19 +345,11 @@
}
type StringValueStruct struct {
- addr Addr
+ CommonV
}
func StringCreator(typ Type, addr Addr) Value {
- return &StringValueStruct{addr}
-}
-
-func (v *StringValueStruct) Kind() int {
- return StringKind
-}
-
-func (v *StringValueStruct) Type() Type {
- return String
+ return &StringValueStruct{ CommonV{StringKind, typ, addr} }
}
func (v *StringValueStruct) Get() string {
@@ -450,16 +370,7 @@
}
type PtrValueStruct struct {
- addr Addr;
- typ Type;
-}
-
-func (v *PtrValueStruct) Kind() int {
- return PtrKind
-}
-
-func (v *PtrValueStruct) Type() Type {
- return v.typ
+ CommonV
}
func (v *PtrValueStruct) Get() Addr {
@@ -471,10 +382,10 @@
}
func PtrCreator(typ Type, addr Addr) Value {
- return &PtrValueStruct{addr, typ};
+ return &PtrValueStruct{ CommonV{PtrKind, typ, addr} };
}
-// -- Array TODO: finish and test
+// -- Array
export type ArrayValue interface {
Kind() int;
@@ -485,11 +396,11 @@
}
type OpenArrayValueStruct struct {
- addr Addr;
- typ Type;
+ CommonV;
elemtype Type;
elemsize uint64;
}
+
/*
Run-time representation of open arrays looks like this:
struct Array {
@@ -498,14 +409,6 @@
};
*/
-func (v *OpenArrayValueStruct) Kind() int {
- return ArrayKind
-}
-
-func (v *OpenArrayValueStruct) Type() Type {
- return v.typ
-}
-
func (v *OpenArrayValueStruct) Open() bool {
return true
}
@@ -520,21 +423,12 @@
}
type FixedArrayValueStruct struct {
- addr Addr;
- typ Type;
+ CommonV;
elemtype Type;
elemsize uint64;
len uint64;
}
-func (v *FixedArrayValueStruct) Kind() int {
- return ArrayKind
-}
-
-func (v *FixedArrayValueStruct) Type() Type {
- return v.typ
-}
-
func (v *FixedArrayValueStruct) Open() bool {
return false
}
@@ -552,6 +446,7 @@
arraytype := typ.(ArrayType);
if arraytype.Open() {
v := new(OpenArrayValueStruct);
+ v.kind = ArrayKind;
v.addr = addr;
v.typ = typ;
v.elemtype = arraytype.Elem();
@@ -559,6 +454,7 @@
return v;
}
v := new(FixedArrayValueStruct);
+ v.kind = ArrayKind;
v.addr = addr;
v.typ = typ;
v.elemtype = arraytype.Elem();
@@ -577,20 +473,11 @@
}
type MapValueStruct struct {
- addr Addr;
- typ Type;
+ CommonV
}
func MapCreator(typ Type, addr Addr) Value {
- return &MapValueStruct{addr, typ}
-}
-
-func (v *MapValueStruct) Kind() int {
- return MapKind
-}
-
-func (v *MapValueStruct) Type() Type {
- return v.typ
+ return &MapValueStruct{ CommonV{MapKind, typ, addr} }
}
func (v *MapValueStruct) Len() int {
@@ -610,20 +497,11 @@
}
type ChanValueStruct struct {
- addr Addr;
- typ Type;
+ CommonV
}
func ChanCreator(typ Type, addr Addr) Value {
- return &ChanValueStruct{addr, typ}
-}
-
-func (v *ChanValueStruct) Kind() int {
- return ChanKind
-}
-
-func (v *ChanValueStruct) Type() Type {
- return v.typ
+ return &ChanValueStruct{ CommonV{ChanKind, typ, addr} }
}
// -- Struct
@@ -636,19 +514,10 @@
}
type StructValueStruct struct {
- addr Addr;
- typ Type;
+ CommonV;
field *[]Value;
}
-func (v *StructValueStruct) Kind() int {
- return StructKind
-}
-
-func (v *StructValueStruct) Type() Type {
- return v.typ
-}
-
func (v *StructValueStruct) Len() int {
return len(v.field)
}
@@ -659,10 +528,8 @@
func StructCreator(typ Type, addr Addr) Value {
t := typ.(StructType);
- v := new(StructValueStruct);
- v.addr = addr;
nfield := t.Len();
- v.field = new([]Value, nfield);
+ v := &StructValueStruct{ CommonV{StructKind, typ, addr}, new([]Value, nfield) };
for i := 0; i < nfield; i++ {
name, ftype, offset := t.Field(i);
v.field[i] = NewValueAddr(ftype, addr + offset);
@@ -679,20 +546,11 @@
}
type InterfaceValueStruct struct {
- addr Addr;
- typ Type;
+ CommonV
}
func InterfaceCreator(typ Type, addr Addr) Value {
- return &InterfaceValueStruct{addr, typ}
-}
-
-func (v *InterfaceValueStruct) Kind() int {
- return InterfaceKind
-}
-
-func (v *InterfaceValueStruct) Type() Type {
- return v.typ
+ return &InterfaceValueStruct{ CommonV{InterfaceKind, typ, addr} }
}
// -- Func
@@ -703,20 +561,11 @@
}
type FuncValueStruct struct {
- addr Addr;
- typ Type;
+ CommonV
}
func FuncCreator(typ Type, addr Addr) Value {
- return &FuncValueStruct{addr, typ}
-}
-
-func (v *FuncValueStruct) Kind() int {
- return FuncKind
-}
-
-func (v *FuncValueStruct) Type() Type {
- return v.typ
+ return &FuncValueStruct{ CommonV{FuncKind, typ, addr} }
}
var creator *map[int] Creator