int wr_equal_ptr_primitives(glb* g, gint a, gint b, int uniquestrflag) { gint t1,t2; gint l1,l2,ol; char* s1; char* s2; //printf("equal_ptr_primitives called with %d and %d\n",a,b); switch(a&NORMALPTRMASK) { // last 3 bits case FULLINTBITSV0: case FULLINTBITSV1: if (isfullint(b) && (dbfetch(g->db,decode_fullint_offset(a))==dbfetch(g->db,decode_fullint_offset(b))) ) return 1; else return 0; case FULLDOUBLEBITS: if (isfulldouble(b) && wg_decode_double(g->db,a)==wg_decode_double(g->db,b) ) return 1; else return 0; case SHORTSTRBITS: //printf("shortstrbits \n"); if (isshortstr(b) && !memcmp((void*)(offsettoptr(g->db,decode_shortstr_offset(a))), (void*)(offsettoptr(g->db,decode_shortstr_offset(b))), SHORTSTR_SIZE)) return 1; else return 0; case LONGSTRBITS: if (uniquestrflag) { if (a==b) return 1; else return 0; } else { t1=wg_get_encoded_type(g->db,a); t2=wg_get_encoded_type(g->db,b); if (t1!=t2) return 0; l1=wg_decode_unistr_lang_len(g->db,a,t1); l2=wg_decode_unistr_lang_len(g->db,b,t2); if (11!=l2) return 0; ol=l1; l1=wg_decode_unistr_len(g->db,a,t1); l2=wg_decode_unistr_len(g->db,b,t2); if (11!=l2) return 0; s1=wg_decode_unistr_lang(g->db,a,t1); s2=wg_decode_unistr_lang(g->db,b,t2); if (s1!=s2 && (s1==NULL || s2==NULL || memcmp(s1,s2,ol))) return 0; s1=wg_decode_unistr(g->db,a,t1); s2=wg_decode_unistr(g->db,b,t2); if (s1!=s2 && (s1==NULL || s2==NULL || memcmp(s1,s2,l1))) return 0; return 1; } } return 0; }
void luaK_dischargevars (FuncState *fs, expdesc *e) { switch (e->k) { case VLOCAL: { e->k = VNONRELOC; DEBUG_EXPR(raviY_printf(fs, "luaK_dischargevars (VLOCAL->VNONRELOC) %e\n", e)); break; } case VUPVAL: { e->u.info = luaK_codeABC(fs, OP_GETUPVAL, 0, e->u.info, 0); e->k = VRELOCABLE; DEBUG_EXPR(raviY_printf(fs, "luaK_dischargevars (VUPVAL->VRELOCABLE) %e\n", e)); break; } case VINDEXED: { OpCode op = OP_GETTABUP; /* assume 't' is in an upvalue */ freereg(fs, e->u.ind.idx); if (e->u.ind.vt == VLOCAL) { /* 't' is in a register? */ freereg(fs, e->u.ind.t); /* TODO we should do this for upvalues too */ /* table access - set specialized op codes if array types are detected */ if (e->ravi_type == RAVI_TARRAYFLT && e->u.ind.key_type == RAVI_TNUMINT) op = OP_RAVI_GETTABLE_AF; else if (e->ravi_type == RAVI_TARRAYINT && e->u.ind.key_type == RAVI_TNUMINT) op = OP_RAVI_GETTABLE_AI; /* Check that we have a short string constant */ else if (e->ravi_type == RAVI_TTABLE && e->u.ind.key_type == RAVI_TSTRING && isshortstr(fs, e->u.ind.idx)) op = OP_RAVI_GETTABLE_S; else if (e->ravi_type == RAVI_TTABLE && e->u.ind.key_type == RAVI_TNUMINT) op = OP_RAVI_GETTABLE_I; else op = OP_GETTABLE; if (e->ravi_type == RAVI_TARRAYFLT || e->ravi_type == RAVI_TARRAYINT) /* set the type of resulting expression */ e->ravi_type = e->ravi_type == RAVI_TARRAYFLT ? RAVI_TNUMFLT : RAVI_TNUMINT; else e->ravi_type = RAVI_TANY; } e->u.info = luaK_codeABC(fs, op, 0, e->u.ind.t, e->u.ind.idx); e->k = VRELOCABLE; DEBUG_EXPR(raviY_printf(fs, "luaK_dischargevars (VINDEXED->VRELOCABLE) %e\n", e)); break; } case VVARARG: case VCALL: { luaK_setoneret(fs, e); break; } default: break; /* there is one value available (somewhere) */ } }