lj_dispatch.c 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559
  1. /*
  2. ** Instruction dispatch handling.
  3. ** Copyright (C) 2005-2023 Mike Pall. See Copyright Notice in luajit.h
  4. */
  5. #define lj_dispatch_c
  6. #define LUA_CORE
  7. #include "lj_obj.h"
  8. #include "lj_err.h"
  9. #include "lj_buf.h"
  10. #include "lj_func.h"
  11. #include "lj_str.h"
  12. #include "lj_tab.h"
  13. #include "lj_meta.h"
  14. #include "lj_debug.h"
  15. #include "lj_state.h"
  16. #include "lj_frame.h"
  17. #include "lj_bc.h"
  18. #include "lj_ff.h"
  19. #include "lj_strfmt.h"
  20. #if LJ_HASJIT
  21. #include "lj_jit.h"
  22. #endif
  23. #if LJ_HASFFI
  24. #include "lj_ccallback.h"
  25. #endif
  26. #include "lj_trace.h"
  27. #include "lj_dispatch.h"
  28. #if LJ_HASPROFILE
  29. #include "lj_profile.h"
  30. #endif
  31. #include "lj_vm.h"
  32. #include "luajit.h"
  33. /* Bump GG_NUM_ASMFF in lj_dispatch.h as needed. Ugly. */
  34. LJ_STATIC_ASSERT(GG_NUM_ASMFF == FF_NUM_ASMFUNC);
  35. /* -- Dispatch table management ------------------------------------------- */
  36. #if LJ_TARGET_MIPS
  37. #include <math.h>
  38. LJ_FUNCA_NORET void LJ_FASTCALL lj_ffh_coroutine_wrap_err(lua_State *L,
  39. lua_State *co);
  40. #if !LJ_HASJIT
  41. #define lj_dispatch_stitch lj_dispatch_ins
  42. #endif
  43. #if !LJ_HASPROFILE
  44. #define lj_dispatch_profile lj_dispatch_ins
  45. #endif
  46. #define GOTFUNC(name) (ASMFunction)name,
  47. static const ASMFunction dispatch_got[] = {
  48. GOTDEF(GOTFUNC)
  49. };
  50. #undef GOTFUNC
  51. #endif
  52. /* Initialize instruction dispatch table and hot counters. */
  53. void lj_dispatch_init(GG_State *GG)
  54. {
  55. uint32_t i;
  56. ASMFunction *disp = GG->dispatch;
  57. for (i = 0; i < GG_LEN_SDISP; i++)
  58. disp[GG_LEN_DDISP+i] = disp[i] = makeasmfunc(lj_bc_ofs[i]);
  59. for (i = GG_LEN_SDISP; i < GG_LEN_DDISP; i++)
  60. disp[i] = makeasmfunc(lj_bc_ofs[i]);
  61. /* The JIT engine is off by default. luaopen_jit() turns it on. */
  62. disp[BC_FORL] = disp[BC_IFORL];
  63. disp[BC_ITERL] = disp[BC_IITERL];
  64. /* Workaround for stable v2.1 bytecode. TODO: Replace with BC_IITERN. */
  65. disp[BC_ITERN] = &lj_vm_IITERN;
  66. disp[BC_LOOP] = disp[BC_ILOOP];
  67. disp[BC_FUNCF] = disp[BC_IFUNCF];
  68. disp[BC_FUNCV] = disp[BC_IFUNCV];
  69. GG->g.bc_cfunc_ext = GG->g.bc_cfunc_int = BCINS_AD(BC_FUNCC, LUA_MINSTACK, 0);
  70. for (i = 0; i < GG_NUM_ASMFF; i++)
  71. GG->bcff[i] = BCINS_AD(BC__MAX+i, 0, 0);
  72. #if LJ_TARGET_MIPS
  73. memcpy(GG->got, dispatch_got, LJ_GOT__MAX*sizeof(ASMFunction *));
  74. #endif
  75. }
  76. #if LJ_HASJIT
  77. /* Initialize hotcount table. */
  78. void lj_dispatch_init_hotcount(global_State *g)
  79. {
  80. int32_t hotloop = G2J(g)->param[JIT_P_hotloop];
  81. HotCount start = (HotCount)(hotloop*HOTCOUNT_LOOP - 1);
  82. HotCount *hotcount = G2GG(g)->hotcount;
  83. uint32_t i;
  84. for (i = 0; i < HOTCOUNT_SIZE; i++)
  85. hotcount[i] = start;
  86. }
  87. #endif
  88. /* Internal dispatch mode bits. */
  89. #define DISPMODE_CALL 0x01 /* Override call dispatch. */
  90. #define DISPMODE_RET 0x02 /* Override return dispatch. */
  91. #define DISPMODE_INS 0x04 /* Override instruction dispatch. */
  92. #define DISPMODE_JIT 0x10 /* JIT compiler on. */
  93. #define DISPMODE_REC 0x20 /* Recording active. */
  94. #define DISPMODE_PROF 0x40 /* Profiling active. */
  95. /* Update dispatch table depending on various flags. */
  96. void lj_dispatch_update(global_State *g)
  97. {
  98. uint8_t oldmode = g->dispatchmode;
  99. uint8_t mode = 0;
  100. #if LJ_HASJIT
  101. mode |= (G2J(g)->flags & JIT_F_ON) ? DISPMODE_JIT : 0;
  102. mode |= G2J(g)->state != LJ_TRACE_IDLE ?
  103. (DISPMODE_REC|DISPMODE_INS|DISPMODE_CALL) : 0;
  104. #endif
  105. #if LJ_HASPROFILE
  106. mode |= (g->hookmask & HOOK_PROFILE) ? (DISPMODE_PROF|DISPMODE_INS) : 0;
  107. #endif
  108. mode |= (g->hookmask & (LUA_MASKLINE|LUA_MASKCOUNT)) ? DISPMODE_INS : 0;
  109. mode |= (g->hookmask & LUA_MASKCALL) ? DISPMODE_CALL : 0;
  110. mode |= (g->hookmask & LUA_MASKRET) ? DISPMODE_RET : 0;
  111. if (oldmode != mode) { /* Mode changed? */
  112. ASMFunction *disp = G2GG(g)->dispatch;
  113. ASMFunction f_forl, f_iterl, f_itern, f_loop, f_funcf, f_funcv;
  114. g->dispatchmode = mode;
  115. /* Hotcount if JIT is on, but not while recording. */
  116. if ((mode & (DISPMODE_JIT|DISPMODE_REC)) == DISPMODE_JIT) {
  117. f_forl = makeasmfunc(lj_bc_ofs[BC_FORL]);
  118. f_iterl = makeasmfunc(lj_bc_ofs[BC_ITERL]);
  119. f_itern = makeasmfunc(lj_bc_ofs[BC_ITERN]);
  120. f_loop = makeasmfunc(lj_bc_ofs[BC_LOOP]);
  121. f_funcf = makeasmfunc(lj_bc_ofs[BC_FUNCF]);
  122. f_funcv = makeasmfunc(lj_bc_ofs[BC_FUNCV]);
  123. } else { /* Otherwise use the non-hotcounting instructions. */
  124. f_forl = disp[GG_LEN_DDISP+BC_IFORL];
  125. f_iterl = disp[GG_LEN_DDISP+BC_IITERL];
  126. f_itern = &lj_vm_IITERN;
  127. f_loop = disp[GG_LEN_DDISP+BC_ILOOP];
  128. f_funcf = makeasmfunc(lj_bc_ofs[BC_IFUNCF]);
  129. f_funcv = makeasmfunc(lj_bc_ofs[BC_IFUNCV]);
  130. }
  131. /* Init static counting instruction dispatch first (may be copied below). */
  132. disp[GG_LEN_DDISP+BC_FORL] = f_forl;
  133. disp[GG_LEN_DDISP+BC_ITERL] = f_iterl;
  134. disp[GG_LEN_DDISP+BC_ITERN] = f_itern;
  135. disp[GG_LEN_DDISP+BC_LOOP] = f_loop;
  136. /* Set dynamic instruction dispatch. */
  137. if ((oldmode ^ mode) & (DISPMODE_PROF|DISPMODE_REC|DISPMODE_INS)) {
  138. /* Need to update the whole table. */
  139. if (!(mode & DISPMODE_INS)) { /* No ins dispatch? */
  140. /* Copy static dispatch table to dynamic dispatch table. */
  141. memcpy(&disp[0], &disp[GG_LEN_DDISP], GG_LEN_SDISP*sizeof(ASMFunction));
  142. /* Overwrite with dynamic return dispatch. */
  143. if ((mode & DISPMODE_RET)) {
  144. disp[BC_RETM] = lj_vm_rethook;
  145. disp[BC_RET] = lj_vm_rethook;
  146. disp[BC_RET0] = lj_vm_rethook;
  147. disp[BC_RET1] = lj_vm_rethook;
  148. }
  149. } else {
  150. /* The recording dispatch also checks for hooks. */
  151. ASMFunction f = (mode & DISPMODE_PROF) ? lj_vm_profhook :
  152. (mode & DISPMODE_REC) ? lj_vm_record : lj_vm_inshook;
  153. uint32_t i;
  154. for (i = 0; i < GG_LEN_SDISP; i++)
  155. disp[i] = f;
  156. }
  157. } else if (!(mode & DISPMODE_INS)) {
  158. /* Otherwise set dynamic counting ins. */
  159. disp[BC_FORL] = f_forl;
  160. disp[BC_ITERL] = f_iterl;
  161. disp[BC_ITERN] = f_itern;
  162. disp[BC_LOOP] = f_loop;
  163. /* Set dynamic return dispatch. */
  164. if ((mode & DISPMODE_RET)) {
  165. disp[BC_RETM] = lj_vm_rethook;
  166. disp[BC_RET] = lj_vm_rethook;
  167. disp[BC_RET0] = lj_vm_rethook;
  168. disp[BC_RET1] = lj_vm_rethook;
  169. } else {
  170. disp[BC_RETM] = disp[GG_LEN_DDISP+BC_RETM];
  171. disp[BC_RET] = disp[GG_LEN_DDISP+BC_RET];
  172. disp[BC_RET0] = disp[GG_LEN_DDISP+BC_RET0];
  173. disp[BC_RET1] = disp[GG_LEN_DDISP+BC_RET1];
  174. }
  175. }
  176. /* Set dynamic call dispatch. */
  177. if ((oldmode ^ mode) & DISPMODE_CALL) { /* Update the whole table? */
  178. uint32_t i;
  179. if ((mode & DISPMODE_CALL) == 0) { /* No call hooks? */
  180. for (i = GG_LEN_SDISP; i < GG_LEN_DDISP; i++)
  181. disp[i] = makeasmfunc(lj_bc_ofs[i]);
  182. } else {
  183. for (i = GG_LEN_SDISP; i < GG_LEN_DDISP; i++)
  184. disp[i] = lj_vm_callhook;
  185. }
  186. }
  187. if (!(mode & DISPMODE_CALL)) { /* Overwrite dynamic counting ins. */
  188. disp[BC_FUNCF] = f_funcf;
  189. disp[BC_FUNCV] = f_funcv;
  190. }
  191. #if LJ_HASJIT
  192. /* Reset hotcounts for JIT off to on transition. */
  193. if ((mode & DISPMODE_JIT) && !(oldmode & DISPMODE_JIT))
  194. lj_dispatch_init_hotcount(g);
  195. #endif
  196. }
  197. }
  198. /* -- JIT mode setting ---------------------------------------------------- */
  199. #if LJ_HASJIT
  200. /* Set JIT mode for a single prototype. */
  201. static void setptmode(global_State *g, GCproto *pt, int mode)
  202. {
  203. if ((mode & LUAJIT_MODE_ON)) { /* (Re-)enable JIT compilation. */
  204. pt->flags &= ~PROTO_NOJIT;
  205. lj_trace_reenableproto(pt); /* Unpatch all ILOOP etc. bytecodes. */
  206. } else { /* Flush and/or disable JIT compilation. */
  207. if (!(mode & LUAJIT_MODE_FLUSH))
  208. pt->flags |= PROTO_NOJIT;
  209. lj_trace_flushproto(g, pt); /* Flush all traces of prototype. */
  210. }
  211. }
  212. /* Recursively set the JIT mode for all children of a prototype. */
  213. static void setptmode_all(global_State *g, GCproto *pt, int mode)
  214. {
  215. ptrdiff_t i;
  216. if (!(pt->flags & PROTO_CHILD)) return;
  217. for (i = -(ptrdiff_t)pt->sizekgc; i < 0; i++) {
  218. GCobj *o = proto_kgc(pt, i);
  219. if (o->gch.gct == ~LJ_TPROTO) {
  220. setptmode(g, gco2pt(o), mode);
  221. setptmode_all(g, gco2pt(o), mode);
  222. }
  223. }
  224. }
  225. #endif
  226. /* Public API function: control the JIT engine. */
  227. int luaJIT_setmode(lua_State *L, int idx, int mode)
  228. {
  229. global_State *g = G(L);
  230. int mm = mode & LUAJIT_MODE_MASK;
  231. lj_trace_abort(g); /* Abort recording on any state change. */
  232. /* Avoid pulling the rug from under our own feet. */
  233. if ((g->hookmask & HOOK_GC))
  234. lj_err_caller(L, LJ_ERR_NOGCMM);
  235. switch (mm) {
  236. #if LJ_HASJIT
  237. case LUAJIT_MODE_ENGINE:
  238. if ((mode & LUAJIT_MODE_FLUSH)) {
  239. lj_trace_flushall(L);
  240. } else {
  241. if (!(mode & LUAJIT_MODE_ON))
  242. G2J(g)->flags &= ~(uint32_t)JIT_F_ON;
  243. else
  244. G2J(g)->flags |= (uint32_t)JIT_F_ON;
  245. lj_dispatch_update(g);
  246. }
  247. break;
  248. case LUAJIT_MODE_FUNC:
  249. case LUAJIT_MODE_ALLFUNC:
  250. case LUAJIT_MODE_ALLSUBFUNC: {
  251. cTValue *tv = idx == 0 ? frame_prev(L->base-1)-LJ_FR2 :
  252. idx > 0 ? L->base + (idx-1) : L->top + idx;
  253. GCproto *pt;
  254. if ((idx == 0 || tvisfunc(tv)) && isluafunc(&gcval(tv)->fn))
  255. pt = funcproto(&gcval(tv)->fn); /* Cannot use funcV() for frame slot. */
  256. else if (tvisproto(tv))
  257. pt = protoV(tv);
  258. else
  259. return 0; /* Failed. */
  260. if (mm != LUAJIT_MODE_ALLSUBFUNC)
  261. setptmode(g, pt, mode);
  262. if (mm != LUAJIT_MODE_FUNC)
  263. setptmode_all(g, pt, mode);
  264. break;
  265. }
  266. case LUAJIT_MODE_TRACE:
  267. if (!(mode & LUAJIT_MODE_FLUSH))
  268. return 0; /* Failed. */
  269. lj_trace_flush(G2J(g), idx);
  270. break;
  271. #else
  272. case LUAJIT_MODE_ENGINE:
  273. case LUAJIT_MODE_FUNC:
  274. case LUAJIT_MODE_ALLFUNC:
  275. case LUAJIT_MODE_ALLSUBFUNC:
  276. UNUSED(idx);
  277. if ((mode & LUAJIT_MODE_ON))
  278. return 0; /* Failed. */
  279. break;
  280. #endif
  281. case LUAJIT_MODE_WRAPCFUNC:
  282. if ((mode & LUAJIT_MODE_ON)) {
  283. if (idx != 0) {
  284. cTValue *tv = idx > 0 ? L->base + (idx-1) : L->top + idx;
  285. if (tvislightud(tv))
  286. g->wrapf = (lua_CFunction)lightudV(g, tv);
  287. else
  288. return 0; /* Failed. */
  289. } else {
  290. return 0; /* Failed. */
  291. }
  292. setbc_op(&g->bc_cfunc_ext, BC_FUNCCW);
  293. } else {
  294. setbc_op(&g->bc_cfunc_ext, BC_FUNCC);
  295. }
  296. break;
  297. default:
  298. return 0; /* Failed. */
  299. }
  300. return 1; /* OK. */
  301. }
  302. /* Enforce (dynamic) linker error for version mismatches. See luajit.c. */
  303. LUA_API void LUAJIT_VERSION_SYM(void)
  304. {
  305. }
  306. /* -- Hooks --------------------------------------------------------------- */
  307. /* This function can be called asynchronously (e.g. during a signal). */
  308. LUA_API int lua_sethook(lua_State *L, lua_Hook func, int mask, int count)
  309. {
  310. global_State *g = G(L);
  311. mask &= HOOK_EVENTMASK;
  312. if (func == NULL || mask == 0) { mask = 0; func = NULL; } /* Consistency. */
  313. g->hookf = func;
  314. g->hookcount = g->hookcstart = (int32_t)count;
  315. g->hookmask = (uint8_t)((g->hookmask & ~HOOK_EVENTMASK) | mask);
  316. lj_trace_abort(g); /* Abort recording on any hook change. */
  317. lj_dispatch_update(g);
  318. return 1;
  319. }
  320. LUA_API lua_Hook lua_gethook(lua_State *L)
  321. {
  322. return G(L)->hookf;
  323. }
  324. LUA_API int lua_gethookmask(lua_State *L)
  325. {
  326. return G(L)->hookmask & HOOK_EVENTMASK;
  327. }
  328. LUA_API int lua_gethookcount(lua_State *L)
  329. {
  330. return (int)G(L)->hookcstart;
  331. }
  332. /* Call a hook. */
  333. static void callhook(lua_State *L, int event, BCLine line)
  334. {
  335. global_State *g = G(L);
  336. lua_Hook hookf = g->hookf;
  337. if (hookf && !hook_active(g)) {
  338. lua_Debug ar;
  339. lj_trace_abort(g); /* Abort recording on any hook call. */
  340. ar.event = event;
  341. ar.currentline = line;
  342. /* Top frame, nextframe = NULL. */
  343. ar.i_ci = (int)((L->base-1) - tvref(L->stack));
  344. lj_state_checkstack(L, 1+LUA_MINSTACK);
  345. #if LJ_HASPROFILE && !LJ_PROFILE_SIGPROF
  346. lj_profile_hook_enter(g);
  347. #else
  348. hook_enter(g);
  349. #endif
  350. hookf(L, &ar);
  351. lj_assertG(hook_active(g), "active hook flag removed");
  352. setgcref(g->cur_L, obj2gco(L));
  353. #if LJ_HASPROFILE && !LJ_PROFILE_SIGPROF
  354. lj_profile_hook_leave(g);
  355. #else
  356. hook_leave(g);
  357. #endif
  358. }
  359. }
  360. /* -- Dispatch callbacks -------------------------------------------------- */
  361. /* Calculate number of used stack slots in the current frame. */
  362. static BCReg cur_topslot(GCproto *pt, const BCIns *pc, uint32_t nres)
  363. {
  364. BCIns ins = pc[-1];
  365. if (bc_op(ins) == BC_UCLO)
  366. ins = pc[bc_j(ins)];
  367. switch (bc_op(ins)) {
  368. case BC_CALLM: case BC_CALLMT: return bc_a(ins) + bc_c(ins) + nres-1+1+LJ_FR2;
  369. case BC_RETM: return bc_a(ins) + bc_d(ins) + nres-1;
  370. case BC_TSETM: return bc_a(ins) + nres-1;
  371. default: return pt->framesize;
  372. }
  373. }
  374. /* Instruction dispatch. Used by instr/line/return hooks or when recording. */
  375. void LJ_FASTCALL lj_dispatch_ins(lua_State *L, const BCIns *pc)
  376. {
  377. ERRNO_SAVE
  378. GCfunc *fn = curr_func(L);
  379. GCproto *pt = funcproto(fn);
  380. void *cf = cframe_raw(L->cframe);
  381. const BCIns *oldpc = cframe_pc(cf);
  382. global_State *g = G(L);
  383. BCReg slots;
  384. setcframe_pc(cf, pc);
  385. slots = cur_topslot(pt, pc, cframe_multres_n(cf));
  386. L->top = L->base + slots; /* Fix top. */
  387. #if LJ_HASJIT
  388. {
  389. jit_State *J = G2J(g);
  390. if (J->state != LJ_TRACE_IDLE) {
  391. #ifdef LUA_USE_ASSERT
  392. ptrdiff_t delta = L->top - L->base;
  393. #endif
  394. J->L = L;
  395. lj_trace_ins(J, pc-1); /* The interpreter bytecode PC is offset by 1. */
  396. lj_assertG(L->top - L->base == delta,
  397. "unbalanced stack after tracing of instruction");
  398. }
  399. }
  400. #endif
  401. if ((g->hookmask & LUA_MASKCOUNT) && g->hookcount == 0) {
  402. g->hookcount = g->hookcstart;
  403. callhook(L, LUA_HOOKCOUNT, -1);
  404. L->top = L->base + slots; /* Fix top again. */
  405. }
  406. if ((g->hookmask & LUA_MASKLINE)) {
  407. BCPos npc = proto_bcpos(pt, pc) - 1;
  408. BCPos opc = proto_bcpos(pt, oldpc) - 1;
  409. BCLine line = lj_debug_line(pt, npc);
  410. if (pc <= oldpc || opc >= pt->sizebc || line != lj_debug_line(pt, opc)) {
  411. callhook(L, LUA_HOOKLINE, line);
  412. L->top = L->base + slots; /* Fix top again. */
  413. }
  414. }
  415. if ((g->hookmask & LUA_MASKRET) && bc_isret(bc_op(pc[-1])))
  416. callhook(L, LUA_HOOKRET, -1);
  417. ERRNO_RESTORE
  418. }
  419. /* Initialize call. Ensure stack space and return # of missing parameters. */
  420. static int call_init(lua_State *L, GCfunc *fn)
  421. {
  422. if (isluafunc(fn)) {
  423. GCproto *pt = funcproto(fn);
  424. int numparams = pt->numparams;
  425. int gotparams = (int)(L->top - L->base);
  426. int need = pt->framesize;
  427. if ((pt->flags & PROTO_VARARG)) need += 1+LJ_FR2+gotparams;
  428. lj_state_checkstack(L, (MSize)need);
  429. numparams -= gotparams;
  430. return numparams >= 0 ? numparams : 0;
  431. } else {
  432. lj_state_checkstack(L, LUA_MINSTACK);
  433. return 0;
  434. }
  435. }
  436. /* Call dispatch. Used by call hooks, hot calls or when recording. */
  437. ASMFunction LJ_FASTCALL lj_dispatch_call(lua_State *L, const BCIns *pc)
  438. {
  439. ERRNO_SAVE
  440. GCfunc *fn = curr_func(L);
  441. BCOp op;
  442. global_State *g = G(L);
  443. #if LJ_HASJIT
  444. jit_State *J = G2J(g);
  445. #endif
  446. int missing = call_init(L, fn);
  447. #if LJ_HASJIT
  448. J->L = L;
  449. if ((uintptr_t)pc & 1) { /* Marker for hot call. */
  450. #ifdef LUA_USE_ASSERT
  451. ptrdiff_t delta = L->top - L->base;
  452. #endif
  453. pc = (const BCIns *)((uintptr_t)pc & ~(uintptr_t)1);
  454. lj_trace_hot(J, pc);
  455. lj_assertG(L->top - L->base == delta,
  456. "unbalanced stack after hot call");
  457. goto out;
  458. } else if (J->state != LJ_TRACE_IDLE &&
  459. !(g->hookmask & (HOOK_GC|HOOK_VMEVENT))) {
  460. #ifdef LUA_USE_ASSERT
  461. ptrdiff_t delta = L->top - L->base;
  462. #endif
  463. /* Record the FUNC* bytecodes, too. */
  464. lj_trace_ins(J, pc-1); /* The interpreter bytecode PC is offset by 1. */
  465. lj_assertG(L->top - L->base == delta,
  466. "unbalanced stack after hot instruction");
  467. }
  468. #endif
  469. if ((g->hookmask & LUA_MASKCALL)) {
  470. int i;
  471. for (i = 0; i < missing; i++) /* Add missing parameters. */
  472. setnilV(L->top++);
  473. callhook(L, LUA_HOOKCALL, -1);
  474. /* Preserve modifications of missing parameters by lua_setlocal(). */
  475. while (missing-- > 0 && tvisnil(L->top - 1))
  476. L->top--;
  477. }
  478. #if LJ_HASJIT
  479. out:
  480. #endif
  481. op = bc_op(pc[-1]); /* Get FUNC* op. */
  482. #if LJ_HASJIT
  483. /* Use the non-hotcounting variants if JIT is off or while recording. */
  484. if ((!(J->flags & JIT_F_ON) || J->state != LJ_TRACE_IDLE) &&
  485. (op == BC_FUNCF || op == BC_FUNCV))
  486. op = (BCOp)((int)op+(int)BC_IFUNCF-(int)BC_FUNCF);
  487. #endif
  488. ERRNO_RESTORE
  489. return makeasmfunc(lj_bc_ofs[op]); /* Return static dispatch target. */
  490. }
  491. #if LJ_HASJIT
  492. /* Stitch a new trace. */
  493. void LJ_FASTCALL lj_dispatch_stitch(jit_State *J, const BCIns *pc)
  494. {
  495. ERRNO_SAVE
  496. lua_State *L = J->L;
  497. void *cf = cframe_raw(L->cframe);
  498. const BCIns *oldpc = cframe_pc(cf);
  499. setcframe_pc(cf, pc);
  500. /* Before dispatch, have to bias PC by 1. */
  501. L->top = L->base + cur_topslot(curr_proto(L), pc+1, cframe_multres_n(cf));
  502. lj_trace_stitch(J, pc-1); /* Point to the CALL instruction. */
  503. setcframe_pc(cf, oldpc);
  504. ERRNO_RESTORE
  505. }
  506. #endif
  507. #if LJ_HASPROFILE
  508. /* Profile dispatch. */
  509. void LJ_FASTCALL lj_dispatch_profile(lua_State *L, const BCIns *pc)
  510. {
  511. ERRNO_SAVE
  512. GCfunc *fn = curr_func(L);
  513. GCproto *pt = funcproto(fn);
  514. void *cf = cframe_raw(L->cframe);
  515. const BCIns *oldpc = cframe_pc(cf);
  516. global_State *g;
  517. setcframe_pc(cf, pc);
  518. L->top = L->base + cur_topslot(pt, pc, cframe_multres_n(cf));
  519. lj_profile_interpreter(L);
  520. setcframe_pc(cf, oldpc);
  521. g = G(L);
  522. setgcref(g->cur_L, obj2gco(L));
  523. setvmstate(g, INTERP);
  524. ERRNO_RESTORE
  525. }
  526. #endif