goto ret;
}
- if(cr != 1) {
- yyerror("bad shape across assignment");
- goto ret;
- }
-
switch(r->op) {
case OCALLMETH:
case OCALLINTER:
case OCALL:
- walktype(r, Erv);
- l = ascompatet(n->op, &n->left, &r->type, 0);
- if(l != N) {
- *n = *nod(OLIST, r, reorder2(l));
+ if(cr == 1) {
+ // a,b,... = fn()
+ walktype(r, Erv);
+ l = ascompatet(n->op, &n->left, &r->type, 0);
+ if(l != N) {
+ *n = *nod(OLIST, r, reorder2(l));
+ }
+ goto ret;
}
break;
case OINDEX:
case OINDEXPTR:
- if(!isptrto(r->left->type, TMAP))
- goto badt;
- if(cl != 2)
- goto badt;
- *n = *mapop(n, top);
+ if(cl == 2 && cr == 1) {
+ // a,b = map[] - mapaccess2
+ if(!isptrto(r->left->type, TMAP))
+ break;
+ l = mapop(n, top);
+ if(l == N)
+ break;
+ *n = *l;
+ goto ret;
+ }
+ break;
+ }
+
+ switch(l->op) {
+ case OINDEX:
+ case OINDEXPTR:
+ if(cl == 1 && cr == 2) {
+ // map[] = a,b - mapassign2
+ if(!isptrto(l->left->type, TMAP))
+ break;
+ l = mapop(n, top);
+ if(l == N)
+ break;
+ *n = *l;
+ goto ret;
+ }
break;
}
+
+ yyerror("bad shape across assignment - cr=%d cl=%d\n", cr, cl);
goto ret;
case OBREAK:
goto badt;
case TSTRING:
break;
+ case TMAP:
+ break;
}
n->type = types[TINT32];
goto ret;
Node *r, *a;
Type *t;
Node *on;
- int alg1, alg2;
+ int alg1, alg2, cl, cr;
lno = dynlineno;
dynlineno = n->lineno;
r->type = t->type;
break;
- access2:
- // mapaccess2(hmap *map[any-1]any-2, key any-3) (val-4 any, pres bool);
+ case OAS:
+ cl = listcount(n->left);
+ cr = listcount(n->right);
- t = fixmap(n->right->left->type);
+ if(cl == 1 && cr == 2)
+ goto assign2;
+ if(cl == 2 && cr == 1)
+ goto access2;
+ if(cl != 1 || cr != 1)
+ goto shape;
+
+ // mapassign1(hmap *map[any-1]any-2, key any-3, val any-4);
+
+//dump("assign1", n);
+ if(n->left->op != OINDEX)
+ goto shape;
+
+ t = fixmap(n->left->left->type);
if(t == T)
break;
- a = n->right->right; // key
+ a = n->right; // val
r = a;
- a = n->right->left; // map
+ a = n->left->right; // key
+ r = nod(OLIST, a, r);
+ a = n->left->left; // map
r = nod(OLIST, a, r);
- on = syslook("mapaccess2", 1);
+ on = syslook("mapassign1", 1);
argtype(on, t->down); // any-1
argtype(on, t->type); // any-2
argtype(on, t->down); // any-3
argtype(on, t->type); // any-4
- n->right = nod(OCALL, on, r);
- walktype(n, Etop);
- r = n;
+ r = nod(OCALL, on, r);
+ walktype(r, Erv);
break;
- case OAS:
- if(top != Elv) {
- if(top == Etop)
- goto access2;
- goto nottop;
- }
- if(n->left->op != OINDEX)
- fatal("mapos: AS left not OINDEX");
+ assign2:
+ // mapassign2(hmap *map[any]any, key any, val any, pres bool);
- // mapassign1(hmap *map[any-1]any-2, key any-3, val any-4);
+//dump("assign2", n);
+ if(n->left->op != OINDEX)
+ goto shape;
t = fixmap(n->left->left->type);
if(t == T)
break;
- a = n->right; // val
+ a = n->right->right; // pres
r = a;
+ a = n->right->left; // val
+ r =nod(OLIST, a, r);
a = n->left->right; // key
r = nod(OLIST, a, r);
a = n->left->left; // map
r = nod(OLIST, a, r);
- on = syslook("mapassign1", 1);
+ on = syslook("mapassign2", 1);
argtype(on, t->down); // any-1
argtype(on, t->type); // any-2
walktype(r, Erv);
break;
-/* BOTCH get 2nd version attached */
- if(top != Elv)
- goto nottop;
- if(n->left->op != OINDEX)
- fatal("mapos: AS left not OINDEX");
+ access2:
+ // mapaccess2(hmap *map[any-1]any-2, key any-3) (val-4 any, pres bool);
- // mapassign2(hmap *map[any]any, key any, val any, pres bool);
+//dump("access2", n);
+ if(n->right->op != OINDEX)
+ goto shape;
- t = fixmap(n->left->left->type);
+ t = fixmap(n->right->left->type);
if(t == T)
break;
- a = n->right; // pres
+ a = n->right->right; // key
r = a;
- a = n->right; // val
- r =nod(OLIST, a, r);
- a = n->left->right; // key
- r = nod(OLIST, a, r);
- a = n->left->left; // map
+ a = n->right->left; // map
r = nod(OLIST, a, r);
- on = syslook("mapassign2", 1);
+ on = syslook("mapaccess2", 1);
argtype(on, t->down); // any-1
argtype(on, t->type); // any-2
argtype(on, t->down); // any-3
argtype(on, t->type); // any-4
- r = nod(OCALL, on, r);
- walktype(r, Erv);
+ n->right = nod(OCALL, on, r);
+ walktype(n, Etop);
+ r = n;
break;
}
dynlineno = lno;
return r;
+shape:
+ dump("shape", n);
+ fatal("mapop: cl=%d cr=%d, %O", top, n->op);
+ return N;
+
nottop:
dump("bad top", n);
fatal("mapop: top=%d %O", top, n->op);
int32 debug = 0;
+static int32 empty = 0;
+static string emptystring = (string)∅
+
void
sys_printbool(bool v)
{
void
sys_printstring(string v)
{
- sys_write(1, v->str, v->len);
+ if(v != nil)
+ sys_write(1, v->str, v->len);
}
int32
-strlen(int8 *s)
+findnull(int8 *s)
{
int32 l;
void
prints(int8 *s)
{
- sys_write(1, s, strlen(s));
+ sys_write(1, s, findnull(s));
}
void
uint32 i, l;
byte c1, c2;
+ if(s1 == nil)
+ s1 = emptystring;
+ if(s2 == nil)
+ s2 = emptystring;
+
l = s1->len;
if(s2->len < l)
l = s2->len;
{
uint32 l;
- if(s1->len == 0) {
+ if(s1 == nil || s1->len == 0) {
s3 = s2;
goto out;
}
- if(s2->len == 0) {
+ if(s2 == nil || s2->len == 0) {
s3 = s1;
goto out;
}
string s, str;
int32 l;
+ if(si == nil)
+ si = emptystring;
+
if(lindex < 0 || lindex > si->len ||
hindex < lindex || hindex > si->len) {
sys_printpc(&si);
void
sys_indexstring(string s, int32 i, byte b)
{
+ if(s == nil)
+ s = emptystring;
+
if(i < 0 || i >= s->len) {
sys_printpc(&s);
prints(" ");
struct Hmap
{
+ uint32 len; // must be first
uint32 keysize;
uint32 valsize;
uint32 hint;
stringcopy(uint32 s, string *a, string *b)
{
if(b == nil) {
- *b = nil;
+ *a = nil;
return;
}
*a = *b;
m = mal(sizeof(*m));
+ m->len = 0;
m->keysize = keysize;
m->valsize = valsize;
m->keyalg = &algarray[keyalg];
l->link = m->link;
m->link = l;
m->keyalg->copy(m->keysize, l->data, ak);
+ m->len++;
out:
m->valalg->copy(m->valsize, l->data+m->valoffset, av);
Link **ll;
byte *ak, *av, *ap;
-
ak = (byte*)&m + m->ko;
av = (byte*)&m + m->vo;
ap = (byte*)&m + m->po;
if(m->keyalg->equal(m->keysize, ak, (*ll)->data)) {
m->valalg->copy(m->valsize, (*ll)->data+m->valoffset, nil);
(*ll) = (*ll)->link;
+ m->len--;
if(debug) {
prints("mapdelete (found): map=");
sys_printpointer(m);