void emitCGetL(HTS& env, int32_t id) { auto const ldrefExit = makeExit(env); auto const ldPMExit = makePseudoMainExit(env); // Mimic hhbc guard relaxation for now. auto cat = curSrcKey(env).op() == OpFPassL ? DataTypeSpecific : DataTypeCountnessInit; pushIncRef(env, ldLocInnerWarn(env, id, ldrefExit, ldPMExit, cat)); }
void emitIsTypeL(IRGS& env, int32_t id, IsTypeOp subop) { if (subop == IsTypeOp::Scalar) return implIsScalarL(env, id); auto const t = typeOpToDataType(subop); auto const ldrefExit = makeExit(env); auto const ldPMExit = makePseudoMainExit(env); auto const val = ldLocInnerWarn(env, id, ldrefExit, ldPMExit, DataTypeSpecific); if (t == KindOfObject) { push(env, optimizedCallIsObject(env, val)); } else { push(env, gen(env, IsType, Type(t), val)); } }
void emitCGetL2(HTS& env, int32_t id) { auto const ldrefExit = makeExit(env); auto const ldPMExit = makePseudoMainExit(env); auto const oldTop = pop(env, Type::StkElem); auto const val = ldLocInnerWarn( env, id, ldrefExit, ldPMExit, DataTypeCountnessInit ); pushIncRef(env, val); push(env, oldTop); }