interfacesize = unsafe.Sizeof(x.xinterface);
)
-var missingString = "$missing$" // syntactic name for undefined type names
-var dotDotDotString = "..."
+const missingString = "$missing$" // syntactic name for undefined type names
+const dotDotDotString = "..."
// Type is the generic interface to reflection types. Once its Kind is known,
// such as ArrayKind, the Type can be narrowed to the appropriate, more
switch {
case c.typ.Kind() == InterfaceKind:
panic("not reached"); // InterfaceValue overrides this method
- case c.typ.Size() > 8: // TODO(rsc): how do we know it is 8?
+ case c.typ.Size() > unsafe.Sizeof(uintptr(0)):
i = unsafe.Unreflect(uint64(uintptr(c.addr)), c.typ.String(), true);
default:
if uintptr(c.addr) == 0 {
func newValueAddr(typ Type, addr Addr) Value {
c, ok := creator[typ.Kind()];
if !ok {
- panicln("no creator for type" , typ.Kind());
+ panicln("no creator for type" , typ.String());
}
return c(typ, addr);
}
typ, ok := typecache[typestring];
if !ok {
typ = ParseTypeString("", typestring);
+ if typ.Kind() == MissingKind {
+ // This can not happen: unsafe.Reflect should only
+ // ever tell us the names of types that exist.
+ // Of course it does happen, and when it does
+ // it is more helpful to catch it in action here than
+ // to see $missing$ in a later print.
+ panicln("missing type for", typestring);
+ }
typecache[typestring] = typ;
}
-
var ap Addr;
if indir {
// Content of interface is large and didn't
// save AX, jmp to lesstack to switch back
TEXT retfromnewstack(SB),7,$0
MOVL 4(FS), BX // m
- MOVL AX, 8(BX) // save AX in m->cret
+ MOVL AX, 12(BX) // save AX in m->cret
JMP lessstack(SB)
// gogo, returning 2nd arg instead of 1
} else {
printf ("not found in table\n");
}
-
+
Example iteration over the elements of *h:
char **data;
struct hash_iter it;
struct hash_subtable; /* opaque */
struct hash_entry; /* opaque */
-typedef uint64 uintptr_t;
+typedef uintptr uintptr_t;
typedef uintptr_t hash_hash_t;
struct hash_iter {
};
/* Return a hashtable h 2**init_power empty entries, each with
- "datasize" data bytes.
+ "datasize" data bytes.
(*data_hash)(a) should return the hash value of data element *a.
(*data_eq)(a,b) should return whether the data at "a" and the data at "b"
are equal.
FLUSH(&ok);
}
-static uint64
+static uintptr
ifacehash1(void *data, Sigt *sigt)
{
int32 alg, wid;
return algarray[alg].hash(wid, data);
}
-uint64
+uintptr
ifacehash(Iface a)
{
if(a.type == nil)
return ifacehash1(a.data, a.type->sigt);
}
-uint64
+uintptr
efacehash(Eface a)
{
return ifacehash1(a.data, a.type);
}
// setup for mark sweep
- mlookup(v, nil, nil, &ref);
+ if(!mlookup(v, nil, nil, &ref)) {
+ printf("malloc %D; mlookup failed\n", (uint64)size);
+ throw("malloc mlookup");
+ }
*ref = RefNone;
m->mallocing = 0;
throw("malloc/free - deadlock");
m->mallocing = 1;
- mlookup(v, nil, nil, &ref);
+ if(!mlookup(v, nil, nil, &ref))
+ throw("free mlookup");
*ref = RefFree;
// Find size class for v.
return v;
}
v = malloc(n);
- mlookup(v, nil, nil, &ref);
+ if(!mlookup(v, nil, nil, &ref))
+ throw("stackalloc mlookup");
*ref = RefStack;
return v;
}
* map and chan helpers for
* dealing with unknown types
*/
-static uint64
+static uintptr
memhash(uint32 s, void *a)
{
byte *b;
- uint64 hash;
+ uintptr hash;
b = a;
- hash = 33054211828000289ULL;
+ if(sizeof(hash) == 4)
+ hash = 2860486313U;
+ else
+ hash = 33054211828000289ULL;
while(s > 0) {
- hash = (hash ^ *b) * 23344194077549503ULL;
+ if(sizeof(hash) == 4)
+ hash = (hash ^ *b) * 3267000013UL;
+ else
+ hash = (hash ^ *b) * 23344194077549503ULL;
b++;
s--;
}
ba[i] = bb[i];
}
-static uint64
+static uintptr
strhash(uint32 s, String *a)
{
USED(s);
sys·printstring(*a);
}
-static uint64
+static uintptr
interhash(uint32 s, Iface *a)
{
USED(s);
return ifaceeq(*a, *b);
}
-static uint64
+static uintptr
nilinterhash(uint32 s, Eface *a)
{
USED(s);
return efaceeq(*a, *b);
}
-uint64
+uintptr
nohash(uint32 s, void *a)
{
USED(s);
};
struct Alg
{
- uint64 (*hash)(uint32, void*);
+ uintptr (*hash)(uint32, void*);
uint32 (*equal)(uint32, void*, void*);
void (*print)(uint32, void*);
void (*copy)(uint32, void*, void*);
void mallocinit(void);
bool ifaceeq(Iface, Iface);
bool efaceeq(Eface, Eface);
-uint64 ifacehash(Iface);
-uint64 efacehash(Eface);
-uint64 nohash(uint32, void*);
+uintptr ifacehash(Iface);
+uintptr efacehash(Eface);
+uintptr nohash(uint32, void*);
uint32 noequal(uint32, void*, void*);
void* malloc(uintptr size);
void* mallocgc(uintptr size);