void emitMIterNext(IRGS& env, int32_t iterId, Offset relOffset, int32_t valLocalId) { surpriseCheck(env, relOffset); auto const res = gen( env, MIterNext, TBool, IterData(iterId, -1, valLocalId), fp(env) ); implCondJmp(env, bcOff(env) + relOffset, false, res); }
void emitWIterNext(IRGS& env, int32_t iterId, Offset relOffset, int32_t valLocalId) { surpriseCheck(env, relOffset); auto const targetOffset = iterBranchTarget(*env.currentNormalizedInstruction); auto const res = gen( env, WIterNext, TBool, IterData(iterId, -1, valLocalId), fp(env) ); implCondJmp(env, targetOffset, false, res); }
void emitIterInit(IRGS& env, int32_t iterId, Offset relOffset, int32_t valLocalId) { auto const targetOffset = iterBranchTarget(*env.currentNormalizedInstruction); auto const src = popC(env); if (!src->type().subtypeOfAny(TArr, TObj)) PUNT(IterInit); auto const res = gen( env, IterInit, TBool, IterData(iterId, -1, valLocalId), src, fp(env) ); implCondJmp(env, targetOffset, true, res); }
void emitDecodeCufIter(IRGS& env, int32_t iterId, Offset relOffset) { auto const src = popC(env); auto const type = src->type(); if (type.subtypeOfAny(TArr, TStr, TObj)) { auto const res = gen( env, DecodeCufIter, TBool, IterId(iterId), src, fp(env) ); decRef(env, src); implCondJmp(env, bcOff(env) + relOffset, true, res); } else { decRef(env, src); jmpImpl(env, bcOff(env) + relOffset); } }
void emitDecodeCufIter(IRGS& env, int32_t iterId, Offset relOffset) { auto const src = popC(env); auto const type = src->type(); if (type.subtypeOfAny(Type::Arr, Type::Str, Type::Obj)) { auto const res = gen( env, DecodeCufIter, Type::Bool, IterId(iterId), src, fp(env) ); gen(env, DecRef, src); implCondJmp(env, bcOff(env) + relOffset, true, res); } else { gen(env, DecRef, src); jmpImpl(env, bcOff(env) + relOffset, instrJmpFlags(*env.currentNormalizedInstruction)); } }
void emitJmpZ(HTS& env, Offset relOffset) { surpriseCheck(env, relOffset); auto const takenOff = bcOff(env) + relOffset; implCondJmp(env, takenOff, true, popC(env)); }