MCPcopy Create free account
hub / github.com/CppCXY/EmmyLuaCodeStyle / exp2reg

Function exp2reg

3rd/lua-5.4.3/src/lcode.c:896–918  ·  view source on GitHub ↗

** Ensures final expression result (which includes results from its ** jump lists) is in register 'reg'. ** If expression has jumps, need to patch these jumps either to ** its final position or to "load" instructions (for those tests ** that do not produce values). */

Source from the content-addressed store, hash-verified

894** that do not produce values).
895*/
896static void exp2reg (FuncState *fs, expdesc *e, int reg) {
897 discharge2reg(fs, e, reg);
898 if (e->k == VJMP) /* expression itself is a test? */
899 luaK_concat(fs, &e->t, e->u.info); /* put this jump in 't' list */
900 if (hasjumps(e)) {
901 int final; /* position after whole expression */
902 int p_f = NO_JUMP; /* position of an eventual LOAD false */
903 int p_t = NO_JUMP; /* position of an eventual LOAD true */
904 if (need_value(fs, e->t) || need_value(fs, e->f)) {
905 int fj = (e->k == VJMP) ? NO_JUMP : luaK_jump(fs);
906 p_f = code_loadbool(fs, reg, OP_LFALSESKIP); /* skip next inst. */
907 p_t = code_loadbool(fs, reg, OP_LOADTRUE);
908 /* jump around these booleans if 'e' is not a test */
909 luaK_patchtohere(fs, fj);
910 }
911 final = luaK_getlabel(fs);
912 patchlistaux(fs, e->f, final, reg, p_f);
913 patchlistaux(fs, e->t, final, reg, p_t);
914 }
915 e->f = e->t = NO_JUMP;
916 e->u.info = reg;
917 e->k = VNONRELOC;
918}
919
920
921/*

Callers 3

luaK_exp2nextregFunction · 0.85
luaK_exp2anyregFunction · 0.85
luaK_storevarFunction · 0.85

Calls 8

discharge2regFunction · 0.85
luaK_concatFunction · 0.85
need_valueFunction · 0.85
luaK_jumpFunction · 0.85
code_loadboolFunction · 0.85
luaK_patchtohereFunction · 0.85
luaK_getlabelFunction · 0.85
patchlistauxFunction · 0.85

Tested by

no test coverage detected