From e2e8aa0ee1d56d77f1cb0f8ad0c4cf8a785b5abf Mon Sep 17 00:00:00 2001 From: Ken Thompson Date: Tue, 14 Oct 2008 16:10:44 -0700 Subject: [PATCH] interface equality (strings specifically) R=r OCL=17134 CL=17134 --- src/cmd/gc/walk.c | 2 -- src/runtime/iface.c | 21 +++++++++++---------- 2 files changed, 11 insertions(+), 12 deletions(-) diff --git a/src/cmd/gc/walk.c b/src/cmd/gc/walk.c index 47a3d10cb6..761a723dc8 100644 --- a/src/cmd/gc/walk.c +++ b/src/cmd/gc/walk.c @@ -2572,9 +2572,7 @@ ifaceop(Type *tl, Node *n, int op) if(op == ONE) r = nod(ONOT, r, N); - dump("bef", r); walktype(r, Erv); - dump("aft", r); return r; } diff --git a/src/runtime/iface.c b/src/runtime/iface.c index b303e459e1..5ed40ce539 100644 --- a/src/runtime/iface.c +++ b/src/runtime/iface.c @@ -13,8 +13,8 @@ typedef struct Map Map; struct Sigt { byte* name; - uint32 hash; - uint32 offset; // offset of substruct + uint32 hash; // hash of type // first is alg + uint32 offset; // offset of substruct // first is width void (*fun)(void); }; @@ -265,6 +265,8 @@ sys·ifaceI2I(Sigi *si, Map *im, void *it, Map *retim, void *retit) void sys·ifaceeq(Map *im1, void *it1, Map *im2, void *it2, byte ret) { + int32 alg, wid; + if(debug) { prints("Ieq i1="); printiface(im1, it1); @@ -284,18 +286,17 @@ sys·ifaceeq(Map *im1, void *it1, Map *im2, void *it2, byte ret) if(im2 == nil) goto no; - // values - if(it1 != it2) + // value + alg = im1->sigt->hash; + if(alg != im2->sigt->hash) goto no; - // types - if(im1 == im2) - goto yes; - if(im1->sigt == im2->sigt) - goto yes; - if(im1->sigt->hash != im2->sigt->hash) + wid = im1->sigt->offset; + if(wid != im2->sigt->offset) goto no; + if(!algarray[alg].equal(wid, &it1, &it2)) + goto no; yes: ret = true; -- 2.48.1