void emitEmptyL(IRGS& env, int32_t id) { auto const ldrefExit = makeExit(env); auto const ldPMExit = makePseudoMainExit(env); auto const ld = ldLocInner(env, id, ldrefExit, ldPMExit, DataTypeSpecific); push( env, gen(env, XorBool, gen(env, ConvCellToBool, ld), cns(env, true)) ); }
void emitAGetL(HTS& env, int32_t id) { auto const ldrefExit = makeExit(env); auto const ldPMExit = makePseudoMainExit(env); auto const src = ldLocInner(env, id, ldrefExit, ldPMExit, DataTypeSpecific); if (src->type().subtypeOfAny(Type::Obj, Type::Str)) { implAGet(env, src); } else { PUNT(AGetL); } }
void emitNewLikeArrayL(HTS& env, int32_t id, int32_t capacity) { auto const ldrefExit = makeExit(env); auto const ldPMExit = makeExit(env); auto const ld = ldLocInner(env, id, ldrefExit, ldPMExit, DataTypeSpecific); SSATmp* arr; if (ld->isA(Type::Arr)) { arr = gen(env, NewLikeArray, ld, cns(env, capacity)); } else { capacity = (capacity ? capacity : MixedArray::SmallSize); arr = gen(env, NewArray, cns(env, capacity)); } push(env, arr); }
void emitIssetL(IRGS& env, int32_t id) { auto const ldrefExit = makeExit(env); auto const ldPMExit = makePseudoMainExit(env); auto const ld = ldLocInner(env, id, ldrefExit, ldPMExit, DataTypeSpecific); push(env, gen(env, IsNType, TNull, ld)); }