void do_lvalue(node *n) { switch(n->token) { case F_LOCAL: ins_f_byte(F_PUSH_LOCAL_LVALUE); ins_byte(n->u.s.a.number); break; case F_GLOBAL: ins_f_byte(F_PUSH_GLOBAL_LVALUE); ins_byte(n->u.s.a.number); break; case F_INDEX: docode(n->u.s.a.node); docode(n->u.s.b.node); ins_f_byte(F_PUSH_INDEXED_LVALUE); break; default: error("Illegal lvalue.\n"); ins_int(0); break; } } void do_assign(node *to,node *from) { switch(n->token) { case F_LOCAL: do_docode(from); ins_f_byte(F_ASSIGN_LOCAL); ins_byte(to->u.s.a.number); break; case F_GLOBAL: do_docode(from); ins_f_byte(F_ASSIGN_GLOBAL); ins_byte(to->u.s.a.number); break; case F_INDEX: do_lvalue(to->u.s.a.node); do_docode(to->u.s.b.node); do_docode(from); ins_f_byte(F_ASSIGN_INDEX); break; default: error("Illegal lvalue.\n"); ins_int(0); break; } } void foo() { switch() { case F_PUSH_LOCAL_LVALUE: sp++; sp->type=T_LVALUE_POINTER; sp->subtype=T_ANY; sp->u.svalue=fp+EXTRACT_UCHAR(pc); pc++; break; case F_RESOLV_INDEXED_LVALUE: { struct vector *v; int i; switch(sp[-1].type) { default: error("Indexing on illigal type.\n"); case T_POINTER: if(sp[0].type!=T_NUMBER) error("Index is not an integer.\n"); i=sp[0].u.number; if(i<0) i+=sp[-1].u.vec->size; if(i<0 || i>=sp[-1].u.vec->size) error("Index out of range.\n"); sp[0].u.number=i; sp[0].type=T_LVALUE_VECTOR_INDEX; break; case T_MAPPING: sp++; sp->type=T_LVALUE_MAPPING_INDEX: } } case F_LVALUE_TO_SVALUE: { switch(sp[-1].type) { case T_LVALUE_POINTER: assign_svalue_no_free(sp,sp->u.svalue); break; case T_LVALUE_VECTOR_INDEX: assign_svalue(sp,sp[-1].u.vec->item+sp->u.number); free_svalue(sp-1); sp[-1]=*sp; sp--; break; case T_LVALUE_MAPPING_INDEX: i=assoc(sp[-2].u.vec->item[0].u.vec,sp[-1]); if(i==-1) { assign_svalue( }else{ } } } } }