RewriterVar* JitFragmentWriter::emitDeref(InternedString s) { return call(false, (void*)ASTInterpreterJitInterface::derefHelper, getInterp(), #ifndef NDEBUG imm(asUInt(s).first), imm(asUInt(s).second)); #else imm(asUInt(s))); #endif }
void JitFragmentWriter::emitDelName(InternedString name) { call(false, (void*)ASTInterpreterJitInterface::delNameHelper, getInterp(), #ifndef NDEBUG imm(asUInt(name).first), imm(asUInt(name).second)); #else imm(asUInt(name))); #endif }
void JitFragmentWriter::emitSetLocal(InternedString s, int vreg, bool set_closure, RewriterVar* v) { assert(vreg >= 0); if (set_closure) { call(false, (void*)ASTInterpreterJitInterface::setLocalClosureHelper, getInterp(), imm(vreg), #ifndef NDEBUG imm(asUInt(s).first), imm(asUInt(s).second), #else imm(asUInt(s)), #endif v); } else { vregs_array->setAttr(8 * vreg, v); } }
void JitFragmentWriter::_emitOSRPoint(RewriterVar* result, RewriterVar* node_var) { RewriterVar::SmallVector args; args.push_back(getInterp()); args.push_back(node_var); _call(result, false, (void*)ASTInterpreterJitInterface::doOSRHelper, args, RewriterVar::SmallVector()); auto result_reg = result->getInReg(assembler::RDX); result->bumpUse(); assembler->test(result_reg, result_reg); { assembler::ForwardJump je(*assembler, assembler::COND_EQUAL); assembler->mov(assembler::Immediate(0ul), assembler::RAX); // TODO: use xor assembler->add(assembler::Immediate(JitCodeBlock::sp_adjustment), assembler::RSP); assembler->pop(assembler::R12); assembler->pop(assembler::R14); assembler->retq(); } assertConsistent(); }
void JitFragmentWriter::emitUncacheExcInfo() { call(false, (void*)ASTInterpreterJitInterface::uncacheExcInfoHelper, getInterp()); }
void JitFragmentWriter::emitSetExcInfo(RewriterVar* type, RewriterVar* value, RewriterVar* traceback) { call(false, (void*)ASTInterpreterJitInterface::setExcInfoHelper, getInterp(), type, value, traceback); }
void JitFragmentWriter::emitSetCurrentInst(AST_stmt* node) { getInterp()->setAttr(ASTInterpreterJitInterface::getCurrentInstOffset(), imm(node)); }
void JitFragmentWriter::emitOSRPoint(AST_Jump* node) { RewriterVar* node_var = imm(node); RewriterVar* result = createNewVar(); addAction([=]() { _emitOSRPoint(result, node_var); }, { result, node_var, getInterp() }, ActionType::NORMAL); }
void JitFragmentWriter::emitDelGlobal(BoxedString* name) { RewriterVar* globals = getInterp()->getAttr(ASTInterpreterJitInterface::getGlobalsOffset()); emitPPCall((void*)delGlobal, { globals, imm(name) }, 1, 512); }
RewriterVar* JitFragmentWriter::emitYield(RewriterVar* v) { RewriterVar* generator = getInterp()->getAttr(ASTInterpreterJitInterface::getGeneratorOffset()); return call(false, (void*)yield, generator, v); }
RewriterVar* JitFragmentWriter::emitLandingpad() { return call(false, (void*)ASTInterpreterJitInterface::landingpadHelper, getInterp()); }
RewriterVar* JitFragmentWriter::emitImportStar(RewriterVar* module) { RewriterVar* globals = getInterp()->getAttr(ASTInterpreterJitInterface::getGlobalsOffset()); return call(false, (void*)importStar, module, globals); }
RewriterVar* JitFragmentWriter::emitGetBoxedLocals() { return getInterp()->getAttr(ASTInterpreterJitInterface::getBoxedLocalsOffset()); }
RewriterVar* JitFragmentWriter::emitGetBoxedLocal(BoxedString* s) { RewriterVar* boxed_locals = emitGetBoxedLocals(); RewriterVar* globals = getInterp()->getAttr(ASTInterpreterJitInterface::getGlobalsOffset()); return call(false, (void*)boxedLocalsGet, boxed_locals, imm(s), globals); }
void JitFragmentWriter::emitRaise0() { call(false, (void*)ASTInterpreterJitInterface::raise0Helper, getInterp()); }