From 64627b04fbc326819296823d22e5a4315d090e67 Mon Sep 17 00:00:00 2001 From: Russ Cox Date: Wed, 15 Apr 2009 00:55:58 -0700 Subject: [PATCH] check for type equality in deepequal R=r,dnadasi DELTA=9 (8 added, 0 deleted, 1 changed) OCL=27473 CL=27486 --- src/lib/reflect/all_test.go | 5 ++++- src/lib/reflect/deepequal.go | 7 ++++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/lib/reflect/all_test.go b/src/lib/reflect/all_test.go index 514fe7038c..080a360a34 100644 --- a/src/lib/reflect/all_test.go +++ b/src/lib/reflect/all_test.go @@ -310,7 +310,7 @@ func TestInterfaceValue(t *testing.T) { 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 @@ type Basic struct { y float32 } +type NotBasic Basic + type Recursive struct { x int; r *Recursive @@ -429,6 +431,7 @@ var deepEqualTests = []DeepEqualTest { 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 a9acf737ac..57b52485f7 100644 --- a/src/lib/reflect/deepequal.go +++ b/src/lib/reflect/deepequal.go @@ -74,5 +74,10 @@ func deepValueEqual(v1, v2 Value, visited map[Addr]Addr) bool { // 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)); } -- 2.48.1