aboutsummaryrefslogtreecommitdiff
path: root/src/runtime/runtime.c
diff options
context:
space:
mode:
authorKen Thompson <ken@golang.org>2008-07-13 14:29:46 -0700
committerKen Thompson <ken@golang.org>2008-07-13 14:29:46 -0700
commit594175d0b5e1c183b0d1642dabbc85437f07407b (patch)
tree4ec40b6342c5afa0bdd3cf4f48033e13195ab1e3 /src/runtime/runtime.c
parent3f982aeaf6c5809d2ec61b07944a72ac2f6aa5a9 (diff)
downloadgo-594175d0b5e1c183b0d1642dabbc85437f07407b.tar.xz
chan
SVN=126958
Diffstat (limited to 'src/runtime/runtime.c')
-rw-r--r--src/runtime/runtime.c147
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 },
+};