check for type equality in deepequal
R=r,dnadasi
DELTA=9 (8 added, 0 deleted, 1 changed)
OCL=27473
CL=27486
diff --git a/src/lib/reflect/all_test.go b/src/lib/reflect/all_test.go
index 514fe703..080a360 100644
--- a/src/lib/reflect/all_test.go
+++ b/src/lib/reflect/all_test.go
@@ -310,7 +310,7 @@
assert(v2.Type().String(), "interface { }");
v3 := v2.(reflect.InterfaceValue).Value();
assert(v3.Type().String(), "float");
-
+
i3 := v2.Interface();
if f, ok := i3.(float); !ok {
a, typ, c := sys.Reflect(i3);
@@ -387,6 +387,8 @@
y float32
}
+type NotBasic Basic
+
type Recursive struct {
x int;
r *Recursive
@@ -429,6 +431,7 @@
DeepEqualTest{ 0.5, "hello", false },
DeepEqualTest{ []int{ 1, 2, 3 }, [3]int{ 1, 2, 3 }, false },
DeepEqualTest{ &[3]interface{} { 1, 2, 4 }, &[3]interface{} { 1, 2, "s" }, false },
+ DeepEqualTest{ Basic{ 1, 0.5 }, NotBasic{ 1, 0.5 }, false },
}
func TestDeepEqual(t *testing.T) {
diff --git a/src/lib/reflect/deepequal.go b/src/lib/reflect/deepequal.go
index a9acf73..57b5248 100644
--- a/src/lib/reflect/deepequal.go
+++ b/src/lib/reflect/deepequal.go
@@ -74,5 +74,10 @@
// handles recursive types. Until reflection supports maps, maps are equal iff
// they are identical.
func DeepEqual(a1, a2 interface{}) bool {
- return deepValueEqual(NewValue(a1), NewValue(a2), make(map[Addr]Addr));
+ v1 := NewValue(a1);
+ v2 := NewValue(a2);
+ if !equalType(v1.Type(), v2.Type()) {
+ return false;
+ }
+ return deepValueEqual(v1, v2, make(map[Addr]Addr));
}