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
+
Float64
Float80
String
+Bool
!
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);
}
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}");
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())) + ")";
export const (
MissingKind = iota;
ArrayKind;
+ BoolKind;
ChanKind;
FloatKind;
Float32Kind;
// 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);
types["float64"] = &Float64;
types["float80"] = &Float80;
types["string"] = &String;
+ types["bool"] = &Bool;
// Basics get prebuilt stubs
MissingStub = NewStubType(MissingString, Missing);
basicstub["float64"] = NewStubType("float64", Float64);
basicstub["float80"] = NewStubType("float80", Float80);
basicstub["string"] = NewStubType("string", String);
+ basicstub["bool"] = NewStubType("bool", Bool);
Unlock();
}
func AddrToPtrFloat64(Addr) *float64
func AddrToPtrFloat80(Addr) *float80
func AddrToPtrString(Addr) *string
+func AddrToPtrBool(Addr) *bool
// -- Int
*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 {
creator[Float64Kind] = &Float64Creator;
creator[Float80Kind] = &Float80Creator;
creator[StringKind] = &StringCreator;
+ creator[BoolKind] = &BoolCreator;
creator[PtrKind] = &PtrCreator;
creator[ArrayKind] = &ArrayCreator;
creator[MapKind] = &MapCreator;