use embedded interface types

R=r
DELTA=205  (1 added, 157 deleted, 47 changed)
OCL=25071
CL=25073
diff --git a/src/lib/io/io.go b/src/lib/io/io.go
index 5f5966d..c4464f5 100644
--- a/src/lib/io/io.go
+++ b/src/lib/io/io.go
@@ -24,24 +24,24 @@
 }
 
 type ReadWrite interface {
-	Read(p []byte) (n int, err *os.Error);
-	Write(p []byte) (n int, err *os.Error);
+	Read;
+	Write;
 }
 
 type ReadClose interface {
-	Read(p []byte) (n int, err *os.Error);
-	Close() *os.Error;
+	Read;
+	Close;
 }
 
 type WriteClose interface {
-	Write(p []byte) (n int, err *os.Error);
-	Close() *os.Error;
+	Write;
+	Close;
 }
 
 type ReadWriteClose interface {
-	Read(p []byte) (n int, err *os.Error);
-	Write(p []byte) (n int, err *os.Error);
-	Close() *os.Error;
+	Read;
+	Write;
+	Close;
 }
 
 // Convert a string to an array of bytes for easy marshaling.
diff --git a/src/lib/reflect/type.go b/src/lib/reflect/type.go
index 6d14e66..f0585f0 100644
--- a/src/lib/reflect/type.go
+++ b/src/lib/reflect/type.go
@@ -108,23 +108,24 @@
 var (
 	Missing = newBasicType(missingString, MissingKind, 1);
 	DotDotDot = newBasicType(dotDotDotString, DotDotDotKind, 16);	// TODO(r): size of interface?
-	Bool = newBasicType("bool", BoolKind, 1); // TODO: need to know how big a bool is
-	Int = newBasicType("int", IntKind, 4);	// TODO: need to know how big an int is
+	Bool = newBasicType("bool", BoolKind, unsafe.Sizeof(true));
+	Int = newBasicType("int", IntKind, unsafe.Sizeof(int(0)));
 	Int8 = newBasicType("int8", Int8Kind, 1);
 	Int16 = newBasicType("int16", Int16Kind, 2);
 	Int32 = newBasicType("int32", Int32Kind, 4);
 	Int64 = newBasicType("int64", Int64Kind, 8);
-	Uint = newBasicType("uint", UintKind, 4);	// TODO: need to know how big a uint is
+	Uint = newBasicType("uint", UintKind, unsafe.Sizeof(uint(0)));
 	Uint8 = newBasicType("uint8", Uint8Kind, 1);
 	Uint16 = newBasicType("uint16", Uint16Kind, 2);
 	Uint32 = newBasicType("uint32", Uint32Kind, 4);
 	Uint64 = newBasicType("uint64", Uint64Kind, 8);
-	Uintptr = newBasicType("uintptr", UintptrKind, 8);	// TODO: need to know how big a uintptr is
-	Float = newBasicType("float", FloatKind, 4);	// TODO: need to know how big a float is
+	Uintptr = newBasicType("uintptr", UintptrKind, unsafe.Sizeof(uintptr(0)));
+	Float = newBasicType("float", FloatKind, unsafe.Sizeof(float(0)));
 	Float32 = newBasicType("float32", Float32Kind, 4);
 	Float64 = newBasicType("float64", Float64Kind, 8);
 	Float80 = newBasicType("float80", Float80Kind, 10);	// TODO: strange size?
-	String = newBasicType("string", StringKind, 8);	// implemented as a pointer
+	// TODO(rsc): Sizeof("") should work, doesn't.
+	String = newBasicType("string", StringKind, unsafe.Sizeof(string(0)));
 )
 
 // Stub types allow us to defer evaluating type names until needed.
@@ -149,12 +150,7 @@
 // -- Pointer
 
 type PtrType interface {
-	// TODO: Type;
-	Kind()	int;
-	Name()	string;
-	String()	string;
-	Size()	int;
-
+	Type;
 	Sub()	Type
 }
 
@@ -174,12 +170,7 @@
 // -- Array
 
 type ArrayType interface {
-	// TODO: Type;
-	Kind()	int;
-	Name()	string;
-	String()	string;
-	Size()	int;
-
+	Type;
 	IsSlice()	bool;
 	Len()	int;
 	Elem()	Type;
@@ -219,12 +210,7 @@
 // -- Map
 
 type MapType interface {
-	// TODO: Type;
-	Kind()	int;
-	Name()	string;
-	String()	string;
-	Size()	int;
-
+	Type;
 	Key()	Type;
 	Elem()	Type;
 }
@@ -250,12 +236,7 @@
 // -- Chan
 
 type ChanType interface {
-	// TODO: Type;
-	Kind()	int;
-	Name()	string;
-	String()	string;
-	Size()	int;
-
+	Type;
 	Dir()	int;
 	Elem()	Type;
 }
@@ -287,12 +268,7 @@
 // -- Struct
 
 type StructType interface {
-	// TODO: Type;
-	Kind()	int;
-	Name()	string;
-	String()	string;
-	Size()	int;
-
+	Type;
 	Field(int)	(name string, typ Type, tag string, offset int);
 	Len()	int;
 }
@@ -353,12 +329,7 @@
 // -- Interface
 
 type InterfaceType interface {
-	// TODO: Type;
-	Kind()	int;
-	Name()	string;
-	String()	string;
-	Size()	int;
-
+	Type;
 	Field(int)	(name string, typ Type, tag string, offset int);
 	Len()	int;
 }
@@ -385,12 +356,7 @@
 // -- Func
 
 type FuncType interface {
-	// TODO: Type;
-	Kind()	int;
-	Name()	string;
-	String()	string;
-	Size()	int;
-
+	Type;
 	In()	StructType;
 	Out()	StructType;
 }
diff --git a/src/lib/reflect/value.go b/src/lib/reflect/value.go
index 8d15a8e..ba430c2 100644
--- a/src/lib/reflect/value.go
+++ b/src/lib/reflect/value.go
@@ -66,11 +66,7 @@
 // -- Missing
 
 type MissingValue interface {
-	// TODO: Value;
-	Kind()	int;
-	Type()	Type;
-	Addr()	Addr;
-	Interface()	interface {};
+	Value;
 }
 
 type missingValueStruct struct {
@@ -84,12 +80,7 @@
 // -- Int
 
 type IntValue interface {
-	// TODO: Value;
-	Kind()	int;
-	Type()	Type;
-	Addr()	Addr;
-	Interface()	interface {};
-
+	Value;
 	Get()	int;
 	Set(int);
 }
@@ -113,12 +104,7 @@
 // -- Int8
 
 type Int8Value interface {
-	// TODO: Value;
-	Kind()	int;
-	Type()	Type;
-	Addr()	Addr;
-	Interface()	interface {};
-
+	Value;
 	Get()	int8;
 	Set(int8);
 }
@@ -142,12 +128,7 @@
 // -- Int16
 
 type Int16Value interface {
-	// TODO: Value;
-	Kind()	int;
-	Type()	Type;
-	Addr()	Addr;
-	Interface()	interface {};
-
+	Value;
 	Get()	int16;
 	Set(int16);
 }
@@ -171,12 +152,7 @@
 // -- Int32
 
 type Int32Value interface {
-	// TODO: Value;
-	Kind()	int;
-	Type()	Type;
-	Addr()	Addr;
-	Interface()	interface {};
-
+	Value;
 	Get()	int32;
 	Set(int32);
 }
@@ -200,12 +176,7 @@
 // -- Int64
 
 type Int64Value interface {
-	// TODO: Value;
-	Kind()	int;
-	Type()	Type;
-	Addr()	Addr;
-	Interface()	interface {};
-
+	Value;
 	Get()	int64;
 	Set(int64);
 }
@@ -229,12 +200,7 @@
 // -- Uint
 
 type UintValue interface {
-	// TODO: Value;
-	Kind()	int;
-	Type()	Type;
-	Addr()	Addr;
-	Interface()	interface {};
-
+	Value;
 	Get()	uint;
 	Set(uint);
 }
@@ -258,12 +224,7 @@
 // -- Uint8
 
 type Uint8Value interface {
-	// TODO: Value;
-	Kind()	int;
-	Type()	Type;
-	Addr()	Addr;
-	Interface()	interface {};
-
+	Value;
 	Get()	uint8;
 	Set(uint8);
 }
@@ -287,12 +248,7 @@
 // -- Uint16
 
 type Uint16Value interface {
-	// TODO: Value;
-	Kind()	int;
-	Type()	Type;
-	Addr()	Addr;
-	Interface()	interface {};
-
+	Value;
 	Get()	uint16;
 	Set(uint16);
 }
@@ -316,12 +272,7 @@
 // -- Uint32
 
 type Uint32Value interface {
-	// TODO: Value;
-	Kind()	int;
-	Type()	Type;
-	Addr()	Addr;
-	Interface()	interface {};
-
+	Value;
 	Get()	uint32;
 	Set(uint32);
 }
@@ -345,12 +296,7 @@
 // -- Uint64
 
 type Uint64Value interface {
-	// TODO: Value;
-	Kind()	int;
-	Type()	Type;
-	Addr()	Addr;
-	Interface()	interface {};
-
+	Value;
 	Get()	uint64;
 	Set(uint64);
 }
@@ -374,12 +320,7 @@
 // -- Uintptr
 
 type UintptrValue interface {
-	// TODO: Value;
-	Kind()	int;
-	Type()	Type;
-	Addr()	Addr;
-	Interface()	interface {};
-
+	Value;
 	Get()	uintptr;
 	Set(uintptr);
 }
@@ -403,12 +344,7 @@
 // -- Float
 
 type FloatValue interface {
-	// TODO: Value;
-	Kind()	int;
-	Type()	Type;
-	Addr()	Addr;
-	Interface()	interface {};
-
+	Value;
 	Get()	float;
 	Set(float);
 }
@@ -432,12 +368,7 @@
 // -- Float32
 
 type Float32Value interface {
-	// TODO: Value;
-	Kind()	int;
-	Type()	Type;
-	Addr()	Addr;
-	Interface()	interface {};
-
+	Value;
 	Get()	float32;
 	Set(float32);
 }
@@ -461,12 +392,7 @@
 // -- Float64
 
 type Float64Value interface {
-	// TODO: Value;
-	Kind()	int;
-	Type()	Type;
-	Addr()	Addr;
-	Interface()	interface {};
-
+	Value;
 	Get()	float64;
 	Set(float64);
 }
@@ -490,12 +416,7 @@
 // -- Float80
 
 type Float80Value interface {
-	// TODO: Value;
-	Kind()	int;
-	Type()	Type;
-	Addr()	Addr;
-	Interface()	interface {};
-
+	Value;
 	Get()	float80;
 	Set(float80);
 }
@@ -522,12 +443,7 @@
 // -- String
 
 type StringValue interface {
-	// TODO: Value;
-	Kind()	int;
-	Type()	Type;
-	Addr()	Addr;
-	Interface()	interface {};
-
+	Value;
 	Get()	string;
 	Set(string);
 }
@@ -551,12 +467,7 @@
 // -- Bool
 
 type BoolValue interface {
-	// TODO: Value;
-	Kind()	int;
-	Type()	Type;
-	Addr()	Addr;
-	Interface()	interface {};
-
+	Value;
 	Get()	bool;
 	Set(bool);
 }
@@ -580,12 +491,7 @@
 // -- Pointer
 
 type PtrValue interface {
-	// TODO: Value;
-	Kind()	int;
-	Type()	Type;
-	Addr()	Addr;
-	Interface()	interface {};
-
+	Value;
 	Sub()	Value;
 	Get()	Addr;
 	SetSub(Value);
@@ -621,12 +527,7 @@
 // Slices and arrays are represented by the same interface.
 
 type ArrayValue interface {
-	// TODO: Value;
-	Kind()	int;
-	Type()	Type;
-	Addr()	Addr;
-	Interface()	interface {};
-
+	Value;
 	IsSlice()	bool;
 	Len()	int;
 	Cap() int;
@@ -759,12 +660,7 @@
 // -- Map	TODO: finish and test
 
 type MapValue interface {
-	// TODO: Value;
-	Kind()	int;
-	Type()	Type;
-	Addr()	Addr;
-	Interface()	interface {};
-
+	Value;
 	Len()	int;
 	Elem(key Value)	Value;
 }
@@ -789,11 +685,7 @@
 // -- Chan
 
 type ChanValue interface {
-	// TODO: Value;
-	Kind()	int;
-	Type()	Type;
-	Addr()	Addr;
-	Interface()	interface {};
+	Value;
 }
 
 type chanValueStruct struct {
@@ -807,12 +699,7 @@
 // -- Struct
 
 type StructValue interface {
-	// TODO: Value;
-	Kind()	int;
-	Type()	Type;
-	Addr()	Addr;
-	Interface()	interface {};
-
+	Value;
 	Len()	int;
 	Field(i int)	Value;
 }
@@ -846,12 +733,7 @@
 // -- Interface
 
 type InterfaceValue interface {
-	// TODO: Value;
-	Kind()	int;
-	Type()	Type;
-	Addr()	Addr;
-	Interface()	interface {};
-
+	Value;
 	Get()	interface {};
 }
 
@@ -870,11 +752,7 @@
 // -- Func
 
 type FuncValue interface {
-	// TODO: Value;
-	Kind()	int;
-	Type()	Type;
-	Addr()	Addr;
-	Interface()	interface {};
+	Value;
 }
 
 type funcValueStruct struct {