void endBlock(IRGS& env, Offset next, bool nextIsMerge) { if (!fp(env)) { // If there's no fp, we've already executed a RetCtrl or similar, so // there's no reason to try to jump anywhere now. return; } jmpImpl(env, next, nextIsMerge ? JmpFlagNextIsMerge : JmpFlagNone); }
void emitIterBreak(IRGS& env, Offset relOffset, const ImmVector& iv) { for (int iterIndex = 0; iterIndex < iv.size(); iterIndex += 2) { IterKind iterKind = (IterKind)iv.vec32()[iterIndex]; Id iterId = iv.vec32()[iterIndex + 1]; switch (iterKind) { case KindOfIter: gen(env, IterFree, IterId(iterId), fp(env)); break; case KindOfMIter: gen(env, MIterFree, IterId(iterId), fp(env)); break; case KindOfCIter: gen(env, CIterFree, IterId(iterId), fp(env)); break; } } 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(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 emitJmpNS(HTS& env, Offset relOffset) { jmpImpl(env, bcOff(env) + relOffset, instrJmpFlags(*env.currentNormalizedInstruction)); }
void emitJmp(HTS& env, Offset relOffset) { surpriseCheck(env, relOffset); auto const offset = bcOff(env) + relOffset; jmpImpl(env, offset, instrJmpFlags(*env.currentNormalizedInstruction)); }
void endBlock(HTS& env, Offset next, bool nextIsMerge) { jmpImpl(env, next, nextIsMerge ? JmpFlagNextIsMerge : JmpFlagNone); }