]> Cypherpunks repositories - gostls13.git/commitdiff
new interface error messages
authorRuss Cox <rsc@golang.org>
Wed, 5 Nov 2008 21:05:01 +0000 (13:05 -0800)
committerRuss Cox <rsc@golang.org>
Wed, 5 Nov 2008 21:05:01 +0000 (13:05 -0800)
package main
func main() {
var i interface { } = 1;
a := i.(*[]byte);
}

interface { } is int, not *[]uint8
throw: interface conversion

package main
func main() {
var i interface { };
a := i.(*[]byte);
}

interface is nil, not *[]uint8
throw: interface conversion

package main
func main() {
i := sys.unreflect(0, "*bogus");
a := i.(*[]byte);
}

interface { } is *bogus, not *[]uint8
throw: interface conversion

R=r
DELTA=30  (24 added, 2 deleted, 4 changed)
OCL=18548
CL=18565

src/runtime/iface.c

index dba4c03933f325034e515714c8930076a09924cf..4a394fc888bb26df799239241865fd50820d50e8 100644 (file)
@@ -122,9 +122,17 @@ hashmap(Sigi *si, Sigt *st, int32 canfail)
        for(m=hash[h]; m!=nil; m=m->link) {
                if(m->sigi == si && m->sigt == st) {
                        if(m->bad) {
-                               if(!canfail)
-                                       throw("bad hashmap");
                                m = nil;
+                               if(!canfail) {
+                                       // this can only happen if the conversion
+                                       // was already done once using the , ok form
+                                       // and we have a cached negative result.
+                                       // the cached result doesn't record which
+                                       // interface function was missing, so jump
+                                       // down to the interface check, which will
+                                       // give a better error.
+                                       goto throw;
+                               }
                        }
                        // prints("old hashmap\n");
                        return m;
@@ -136,6 +144,7 @@ hashmap(Sigi *si, Sigt *st, int32 canfail)
        m->sigi = si;
        m->sigt = st;
 
+throw:
        nt = 1;
        for(ni=1;; ni++) {      // ni=1: skip first word
                iname = si[ni].name;
@@ -222,10 +231,23 @@ sys·ifaceI2T(Sigt *st, Map *im, void *it, void *ret)
                prints("\n");
        }
 
-       if(im == nil)
-               throw("ifaceI2T: nil map");
-       if(im->sigt != st)
-               throw("ifaceI2T: wrong type");
+       if(im == nil) {
+               prints("interface is nil, not ");
+               prints((int8*)st[0].name);
+               prints("\n");
+               throw("interface conversion");
+       }
+
+       if(im->sigt != st) {
+               prints((int8*)im->sigi[0].name);
+               prints(" is ");
+               prints((int8*)im->sigt[0].name);
+               prints(", not ");
+               prints((int8*)st[0].name);
+               prints("\n");
+               throw("interface conversion");
+       }
+
        ret = it;
        if(debug) {
                prints("I2T ret=");