diff options
| author | Ken Thompson <ken@golang.org> | 2008-07-13 14:29:46 -0700 |
|---|---|---|
| committer | Ken Thompson <ken@golang.org> | 2008-07-13 14:29:46 -0700 |
| commit | 594175d0b5e1c183b0d1642dabbc85437f07407b (patch) | |
| tree | 4ec40b6342c5afa0bdd3cf4f48033e13195ab1e3 /src/runtime/runtime.c | |
| parent | 3f982aeaf6c5809d2ec61b07944a72ac2f6aa5a9 (diff) | |
| download | go-594175d0b5e1c183b0d1642dabbc85437f07407b.tar.xz | |
chan
SVN=126958
Diffstat (limited to 'src/runtime/runtime.c')
| -rw-r--r-- | src/runtime/runtime.c | 147 |
1 files changed, 145 insertions, 2 deletions
diff --git a/src/runtime/runtime.c b/src/runtime/runtime.c index f8dfa954cc..bc6c0ccb9d 100644 --- a/src/runtime/runtime.c +++ b/src/runtime/runtime.c @@ -64,6 +64,17 @@ mcpy(byte *t, byte *f, uint32 n) } } +uint32 +rnd(uint32 n, uint32 m) +{ + uint32 r; + + r = n % m; + if(r) + n += m-r; + return n; +} + static byte* brk(uint32 n) { @@ -81,7 +92,7 @@ mal(uint32 n) byte* v; // round to keep everything 64-bit aligned - n = (n+7) & ~7; + n = rnd(n, 8); nmal += n; // do we have enough in contiguous hunk @@ -469,7 +480,6 @@ static uint8** argv; static int32 envc; static uint8** envv; - void args(int32 c, uint8 **v) { @@ -797,3 +807,136 @@ sys·morestack(uint64 u) *(int32*)234 = 123; } + +/* + * map and chan helpers for + * dealing with unknown types + */ + +static uint64 +memhash(uint32 s, void *a) +{ + prints("memhash\n"); + return 0x12345; +} + +static uint32 +memequal(uint32 s, void *a, void *b) +{ + byte *ba, *bb; + uint32 i; + + ba = a; + bb = b; + for(i=0; i<s; i++) + if(ba[i] != bb[i]) + return 0; + 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; + } + sys·printint(v); +} + +static void +memcopy(uint32 s, void *a, void *b) +{ + byte *ba, *bb; + uint32 i; + + ba = a; + bb = b; + if(bb == nil) { + for(i=0; i<s; i++) + ba[i] = 0; + return; + } + for(i=0; i<s; i++) + ba[i] = bb[i]; +} + +static uint64 +stringhash(uint32 s, string *a) +{ + prints("stringhash\n"); + return 0x12345; +} + +static uint32 +stringequal(uint32 s, string *a, string *b) +{ + return cmpstring(*a, *b) == 0; +} + +static void +stringprint(uint32 s, string *a) +{ + sys·printstring(*a); +} + +static void +stringcopy(uint32 s, string *a, string *b) +{ + if(b == nil) { + *a = nil; + return; + } + *a = *b; +} + +static uint64 +pointerhash(uint32 s, void **a) +{ + prints("pointerhash\n"); + return 0x12345; +} + +static uint32 +pointerequal(uint32 s, void **a, void **b) +{ + prints("pointerequal\n"); + return 0; +} + +static void +pointerprint(uint32 s, void **a) +{ + prints("pointerprint\n"); +} + +static void +pointercopy(uint32 s, void **a, void **b) +{ + if(b == nil) { + *a = nil; + return; + } + *a = *b; +} + +Alg +algarray[3] = +{ + { &memhash, &memequal, &memprint, &memcopy }, + { &stringhash, &stringequal, &stringprint, &stringcopy }, + { &pointerhash, &pointerequal, &pointerprint, &pointercopy }, +}; |
