Add support for the basic type "bool".

R=r
DELTA=51  (51 added, 0 deleted, 0 changed)
OCL=18283
CL=18290
diff --git a/src/lib/reflect/cast_amd64.s b/src/lib/reflect/cast_amd64.s
index ae04b8b..fe7de54 100644
--- a/src/lib/reflect/cast_amd64.s
+++ b/src/lib/reflect/cast_amd64.s
@@ -161,3 +161,13 @@
 	MOVQ	AX, 16(SP)
 	RET
 
+TEXT reflect·AddrToPtrBool(SB),7,$-8
+	MOVQ	8(SP), AX
+	MOVQ	AX, 16(SP)
+	RET
+
+TEXT reflect·PtrBoolToAddr(SB),7,$-8
+	MOVQ	8(SP), AX
+	MOVQ	AX, 16(SP)
+	RET
+
diff --git a/src/lib/reflect/gencast.sh b/src/lib/reflect/gencast.sh
index d33bc11..f3b73f9 100755
--- a/src/lib/reflect/gencast.sh
+++ b/src/lib/reflect/gencast.sh
@@ -36,4 +36,5 @@
 Float64
 Float80
 String
+Bool
 !
diff --git a/src/lib/reflect/test.go b/src/lib/reflect/test.go
index 9ec22d1..864220d 100644
--- a/src/lib/reflect/test.go
+++ b/src/lib/reflect/test.go
@@ -77,6 +77,8 @@
 		v.(reflect.Float64Value).Put(64.0);
 	case reflect.StringKind:
 		v.(reflect.StringValue).Put("stringy cheese");
+	case reflect.BoolKind:
+		v.(reflect.BoolValue).Put(true);
 	}
 	assert(reflect.ValueToString(v), t);
 }
@@ -132,6 +134,7 @@
 	valuedump("float32", "+3.200000e+01");
 	valuedump("float64", "+6.400000e+01");
 	valuedump("string", "stringy cheese");
+	valuedump("bool", "true");
 	valuedump("*int8", "*int8(0)");
 	valuedump("**int8", "**int8(0)");
 	valuedump("[5]int32", "[5]int32{0, 0, 0, 0, 0}");
diff --git a/src/lib/reflect/tostring.go b/src/lib/reflect/tostring.go
index 963ab0f..f35cade 100644
--- a/src/lib/reflect/tostring.go
+++ b/src/lib/reflect/tostring.go
@@ -162,6 +162,12 @@
 		return "float80";
 	case StringKind:
 		return val.(StringValue).Get();
+	case BoolKind:
+		if val.(BoolValue).Get() {
+			return "true"
+		} else {
+			return "false"
+		}
 	case PtrKind:
 		v := val.(PtrValue);
 		return TypeToString(typ, false) + "(" + integer(int64(v.Get())) + ")";
diff --git a/src/lib/reflect/type.go b/src/lib/reflect/type.go
index 3e51791..d4bc263 100644
--- a/src/lib/reflect/type.go
+++ b/src/lib/reflect/type.go
@@ -16,6 +16,7 @@
 export const (
 	MissingKind = iota;
 	ArrayKind;
+	BoolKind;
 	ChanKind;
 	FloatKind;
 	Float32Kind;
@@ -82,6 +83,7 @@
 // Prebuilt basic types
 export var (
 	Missing = NewBasicType(MissingString, MissingKind, 1);
+	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
 	Int8 = NewBasicType("int8", Int8Kind, 1);
 	Int16 = NewBasicType("int16", Int16Kind, 2);
@@ -409,6 +411,7 @@
 	types["float64"] = &Float64;
 	types["float80"] = &Float80;
 	types["string"] = &String;
+	types["bool"] = &Bool;
 
 	// Basics get prebuilt stubs
 	MissingStub = NewStubType(MissingString, Missing);
@@ -428,6 +431,7 @@
 	basicstub["float64"] = NewStubType("float64", Float64);
 	basicstub["float80"] = NewStubType("float80", Float80);
 	basicstub["string"] = NewStubType("string", String);
+	basicstub["bool"] = NewStubType("bool", Bool);
 
 	Unlock();
 }
diff --git a/src/lib/reflect/value.go b/src/lib/reflect/value.go
index 9f3e4ab..554da2d 100644
--- a/src/lib/reflect/value.go
+++ b/src/lib/reflect/value.go
@@ -58,6 +58,7 @@
 func AddrToPtrFloat64(Addr) *float64
 func AddrToPtrFloat80(Addr) *float80
 func AddrToPtrString(Addr) *string
+func AddrToPtrBool(Addr) *bool
 
 // -- Int
 
@@ -438,6 +439,31 @@
 	*AddrToPtrString(v.addr) = s
 }
 
+// -- Bool
+
+export type BoolValue interface {
+	Kind()	int;
+	Get()	bool;
+	Put(bool);
+	Type()	Type;
+}
+
+type BoolValueStruct struct {
+	CommonV
+}
+
+func BoolCreator(typ Type, addr Addr) Value {
+	return &BoolValueStruct{ CommonV{BoolKind, typ, addr} }
+}
+
+func (v *BoolValueStruct) Get() bool {
+	return *AddrToPtrBool(v.addr)
+}
+
+func (v *BoolValueStruct) Put(b bool) {
+	*AddrToPtrBool(v.addr) = b
+}
+
 // -- Pointer
 
 export type PtrValue interface {
@@ -665,6 +691,7 @@
 	creator[Float64Kind] = &Float64Creator;
 	creator[Float80Kind] = &Float80Creator;
 	creator[StringKind] = &StringCreator;
+	creator[BoolKind] = &BoolCreator;
 	creator[PtrKind] = &PtrCreator;
 	creator[ArrayKind] = &ArrayCreator;
 	creator[MapKind] = &MapCreator;