add method Value() Value to InterfaceValue.
use Value() in print to print underlying value
from interface.
before:
package main
import "fmt"
func main() {
x := []interface{} {1, "hello", 2.5};
fmt.Println(x[0], x[1], x[2], x);
}
1 hello 2.5 [<non-nil interface> <non-nil interface> <non-nil interface>]
after:
1 hello 2.5 [1 hello 2.5]
R=r
DELTA=44 (22 added, 16 deleted, 6 changed)
OCL=27139
CL=27141
diff --git a/src/lib/reflect/all_test.go b/src/lib/reflect/all_test.go
index 166b207..e3f6b9b 100644
--- a/src/lib/reflect/all_test.go
+++ b/src/lib/reflect/all_test.go
@@ -301,6 +301,16 @@
assert(v3.Type().String(), "float");
}
+func TestInterfaceValue(t *testing.T) {
+ var inter struct { e interface{ } };
+ inter.e = 123.456;
+ v1 := reflect.NewValue(&inter);
+ v2 := v1.(reflect.PtrValue).Sub().(reflect.StructValue).Field(0);
+ assert(v2.Type().String(), "interface { }");
+ v3 := v2.(reflect.InterfaceValue).Value();
+ assert(v3.Type().String(), "float");
+}
+
func TestCopyArray(t *testing.T) {
a := []int{ 1, 2, 3, 4, 10, 9, 8, 7 };
b := []int{ 11, 22, 33, 44, 1010, 99, 88, 77, 66, 55, 44 };
diff --git a/src/lib/reflect/value.go b/src/lib/reflect/value.go
index 7bd6f3b..ad0cd46 100644
--- a/src/lib/reflect/value.go
+++ b/src/lib/reflect/value.go
@@ -34,6 +34,8 @@
Interface() interface {};
}
+func NewValue(e interface{}) Value;
+
// commonValue fields and functionality for all values
type commonValue struct {
@@ -744,6 +746,7 @@
type InterfaceValue interface {
Value;
Get() interface {}; // Get the underlying interface{} value.
+ Value() Value;
}
type interfaceValueStruct struct {
@@ -754,6 +757,14 @@
return *(*interface{})(v.addr)
}
+func (v *interfaceValueStruct) Value() Value {
+ i := v.Get();
+ if i == nil {
+ return nil;
+ }
+ return NewValue(i);
+}
+
func interfaceCreator(typ Type, addr Addr) Value {
return &interfaceValueStruct{ commonValue{InterfaceKind, typ, addr} }
}