]> Cypherpunks repositories - gostls13.git/commitdiff
Add support for the basic type "bool".
authorIan Lance Taylor <iant@golang.org>
Fri, 31 Oct 2008 23:34:47 +0000 (16:34 -0700)
committerIan Lance Taylor <iant@golang.org>
Fri, 31 Oct 2008 23:34:47 +0000 (16:34 -0700)
R=r
DELTA=51  (51 added, 0 deleted, 0 changed)
OCL=18283
CL=18290

src/lib/reflect/cast_amd64.s
src/lib/reflect/gencast.sh
src/lib/reflect/test.go
src/lib/reflect/tostring.go
src/lib/reflect/type.go
src/lib/reflect/value.go

index ae04b8b32e8d35c86164c18a3f63cb63272df4b0..fe7de5470fd0ccf0d9456e0026fca6b6893161e0 100644 (file)
@@ -161,3 +161,13 @@ TEXT reflect·PtrStringToAddr(SB),7,$-8
        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
+
index d33bc11fb189666e589ea5ee5f68c17e77840d9d..f3b73f939ebe7930c50669396fef83bfa40e2b82 100755 (executable)
@@ -36,4 +36,5 @@ Float32
 Float64
 Float80
 String
+Bool
 !
index 9ec22d1ac4478d89652c5257d6513a414ef29cf6..864220d4e2fc8173a0d68568e114178e979e6b70 100644 (file)
@@ -77,6 +77,8 @@ func valuedump(s, t string) {
                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 @@ func main() {
        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}");
index 963ab0fbb3e70195122a6952dbd1e838de54e0c1..f35caded97d0a164d48455c650dd5bfabe0592a0 100644 (file)
@@ -162,6 +162,12 @@ func ValueToString(val Value) string {
                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())) + ")";
index 3e5179190cd172cc52f526a97f87ab711e22c0e7..d4bc263870804a4a815b8dddc4e93f943162bfcd 100644 (file)
@@ -16,6 +16,7 @@ export func typestrings() string      // implemented in C; declared here
 export const (
        MissingKind = iota;
        ArrayKind;
+       BoolKind;
        ChanKind;
        FloatKind;
        Float32Kind;
@@ -82,6 +83,7 @@ func NewBasicType(name string, kind int, size uint64) Type {
 // 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 @@ func init() {
        types["float64"] = &Float64;
        types["float80"] = &Float80;
        types["string"] = &String;
+       types["bool"] = &Bool;
 
        // Basics get prebuilt stubs
        MissingStub = NewStubType(MissingString, Missing);
@@ -428,6 +431,7 @@ func init() {
        basicstub["float64"] = NewStubType("float64", Float64);
        basicstub["float80"] = NewStubType("float80", Float80);
        basicstub["string"] = NewStubType("string", String);
+       basicstub["bool"] = NewStubType("bool", Bool);
 
        Unlock();
 }
index 9f3e4ab7df6771ba20d177e5a90c1326147e36ae..554da2d53e74d9624dd461806942ee51001255a1 100644 (file)
@@ -58,6 +58,7 @@ func AddrToPtrFloat32(Addr) *float32
 func AddrToPtrFloat64(Addr) *float64
 func AddrToPtrFloat80(Addr) *float80
 func AddrToPtrString(Addr) *string
+func AddrToPtrBool(Addr) *bool
 
 // -- Int
 
@@ -438,6 +439,31 @@ func (v *StringValueStruct) Put(s string) {
        *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 @@ func init() {
        creator[Float64Kind] = &Float64Creator;
        creator[Float80Kind] = &Float80Creator;
        creator[StringKind] = &StringCreator;
+       creator[BoolKind] = &BoolCreator;
        creator[PtrKind] = &PtrCreator;
        creator[ArrayKind] = &ArrayCreator;
        creator[MapKind] = &MapCreator;