Commit 7a0f4cac authored by Russ Cox's avatar Russ Cox

pass Type* to makechan and makemap so that

they can get the official alignment out of there
instead of guessing.

R=ken
OCL=34450
CL=34450
parent bd0c13e9
...@@ -41,7 +41,7 @@ char *sysimport = ...@@ -41,7 +41,7 @@ char *sysimport =
"func sys.efaceeq (i1 any, i2 any) (ret bool)\n" "func sys.efaceeq (i1 any, i2 any) (ret bool)\n"
"func sys.ifacethash (i1 any) (ret uint32)\n" "func sys.ifacethash (i1 any) (ret uint32)\n"
"func sys.efacethash (i1 any) (ret uint32)\n" "func sys.efacethash (i1 any) (ret uint32)\n"
"func sys.makemap (keysize int, valsize int, keyalg int, valalg int, hint int) (hmap map[any] any)\n" "func sys.makemap (key *uint8, val *uint8, hint int) (hmap map[any] any)\n"
"func sys.mapaccess1 (hmap map[any] any, key any) (val any)\n" "func sys.mapaccess1 (hmap map[any] any, key any) (val any)\n"
"func sys.mapaccess2 (hmap map[any] any, key any) (val any, pres bool)\n" "func sys.mapaccess2 (hmap map[any] any, key any) (val any, pres bool)\n"
"func sys.mapassign1 (hmap map[any] any, key any, val any)\n" "func sys.mapassign1 (hmap map[any] any, key any, val any)\n"
...@@ -50,7 +50,7 @@ char *sysimport = ...@@ -50,7 +50,7 @@ char *sysimport =
"func sys.mapiternext (hiter *any)\n" "func sys.mapiternext (hiter *any)\n"
"func sys.mapiter1 (hiter *any) (key any)\n" "func sys.mapiter1 (hiter *any) (key any)\n"
"func sys.mapiter2 (hiter *any) (key any, val any)\n" "func sys.mapiter2 (hiter *any) (key any, val any)\n"
"func sys.makechan (elemsize int, elemalg int, hint int) (hchan chan any)\n" "func sys.makechan (elem *uint8, hint int) (hchan chan any)\n"
"func sys.chanrecv1 (hchan <-chan any) (elem any)\n" "func sys.chanrecv1 (hchan <-chan any) (elem any)\n"
"func sys.chanrecv2 (hchan <-chan any) (elem any, pres bool)\n" "func sys.chanrecv2 (hchan <-chan any) (elem any, pres bool)\n"
"func sys.chansend1 (hchan chan<- any, elem any)\n" "func sys.chansend1 (hchan chan<- any, elem any)\n"
......
...@@ -51,9 +51,8 @@ func efaceeq(i1 any, i2 any) (ret bool); ...@@ -51,9 +51,8 @@ func efaceeq(i1 any, i2 any) (ret bool);
func ifacethash(i1 any) (ret uint32); func ifacethash(i1 any) (ret uint32);
func efacethash(i1 any) (ret uint32); func efacethash(i1 any) (ret uint32);
func makemap(keysize int, valsize int, // *byte is really *runtime.Type
keyalg int, valalg int, func makemap(key, val *byte, hint int) (hmap map[any]any);
hint int) (hmap map[any]any);
func mapaccess1(hmap map[any]any, key any) (val any); func mapaccess1(hmap map[any]any, key any) (val any);
func mapaccess2(hmap map[any]any, key any) (val any, pres bool); func mapaccess2(hmap map[any]any, key any) (val any, pres bool);
func mapassign1(hmap map[any]any, key any, val any); func mapassign1(hmap map[any]any, key any, val any);
...@@ -63,7 +62,8 @@ func mapiternext(hiter *any); ...@@ -63,7 +62,8 @@ func mapiternext(hiter *any);
func mapiter1(hiter *any) (key any); func mapiter1(hiter *any) (key any);
func mapiter2(hiter *any) (key any, val any); func mapiter2(hiter *any) (key any, val any);
func makechan(elemsize int, elemalg int, hint int) (hchan chan any); // *byte is really *runtime.Type
func makechan(elem *byte, hint int) (hchan chan any);
func chanrecv1(hchan <-chan any) (elem any); func chanrecv1(hchan <-chan any) (elem any);
func chanrecv2(hchan <-chan any) (elem any, pres bool); func chanrecv2(hchan <-chan any) (elem any, pres bool);
func chansend1(hchan chan<- any, elem any); func chansend1(hchan chan<- any, elem any);
......
...@@ -887,8 +887,7 @@ walkexpr(Node **np, NodeList **init) ...@@ -887,8 +887,7 @@ walkexpr(Node **np, NodeList **init)
case OMAKECHAN: case OMAKECHAN:
n = mkcall1(chanfn("makechan", 1, n->type), n->type, init, n = mkcall1(chanfn("makechan", 1, n->type), n->type, init,
nodintconst(n->type->type->width), typename(n->type->type),
nodintconst(algtype(n->type->type)),
conv(n->left, types[TINT])); conv(n->left, types[TINT]));
goto ret; goto ret;
...@@ -900,10 +899,8 @@ walkexpr(Node **np, NodeList **init) ...@@ -900,10 +899,8 @@ walkexpr(Node **np, NodeList **init)
argtype(fn, t->type); // any-2 argtype(fn, t->type); // any-2
n = mkcall1(fn, n->type, init, n = mkcall1(fn, n->type, init,
nodintconst(t->down->width), // key width typename(t->down), // key type
nodintconst(t->type->width), // val width typename(t->type), // value type
nodintconst(algtype(t->down)), // key algorithm
nodintconst(algtype(t->type)), // val algorithm
conv(n->left, types[TINT])); conv(n->left, types[TINT]));
goto ret; goto ret;
...@@ -2249,7 +2246,7 @@ maplit(Node *n, Node *var, NodeList **init) ...@@ -2249,7 +2246,7 @@ maplit(Node *n, Node *var, NodeList **init)
walkexpr(&a, init); walkexpr(&a, init);
a->dodata = 2; a->dodata = 2;
*init = list(*init, a); *init = list(*init, a);
b++; b++;
} }
} }
......
...@@ -3,6 +3,7 @@ ...@@ -3,6 +3,7 @@
// license that can be found in the LICENSE file. // license that can be found in the LICENSE file.
#include "runtime.h" #include "runtime.h"
#include "type.h"
static int32 debug = 0; static int32 debug = 0;
static Lock chanlock; static Lock chanlock;
...@@ -43,6 +44,7 @@ struct Hchan ...@@ -43,6 +44,7 @@ struct Hchan
uint32 dataqsiz; // size of the circular q uint32 dataqsiz; // size of the circular q
uint16 elemsize; uint16 elemsize;
uint16 closed; // Wclosed Rclosed errorcount uint16 closed; // Wclosed Rclosed errorcount
uint8 elemalign;
Alg* elemalg; // interface for element type Alg* elemalg; // interface for element type
Link* senddataq; // pointer for sender Link* senddataq; // pointer for sender
Link* recvdataq; // pointer for receiver Link* recvdataq; // pointer for receiver
...@@ -88,20 +90,21 @@ static uint32 fastrand1(void); ...@@ -88,20 +90,21 @@ static uint32 fastrand1(void);
static uint32 fastrand2(void); static uint32 fastrand2(void);
Hchan* Hchan*
makechan(uint32 elemsize, uint32 elemalg, uint32 hint) makechan(Type *elem, uint32 hint)
{ {
Hchan *c; Hchan *c;
int32 i; int32 i;
if(elemalg >= nelem(algarray)) { if(elem->alg >= nelem(algarray)) {
printf("chan(alg=%d)\n", elemalg); printf("chan(alg=%d)\n", elem->alg);
throw("sys·makechan: unsupported elem type"); throw("sys·makechan: unsupported elem type");
} }
c = mal(sizeof(*c)); c = mal(sizeof(*c));
c->elemsize = elemsize; c->elemsize = elem->size;
c->elemalg = &algarray[elemalg]; c->elemalg = &algarray[elem->alg];
c->elemalign = elem->align;
if(hint > 0) { if(hint > 0) {
Link *d, *b, *e; Link *d, *b, *e;
...@@ -127,9 +130,11 @@ makechan(uint32 elemsize, uint32 elemalg, uint32 hint) ...@@ -127,9 +130,11 @@ makechan(uint32 elemsize, uint32 elemalg, uint32 hint)
prints("makechan: chan="); prints("makechan: chan=");
sys·printpointer(c); sys·printpointer(c);
prints("; elemsize="); prints("; elemsize=");
sys·printint(elemsize); sys·printint(elem->size);
prints("; elemalg="); prints("; elemalg=");
sys·printint(elemalg); sys·printint(elem->alg);
prints("; elemalign=");
sys·printint(elem->align);
prints("; dataqsiz="); prints("; dataqsiz=");
sys·printint(c->dataqsiz); sys·printint(c->dataqsiz);
prints("\n"); prints("\n");
...@@ -140,9 +145,9 @@ makechan(uint32 elemsize, uint32 elemalg, uint32 hint) ...@@ -140,9 +145,9 @@ makechan(uint32 elemsize, uint32 elemalg, uint32 hint)
// makechan(elemsize uint32, elemalg uint32, hint uint32) (hchan *chan any); // makechan(elemsize uint32, elemalg uint32, hint uint32) (hchan *chan any);
void void
sys·makechan(uint32 elemsize, uint32 elemalg, uint32 hint, Hchan *ret) sys·makechan(Type *elem, uint32 hint, Hchan *ret)
{ {
ret = makechan(elemsize, elemalg, hint); ret = makechan(elem, hint);
FLUSH(&ret); FLUSH(&ret);
} }
...@@ -379,7 +384,7 @@ sys·chansend1(Hchan* c, ...) ...@@ -379,7 +384,7 @@ sys·chansend1(Hchan* c, ...)
int32 o; int32 o;
byte *ae; byte *ae;
o = rnd(sizeof(c), c->elemsize); o = rnd(sizeof(c), c->elemalign);
ae = (byte*)&c + o; ae = (byte*)&c + o;
chansend(c, ae, nil); chansend(c, ae, nil);
} }
...@@ -391,7 +396,7 @@ sys·chansend2(Hchan* c, ...) ...@@ -391,7 +396,7 @@ sys·chansend2(Hchan* c, ...)
int32 o; int32 o;
byte *ae, *ap; byte *ae, *ap;
o = rnd(sizeof(c), c->elemsize); o = rnd(sizeof(c), c->elemalign);
ae = (byte*)&c + o; ae = (byte*)&c + o;
o = rnd(o+c->elemsize, Structrnd); o = rnd(o+c->elemsize, Structrnd);
ap = (byte*)&c + o; ap = (byte*)&c + o;
......
...@@ -4,6 +4,7 @@ ...@@ -4,6 +4,7 @@
#include "runtime.h" #include "runtime.h"
#include "hashmap.h" #include "hashmap.h"
#include "type.h"
/* Return a pointer to the struct/union of type "type" /* Return a pointer to the struct/union of type "type"
whose "field" field is addressed by pointer "p". */ whose "field" field is addressed by pointer "p". */
...@@ -664,14 +665,17 @@ donothing(uint32 s, void *a, void *b) ...@@ -664,14 +665,17 @@ donothing(uint32 s, void *a, void *b)
static int32 debug = 0; static int32 debug = 0;
// makemap(keysize uint32, valsize uint32, // makemap(key, val *Type, hint uint32) (hmap *map[any]any);
// keyalg uint32, valalg uint32,
// hint uint32) (hmap *map[any]any);
Hmap* Hmap*
makemap(uint32 keysize, uint32 valsize, makemap(Type *key, Type *val, uint32 hint)
uint32 keyalg, uint32 valalg, uint32 hint)
{ {
Hmap *h; Hmap *h;
int32 keyalg, valalg, keysize, valsize;
keyalg = key->alg;
valalg = val->alg;
keysize = key->size;
valsize = val->size;
if(keyalg >= nelem(algarray) || algarray[keyalg].hash == nohash) { if(keyalg >= nelem(algarray) || algarray[keyalg].hash == nohash) {
printf("map(keyalg=%d)\n", keyalg); printf("map(keyalg=%d)\n", keyalg);
...@@ -707,16 +711,16 @@ makemap(uint32 keysize, uint32 valsize, ...@@ -707,16 +711,16 @@ makemap(uint32 keysize, uint32 valsize,
// func() (key, val) // func() (key, val)
h->ko0 = rnd(sizeof(h), Structrnd); h->ko0 = rnd(sizeof(h), Structrnd);
h->vo0 = rnd(h->ko0+keysize, valsize); h->vo0 = rnd(h->ko0+keysize, val->align);
// func(key) (val[, pres]) // func(key) (val[, pres])
h->ko1 = rnd(sizeof(h), keysize); h->ko1 = rnd(sizeof(h), key->align);
h->vo1 = rnd(h->ko1+keysize, Structrnd); h->vo1 = rnd(h->ko1+keysize, Structrnd);
h->po1 = rnd(h->vo1+valsize, 1); h->po1 = rnd(h->vo1+valsize, 1);
// func(key, val[, pres]) // func(key, val[, pres])
h->ko2 = rnd(sizeof(h), keysize); h->ko2 = rnd(sizeof(h), key->align);
h->vo2 = rnd(h->ko2+keysize, valsize); h->vo2 = rnd(h->ko2+keysize, val->align);
h->po2 = rnd(h->vo2+valsize, 1); h->po2 = rnd(h->vo2+valsize, 1);
if(debug) { if(debug) {
...@@ -727,15 +731,11 @@ makemap(uint32 keysize, uint32 valsize, ...@@ -727,15 +731,11 @@ makemap(uint32 keysize, uint32 valsize,
return h; return h;
} }
// makemap(keysize uint32, valsize uint32, // makemap(key, val *Type, hint uint32) (hmap *map[any]any);
// keyalg uint32, valalg uint32,
// hint uint32) (hmap *map[any]any);
void void
sys·makemap(uint32 keysize, uint32 valsize, sys·makemap(Type *key, Type *val, uint32 hint, Hmap *ret)
uint32 keyalg, uint32 valalg, uint32 hint,
Hmap *ret)
{ {
ret = makemap(keysize, valsize, keyalg, valalg, hint); ret = makemap(key, val, hint);
FLUSH(&ret); FLUSH(&ret);
} }
......
...@@ -52,7 +52,7 @@ func makemap(typ *byte) (map *byte) { ...@@ -52,7 +52,7 @@ func makemap(typ *byte) (map *byte) {
MapType *t; MapType *t;
t = (MapType*)gettype(typ); t = (MapType*)gettype(typ);
map = (byte*)makemap(t->key->size, t->elem->size, t->key->alg, t->elem->alg, 0); map = (byte*)makemap(t->key, t->elem, 0);
} }
/* /*
...@@ -67,7 +67,7 @@ func makechan(typ *byte, size uint32) (ch *byte) { ...@@ -67,7 +67,7 @@ func makechan(typ *byte, size uint32) (ch *byte) {
// in front of the raw ChanType. the -2 below backs up // in front of the raw ChanType. the -2 below backs up
// to the interface value header. // to the interface value header.
t = (ChanType*)gettype(typ); t = (ChanType*)gettype(typ);
ch = (byte*)makechan(t->elem->size, t->elem->alg, size); ch = (byte*)makechan(t->elem, size);
} }
func chansend(ch *byte, val *byte, pres *bool) { func chansend(ch *byte, val *byte, pres *bool) {
......
...@@ -486,9 +486,9 @@ struct hash_iter* mapiterinit(Hmap*); ...@@ -486,9 +486,9 @@ struct hash_iter* mapiterinit(Hmap*);
void mapiternext(struct hash_iter*); void mapiternext(struct hash_iter*);
bool mapiterkey(struct hash_iter*, void*); bool mapiterkey(struct hash_iter*, void*);
void mapiterkeyvalue(struct hash_iter*, void*, void*); void mapiterkeyvalue(struct hash_iter*, void*, void*);
Hmap* makemap(uint32, uint32, uint32, uint32, uint32); Hmap* makemap(Type*, Type*, uint32);
Hchan* makechan(uint32, uint32, uint32); Hchan* makechan(Type*, uint32);
void chansend(Hchan*, void*, bool*); void chansend(Hchan*, void*, bool*);
void chanrecv(Hchan*, void*, bool*); void chanrecv(Hchan*, void*, bool*);
void chanclose(Hchan*); void chanclose(Hchan*);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment