From b9ccd077dc478fca2e8bd00633c1a60a54f342d8 Mon Sep 17 00:00:00 2001 From: Russ Cox Date: Mon, 5 Dec 2011 09:40:22 -0500 Subject: runtime: prep for type-specific algorithms Equality on structs will require arbitrary code for type equality, so change algorithm in type data from uint8 to table pointer. In the process, trim top-level map structure from 104/80 bytes (64-bit/32-bit) to 24/12. Equality on structs will require being able to call code generated by the Go compiler, and C code has no way to access Go return values, so change the hash and equal algorithm functions to take a pointer to a result instead of returning the result. R=ken CC=golang-dev https://golang.org/cl/5453043 --- src/pkg/runtime/runtime.c | 332 ---------------------------------------------- 1 file changed, 332 deletions(-) (limited to 'src/pkg/runtime/runtime.c') diff --git a/src/pkg/runtime/runtime.c b/src/pkg/runtime/runtime.c index a609a26f80..ed46150ea5 100644 --- a/src/pkg/runtime/runtime.c +++ b/src/pkg/runtime/runtime.c @@ -322,338 +322,6 @@ runtime·check(void) runtime·initsig(0); } -/* - * map and chan helpers for - * dealing with unknown types - */ -static uintptr -memhash(uint32 s, void *a) -{ - byte *b; - uintptr hash; - - b = a; - if(sizeof(hash) == 4) - hash = 2860486313U; - else - hash = 33054211828000289ULL; - while(s > 0) { - if(sizeof(hash) == 4) - hash = (hash ^ *b) * 3267000013UL; - else - hash = (hash ^ *b) * 23344194077549503ULL; - b++; - s--; - } - return hash; -} - -static uint32 -memequal(uint32 s, void *a, void *b) -{ - byte *ba, *bb, *aend; - - if(a == b) - return 1; - ba = a; - bb = b; - aend = ba+s; - while(ba != aend) { - if(*ba != *bb) - return 0; - ba++; - bb++; - } - return 1; -} - -static void -memprint(uint32 s, void *a) -{ - uint64 v; - - v = 0xbadb00b; - switch(s) { - case 1: - v = *(uint8*)a; - break; - case 2: - v = *(uint16*)a; - break; - case 4: - v = *(uint32*)a; - break; - case 8: - v = *(uint64*)a; - break; - } - runtime·printint(v); -} - -static void -memcopy(uint32 s, void *a, void *b) -{ - if(b == nil) { - runtime·memclr(a,s); - return; - } - runtime·memmove(a,b,s); -} - -static uint32 -memequal8(uint32 s, uint8 *a, uint8 *b) -{ - USED(s); - return *a == *b; -} - -static void -memcopy8(uint32 s, uint8 *a, uint8 *b) -{ - USED(s); - if(b == nil) { - *a = 0; - return; - } - *a = *b; -} - -static uint32 -memequal16(uint32 s, uint16 *a, uint16 *b) -{ - USED(s); - return *a == *b; -} - -static void -memcopy16(uint32 s, uint16 *a, uint16 *b) -{ - USED(s); - if(b == nil) { - *a = 0; - return; - } - *a = *b; -} - -static uint32 -memequal32(uint32 s, uint32 *a, uint32 *b) -{ - USED(s); - return *a == *b; -} - -static void -memcopy32(uint32 s, uint32 *a, uint32 *b) -{ - USED(s); - if(b == nil) { - *a = 0; - return; - } - *a = *b; -} - -static uint32 -memequal64(uint32 s, uint64 *a, uint64 *b) -{ - USED(s); - return *a == *b; -} - -static void -memcopy64(uint32 s, uint64 *a, uint64 *b) -{ - USED(s); - if(b == nil) { - *a = 0; - return; - } - *a = *b; -} - -static uint32 -memequal128(uint32 s, uint64 *a, uint64 *b) -{ - USED(s); - return a[0] == b[0] && a[1] == b[1]; -} - -static void -memcopy128(uint32 s, uint64 *a, uint64 *b) -{ - USED(s); - if(b == nil) { - a[0] = 0; - a[1] = 0; - return; - } - a[0] = b[0]; - a[1] = b[1]; -} - -static void -slicecopy(uint32 s, Slice *a, Slice *b) -{ - USED(s); - if(b == nil) { - a->array = 0; - a->len = 0; - a->cap = 0; - return; - } - a->array = b->array; - a->len = b->len; - a->cap = b->cap; -} - -static uintptr -strhash(uint32 s, String *a) -{ - USED(s); - return memhash((*a).len, (*a).str); -} - -static uint32 -strequal(uint32 s, String *a, String *b) -{ - int32 alen; - - USED(s); - alen = a->len; - if(alen != b->len) - return false; - return memequal(alen, a->str, b->str); -} - -static void -strprint(uint32 s, String *a) -{ - USED(s); - runtime·printstring(*a); -} - -static void -strcopy(uint32 s, String *a, String *b) -{ - USED(s); - if(b == nil) { - a->str = 0; - a->len = 0; - return; - } - a->str = b->str; - a->len = b->len; -} - -static uintptr -interhash(uint32 s, Iface *a) -{ - USED(s); - return runtime·ifacehash(*a); -} - -static void -interprint(uint32 s, Iface *a) -{ - USED(s); - runtime·printiface(*a); -} - -static uint32 -interequal(uint32 s, Iface *a, Iface *b) -{ - USED(s); - return runtime·ifaceeq_c(*a, *b); -} - -static void -intercopy(uint32 s, Iface *a, Iface *b) -{ - USED(s); - if(b == nil) { - a->tab = 0; - a->data = 0; - return; - } - a->tab = b->tab; - a->data = b->data; -} - -static uintptr -nilinterhash(uint32 s, Eface *a) -{ - USED(s); - return runtime·efacehash(*a); -} - -static void -nilinterprint(uint32 s, Eface *a) -{ - USED(s); - runtime·printeface(*a); -} - -static uint32 -nilinterequal(uint32 s, Eface *a, Eface *b) -{ - USED(s); - return runtime·efaceeq_c(*a, *b); -} - -static void -nilintercopy(uint32 s, Eface *a, Eface *b) -{ - USED(s); - if(b == nil) { - a->type = 0; - a->data = 0; - return; - } - a->type = b->type; - a->data = b->data; -} - -uintptr -runtime·nohash(uint32 s, void *a) -{ - USED(s); - USED(a); - runtime·panicstring("hash of unhashable type"); - return 0; -} - -uint32 -runtime·noequal(uint32 s, void *a, void *b) -{ - USED(s); - USED(a); - USED(b); - runtime·panicstring("comparing uncomparable types"); - return 0; -} - -Alg -runtime·algarray[] = -{ -[AMEM] { memhash, memequal, memprint, memcopy }, -[ANOEQ] { runtime·nohash, runtime·noequal, memprint, memcopy }, -[ASTRING] { (void*)strhash, (void*)strequal, (void*)strprint, (void*)strcopy }, -[AINTER] { (void*)interhash, (void*)interequal, (void*)interprint, (void*)intercopy }, -[ANILINTER] { (void*)nilinterhash, (void*)nilinterequal, (void*)nilinterprint, (void*)nilintercopy }, -[ASLICE] { (void*)runtime·nohash, (void*)runtime·noequal, (void*)memprint, (void*)slicecopy }, -[AMEM8] { memhash, (void*)memequal8, memprint, (void*)memcopy8 }, -[AMEM16] { memhash, (void*)memequal16, memprint, (void*)memcopy16 }, -[AMEM32] { memhash, (void*)memequal32, memprint, (void*)memcopy32 }, -[AMEM64] { memhash, (void*)memequal64, memprint, (void*)memcopy64 }, -[AMEM128] { memhash, (void*)memequal128, memprint, (void*)memcopy128 }, -[ANOEQ8] { runtime·nohash, runtime·noequal, memprint, (void*)memcopy8 }, -[ANOEQ16] { runtime·nohash, runtime·noequal, memprint, (void*)memcopy16 }, -[ANOEQ32] { runtime·nohash, runtime·noequal, memprint, (void*)memcopy32 }, -[ANOEQ64] { runtime·nohash, runtime·noequal, memprint, (void*)memcopy64 }, -[ANOEQ128] { runtime·nohash, runtime·noequal, memprint, (void*)memcopy128 }, -}; - void runtime·Caller(int32 skip, uintptr retpc, String retfile, int32 retline, bool retbool) { -- cgit v1.3