lj_parse.c 78 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752
  1. /*
  2. ** Lua parser (source code -> bytecode).
  3. ** Copyright (C) 2005-2014 Mike Pall. See Copyright Notice in luajit.h
  4. **
  5. ** Major portions taken verbatim or adapted from the Lua interpreter.
  6. ** Copyright (C) 1994-2008 Lua.org, PUC-Rio. See Copyright Notice in lua.h
  7. */
  8. #define lj_parse_c
  9. #define LUA_CORE
  10. #include "lj_obj.h"
  11. #include "lj_gc.h"
  12. #include "lj_err.h"
  13. #include "lj_debug.h"
  14. #include "lj_str.h"
  15. #include "lj_tab.h"
  16. #include "lj_func.h"
  17. #include "lj_state.h"
  18. #include "lj_bc.h"
  19. #if LJ_HASFFI
  20. #include "lj_ctype.h"
  21. #endif
  22. #include "lj_lex.h"
  23. #include "lj_parse.h"
  24. #include "lj_vm.h"
  25. #include "lj_vmevent.h"
  26. /* -- Parser structures and definitions ----------------------------------- */
  27. /* Expression kinds. */
  28. typedef enum {
  29. /* Constant expressions must be first and in this order: */
  30. VKNIL,
  31. VKFALSE,
  32. VKTRUE,
  33. VKSTR, /* sval = string value */
  34. VKNUM, /* nval = number value */
  35. VKLAST = VKNUM,
  36. VKCDATA, /* nval = cdata value, not treated as a constant expression */
  37. /* Non-constant expressions follow: */
  38. VLOCAL, /* info = local register, aux = vstack index */
  39. VUPVAL, /* info = upvalue index, aux = vstack index */
  40. VGLOBAL, /* sval = string value */
  41. VINDEXED, /* info = table register, aux = index reg/byte/string const */
  42. VJMP, /* info = instruction PC */
  43. VRELOCABLE, /* info = instruction PC */
  44. VNONRELOC, /* info = result register */
  45. VCALL, /* info = instruction PC, aux = base */
  46. VVOID
  47. } ExpKind;
  48. /* Expression descriptor. */
  49. typedef struct ExpDesc {
  50. union {
  51. struct {
  52. uint32_t info; /* Primary info. */
  53. uint32_t aux; /* Secondary info. */
  54. } s;
  55. TValue nval; /* Number value. */
  56. GCstr *sval; /* String value. */
  57. } u;
  58. ExpKind k;
  59. BCPos t; /* True condition jump list. */
  60. BCPos f; /* False condition jump list. */
  61. } ExpDesc;
  62. /* Macros for expressions. */
  63. #define expr_hasjump(e) ((e)->t != (e)->f)
  64. #define expr_isk(e) ((e)->k <= VKLAST)
  65. #define expr_isk_nojump(e) (expr_isk(e) && !expr_hasjump(e))
  66. #define expr_isnumk(e) ((e)->k == VKNUM)
  67. #define expr_isnumk_nojump(e) (expr_isnumk(e) && !expr_hasjump(e))
  68. #define expr_isstrk(e) ((e)->k == VKSTR)
  69. #define expr_numtv(e) check_exp(expr_isnumk((e)), &(e)->u.nval)
  70. #define expr_numberV(e) numberVnum(expr_numtv((e)))
  71. /* Initialize expression. */
  72. static LJ_AINLINE void expr_init(ExpDesc *e, ExpKind k, uint32_t info)
  73. {
  74. e->k = k;
  75. e->u.s.info = info;
  76. e->f = e->t = NO_JMP;
  77. }
  78. /* Check number constant for +-0. */
  79. static int expr_numiszero(ExpDesc *e)
  80. {
  81. TValue *o = expr_numtv(e);
  82. return tvisint(o) ? (intV(o) == 0) : tviszero(o);
  83. }
  84. /* Per-function linked list of scope blocks. */
  85. typedef struct FuncScope {
  86. struct FuncScope *prev; /* Link to outer scope. */
  87. MSize vstart; /* Start of block-local variables. */
  88. uint8_t nactvar; /* Number of active vars outside the scope. */
  89. uint8_t flags; /* Scope flags. */
  90. } FuncScope;
  91. #define FSCOPE_LOOP 0x01 /* Scope is a (breakable) loop. */
  92. #define FSCOPE_BREAK 0x02 /* Break used in scope. */
  93. #define FSCOPE_GOLA 0x04 /* Goto or label used in scope. */
  94. #define FSCOPE_UPVAL 0x08 /* Upvalue in scope. */
  95. #define FSCOPE_NOCLOSE 0x10 /* Do not close upvalues. */
  96. #define NAME_BREAK ((GCstr *)(uintptr_t)1)
  97. /* Index into variable stack. */
  98. typedef uint16_t VarIndex;
  99. #define LJ_MAX_VSTACK (65536 - LJ_MAX_UPVAL)
  100. /* Variable/goto/label info. */
  101. #define VSTACK_VAR_RW 0x01 /* R/W variable. */
  102. #define VSTACK_GOTO 0x02 /* Pending goto. */
  103. #define VSTACK_LABEL 0x04 /* Label. */
  104. /* Per-function state. */
  105. typedef struct FuncState {
  106. GCtab *kt; /* Hash table for constants. */
  107. LexState *ls; /* Lexer state. */
  108. lua_State *L; /* Lua state. */
  109. FuncScope *bl; /* Current scope. */
  110. struct FuncState *prev; /* Enclosing function. */
  111. BCPos pc; /* Next bytecode position. */
  112. BCPos lasttarget; /* Bytecode position of last jump target. */
  113. BCPos jpc; /* Pending jump list to next bytecode. */
  114. BCReg freereg; /* First free register. */
  115. BCReg nactvar; /* Number of active local variables. */
  116. BCReg nkn, nkgc; /* Number of lua_Number/GCobj constants */
  117. BCLine linedefined; /* First line of the function definition. */
  118. BCInsLine *bcbase; /* Base of bytecode stack. */
  119. BCPos bclim; /* Limit of bytecode stack. */
  120. MSize vbase; /* Base of variable stack for this function. */
  121. uint8_t flags; /* Prototype flags. */
  122. uint8_t numparams; /* Number of parameters. */
  123. uint8_t framesize; /* Fixed frame size. */
  124. uint8_t nuv; /* Number of upvalues */
  125. VarIndex varmap[LJ_MAX_LOCVAR]; /* Map from register to variable idx. */
  126. VarIndex uvmap[LJ_MAX_UPVAL]; /* Map from upvalue to variable idx. */
  127. VarIndex uvtmp[LJ_MAX_UPVAL]; /* Temporary upvalue map. */
  128. } FuncState;
  129. /* Binary and unary operators. ORDER OPR */
  130. typedef enum BinOpr {
  131. OPR_ADD, OPR_SUB, OPR_MUL, OPR_DIV, OPR_MOD, OPR_POW, /* ORDER ARITH */
  132. OPR_CONCAT,
  133. OPR_NE, OPR_EQ,
  134. OPR_LT, OPR_GE, OPR_LE, OPR_GT,
  135. OPR_AND, OPR_OR,
  136. OPR_NOBINOPR
  137. } BinOpr;
  138. LJ_STATIC_ASSERT((int)BC_ISGE-(int)BC_ISLT == (int)OPR_GE-(int)OPR_LT);
  139. LJ_STATIC_ASSERT((int)BC_ISLE-(int)BC_ISLT == (int)OPR_LE-(int)OPR_LT);
  140. LJ_STATIC_ASSERT((int)BC_ISGT-(int)BC_ISLT == (int)OPR_GT-(int)OPR_LT);
  141. LJ_STATIC_ASSERT((int)BC_SUBVV-(int)BC_ADDVV == (int)OPR_SUB-(int)OPR_ADD);
  142. LJ_STATIC_ASSERT((int)BC_MULVV-(int)BC_ADDVV == (int)OPR_MUL-(int)OPR_ADD);
  143. LJ_STATIC_ASSERT((int)BC_DIVVV-(int)BC_ADDVV == (int)OPR_DIV-(int)OPR_ADD);
  144. LJ_STATIC_ASSERT((int)BC_MODVV-(int)BC_ADDVV == (int)OPR_MOD-(int)OPR_ADD);
  145. /* -- Error handling ------------------------------------------------------ */
  146. LJ_NORET LJ_NOINLINE static void err_syntax(LexState *ls, ErrMsg em)
  147. {
  148. lj_lex_error(ls, ls->token, em);
  149. }
  150. LJ_NORET LJ_NOINLINE static void err_token(LexState *ls, LexToken token)
  151. {
  152. lj_lex_error(ls, ls->token, LJ_ERR_XTOKEN, lj_lex_token2str(ls, token));
  153. }
  154. LJ_NORET static void err_limit(FuncState *fs, uint32_t limit, const char *what)
  155. {
  156. if (fs->linedefined == 0)
  157. lj_lex_error(fs->ls, 0, LJ_ERR_XLIMM, limit, what);
  158. else
  159. lj_lex_error(fs->ls, 0, LJ_ERR_XLIMF, fs->linedefined, limit, what);
  160. }
  161. #define checklimit(fs, v, l, m) if ((v) >= (l)) err_limit(fs, l, m)
  162. #define checklimitgt(fs, v, l, m) if ((v) > (l)) err_limit(fs, l, m)
  163. #define checkcond(ls, c, em) { if (!(c)) err_syntax(ls, em); }
  164. /* -- Management of constants --------------------------------------------- */
  165. /* Return bytecode encoding for primitive constant. */
  166. #define const_pri(e) check_exp((e)->k <= VKTRUE, (e)->k)
  167. #define tvhaskslot(o) ((o)->u32.hi == 0)
  168. #define tvkslot(o) ((o)->u32.lo)
  169. /* Add a number constant. */
  170. static BCReg const_num(FuncState *fs, ExpDesc *e)
  171. {
  172. lua_State *L = fs->L;
  173. TValue *o;
  174. lua_assert(expr_isnumk(e));
  175. o = lj_tab_set(L, fs->kt, &e->u.nval);
  176. if (tvhaskslot(o))
  177. return tvkslot(o);
  178. o->u64 = fs->nkn;
  179. return fs->nkn++;
  180. }
  181. /* Add a GC object constant. */
  182. static BCReg const_gc(FuncState *fs, GCobj *gc, uint32_t itype)
  183. {
  184. lua_State *L = fs->L;
  185. TValue key, *o;
  186. setgcV(L, &key, gc, itype);
  187. /* NOBARRIER: the key is new or kept alive. */
  188. o = lj_tab_set(L, fs->kt, &key);
  189. if (tvhaskslot(o))
  190. return tvkslot(o);
  191. o->u64 = fs->nkgc;
  192. return fs->nkgc++;
  193. }
  194. /* Add a string constant. */
  195. static BCReg const_str(FuncState *fs, ExpDesc *e)
  196. {
  197. lua_assert(expr_isstrk(e) || e->k == VGLOBAL);
  198. return const_gc(fs, obj2gco(e->u.sval), LJ_TSTR);
  199. }
  200. /* Anchor string constant to avoid GC. */
  201. GCstr *lj_parse_keepstr(LexState *ls, const char *str, size_t len)
  202. {
  203. /* NOBARRIER: the key is new or kept alive. */
  204. lua_State *L = ls->L;
  205. GCstr *s = lj_str_new(L, str, len);
  206. TValue *tv = lj_tab_setstr(L, ls->fs->kt, s);
  207. if (tvisnil(tv)) setboolV(tv, 1);
  208. lj_gc_check(L);
  209. return s;
  210. }
  211. #if LJ_HASFFI
  212. /* Anchor cdata to avoid GC. */
  213. void lj_parse_keepcdata(LexState *ls, TValue *tv, GCcdata *cd)
  214. {
  215. /* NOBARRIER: the key is new or kept alive. */
  216. lua_State *L = ls->L;
  217. setcdataV(L, tv, cd);
  218. setboolV(lj_tab_set(L, ls->fs->kt, tv), 1);
  219. }
  220. #endif
  221. /* -- Jump list handling -------------------------------------------------- */
  222. /* Get next element in jump list. */
  223. static BCPos jmp_next(FuncState *fs, BCPos pc)
  224. {
  225. ptrdiff_t delta = bc_j(fs->bcbase[pc].ins);
  226. if ((BCPos)delta == NO_JMP)
  227. return NO_JMP;
  228. else
  229. return (BCPos)(((ptrdiff_t)pc+1)+delta);
  230. }
  231. /* Check if any of the instructions on the jump list produce no value. */
  232. static int jmp_novalue(FuncState *fs, BCPos list)
  233. {
  234. for (; list != NO_JMP; list = jmp_next(fs, list)) {
  235. BCIns p = fs->bcbase[list >= 1 ? list-1 : list].ins;
  236. if (!(bc_op(p) == BC_ISTC || bc_op(p) == BC_ISFC || bc_a(p) == NO_REG))
  237. return 1;
  238. }
  239. return 0;
  240. }
  241. /* Patch register of test instructions. */
  242. static int jmp_patchtestreg(FuncState *fs, BCPos pc, BCReg reg)
  243. {
  244. BCInsLine *ilp = &fs->bcbase[pc >= 1 ? pc-1 : pc];
  245. BCOp op = bc_op(ilp->ins);
  246. if (op == BC_ISTC || op == BC_ISFC) {
  247. if (reg != NO_REG && reg != bc_d(ilp->ins)) {
  248. setbc_a(&ilp->ins, reg);
  249. } else { /* Nothing to store or already in the right register. */
  250. setbc_op(&ilp->ins, op+(BC_IST-BC_ISTC));
  251. setbc_a(&ilp->ins, 0);
  252. }
  253. } else if (bc_a(ilp->ins) == NO_REG) {
  254. if (reg == NO_REG) {
  255. ilp->ins = BCINS_AJ(BC_JMP, bc_a(fs->bcbase[pc].ins), 0);
  256. } else {
  257. setbc_a(&ilp->ins, reg);
  258. if (reg >= bc_a(ilp[1].ins))
  259. setbc_a(&ilp[1].ins, reg+1);
  260. }
  261. } else {
  262. return 0; /* Cannot patch other instructions. */
  263. }
  264. return 1;
  265. }
  266. /* Drop values for all instructions on jump list. */
  267. static void jmp_dropval(FuncState *fs, BCPos list)
  268. {
  269. for (; list != NO_JMP; list = jmp_next(fs, list))
  270. jmp_patchtestreg(fs, list, NO_REG);
  271. }
  272. /* Patch jump instruction to target. */
  273. static void jmp_patchins(FuncState *fs, BCPos pc, BCPos dest)
  274. {
  275. BCIns *jmp = &fs->bcbase[pc].ins;
  276. BCPos offset = dest-(pc+1)+BCBIAS_J;
  277. lua_assert(dest != NO_JMP);
  278. if (offset > BCMAX_D)
  279. err_syntax(fs->ls, LJ_ERR_XJUMP);
  280. setbc_d(jmp, offset);
  281. }
  282. /* Append to jump list. */
  283. static void jmp_append(FuncState *fs, BCPos *l1, BCPos l2)
  284. {
  285. if (l2 == NO_JMP) {
  286. return;
  287. } else if (*l1 == NO_JMP) {
  288. *l1 = l2;
  289. } else {
  290. BCPos list = *l1;
  291. BCPos next;
  292. while ((next = jmp_next(fs, list)) != NO_JMP) /* Find last element. */
  293. list = next;
  294. jmp_patchins(fs, list, l2);
  295. }
  296. }
  297. /* Patch jump list and preserve produced values. */
  298. static void jmp_patchval(FuncState *fs, BCPos list, BCPos vtarget,
  299. BCReg reg, BCPos dtarget)
  300. {
  301. while (list != NO_JMP) {
  302. BCPos next = jmp_next(fs, list);
  303. if (jmp_patchtestreg(fs, list, reg))
  304. jmp_patchins(fs, list, vtarget); /* Jump to target with value. */
  305. else
  306. jmp_patchins(fs, list, dtarget); /* Jump to default target. */
  307. list = next;
  308. }
  309. }
  310. /* Jump to following instruction. Append to list of pending jumps. */
  311. static void jmp_tohere(FuncState *fs, BCPos list)
  312. {
  313. fs->lasttarget = fs->pc;
  314. jmp_append(fs, &fs->jpc, list);
  315. }
  316. /* Patch jump list to target. */
  317. static void jmp_patch(FuncState *fs, BCPos list, BCPos target)
  318. {
  319. if (target == fs->pc) {
  320. jmp_tohere(fs, list);
  321. } else {
  322. lua_assert(target < fs->pc);
  323. jmp_patchval(fs, list, target, NO_REG, target);
  324. }
  325. }
  326. /* -- Bytecode register allocator ----------------------------------------- */
  327. /* Bump frame size. */
  328. static void bcreg_bump(FuncState *fs, BCReg n)
  329. {
  330. BCReg sz = fs->freereg + n;
  331. if (sz > fs->framesize) {
  332. if (sz >= LJ_MAX_SLOTS)
  333. err_syntax(fs->ls, LJ_ERR_XSLOTS);
  334. fs->framesize = (uint8_t)sz;
  335. }
  336. }
  337. /* Reserve registers. */
  338. static void bcreg_reserve(FuncState *fs, BCReg n)
  339. {
  340. bcreg_bump(fs, n);
  341. fs->freereg += n;
  342. }
  343. /* Free register. */
  344. static void bcreg_free(FuncState *fs, BCReg reg)
  345. {
  346. if (reg >= fs->nactvar) {
  347. fs->freereg--;
  348. lua_assert(reg == fs->freereg);
  349. }
  350. }
  351. /* Free register for expression. */
  352. static void expr_free(FuncState *fs, ExpDesc *e)
  353. {
  354. if (e->k == VNONRELOC)
  355. bcreg_free(fs, e->u.s.info);
  356. }
  357. /* -- Bytecode emitter ---------------------------------------------------- */
  358. /* Emit bytecode instruction. */
  359. static BCPos bcemit_INS(FuncState *fs, BCIns ins)
  360. {
  361. BCPos pc = fs->pc;
  362. LexState *ls = fs->ls;
  363. jmp_patchval(fs, fs->jpc, pc, NO_REG, pc);
  364. fs->jpc = NO_JMP;
  365. if (LJ_UNLIKELY(pc >= fs->bclim)) {
  366. ptrdiff_t base = fs->bcbase - ls->bcstack;
  367. checklimit(fs, ls->sizebcstack, LJ_MAX_BCINS, "bytecode instructions");
  368. lj_mem_growvec(fs->L, ls->bcstack, ls->sizebcstack, LJ_MAX_BCINS,BCInsLine);
  369. fs->bclim = (BCPos)(ls->sizebcstack - base);
  370. fs->bcbase = ls->bcstack + base;
  371. }
  372. fs->bcbase[pc].ins = ins;
  373. fs->bcbase[pc].line = ls->lastline;
  374. fs->pc = pc+1;
  375. return pc;
  376. }
  377. #define bcemit_ABC(fs, o, a, b, c) bcemit_INS(fs, BCINS_ABC(o, a, b, c))
  378. #define bcemit_AD(fs, o, a, d) bcemit_INS(fs, BCINS_AD(o, a, d))
  379. #define bcemit_AJ(fs, o, a, j) bcemit_INS(fs, BCINS_AJ(o, a, j))
  380. #define bcptr(fs, e) (&(fs)->bcbase[(e)->u.s.info].ins)
  381. /* -- Bytecode emitter for expressions ------------------------------------ */
  382. /* Discharge non-constant expression to any register. */
  383. static void expr_discharge(FuncState *fs, ExpDesc *e)
  384. {
  385. BCIns ins;
  386. if (e->k == VUPVAL) {
  387. ins = BCINS_AD(BC_UGET, 0, e->u.s.info);
  388. } else if (e->k == VGLOBAL) {
  389. ins = BCINS_AD(BC_GGET, 0, const_str(fs, e));
  390. } else if (e->k == VINDEXED) {
  391. BCReg rc = e->u.s.aux;
  392. if ((int32_t)rc < 0) {
  393. ins = BCINS_ABC(BC_TGETS, 0, e->u.s.info, ~rc);
  394. } else if (rc > BCMAX_C) {
  395. ins = BCINS_ABC(BC_TGETB, 0, e->u.s.info, rc-(BCMAX_C+1));
  396. } else {
  397. bcreg_free(fs, rc);
  398. ins = BCINS_ABC(BC_TGETV, 0, e->u.s.info, rc);
  399. }
  400. bcreg_free(fs, e->u.s.info);
  401. } else if (e->k == VCALL) {
  402. e->u.s.info = e->u.s.aux;
  403. e->k = VNONRELOC;
  404. return;
  405. } else if (e->k == VLOCAL) {
  406. e->k = VNONRELOC;
  407. return;
  408. } else {
  409. return;
  410. }
  411. e->u.s.info = bcemit_INS(fs, ins);
  412. e->k = VRELOCABLE;
  413. }
  414. /* Emit bytecode to set a range of registers to nil. */
  415. static void bcemit_nil(FuncState *fs, BCReg from, BCReg n)
  416. {
  417. if (fs->pc > fs->lasttarget) { /* No jumps to current position? */
  418. BCIns *ip = &fs->bcbase[fs->pc-1].ins;
  419. BCReg pto, pfrom = bc_a(*ip);
  420. switch (bc_op(*ip)) { /* Try to merge with the previous instruction. */
  421. case BC_KPRI:
  422. if (bc_d(*ip) != ~LJ_TNIL) break;
  423. if (from == pfrom) {
  424. if (n == 1) return;
  425. } else if (from == pfrom+1) {
  426. from = pfrom;
  427. n++;
  428. } else {
  429. break;
  430. }
  431. *ip = BCINS_AD(BC_KNIL, from, from+n-1); /* Replace KPRI. */
  432. return;
  433. case BC_KNIL:
  434. pto = bc_d(*ip);
  435. if (pfrom <= from && from <= pto+1) { /* Can we connect both ranges? */
  436. if (from+n-1 > pto)
  437. setbc_d(ip, from+n-1); /* Patch previous instruction range. */
  438. return;
  439. }
  440. break;
  441. default:
  442. break;
  443. }
  444. }
  445. /* Emit new instruction or replace old instruction. */
  446. bcemit_INS(fs, n == 1 ? BCINS_AD(BC_KPRI, from, VKNIL) :
  447. BCINS_AD(BC_KNIL, from, from+n-1));
  448. }
  449. /* Discharge an expression to a specific register. Ignore branches. */
  450. static void expr_toreg_nobranch(FuncState *fs, ExpDesc *e, BCReg reg)
  451. {
  452. BCIns ins;
  453. expr_discharge(fs, e);
  454. if (e->k == VKSTR) {
  455. ins = BCINS_AD(BC_KSTR, reg, const_str(fs, e));
  456. } else if (e->k == VKNUM) {
  457. #if LJ_DUALNUM
  458. cTValue *tv = expr_numtv(e);
  459. if (tvisint(tv) && checki16(intV(tv)))
  460. ins = BCINS_AD(BC_KSHORT, reg, (BCReg)(uint16_t)intV(tv));
  461. else
  462. #else
  463. lua_Number n = expr_numberV(e);
  464. int32_t k = lj_num2int(n);
  465. if (checki16(k) && n == (lua_Number)k)
  466. ins = BCINS_AD(BC_KSHORT, reg, (BCReg)(uint16_t)k);
  467. else
  468. #endif
  469. ins = BCINS_AD(BC_KNUM, reg, const_num(fs, e));
  470. #if LJ_HASFFI
  471. } else if (e->k == VKCDATA) {
  472. fs->flags |= PROTO_FFI;
  473. ins = BCINS_AD(BC_KCDATA, reg,
  474. const_gc(fs, obj2gco(cdataV(&e->u.nval)), LJ_TCDATA));
  475. #endif
  476. } else if (e->k == VRELOCABLE) {
  477. setbc_a(bcptr(fs, e), reg);
  478. goto noins;
  479. } else if (e->k == VNONRELOC) {
  480. if (reg == e->u.s.info)
  481. goto noins;
  482. ins = BCINS_AD(BC_MOV, reg, e->u.s.info);
  483. } else if (e->k == VKNIL) {
  484. bcemit_nil(fs, reg, 1);
  485. goto noins;
  486. } else if (e->k <= VKTRUE) {
  487. ins = BCINS_AD(BC_KPRI, reg, const_pri(e));
  488. } else {
  489. lua_assert(e->k == VVOID || e->k == VJMP);
  490. return;
  491. }
  492. bcemit_INS(fs, ins);
  493. noins:
  494. e->u.s.info = reg;
  495. e->k = VNONRELOC;
  496. }
  497. /* Forward declaration. */
  498. static BCPos bcemit_jmp(FuncState *fs);
  499. /* Discharge an expression to a specific register. */
  500. static void expr_toreg(FuncState *fs, ExpDesc *e, BCReg reg)
  501. {
  502. expr_toreg_nobranch(fs, e, reg);
  503. if (e->k == VJMP)
  504. jmp_append(fs, &e->t, e->u.s.info); /* Add it to the true jump list. */
  505. if (expr_hasjump(e)) { /* Discharge expression with branches. */
  506. BCPos jend, jfalse = NO_JMP, jtrue = NO_JMP;
  507. if (jmp_novalue(fs, e->t) || jmp_novalue(fs, e->f)) {
  508. BCPos jval = (e->k == VJMP) ? NO_JMP : bcemit_jmp(fs);
  509. jfalse = bcemit_AD(fs, BC_KPRI, reg, VKFALSE);
  510. bcemit_AJ(fs, BC_JMP, fs->freereg, 1);
  511. jtrue = bcemit_AD(fs, BC_KPRI, reg, VKTRUE);
  512. jmp_tohere(fs, jval);
  513. }
  514. jend = fs->pc;
  515. fs->lasttarget = jend;
  516. jmp_patchval(fs, e->f, jend, reg, jfalse);
  517. jmp_patchval(fs, e->t, jend, reg, jtrue);
  518. }
  519. e->f = e->t = NO_JMP;
  520. e->u.s.info = reg;
  521. e->k = VNONRELOC;
  522. }
  523. /* Discharge an expression to the next free register. */
  524. static void expr_tonextreg(FuncState *fs, ExpDesc *e)
  525. {
  526. expr_discharge(fs, e);
  527. expr_free(fs, e);
  528. bcreg_reserve(fs, 1);
  529. expr_toreg(fs, e, fs->freereg - 1);
  530. }
  531. /* Discharge an expression to any register. */
  532. static BCReg expr_toanyreg(FuncState *fs, ExpDesc *e)
  533. {
  534. expr_discharge(fs, e);
  535. if (e->k == VNONRELOC) {
  536. if (!expr_hasjump(e)) return e->u.s.info; /* Already in a register. */
  537. if (e->u.s.info >= fs->nactvar) {
  538. expr_toreg(fs, e, e->u.s.info); /* Discharge to temp. register. */
  539. return e->u.s.info;
  540. }
  541. }
  542. expr_tonextreg(fs, e); /* Discharge to next register. */
  543. return e->u.s.info;
  544. }
  545. /* Partially discharge expression to a value. */
  546. static void expr_toval(FuncState *fs, ExpDesc *e)
  547. {
  548. if (expr_hasjump(e))
  549. expr_toanyreg(fs, e);
  550. else
  551. expr_discharge(fs, e);
  552. }
  553. /* Emit store for LHS expression. */
  554. static void bcemit_store(FuncState *fs, ExpDesc *var, ExpDesc *e)
  555. {
  556. BCIns ins;
  557. if (var->k == VLOCAL) {
  558. fs->ls->vstack[var->u.s.aux].info |= VSTACK_VAR_RW;
  559. expr_free(fs, e);
  560. expr_toreg(fs, e, var->u.s.info);
  561. return;
  562. } else if (var->k == VUPVAL) {
  563. fs->ls->vstack[var->u.s.aux].info |= VSTACK_VAR_RW;
  564. expr_toval(fs, e);
  565. if (e->k <= VKTRUE)
  566. ins = BCINS_AD(BC_USETP, var->u.s.info, const_pri(e));
  567. else if (e->k == VKSTR)
  568. ins = BCINS_AD(BC_USETS, var->u.s.info, const_str(fs, e));
  569. else if (e->k == VKNUM)
  570. ins = BCINS_AD(BC_USETN, var->u.s.info, const_num(fs, e));
  571. else
  572. ins = BCINS_AD(BC_USETV, var->u.s.info, expr_toanyreg(fs, e));
  573. } else if (var->k == VGLOBAL) {
  574. BCReg ra = expr_toanyreg(fs, e);
  575. ins = BCINS_AD(BC_GSET, ra, const_str(fs, var));
  576. } else {
  577. BCReg ra, rc;
  578. lua_assert(var->k == VINDEXED);
  579. ra = expr_toanyreg(fs, e);
  580. rc = var->u.s.aux;
  581. if ((int32_t)rc < 0) {
  582. ins = BCINS_ABC(BC_TSETS, ra, var->u.s.info, ~rc);
  583. } else if (rc > BCMAX_C) {
  584. ins = BCINS_ABC(BC_TSETB, ra, var->u.s.info, rc-(BCMAX_C+1));
  585. } else {
  586. /* Free late alloced key reg to avoid assert on free of value reg. */
  587. /* This can only happen when called from expr_table(). */
  588. lua_assert(e->k != VNONRELOC || ra < fs->nactvar ||
  589. rc < ra || (bcreg_free(fs, rc),1));
  590. ins = BCINS_ABC(BC_TSETV, ra, var->u.s.info, rc);
  591. }
  592. }
  593. bcemit_INS(fs, ins);
  594. expr_free(fs, e);
  595. }
  596. /* Emit method lookup expression. */
  597. static void bcemit_method(FuncState *fs, ExpDesc *e, ExpDesc *key)
  598. {
  599. BCReg idx, func, obj = expr_toanyreg(fs, e);
  600. expr_free(fs, e);
  601. func = fs->freereg;
  602. bcemit_AD(fs, BC_MOV, func+1, obj); /* Copy object to first argument. */
  603. lua_assert(expr_isstrk(key));
  604. idx = const_str(fs, key);
  605. if (idx <= BCMAX_C) {
  606. bcreg_reserve(fs, 2);
  607. bcemit_ABC(fs, BC_TGETS, func, obj, idx);
  608. } else {
  609. bcreg_reserve(fs, 3);
  610. bcemit_AD(fs, BC_KSTR, func+2, idx);
  611. bcemit_ABC(fs, BC_TGETV, func, obj, func+2);
  612. fs->freereg--;
  613. }
  614. e->u.s.info = func;
  615. e->k = VNONRELOC;
  616. }
  617. /* -- Bytecode emitter for branches --------------------------------------- */
  618. /* Emit unconditional branch. */
  619. static BCPos bcemit_jmp(FuncState *fs)
  620. {
  621. BCPos jpc = fs->jpc;
  622. BCPos j = fs->pc - 1;
  623. BCIns *ip = &fs->bcbase[j].ins;
  624. fs->jpc = NO_JMP;
  625. if ((int32_t)j >= (int32_t)fs->lasttarget && bc_op(*ip) == BC_UCLO)
  626. setbc_j(ip, NO_JMP);
  627. else
  628. j = bcemit_AJ(fs, BC_JMP, fs->freereg, NO_JMP);
  629. jmp_append(fs, &j, jpc);
  630. return j;
  631. }
  632. /* Invert branch condition of bytecode instruction. */
  633. static void invertcond(FuncState *fs, ExpDesc *e)
  634. {
  635. BCIns *ip = &fs->bcbase[e->u.s.info - 1].ins;
  636. setbc_op(ip, bc_op(*ip)^1);
  637. }
  638. /* Emit conditional branch. */
  639. static BCPos bcemit_branch(FuncState *fs, ExpDesc *e, int cond)
  640. {
  641. BCPos pc;
  642. if (e->k == VRELOCABLE) {
  643. BCIns *ip = bcptr(fs, e);
  644. if (bc_op(*ip) == BC_NOT) {
  645. *ip = BCINS_AD(cond ? BC_ISF : BC_IST, 0, bc_d(*ip));
  646. return bcemit_jmp(fs);
  647. }
  648. }
  649. if (e->k != VNONRELOC) {
  650. bcreg_reserve(fs, 1);
  651. expr_toreg_nobranch(fs, e, fs->freereg-1);
  652. }
  653. bcemit_AD(fs, cond ? BC_ISTC : BC_ISFC, NO_REG, e->u.s.info);
  654. pc = bcemit_jmp(fs);
  655. expr_free(fs, e);
  656. return pc;
  657. }
  658. /* Emit branch on true condition. */
  659. static void bcemit_branch_t(FuncState *fs, ExpDesc *e)
  660. {
  661. BCPos pc;
  662. expr_discharge(fs, e);
  663. if (e->k == VKSTR || e->k == VKNUM || e->k == VKTRUE)
  664. pc = NO_JMP; /* Never jump. */
  665. else if (e->k == VJMP)
  666. invertcond(fs, e), pc = e->u.s.info;
  667. else if (e->k == VKFALSE || e->k == VKNIL)
  668. expr_toreg_nobranch(fs, e, NO_REG), pc = bcemit_jmp(fs);
  669. else
  670. pc = bcemit_branch(fs, e, 0);
  671. jmp_append(fs, &e->f, pc);
  672. jmp_tohere(fs, e->t);
  673. e->t = NO_JMP;
  674. }
  675. /* Emit branch on false condition. */
  676. static void bcemit_branch_f(FuncState *fs, ExpDesc *e)
  677. {
  678. BCPos pc;
  679. expr_discharge(fs, e);
  680. if (e->k == VKNIL || e->k == VKFALSE)
  681. pc = NO_JMP; /* Never jump. */
  682. else if (e->k == VJMP)
  683. pc = e->u.s.info;
  684. else if (e->k == VKSTR || e->k == VKNUM || e->k == VKTRUE)
  685. expr_toreg_nobranch(fs, e, NO_REG), pc = bcemit_jmp(fs);
  686. else
  687. pc = bcemit_branch(fs, e, 1);
  688. jmp_append(fs, &e->t, pc);
  689. jmp_tohere(fs, e->f);
  690. e->f = NO_JMP;
  691. }
  692. /* -- Bytecode emitter for operators -------------------------------------- */
  693. /* Try constant-folding of arithmetic operators. */
  694. static int foldarith(BinOpr opr, ExpDesc *e1, ExpDesc *e2)
  695. {
  696. TValue o;
  697. lua_Number n;
  698. if (!expr_isnumk_nojump(e1) || !expr_isnumk_nojump(e2)) return 0;
  699. n = lj_vm_foldarith(expr_numberV(e1), expr_numberV(e2), (int)opr-OPR_ADD);
  700. setnumV(&o, n);
  701. if (tvisnan(&o) || tvismzero(&o)) return 0; /* Avoid NaN and -0 as consts. */
  702. if (LJ_DUALNUM) {
  703. int32_t k = lj_num2int(n);
  704. if ((lua_Number)k == n) {
  705. setintV(&e1->u.nval, k);
  706. return 1;
  707. }
  708. }
  709. setnumV(&e1->u.nval, n);
  710. return 1;
  711. }
  712. /* Emit arithmetic operator. */
  713. static void bcemit_arith(FuncState *fs, BinOpr opr, ExpDesc *e1, ExpDesc *e2)
  714. {
  715. BCReg rb, rc, t;
  716. uint32_t op;
  717. if (foldarith(opr, e1, e2))
  718. return;
  719. if (opr == OPR_POW) {
  720. op = BC_POW;
  721. rc = expr_toanyreg(fs, e2);
  722. rb = expr_toanyreg(fs, e1);
  723. } else {
  724. op = opr-OPR_ADD+BC_ADDVV;
  725. /* Must discharge 2nd operand first since VINDEXED might free regs. */
  726. expr_toval(fs, e2);
  727. if (expr_isnumk(e2) && (rc = const_num(fs, e2)) <= BCMAX_C)
  728. op -= BC_ADDVV-BC_ADDVN;
  729. else
  730. rc = expr_toanyreg(fs, e2);
  731. /* 1st operand discharged by bcemit_binop_left, but need KNUM/KSHORT. */
  732. lua_assert(expr_isnumk(e1) || e1->k == VNONRELOC);
  733. expr_toval(fs, e1);
  734. /* Avoid two consts to satisfy bytecode constraints. */
  735. if (expr_isnumk(e1) && !expr_isnumk(e2) &&
  736. (t = const_num(fs, e1)) <= BCMAX_B) {
  737. rb = rc; rc = t; op -= BC_ADDVV-BC_ADDNV;
  738. } else {
  739. rb = expr_toanyreg(fs, e1);
  740. }
  741. }
  742. /* Using expr_free might cause asserts if the order is wrong. */
  743. if (e1->k == VNONRELOC && e1->u.s.info >= fs->nactvar) fs->freereg--;
  744. if (e2->k == VNONRELOC && e2->u.s.info >= fs->nactvar) fs->freereg--;
  745. e1->u.s.info = bcemit_ABC(fs, op, 0, rb, rc);
  746. e1->k = VRELOCABLE;
  747. }
  748. /* Emit comparison operator. */
  749. static void bcemit_comp(FuncState *fs, BinOpr opr, ExpDesc *e1, ExpDesc *e2)
  750. {
  751. ExpDesc *eret = e1;
  752. BCIns ins;
  753. expr_toval(fs, e1);
  754. if (opr == OPR_EQ || opr == OPR_NE) {
  755. BCOp op = opr == OPR_EQ ? BC_ISEQV : BC_ISNEV;
  756. BCReg ra;
  757. if (expr_isk(e1)) { e1 = e2; e2 = eret; } /* Need constant in 2nd arg. */
  758. ra = expr_toanyreg(fs, e1); /* First arg must be in a reg. */
  759. expr_toval(fs, e2);
  760. switch (e2->k) {
  761. case VKNIL: case VKFALSE: case VKTRUE:
  762. ins = BCINS_AD(op+(BC_ISEQP-BC_ISEQV), ra, const_pri(e2));
  763. break;
  764. case VKSTR:
  765. ins = BCINS_AD(op+(BC_ISEQS-BC_ISEQV), ra, const_str(fs, e2));
  766. break;
  767. case VKNUM:
  768. ins = BCINS_AD(op+(BC_ISEQN-BC_ISEQV), ra, const_num(fs, e2));
  769. break;
  770. default:
  771. ins = BCINS_AD(op, ra, expr_toanyreg(fs, e2));
  772. break;
  773. }
  774. } else {
  775. uint32_t op = opr-OPR_LT+BC_ISLT;
  776. BCReg ra, rd;
  777. if ((op-BC_ISLT) & 1) { /* GT -> LT, GE -> LE */
  778. e1 = e2; e2 = eret; /* Swap operands. */
  779. op = ((op-BC_ISLT)^3)+BC_ISLT;
  780. expr_toval(fs, e1);
  781. }
  782. rd = expr_toanyreg(fs, e2);
  783. ra = expr_toanyreg(fs, e1);
  784. ins = BCINS_AD(op, ra, rd);
  785. }
  786. /* Using expr_free might cause asserts if the order is wrong. */
  787. if (e1->k == VNONRELOC && e1->u.s.info >= fs->nactvar) fs->freereg--;
  788. if (e2->k == VNONRELOC && e2->u.s.info >= fs->nactvar) fs->freereg--;
  789. bcemit_INS(fs, ins);
  790. eret->u.s.info = bcemit_jmp(fs);
  791. eret->k = VJMP;
  792. }
  793. /* Fixup left side of binary operator. */
  794. static void bcemit_binop_left(FuncState *fs, BinOpr op, ExpDesc *e)
  795. {
  796. if (op == OPR_AND) {
  797. bcemit_branch_t(fs, e);
  798. } else if (op == OPR_OR) {
  799. bcemit_branch_f(fs, e);
  800. } else if (op == OPR_CONCAT) {
  801. expr_tonextreg(fs, e);
  802. } else if (op == OPR_EQ || op == OPR_NE) {
  803. if (!expr_isk_nojump(e)) expr_toanyreg(fs, e);
  804. } else {
  805. if (!expr_isnumk_nojump(e)) expr_toanyreg(fs, e);
  806. }
  807. }
  808. /* Emit binary operator. */
  809. static void bcemit_binop(FuncState *fs, BinOpr op, ExpDesc *e1, ExpDesc *e2)
  810. {
  811. if (op <= OPR_POW) {
  812. bcemit_arith(fs, op, e1, e2);
  813. } else if (op == OPR_AND) {
  814. lua_assert(e1->t == NO_JMP); /* List must be closed. */
  815. expr_discharge(fs, e2);
  816. jmp_append(fs, &e2->f, e1->f);
  817. *e1 = *e2;
  818. } else if (op == OPR_OR) {
  819. lua_assert(e1->f == NO_JMP); /* List must be closed. */
  820. expr_discharge(fs, e2);
  821. jmp_append(fs, &e2->t, e1->t);
  822. *e1 = *e2;
  823. } else if (op == OPR_CONCAT) {
  824. expr_toval(fs, e2);
  825. if (e2->k == VRELOCABLE && bc_op(*bcptr(fs, e2)) == BC_CAT) {
  826. lua_assert(e1->u.s.info == bc_b(*bcptr(fs, e2))-1);
  827. expr_free(fs, e1);
  828. setbc_b(bcptr(fs, e2), e1->u.s.info);
  829. e1->u.s.info = e2->u.s.info;
  830. } else {
  831. expr_tonextreg(fs, e2);
  832. expr_free(fs, e2);
  833. expr_free(fs, e1);
  834. e1->u.s.info = bcemit_ABC(fs, BC_CAT, 0, e1->u.s.info, e2->u.s.info);
  835. }
  836. e1->k = VRELOCABLE;
  837. } else {
  838. lua_assert(op == OPR_NE || op == OPR_EQ ||
  839. op == OPR_LT || op == OPR_GE || op == OPR_LE || op == OPR_GT);
  840. bcemit_comp(fs, op, e1, e2);
  841. }
  842. }
  843. /* Emit unary operator. */
  844. static void bcemit_unop(FuncState *fs, BCOp op, ExpDesc *e)
  845. {
  846. if (op == BC_NOT) {
  847. /* Swap true and false lists. */
  848. { BCPos temp = e->f; e->f = e->t; e->t = temp; }
  849. jmp_dropval(fs, e->f);
  850. jmp_dropval(fs, e->t);
  851. expr_discharge(fs, e);
  852. if (e->k == VKNIL || e->k == VKFALSE) {
  853. e->k = VKTRUE;
  854. return;
  855. } else if (expr_isk(e) || (LJ_HASFFI && e->k == VKCDATA)) {
  856. e->k = VKFALSE;
  857. return;
  858. } else if (e->k == VJMP) {
  859. invertcond(fs, e);
  860. return;
  861. } else if (e->k == VRELOCABLE) {
  862. bcreg_reserve(fs, 1);
  863. setbc_a(bcptr(fs, e), fs->freereg-1);
  864. e->u.s.info = fs->freereg-1;
  865. e->k = VNONRELOC;
  866. } else {
  867. lua_assert(e->k == VNONRELOC);
  868. }
  869. } else {
  870. lua_assert(op == BC_UNM || op == BC_LEN);
  871. if (op == BC_UNM && !expr_hasjump(e)) { /* Constant-fold negations. */
  872. #if LJ_HASFFI
  873. if (e->k == VKCDATA) { /* Fold in-place since cdata is not interned. */
  874. GCcdata *cd = cdataV(&e->u.nval);
  875. int64_t *p = (int64_t *)cdataptr(cd);
  876. if (cd->ctypeid == CTID_COMPLEX_DOUBLE)
  877. p[1] ^= (int64_t)U64x(80000000,00000000);
  878. else
  879. *p = -*p;
  880. return;
  881. } else
  882. #endif
  883. if (expr_isnumk(e) && !expr_numiszero(e)) { /* Avoid folding to -0. */
  884. TValue *o = expr_numtv(e);
  885. if (tvisint(o)) {
  886. int32_t k = intV(o);
  887. if (k == -k)
  888. setnumV(o, -(lua_Number)k);
  889. else
  890. setintV(o, -k);
  891. return;
  892. } else {
  893. o->u64 ^= U64x(80000000,00000000);
  894. return;
  895. }
  896. }
  897. }
  898. expr_toanyreg(fs, e);
  899. }
  900. expr_free(fs, e);
  901. e->u.s.info = bcemit_AD(fs, op, 0, e->u.s.info);
  902. e->k = VRELOCABLE;
  903. }
  904. /* -- Lexer support ------------------------------------------------------- */
  905. /* Check and consume optional token. */
  906. static int lex_opt(LexState *ls, LexToken tok)
  907. {
  908. if (ls->token == tok) {
  909. lj_lex_next(ls);
  910. return 1;
  911. }
  912. return 0;
  913. }
  914. /* Check and consume token. */
  915. static void lex_check(LexState *ls, LexToken tok)
  916. {
  917. if (ls->token != tok)
  918. err_token(ls, tok);
  919. lj_lex_next(ls);
  920. }
  921. /* Check for matching token. */
  922. static void lex_match(LexState *ls, LexToken what, LexToken who, BCLine line)
  923. {
  924. if (!lex_opt(ls, what)) {
  925. if (line == ls->linenumber) {
  926. err_token(ls, what);
  927. } else {
  928. const char *swhat = lj_lex_token2str(ls, what);
  929. const char *swho = lj_lex_token2str(ls, who);
  930. lj_lex_error(ls, ls->token, LJ_ERR_XMATCH, swhat, swho, line);
  931. }
  932. }
  933. }
  934. /* Check for string token. */
  935. static GCstr *lex_str(LexState *ls)
  936. {
  937. GCstr *s;
  938. if (ls->token != TK_name && (LJ_52 || ls->token != TK_goto))
  939. err_token(ls, TK_name);
  940. s = strV(&ls->tokenval);
  941. lj_lex_next(ls);
  942. return s;
  943. }
  944. /* -- Variable handling --------------------------------------------------- */
  945. #define var_get(ls, fs, i) ((ls)->vstack[(fs)->varmap[(i)]])
  946. /* Define a new local variable. */
  947. static void var_new(LexState *ls, BCReg n, GCstr *name)
  948. {
  949. FuncState *fs = ls->fs;
  950. MSize vtop = ls->vtop;
  951. checklimit(fs, fs->nactvar+n, LJ_MAX_LOCVAR, "local variables");
  952. if (LJ_UNLIKELY(vtop >= ls->sizevstack)) {
  953. if (ls->sizevstack >= LJ_MAX_VSTACK)
  954. lj_lex_error(ls, 0, LJ_ERR_XLIMC, LJ_MAX_VSTACK);
  955. lj_mem_growvec(ls->L, ls->vstack, ls->sizevstack, LJ_MAX_VSTACK, VarInfo);
  956. }
  957. lua_assert((uintptr_t)name < VARNAME__MAX ||
  958. lj_tab_getstr(fs->kt, name) != NULL);
  959. /* NOBARRIER: name is anchored in fs->kt and ls->vstack is not a GCobj. */
  960. setgcref(ls->vstack[vtop].name, obj2gco(name));
  961. fs->varmap[fs->nactvar+n] = (uint16_t)vtop;
  962. ls->vtop = vtop+1;
  963. }
  964. #define var_new_lit(ls, n, v) \
  965. var_new(ls, (n), lj_parse_keepstr(ls, "" v, sizeof(v)-1))
  966. #define var_new_fixed(ls, n, vn) \
  967. var_new(ls, (n), (GCstr *)(uintptr_t)(vn))
  968. /* Add local variables. */
  969. static void var_add(LexState *ls, BCReg nvars)
  970. {
  971. FuncState *fs = ls->fs;
  972. BCReg nactvar = fs->nactvar;
  973. while (nvars--) {
  974. VarInfo *v = &var_get(ls, fs, nactvar);
  975. v->startpc = fs->pc;
  976. v->slot = nactvar++;
  977. v->info = 0;
  978. }
  979. fs->nactvar = nactvar;
  980. }
  981. /* Remove local variables. */
  982. static void var_remove(LexState *ls, BCReg tolevel)
  983. {
  984. FuncState *fs = ls->fs;
  985. while (fs->nactvar > tolevel)
  986. var_get(ls, fs, --fs->nactvar).endpc = fs->pc;
  987. }
  988. /* Lookup local variable name. */
  989. static BCReg var_lookup_local(FuncState *fs, GCstr *n)
  990. {
  991. int i;
  992. for (i = fs->nactvar-1; i >= 0; i--) {
  993. if (n == strref(var_get(fs->ls, fs, i).name))
  994. return (BCReg)i;
  995. }
  996. return (BCReg)-1; /* Not found. */
  997. }
  998. /* Lookup or add upvalue index. */
  999. static MSize var_lookup_uv(FuncState *fs, MSize vidx, ExpDesc *e)
  1000. {
  1001. MSize i, n = fs->nuv;
  1002. for (i = 0; i < n; i++)
  1003. if (fs->uvmap[i] == vidx)
  1004. return i; /* Already exists. */
  1005. /* Otherwise create a new one. */
  1006. checklimit(fs, fs->nuv, LJ_MAX_UPVAL, "upvalues");
  1007. lua_assert(e->k == VLOCAL || e->k == VUPVAL);
  1008. fs->uvmap[n] = (uint16_t)vidx;
  1009. fs->uvtmp[n] = (uint16_t)(e->k == VLOCAL ? vidx : LJ_MAX_VSTACK+e->u.s.info);
  1010. fs->nuv = n+1;
  1011. return n;
  1012. }
  1013. /* Forward declaration. */
  1014. static void fscope_uvmark(FuncState *fs, BCReg level);
  1015. /* Recursively lookup variables in enclosing functions. */
  1016. static MSize var_lookup_(FuncState *fs, GCstr *name, ExpDesc *e, int first)
  1017. {
  1018. if (fs) {
  1019. BCReg reg = var_lookup_local(fs, name);
  1020. if ((int32_t)reg >= 0) { /* Local in this function? */
  1021. expr_init(e, VLOCAL, reg);
  1022. if (!first)
  1023. fscope_uvmark(fs, reg); /* Scope now has an upvalue. */
  1024. return (MSize)(e->u.s.aux = (uint32_t)fs->varmap[reg]);
  1025. } else {
  1026. MSize vidx = var_lookup_(fs->prev, name, e, 0); /* Var in outer func? */
  1027. if ((int32_t)vidx >= 0) { /* Yes, make it an upvalue here. */
  1028. e->u.s.info = (uint8_t)var_lookup_uv(fs, vidx, e);
  1029. e->k = VUPVAL;
  1030. return vidx;
  1031. }
  1032. }
  1033. } else { /* Not found in any function, must be a global. */
  1034. expr_init(e, VGLOBAL, 0);
  1035. e->u.sval = name;
  1036. }
  1037. return (MSize)-1; /* Global. */
  1038. }
  1039. /* Lookup variable name. */
  1040. #define var_lookup(ls, e) \
  1041. var_lookup_((ls)->fs, lex_str(ls), (e), 1)
  1042. /* -- Goto an label handling ---------------------------------------------- */
  1043. /* Add a new goto or label. */
  1044. static MSize gola_new(LexState *ls, GCstr *name, uint8_t info, BCPos pc)
  1045. {
  1046. FuncState *fs = ls->fs;
  1047. MSize vtop = ls->vtop;
  1048. if (LJ_UNLIKELY(vtop >= ls->sizevstack)) {
  1049. if (ls->sizevstack >= LJ_MAX_VSTACK)
  1050. lj_lex_error(ls, 0, LJ_ERR_XLIMC, LJ_MAX_VSTACK);
  1051. lj_mem_growvec(ls->L, ls->vstack, ls->sizevstack, LJ_MAX_VSTACK, VarInfo);
  1052. }
  1053. lua_assert(name == NAME_BREAK || lj_tab_getstr(fs->kt, name) != NULL);
  1054. /* NOBARRIER: name is anchored in fs->kt and ls->vstack is not a GCobj. */
  1055. setgcref(ls->vstack[vtop].name, obj2gco(name));
  1056. ls->vstack[vtop].startpc = pc;
  1057. ls->vstack[vtop].slot = (uint8_t)fs->nactvar;
  1058. ls->vstack[vtop].info = info;
  1059. ls->vtop = vtop+1;
  1060. return vtop;
  1061. }
  1062. #define gola_isgoto(v) ((v)->info & VSTACK_GOTO)
  1063. #define gola_islabel(v) ((v)->info & VSTACK_LABEL)
  1064. #define gola_isgotolabel(v) ((v)->info & (VSTACK_GOTO|VSTACK_LABEL))
  1065. /* Patch goto to jump to label. */
  1066. static void gola_patch(LexState *ls, VarInfo *vg, VarInfo *vl)
  1067. {
  1068. FuncState *fs = ls->fs;
  1069. BCPos pc = vg->startpc;
  1070. setgcrefnull(vg->name); /* Invalidate pending goto. */
  1071. setbc_a(&fs->bcbase[pc].ins, vl->slot);
  1072. jmp_patch(fs, pc, vl->startpc);
  1073. }
  1074. /* Patch goto to close upvalues. */
  1075. static void gola_close(LexState *ls, VarInfo *vg)
  1076. {
  1077. FuncState *fs = ls->fs;
  1078. BCPos pc = vg->startpc;
  1079. BCIns *ip = &fs->bcbase[pc].ins;
  1080. lua_assert(gola_isgoto(vg));
  1081. lua_assert(bc_op(*ip) == BC_JMP || bc_op(*ip) == BC_UCLO);
  1082. setbc_a(ip, vg->slot);
  1083. if (bc_op(*ip) == BC_JMP) {
  1084. BCPos next = jmp_next(fs, pc);
  1085. if (next != NO_JMP) jmp_patch(fs, next, pc); /* Jump to UCLO. */
  1086. setbc_op(ip, BC_UCLO); /* Turn into UCLO. */
  1087. setbc_j(ip, NO_JMP);
  1088. }
  1089. }
  1090. /* Resolve pending forward gotos for label. */
  1091. static void gola_resolve(LexState *ls, FuncScope *bl, MSize idx)
  1092. {
  1093. VarInfo *vg = ls->vstack + bl->vstart;
  1094. VarInfo *vl = ls->vstack + idx;
  1095. for (; vg < vl; vg++)
  1096. if (gcrefeq(vg->name, vl->name) && gola_isgoto(vg)) {
  1097. if (vg->slot < vl->slot) {
  1098. GCstr *name = strref(var_get(ls, ls->fs, vg->slot).name);
  1099. lua_assert((uintptr_t)name >= VARNAME__MAX);
  1100. ls->linenumber = ls->fs->bcbase[vg->startpc].line;
  1101. lua_assert(strref(vg->name) != NAME_BREAK);
  1102. lj_lex_error(ls, 0, LJ_ERR_XGSCOPE,
  1103. strdata(strref(vg->name)), strdata(name));
  1104. }
  1105. gola_patch(ls, vg, vl);
  1106. }
  1107. }
  1108. /* Fixup remaining gotos and labels for scope. */
  1109. static void gola_fixup(LexState *ls, FuncScope *bl)
  1110. {
  1111. VarInfo *v = ls->vstack + bl->vstart;
  1112. VarInfo *ve = ls->vstack + ls->vtop;
  1113. for (; v < ve; v++) {
  1114. GCstr *name = strref(v->name);
  1115. if (name != NULL) { /* Only consider remaining valid gotos/labels. */
  1116. if (gola_islabel(v)) {
  1117. VarInfo *vg;
  1118. setgcrefnull(v->name); /* Invalidate label that goes out of scope. */
  1119. for (vg = v+1; vg < ve; vg++) /* Resolve pending backward gotos. */
  1120. if (strref(vg->name) == name && gola_isgoto(vg)) {
  1121. if ((bl->flags&FSCOPE_UPVAL) && vg->slot > v->slot)
  1122. gola_close(ls, vg);
  1123. gola_patch(ls, vg, v);
  1124. }
  1125. } else if (gola_isgoto(v)) {
  1126. if (bl->prev) { /* Propagate goto or break to outer scope. */
  1127. bl->prev->flags |= name == NAME_BREAK ? FSCOPE_BREAK : FSCOPE_GOLA;
  1128. v->slot = bl->nactvar;
  1129. if ((bl->flags & FSCOPE_UPVAL))
  1130. gola_close(ls, v);
  1131. } else { /* No outer scope: undefined goto label or no loop. */
  1132. ls->linenumber = ls->fs->bcbase[v->startpc].line;
  1133. if (name == NAME_BREAK)
  1134. lj_lex_error(ls, 0, LJ_ERR_XBREAK);
  1135. else
  1136. lj_lex_error(ls, 0, LJ_ERR_XLUNDEF, strdata(name));
  1137. }
  1138. }
  1139. }
  1140. }
  1141. }
  1142. /* Find existing label. */
  1143. static VarInfo *gola_findlabel(LexState *ls, GCstr *name)
  1144. {
  1145. VarInfo *v = ls->vstack + ls->fs->bl->vstart;
  1146. VarInfo *ve = ls->vstack + ls->vtop;
  1147. for (; v < ve; v++)
  1148. if (strref(v->name) == name && gola_islabel(v))
  1149. return v;
  1150. return NULL;
  1151. }
  1152. /* -- Scope handling ------------------------------------------------------ */
  1153. /* Begin a scope. */
  1154. static void fscope_begin(FuncState *fs, FuncScope *bl, int flags)
  1155. {
  1156. bl->nactvar = (uint8_t)fs->nactvar;
  1157. bl->flags = flags;
  1158. bl->vstart = fs->ls->vtop;
  1159. bl->prev = fs->bl;
  1160. fs->bl = bl;
  1161. lua_assert(fs->freereg == fs->nactvar);
  1162. }
  1163. /* End a scope. */
  1164. static void fscope_end(FuncState *fs)
  1165. {
  1166. FuncScope *bl = fs->bl;
  1167. LexState *ls = fs->ls;
  1168. fs->bl = bl->prev;
  1169. var_remove(ls, bl->nactvar);
  1170. fs->freereg = fs->nactvar;
  1171. lua_assert(bl->nactvar == fs->nactvar);
  1172. if ((bl->flags & (FSCOPE_UPVAL|FSCOPE_NOCLOSE)) == FSCOPE_UPVAL)
  1173. bcemit_AJ(fs, BC_UCLO, bl->nactvar, 0);
  1174. if ((bl->flags & FSCOPE_BREAK)) {
  1175. if ((bl->flags & FSCOPE_LOOP)) {
  1176. MSize idx = gola_new(ls, NAME_BREAK, VSTACK_LABEL, fs->pc);
  1177. ls->vtop = idx; /* Drop break label immediately. */
  1178. gola_resolve(ls, bl, idx);
  1179. return;
  1180. } /* else: need the fixup step to propagate the breaks. */
  1181. } else if (!(bl->flags & FSCOPE_GOLA)) {
  1182. return;
  1183. }
  1184. gola_fixup(ls, bl);
  1185. }
  1186. /* Mark scope as having an upvalue. */
  1187. static void fscope_uvmark(FuncState *fs, BCReg level)
  1188. {
  1189. FuncScope *bl;
  1190. for (bl = fs->bl; bl && bl->nactvar > level; bl = bl->prev)
  1191. ;
  1192. if (bl)
  1193. bl->flags |= FSCOPE_UPVAL;
  1194. }
  1195. /* -- Function state management ------------------------------------------- */
  1196. /* Fixup bytecode for prototype. */
  1197. static void fs_fixup_bc(FuncState *fs, GCproto *pt, BCIns *bc, MSize n)
  1198. {
  1199. BCInsLine *base = fs->bcbase;
  1200. MSize i;
  1201. pt->sizebc = n;
  1202. bc[0] = BCINS_AD((fs->flags & PROTO_VARARG) ? BC_FUNCV : BC_FUNCF,
  1203. fs->framesize, 0);
  1204. for (i = 1; i < n; i++)
  1205. bc[i] = base[i].ins;
  1206. }
  1207. /* Fixup upvalues for child prototype, step #2. */
  1208. static void fs_fixup_uv2(FuncState *fs, GCproto *pt)
  1209. {
  1210. VarInfo *vstack = fs->ls->vstack;
  1211. uint16_t *uv = proto_uv(pt);
  1212. MSize i, n = pt->sizeuv;
  1213. for (i = 0; i < n; i++) {
  1214. VarIndex vidx = uv[i];
  1215. if (vidx >= LJ_MAX_VSTACK)
  1216. uv[i] = vidx - LJ_MAX_VSTACK;
  1217. else if ((vstack[vidx].info & VSTACK_VAR_RW))
  1218. uv[i] = vstack[vidx].slot | PROTO_UV_LOCAL;
  1219. else
  1220. uv[i] = vstack[vidx].slot | PROTO_UV_LOCAL | PROTO_UV_IMMUTABLE;
  1221. }
  1222. }
  1223. /* Fixup constants for prototype. */
  1224. static void fs_fixup_k(FuncState *fs, GCproto *pt, void *kptr)
  1225. {
  1226. GCtab *kt;
  1227. TValue *array;
  1228. Node *node;
  1229. MSize i, hmask;
  1230. checklimitgt(fs, fs->nkn, BCMAX_D+1, "constants");
  1231. checklimitgt(fs, fs->nkgc, BCMAX_D+1, "constants");
  1232. setmref(pt->k, kptr);
  1233. pt->sizekn = fs->nkn;
  1234. pt->sizekgc = fs->nkgc;
  1235. kt = fs->kt;
  1236. array = tvref(kt->array);
  1237. for (i = 0; i < kt->asize; i++)
  1238. if (tvhaskslot(&array[i])) {
  1239. TValue *tv = &((TValue *)kptr)[tvkslot(&array[i])];
  1240. if (LJ_DUALNUM)
  1241. setintV(tv, (int32_t)i);
  1242. else
  1243. setnumV(tv, (lua_Number)i);
  1244. }
  1245. node = noderef(kt->node);
  1246. hmask = kt->hmask;
  1247. for (i = 0; i <= hmask; i++) {
  1248. Node *n = &node[i];
  1249. if (tvhaskslot(&n->val)) {
  1250. ptrdiff_t kidx = (ptrdiff_t)tvkslot(&n->val);
  1251. lua_assert(!tvisint(&n->key));
  1252. if (tvisnum(&n->key)) {
  1253. TValue *tv = &((TValue *)kptr)[kidx];
  1254. if (LJ_DUALNUM) {
  1255. lua_Number nn = numV(&n->key);
  1256. int32_t k = lj_num2int(nn);
  1257. lua_assert(!tvismzero(&n->key));
  1258. if ((lua_Number)k == nn)
  1259. setintV(tv, k);
  1260. else
  1261. *tv = n->key;
  1262. } else {
  1263. *tv = n->key;
  1264. }
  1265. } else {
  1266. GCobj *o = gcV(&n->key);
  1267. setgcref(((GCRef *)kptr)[~kidx], o);
  1268. lj_gc_objbarrier(fs->L, pt, o);
  1269. if (tvisproto(&n->key))
  1270. fs_fixup_uv2(fs, gco2pt(o));
  1271. }
  1272. }
  1273. }
  1274. }
  1275. /* Fixup upvalues for prototype, step #1. */
  1276. static void fs_fixup_uv1(FuncState *fs, GCproto *pt, uint16_t *uv)
  1277. {
  1278. setmref(pt->uv, uv);
  1279. pt->sizeuv = fs->nuv;
  1280. memcpy(uv, fs->uvtmp, fs->nuv*sizeof(VarIndex));
  1281. }
  1282. #ifndef LUAJIT_DISABLE_DEBUGINFO
  1283. /* Prepare lineinfo for prototype. */
  1284. static size_t fs_prep_line(FuncState *fs, BCLine numline)
  1285. {
  1286. return (fs->pc-1) << (numline < 256 ? 0 : numline < 65536 ? 1 : 2);
  1287. }
  1288. /* Fixup lineinfo for prototype. */
  1289. static void fs_fixup_line(FuncState *fs, GCproto *pt,
  1290. void *lineinfo, BCLine numline)
  1291. {
  1292. BCInsLine *base = fs->bcbase + 1;
  1293. BCLine first = fs->linedefined;
  1294. MSize i = 0, n = fs->pc-1;
  1295. pt->firstline = fs->linedefined;
  1296. pt->numline = numline;
  1297. setmref(pt->lineinfo, lineinfo);
  1298. if (LJ_LIKELY(numline < 256)) {
  1299. uint8_t *li = (uint8_t *)lineinfo;
  1300. do {
  1301. BCLine delta = base[i].line - first;
  1302. lua_assert(delta >= 0 && delta < 256);
  1303. li[i] = (uint8_t)delta;
  1304. } while (++i < n);
  1305. } else if (LJ_LIKELY(numline < 65536)) {
  1306. uint16_t *li = (uint16_t *)lineinfo;
  1307. do {
  1308. BCLine delta = base[i].line - first;
  1309. lua_assert(delta >= 0 && delta < 65536);
  1310. li[i] = (uint16_t)delta;
  1311. } while (++i < n);
  1312. } else {
  1313. uint32_t *li = (uint32_t *)lineinfo;
  1314. do {
  1315. BCLine delta = base[i].line - first;
  1316. lua_assert(delta >= 0);
  1317. li[i] = (uint32_t)delta;
  1318. } while (++i < n);
  1319. }
  1320. }
  1321. /* Resize buffer if needed. */
  1322. static LJ_NOINLINE void fs_buf_resize(LexState *ls, MSize len)
  1323. {
  1324. MSize sz = ls->sb.sz * 2;
  1325. while (ls->sb.n + len > sz) sz = sz * 2;
  1326. lj_str_resizebuf(ls->L, &ls->sb, sz);
  1327. }
  1328. static LJ_AINLINE void fs_buf_need(LexState *ls, MSize len)
  1329. {
  1330. if (LJ_UNLIKELY(ls->sb.n + len > ls->sb.sz))
  1331. fs_buf_resize(ls, len);
  1332. }
  1333. /* Add string to buffer. */
  1334. static void fs_buf_str(LexState *ls, const char *str, MSize len)
  1335. {
  1336. char *p = ls->sb.buf + ls->sb.n;
  1337. MSize i;
  1338. ls->sb.n += len;
  1339. for (i = 0; i < len; i++) p[i] = str[i];
  1340. }
  1341. /* Add ULEB128 value to buffer. */
  1342. static void fs_buf_uleb128(LexState *ls, uint32_t v)
  1343. {
  1344. MSize n = ls->sb.n;
  1345. uint8_t *p = (uint8_t *)ls->sb.buf;
  1346. for (; v >= 0x80; v >>= 7)
  1347. p[n++] = (uint8_t)((v & 0x7f) | 0x80);
  1348. p[n++] = (uint8_t)v;
  1349. ls->sb.n = n;
  1350. }
  1351. /* Prepare variable info for prototype. */
  1352. static size_t fs_prep_var(LexState *ls, FuncState *fs, size_t *ofsvar)
  1353. {
  1354. VarInfo *vs =ls->vstack, *ve;
  1355. MSize i, n;
  1356. BCPos lastpc;
  1357. lj_str_resetbuf(&ls->sb); /* Copy to temp. string buffer. */
  1358. /* Store upvalue names. */
  1359. for (i = 0, n = fs->nuv; i < n; i++) {
  1360. GCstr *s = strref(vs[fs->uvmap[i]].name);
  1361. MSize len = s->len+1;
  1362. fs_buf_need(ls, len);
  1363. fs_buf_str(ls, strdata(s), len);
  1364. }
  1365. *ofsvar = ls->sb.n;
  1366. lastpc = 0;
  1367. /* Store local variable names and compressed ranges. */
  1368. for (ve = vs + ls->vtop, vs += fs->vbase; vs < ve; vs++) {
  1369. if (!gola_isgotolabel(vs)) {
  1370. GCstr *s = strref(vs->name);
  1371. BCPos startpc;
  1372. if ((uintptr_t)s < VARNAME__MAX) {
  1373. fs_buf_need(ls, 1 + 2*5);
  1374. ls->sb.buf[ls->sb.n++] = (uint8_t)(uintptr_t)s;
  1375. } else {
  1376. MSize len = s->len+1;
  1377. fs_buf_need(ls, len + 2*5);
  1378. fs_buf_str(ls, strdata(s), len);
  1379. }
  1380. startpc = vs->startpc;
  1381. fs_buf_uleb128(ls, startpc-lastpc);
  1382. fs_buf_uleb128(ls, vs->endpc-startpc);
  1383. lastpc = startpc;
  1384. }
  1385. }
  1386. fs_buf_need(ls, 1);
  1387. ls->sb.buf[ls->sb.n++] = '\0'; /* Terminator for varinfo. */
  1388. return ls->sb.n;
  1389. }
  1390. /* Fixup variable info for prototype. */
  1391. static void fs_fixup_var(LexState *ls, GCproto *pt, uint8_t *p, size_t ofsvar)
  1392. {
  1393. setmref(pt->uvinfo, p);
  1394. setmref(pt->varinfo, (char *)p + ofsvar);
  1395. memcpy(p, ls->sb.buf, ls->sb.n); /* Copy from temp. string buffer. */
  1396. }
  1397. #else
  1398. /* Initialize with empty debug info, if disabled. */
  1399. #define fs_prep_line(fs, numline) (UNUSED(numline), 0)
  1400. #define fs_fixup_line(fs, pt, li, numline) \
  1401. pt->firstline = pt->numline = 0, setmref((pt)->lineinfo, NULL)
  1402. #define fs_prep_var(ls, fs, ofsvar) (UNUSED(ofsvar), 0)
  1403. #define fs_fixup_var(ls, pt, p, ofsvar) \
  1404. setmref((pt)->uvinfo, NULL), setmref((pt)->varinfo, NULL)
  1405. #endif
  1406. /* Check if bytecode op returns. */
  1407. static int bcopisret(BCOp op)
  1408. {
  1409. switch (op) {
  1410. case BC_CALLMT: case BC_CALLT:
  1411. case BC_RETM: case BC_RET: case BC_RET0: case BC_RET1:
  1412. return 1;
  1413. default:
  1414. return 0;
  1415. }
  1416. }
  1417. /* Fixup return instruction for prototype. */
  1418. static void fs_fixup_ret(FuncState *fs)
  1419. {
  1420. BCPos lastpc = fs->pc;
  1421. if (lastpc <= fs->lasttarget || !bcopisret(bc_op(fs->bcbase[lastpc-1].ins))) {
  1422. if ((fs->bl->flags & FSCOPE_UPVAL))
  1423. bcemit_AJ(fs, BC_UCLO, 0, 0);
  1424. bcemit_AD(fs, BC_RET0, 0, 1); /* Need final return. */
  1425. }
  1426. fs->bl->flags |= FSCOPE_NOCLOSE; /* Handled above. */
  1427. fscope_end(fs);
  1428. lua_assert(fs->bl == NULL);
  1429. /* May need to fixup returns encoded before first function was created. */
  1430. if (fs->flags & PROTO_FIXUP_RETURN) {
  1431. BCPos pc;
  1432. for (pc = 1; pc < lastpc; pc++) {
  1433. BCIns ins = fs->bcbase[pc].ins;
  1434. BCPos offset;
  1435. switch (bc_op(ins)) {
  1436. case BC_CALLMT: case BC_CALLT:
  1437. case BC_RETM: case BC_RET: case BC_RET0: case BC_RET1:
  1438. offset = bcemit_INS(fs, ins); /* Copy original instruction. */
  1439. fs->bcbase[offset].line = fs->bcbase[pc].line;
  1440. offset = offset-(pc+1)+BCBIAS_J;
  1441. if (offset > BCMAX_D)
  1442. err_syntax(fs->ls, LJ_ERR_XFIXUP);
  1443. /* Replace with UCLO plus branch. */
  1444. fs->bcbase[pc].ins = BCINS_AD(BC_UCLO, 0, offset);
  1445. break;
  1446. case BC_UCLO:
  1447. return; /* We're done. */
  1448. default:
  1449. break;
  1450. }
  1451. }
  1452. }
  1453. }
  1454. /* Finish a FuncState and return the new prototype. */
  1455. static GCproto *fs_finish(LexState *ls, BCLine line)
  1456. {
  1457. lua_State *L = ls->L;
  1458. FuncState *fs = ls->fs;
  1459. BCLine numline = line - fs->linedefined;
  1460. size_t sizept, ofsk, ofsuv, ofsli, ofsdbg, ofsvar;
  1461. GCproto *pt;
  1462. /* Apply final fixups. */
  1463. fs_fixup_ret(fs);
  1464. /* Calculate total size of prototype including all colocated arrays. */
  1465. sizept = sizeof(GCproto) + fs->pc*sizeof(BCIns) + fs->nkgc*sizeof(GCRef);
  1466. sizept = (sizept + sizeof(TValue)-1) & ~(sizeof(TValue)-1);
  1467. ofsk = sizept; sizept += fs->nkn*sizeof(TValue);
  1468. ofsuv = sizept; sizept += ((fs->nuv+1)&~1)*2;
  1469. ofsli = sizept; sizept += fs_prep_line(fs, numline);
  1470. ofsdbg = sizept; sizept += fs_prep_var(ls, fs, &ofsvar);
  1471. /* Allocate prototype and initialize its fields. */
  1472. pt = (GCproto *)lj_mem_newgco(L, (MSize)sizept);
  1473. pt->gct = ~LJ_TPROTO;
  1474. pt->sizept = (MSize)sizept;
  1475. pt->trace = 0;
  1476. pt->flags = (uint8_t)(fs->flags & ~(PROTO_HAS_RETURN|PROTO_FIXUP_RETURN));
  1477. pt->numparams = fs->numparams;
  1478. pt->framesize = fs->framesize;
  1479. setgcref(pt->chunkname, obj2gco(ls->chunkname));
  1480. /* Close potentially uninitialized gap between bc and kgc. */
  1481. *(uint32_t *)((char *)pt + ofsk - sizeof(GCRef)*(fs->nkgc+1)) = 0;
  1482. fs_fixup_bc(fs, pt, (BCIns *)((char *)pt + sizeof(GCproto)), fs->pc);
  1483. fs_fixup_k(fs, pt, (void *)((char *)pt + ofsk));
  1484. fs_fixup_uv1(fs, pt, (uint16_t *)((char *)pt + ofsuv));
  1485. fs_fixup_line(fs, pt, (void *)((char *)pt + ofsli), numline);
  1486. fs_fixup_var(ls, pt, (uint8_t *)((char *)pt + ofsdbg), ofsvar);
  1487. lj_vmevent_send(L, BC,
  1488. setprotoV(L, L->top++, pt);
  1489. );
  1490. L->top--; /* Pop table of constants. */
  1491. ls->vtop = fs->vbase; /* Reset variable stack. */
  1492. ls->fs = fs->prev;
  1493. lua_assert(ls->fs != NULL || ls->token == TK_eof);
  1494. return pt;
  1495. }
  1496. /* Initialize a new FuncState. */
  1497. static void fs_init(LexState *ls, FuncState *fs)
  1498. {
  1499. lua_State *L = ls->L;
  1500. fs->prev = ls->fs; ls->fs = fs; /* Append to list. */
  1501. fs->ls = ls;
  1502. fs->vbase = ls->vtop;
  1503. fs->L = L;
  1504. fs->pc = 0;
  1505. fs->lasttarget = 0;
  1506. fs->jpc = NO_JMP;
  1507. fs->freereg = 0;
  1508. fs->nkgc = 0;
  1509. fs->nkn = 0;
  1510. fs->nactvar = 0;
  1511. fs->nuv = 0;
  1512. fs->bl = NULL;
  1513. fs->flags = 0;
  1514. fs->framesize = 1; /* Minimum frame size. */
  1515. fs->kt = lj_tab_new(L, 0, 0);
  1516. /* Anchor table of constants in stack to avoid being collected. */
  1517. settabV(L, L->top, fs->kt);
  1518. incr_top(L);
  1519. }
  1520. /* -- Expressions --------------------------------------------------------- */
  1521. /* Forward declaration. */
  1522. static void expr(LexState *ls, ExpDesc *v);
  1523. /* Return string expression. */
  1524. static void expr_str(LexState *ls, ExpDesc *e)
  1525. {
  1526. expr_init(e, VKSTR, 0);
  1527. e->u.sval = lex_str(ls);
  1528. }
  1529. /* Return index expression. */
  1530. static void expr_index(FuncState *fs, ExpDesc *t, ExpDesc *e)
  1531. {
  1532. /* Already called: expr_toval(fs, e). */
  1533. t->k = VINDEXED;
  1534. if (expr_isnumk(e)) {
  1535. #if LJ_DUALNUM
  1536. if (tvisint(expr_numtv(e))) {
  1537. int32_t k = intV(expr_numtv(e));
  1538. if (checku8(k)) {
  1539. t->u.s.aux = BCMAX_C+1+(uint32_t)k; /* 256..511: const byte key */
  1540. return;
  1541. }
  1542. }
  1543. #else
  1544. lua_Number n = expr_numberV(e);
  1545. int32_t k = lj_num2int(n);
  1546. if (checku8(k) && n == (lua_Number)k) {
  1547. t->u.s.aux = BCMAX_C+1+(uint32_t)k; /* 256..511: const byte key */
  1548. return;
  1549. }
  1550. #endif
  1551. } else if (expr_isstrk(e)) {
  1552. BCReg idx = const_str(fs, e);
  1553. if (idx <= BCMAX_C) {
  1554. t->u.s.aux = ~idx; /* -256..-1: const string key */
  1555. return;
  1556. }
  1557. }
  1558. t->u.s.aux = expr_toanyreg(fs, e); /* 0..255: register */
  1559. }
  1560. /* Parse index expression with named field. */
  1561. static void expr_field(LexState *ls, ExpDesc *v)
  1562. {
  1563. FuncState *fs = ls->fs;
  1564. ExpDesc key;
  1565. expr_toanyreg(fs, v);
  1566. lj_lex_next(ls); /* Skip dot or colon. */
  1567. expr_str(ls, &key);
  1568. expr_index(fs, v, &key);
  1569. }
  1570. /* Parse index expression with brackets. */
  1571. static void expr_bracket(LexState *ls, ExpDesc *v)
  1572. {
  1573. lj_lex_next(ls); /* Skip '['. */
  1574. expr(ls, v);
  1575. expr_toval(ls->fs, v);
  1576. lex_check(ls, ']');
  1577. }
  1578. /* Get value of constant expression. */
  1579. static void expr_kvalue(TValue *v, ExpDesc *e)
  1580. {
  1581. if (e->k <= VKTRUE) {
  1582. setitype(v, ~(uint32_t)e->k);
  1583. } else if (e->k == VKSTR) {
  1584. setgcref(v->gcr, obj2gco(e->u.sval));
  1585. setitype(v, LJ_TSTR);
  1586. } else {
  1587. lua_assert(tvisnumber(expr_numtv(e)));
  1588. *v = *expr_numtv(e);
  1589. }
  1590. }
  1591. /* Parse table constructor expression. */
  1592. static void expr_table(LexState *ls, ExpDesc *e)
  1593. {
  1594. FuncState *fs = ls->fs;
  1595. BCLine line = ls->linenumber;
  1596. GCtab *t = NULL;
  1597. int vcall = 0, needarr = 0, fixt = 0;
  1598. uint32_t narr = 1; /* First array index. */
  1599. uint32_t nhash = 0; /* Number of hash entries. */
  1600. BCReg freg = fs->freereg;
  1601. BCPos pc = bcemit_AD(fs, BC_TNEW, freg, 0);
  1602. expr_init(e, VNONRELOC, freg);
  1603. bcreg_reserve(fs, 1);
  1604. freg++;
  1605. lex_check(ls, '{');
  1606. while (ls->token != '}') {
  1607. ExpDesc key, val;
  1608. vcall = 0;
  1609. if (ls->token == '[') {
  1610. expr_bracket(ls, &key); /* Already calls expr_toval. */
  1611. if (!expr_isk(&key)) expr_index(fs, e, &key);
  1612. if (expr_isnumk(&key) && expr_numiszero(&key)) needarr = 1; else nhash++;
  1613. lex_check(ls, '=');
  1614. } else if ((ls->token == TK_name || (!LJ_52 && ls->token == TK_goto)) &&
  1615. lj_lex_lookahead(ls) == '=') {
  1616. expr_str(ls, &key);
  1617. lex_check(ls, '=');
  1618. nhash++;
  1619. } else {
  1620. expr_init(&key, VKNUM, 0);
  1621. setintV(&key.u.nval, (int)narr);
  1622. narr++;
  1623. needarr = vcall = 1;
  1624. }
  1625. expr(ls, &val);
  1626. if (expr_isk(&key) && key.k != VKNIL &&
  1627. (key.k == VKSTR || expr_isk_nojump(&val))) {
  1628. TValue k, *v;
  1629. if (!t) { /* Create template table on demand. */
  1630. BCReg kidx;
  1631. t = lj_tab_new(fs->L, needarr ? narr : 0, hsize2hbits(nhash));
  1632. kidx = const_gc(fs, obj2gco(t), LJ_TTAB);
  1633. fs->bcbase[pc].ins = BCINS_AD(BC_TDUP, freg-1, kidx);
  1634. }
  1635. vcall = 0;
  1636. expr_kvalue(&k, &key);
  1637. v = lj_tab_set(fs->L, t, &k);
  1638. lj_gc_anybarriert(fs->L, t);
  1639. if (expr_isk_nojump(&val)) { /* Add const key/value to template table. */
  1640. expr_kvalue(v, &val);
  1641. } else { /* Otherwise create dummy string key (avoids lj_tab_newkey). */
  1642. settabV(fs->L, v, t); /* Preserve key with table itself as value. */
  1643. fixt = 1; /* Fix this later, after all resizes. */
  1644. goto nonconst;
  1645. }
  1646. } else {
  1647. nonconst:
  1648. if (val.k != VCALL) { expr_toanyreg(fs, &val); vcall = 0; }
  1649. if (expr_isk(&key)) expr_index(fs, e, &key);
  1650. bcemit_store(fs, e, &val);
  1651. }
  1652. fs->freereg = freg;
  1653. if (!lex_opt(ls, ',') && !lex_opt(ls, ';')) break;
  1654. }
  1655. lex_match(ls, '}', '{', line);
  1656. if (vcall) {
  1657. BCInsLine *ilp = &fs->bcbase[fs->pc-1];
  1658. ExpDesc en;
  1659. lua_assert(bc_a(ilp->ins) == freg &&
  1660. bc_op(ilp->ins) == (narr > 256 ? BC_TSETV : BC_TSETB));
  1661. expr_init(&en, VKNUM, 0);
  1662. en.u.nval.u32.lo = narr-1;
  1663. en.u.nval.u32.hi = 0x43300000; /* Biased integer to avoid denormals. */
  1664. if (narr > 256) { fs->pc--; ilp--; }
  1665. ilp->ins = BCINS_AD(BC_TSETM, freg, const_num(fs, &en));
  1666. setbc_b(&ilp[-1].ins, 0);
  1667. }
  1668. if (pc == fs->pc-1) { /* Make expr relocable if possible. */
  1669. e->u.s.info = pc;
  1670. fs->freereg--;
  1671. e->k = VRELOCABLE;
  1672. } else {
  1673. e->k = VNONRELOC; /* May have been changed by expr_index. */
  1674. }
  1675. if (!t) { /* Construct TNEW RD: hhhhhaaaaaaaaaaa. */
  1676. BCIns *ip = &fs->bcbase[pc].ins;
  1677. if (!needarr) narr = 0;
  1678. else if (narr < 3) narr = 3;
  1679. else if (narr > 0x7ff) narr = 0x7ff;
  1680. setbc_d(ip, narr|(hsize2hbits(nhash)<<11));
  1681. } else {
  1682. if (needarr && t->asize < narr)
  1683. lj_tab_reasize(fs->L, t, narr-1);
  1684. if (fixt) { /* Fix value for dummy keys in template table. */
  1685. Node *node = noderef(t->node);
  1686. uint32_t i, hmask = t->hmask;
  1687. for (i = 0; i <= hmask; i++) {
  1688. Node *n = &node[i];
  1689. if (tvistab(&n->val)) {
  1690. lua_assert(tabV(&n->val) == t);
  1691. setnilV(&n->val); /* Turn value into nil. */
  1692. }
  1693. }
  1694. }
  1695. lj_gc_check(fs->L);
  1696. }
  1697. }
  1698. /* Parse function parameters. */
  1699. static BCReg parse_params(LexState *ls, int needself)
  1700. {
  1701. FuncState *fs = ls->fs;
  1702. BCReg nparams = 0;
  1703. lex_check(ls, '(');
  1704. if (needself)
  1705. var_new_lit(ls, nparams++, "self");
  1706. if (ls->token != ')') {
  1707. do {
  1708. if (ls->token == TK_name || (!LJ_52 && ls->token == TK_goto)) {
  1709. var_new(ls, nparams++, lex_str(ls));
  1710. } else if (ls->token == TK_dots) {
  1711. lj_lex_next(ls);
  1712. fs->flags |= PROTO_VARARG;
  1713. break;
  1714. } else {
  1715. err_syntax(ls, LJ_ERR_XPARAM);
  1716. }
  1717. } while (lex_opt(ls, ','));
  1718. }
  1719. var_add(ls, nparams);
  1720. lua_assert(fs->nactvar == nparams);
  1721. bcreg_reserve(fs, nparams);
  1722. lex_check(ls, ')');
  1723. return nparams;
  1724. }
  1725. /* Forward declaration. */
  1726. static void parse_chunk(LexState *ls);
  1727. /* Parse body of a function. */
  1728. static void parse_body(LexState *ls, ExpDesc *e, int needself, BCLine line)
  1729. {
  1730. FuncState fs, *pfs = ls->fs;
  1731. FuncScope bl;
  1732. GCproto *pt;
  1733. ptrdiff_t oldbase = pfs->bcbase - ls->bcstack;
  1734. fs_init(ls, &fs);
  1735. fscope_begin(&fs, &bl, 0);
  1736. fs.linedefined = line;
  1737. fs.numparams = (uint8_t)parse_params(ls, needself);
  1738. fs.bcbase = pfs->bcbase + pfs->pc;
  1739. fs.bclim = pfs->bclim - pfs->pc;
  1740. bcemit_AD(&fs, BC_FUNCF, 0, 0); /* Placeholder. */
  1741. parse_chunk(ls);
  1742. if (ls->token != TK_end) lex_match(ls, TK_end, TK_function, line);
  1743. pt = fs_finish(ls, (ls->lastline = ls->linenumber));
  1744. pfs->bcbase = ls->bcstack + oldbase; /* May have been reallocated. */
  1745. pfs->bclim = (BCPos)(ls->sizebcstack - oldbase);
  1746. /* Store new prototype in the constant array of the parent. */
  1747. expr_init(e, VRELOCABLE,
  1748. bcemit_AD(pfs, BC_FNEW, 0, const_gc(pfs, obj2gco(pt), LJ_TPROTO)));
  1749. #if LJ_HASFFI
  1750. pfs->flags |= (fs.flags & PROTO_FFI);
  1751. #endif
  1752. if (!(pfs->flags & PROTO_CHILD)) {
  1753. if (pfs->flags & PROTO_HAS_RETURN)
  1754. pfs->flags |= PROTO_FIXUP_RETURN;
  1755. pfs->flags |= PROTO_CHILD;
  1756. }
  1757. lj_lex_next(ls);
  1758. }
  1759. /* Parse expression list. Last expression is left open. */
  1760. static BCReg expr_list(LexState *ls, ExpDesc *v)
  1761. {
  1762. BCReg n = 1;
  1763. expr(ls, v);
  1764. while (lex_opt(ls, ',')) {
  1765. expr_tonextreg(ls->fs, v);
  1766. expr(ls, v);
  1767. n++;
  1768. }
  1769. return n;
  1770. }
  1771. /* Parse function argument list. */
  1772. static void parse_args(LexState *ls, ExpDesc *e)
  1773. {
  1774. FuncState *fs = ls->fs;
  1775. ExpDesc args;
  1776. BCIns ins;
  1777. BCReg base;
  1778. BCLine line = ls->linenumber;
  1779. if (ls->token == '(') {
  1780. #if !LJ_52
  1781. if (line != ls->lastline)
  1782. err_syntax(ls, LJ_ERR_XAMBIG);
  1783. #endif
  1784. lj_lex_next(ls);
  1785. if (ls->token == ')') { /* f(). */
  1786. args.k = VVOID;
  1787. } else {
  1788. expr_list(ls, &args);
  1789. if (args.k == VCALL) /* f(a, b, g()) or f(a, b, ...). */
  1790. setbc_b(bcptr(fs, &args), 0); /* Pass on multiple results. */
  1791. }
  1792. lex_match(ls, ')', '(', line);
  1793. } else if (ls->token == '{') {
  1794. expr_table(ls, &args);
  1795. } else if (ls->token == TK_string) {
  1796. expr_init(&args, VKSTR, 0);
  1797. args.u.sval = strV(&ls->tokenval);
  1798. lj_lex_next(ls);
  1799. } else {
  1800. err_syntax(ls, LJ_ERR_XFUNARG);
  1801. return; /* Silence compiler. */
  1802. }
  1803. lua_assert(e->k == VNONRELOC);
  1804. base = e->u.s.info; /* Base register for call. */
  1805. if (args.k == VCALL) {
  1806. ins = BCINS_ABC(BC_CALLM, base, 2, args.u.s.aux - base - 1);
  1807. } else {
  1808. if (args.k != VVOID)
  1809. expr_tonextreg(fs, &args);
  1810. ins = BCINS_ABC(BC_CALL, base, 2, fs->freereg - base);
  1811. }
  1812. expr_init(e, VCALL, bcemit_INS(fs, ins));
  1813. e->u.s.aux = base;
  1814. fs->bcbase[fs->pc - 1].line = line;
  1815. fs->freereg = base+1; /* Leave one result by default. */
  1816. }
  1817. /* Parse primary expression. */
  1818. static void expr_primary(LexState *ls, ExpDesc *v)
  1819. {
  1820. FuncState *fs = ls->fs;
  1821. /* Parse prefix expression. */
  1822. if (ls->token == '(') {
  1823. BCLine line = ls->linenumber;
  1824. lj_lex_next(ls);
  1825. expr(ls, v);
  1826. lex_match(ls, ')', '(', line);
  1827. expr_discharge(ls->fs, v);
  1828. } else if (ls->token == TK_name || (!LJ_52 && ls->token == TK_goto)) {
  1829. var_lookup(ls, v);
  1830. } else {
  1831. err_syntax(ls, LJ_ERR_XSYMBOL);
  1832. }
  1833. for (;;) { /* Parse multiple expression suffixes. */
  1834. if (ls->token == '.') {
  1835. expr_field(ls, v);
  1836. } else if (ls->token == '[') {
  1837. ExpDesc key;
  1838. expr_toanyreg(fs, v);
  1839. expr_bracket(ls, &key);
  1840. expr_index(fs, v, &key);
  1841. } else if (ls->token == ':') {
  1842. ExpDesc key;
  1843. lj_lex_next(ls);
  1844. expr_str(ls, &key);
  1845. bcemit_method(fs, v, &key);
  1846. parse_args(ls, v);
  1847. } else if (ls->token == '(' || ls->token == TK_string || ls->token == '{') {
  1848. expr_tonextreg(fs, v);
  1849. parse_args(ls, v);
  1850. } else {
  1851. break;
  1852. }
  1853. }
  1854. }
  1855. /* Parse simple expression. */
  1856. static void expr_simple(LexState *ls, ExpDesc *v)
  1857. {
  1858. switch (ls->token) {
  1859. case TK_number:
  1860. expr_init(v, (LJ_HASFFI && tviscdata(&ls->tokenval)) ? VKCDATA : VKNUM, 0);
  1861. copyTV(ls->L, &v->u.nval, &ls->tokenval);
  1862. break;
  1863. case TK_string:
  1864. expr_init(v, VKSTR, 0);
  1865. v->u.sval = strV(&ls->tokenval);
  1866. break;
  1867. case TK_nil:
  1868. expr_init(v, VKNIL, 0);
  1869. break;
  1870. case TK_true:
  1871. expr_init(v, VKTRUE, 0);
  1872. break;
  1873. case TK_false:
  1874. expr_init(v, VKFALSE, 0);
  1875. break;
  1876. case TK_dots: { /* Vararg. */
  1877. FuncState *fs = ls->fs;
  1878. BCReg base;
  1879. checkcond(ls, fs->flags & PROTO_VARARG, LJ_ERR_XDOTS);
  1880. bcreg_reserve(fs, 1);
  1881. base = fs->freereg-1;
  1882. expr_init(v, VCALL, bcemit_ABC(fs, BC_VARG, base, 2, fs->numparams));
  1883. v->u.s.aux = base;
  1884. break;
  1885. }
  1886. case '{': /* Table constructor. */
  1887. expr_table(ls, v);
  1888. return;
  1889. case TK_function:
  1890. lj_lex_next(ls);
  1891. parse_body(ls, v, 0, ls->linenumber);
  1892. return;
  1893. default:
  1894. expr_primary(ls, v);
  1895. return;
  1896. }
  1897. lj_lex_next(ls);
  1898. }
  1899. /* Manage syntactic levels to avoid blowing up the stack. */
  1900. static void synlevel_begin(LexState *ls)
  1901. {
  1902. if (++ls->level >= LJ_MAX_XLEVEL)
  1903. lj_lex_error(ls, 0, LJ_ERR_XLEVELS);
  1904. }
  1905. #define synlevel_end(ls) ((ls)->level--)
  1906. /* Convert token to binary operator. */
  1907. static BinOpr token2binop(LexToken tok)
  1908. {
  1909. switch (tok) {
  1910. case '+': return OPR_ADD;
  1911. case '-': return OPR_SUB;
  1912. case '*': return OPR_MUL;
  1913. case '/': return OPR_DIV;
  1914. case '%': return OPR_MOD;
  1915. case '^': return OPR_POW;
  1916. case TK_concat: return OPR_CONCAT;
  1917. case TK_ne: return OPR_NE;
  1918. case TK_eq: return OPR_EQ;
  1919. case '<': return OPR_LT;
  1920. case TK_le: return OPR_LE;
  1921. case '>': return OPR_GT;
  1922. case TK_ge: return OPR_GE;
  1923. case TK_and: return OPR_AND;
  1924. case TK_or: return OPR_OR;
  1925. default: return OPR_NOBINOPR;
  1926. }
  1927. }
  1928. /* Priorities for each binary operator. ORDER OPR. */
  1929. static const struct {
  1930. uint8_t left; /* Left priority. */
  1931. uint8_t right; /* Right priority. */
  1932. } priority[] = {
  1933. {6,6}, {6,6}, {7,7}, {7,7}, {7,7}, /* ADD SUB MUL DIV MOD */
  1934. {10,9}, {5,4}, /* POW CONCAT (right associative) */
  1935. {3,3}, {3,3}, /* EQ NE */
  1936. {3,3}, {3,3}, {3,3}, {3,3}, /* LT GE GT LE */
  1937. {2,2}, {1,1} /* AND OR */
  1938. };
  1939. #define UNARY_PRIORITY 8 /* Priority for unary operators. */
  1940. /* Forward declaration. */
  1941. static BinOpr expr_binop(LexState *ls, ExpDesc *v, uint32_t limit);
  1942. /* Parse unary expression. */
  1943. static void expr_unop(LexState *ls, ExpDesc *v)
  1944. {
  1945. BCOp op;
  1946. if (ls->token == TK_not) {
  1947. op = BC_NOT;
  1948. } else if (ls->token == '-') {
  1949. op = BC_UNM;
  1950. } else if (ls->token == '#') {
  1951. op = BC_LEN;
  1952. } else {
  1953. expr_simple(ls, v);
  1954. return;
  1955. }
  1956. lj_lex_next(ls);
  1957. expr_binop(ls, v, UNARY_PRIORITY);
  1958. bcemit_unop(ls->fs, op, v);
  1959. }
  1960. /* Parse binary expressions with priority higher than the limit. */
  1961. static BinOpr expr_binop(LexState *ls, ExpDesc *v, uint32_t limit)
  1962. {
  1963. BinOpr op;
  1964. synlevel_begin(ls);
  1965. expr_unop(ls, v);
  1966. op = token2binop(ls->token);
  1967. while (op != OPR_NOBINOPR && priority[op].left > limit) {
  1968. ExpDesc v2;
  1969. BinOpr nextop;
  1970. lj_lex_next(ls);
  1971. bcemit_binop_left(ls->fs, op, v);
  1972. /* Parse binary expression with higher priority. */
  1973. nextop = expr_binop(ls, &v2, priority[op].right);
  1974. bcemit_binop(ls->fs, op, v, &v2);
  1975. op = nextop;
  1976. }
  1977. synlevel_end(ls);
  1978. return op; /* Return unconsumed binary operator (if any). */
  1979. }
  1980. /* Parse expression. */
  1981. static void expr(LexState *ls, ExpDesc *v)
  1982. {
  1983. expr_binop(ls, v, 0); /* Priority 0: parse whole expression. */
  1984. }
  1985. /* Assign expression to the next register. */
  1986. static void expr_next(LexState *ls)
  1987. {
  1988. ExpDesc e;
  1989. expr(ls, &e);
  1990. expr_tonextreg(ls->fs, &e);
  1991. }
  1992. /* Parse conditional expression. */
  1993. static BCPos expr_cond(LexState *ls)
  1994. {
  1995. ExpDesc v;
  1996. expr(ls, &v);
  1997. if (v.k == VKNIL) v.k = VKFALSE;
  1998. bcemit_branch_t(ls->fs, &v);
  1999. return v.f;
  2000. }
  2001. /* -- Assignments --------------------------------------------------------- */
  2002. /* List of LHS variables. */
  2003. typedef struct LHSVarList {
  2004. ExpDesc v; /* LHS variable. */
  2005. struct LHSVarList *prev; /* Link to previous LHS variable. */
  2006. } LHSVarList;
  2007. /* Eliminate write-after-read hazards for local variable assignment. */
  2008. static void assign_hazard(LexState *ls, LHSVarList *lh, const ExpDesc *v)
  2009. {
  2010. FuncState *fs = ls->fs;
  2011. BCReg reg = v->u.s.info; /* Check against this variable. */
  2012. BCReg tmp = fs->freereg; /* Rename to this temp. register (if needed). */
  2013. int hazard = 0;
  2014. for (; lh; lh = lh->prev) {
  2015. if (lh->v.k == VINDEXED) {
  2016. if (lh->v.u.s.info == reg) { /* t[i], t = 1, 2 */
  2017. hazard = 1;
  2018. lh->v.u.s.info = tmp;
  2019. }
  2020. if (lh->v.u.s.aux == reg) { /* t[i], i = 1, 2 */
  2021. hazard = 1;
  2022. lh->v.u.s.aux = tmp;
  2023. }
  2024. }
  2025. }
  2026. if (hazard) {
  2027. bcemit_AD(fs, BC_MOV, tmp, reg); /* Rename conflicting variable. */
  2028. bcreg_reserve(fs, 1);
  2029. }
  2030. }
  2031. /* Adjust LHS/RHS of an assignment. */
  2032. static void assign_adjust(LexState *ls, BCReg nvars, BCReg nexps, ExpDesc *e)
  2033. {
  2034. FuncState *fs = ls->fs;
  2035. int32_t extra = (int32_t)nvars - (int32_t)nexps;
  2036. if (e->k == VCALL) {
  2037. extra++; /* Compensate for the VCALL itself. */
  2038. if (extra < 0) extra = 0;
  2039. setbc_b(bcptr(fs, e), extra+1); /* Fixup call results. */
  2040. if (extra > 1) bcreg_reserve(fs, (BCReg)extra-1);
  2041. } else {
  2042. if (e->k != VVOID)
  2043. expr_tonextreg(fs, e); /* Close last expression. */
  2044. if (extra > 0) { /* Leftover LHS are set to nil. */
  2045. BCReg reg = fs->freereg;
  2046. bcreg_reserve(fs, (BCReg)extra);
  2047. bcemit_nil(fs, reg, (BCReg)extra);
  2048. }
  2049. }
  2050. }
  2051. /* Recursively parse assignment statement. */
  2052. static void parse_assignment(LexState *ls, LHSVarList *lh, BCReg nvars)
  2053. {
  2054. ExpDesc e;
  2055. checkcond(ls, VLOCAL <= lh->v.k && lh->v.k <= VINDEXED, LJ_ERR_XSYNTAX);
  2056. if (lex_opt(ls, ',')) { /* Collect LHS list and recurse upwards. */
  2057. LHSVarList vl;
  2058. vl.prev = lh;
  2059. expr_primary(ls, &vl.v);
  2060. if (vl.v.k == VLOCAL)
  2061. assign_hazard(ls, lh, &vl.v);
  2062. checklimit(ls->fs, ls->level + nvars, LJ_MAX_XLEVEL, "variable names");
  2063. parse_assignment(ls, &vl, nvars+1);
  2064. } else { /* Parse RHS. */
  2065. BCReg nexps;
  2066. lex_check(ls, '=');
  2067. nexps = expr_list(ls, &e);
  2068. if (nexps == nvars) {
  2069. if (e.k == VCALL) {
  2070. if (bc_op(*bcptr(ls->fs, &e)) == BC_VARG) { /* Vararg assignment. */
  2071. ls->fs->freereg--;
  2072. e.k = VRELOCABLE;
  2073. } else { /* Multiple call results. */
  2074. e.u.s.info = e.u.s.aux; /* Base of call is not relocatable. */
  2075. e.k = VNONRELOC;
  2076. }
  2077. }
  2078. bcemit_store(ls->fs, &lh->v, &e);
  2079. return;
  2080. }
  2081. assign_adjust(ls, nvars, nexps, &e);
  2082. if (nexps > nvars)
  2083. ls->fs->freereg -= nexps - nvars; /* Drop leftover regs. */
  2084. }
  2085. /* Assign RHS to LHS and recurse downwards. */
  2086. expr_init(&e, VNONRELOC, ls->fs->freereg-1);
  2087. bcemit_store(ls->fs, &lh->v, &e);
  2088. }
  2089. /* Parse call statement or assignment. */
  2090. static void parse_call_assign(LexState *ls)
  2091. {
  2092. FuncState *fs = ls->fs;
  2093. LHSVarList vl;
  2094. expr_primary(ls, &vl.v);
  2095. if (vl.v.k == VCALL) { /* Function call statement. */
  2096. setbc_b(bcptr(fs, &vl.v), 1); /* No results. */
  2097. } else { /* Start of an assignment. */
  2098. vl.prev = NULL;
  2099. parse_assignment(ls, &vl, 1);
  2100. }
  2101. }
  2102. /* Parse 'local' statement. */
  2103. static void parse_local(LexState *ls)
  2104. {
  2105. if (lex_opt(ls, TK_function)) { /* Local function declaration. */
  2106. ExpDesc v, b;
  2107. FuncState *fs = ls->fs;
  2108. var_new(ls, 0, lex_str(ls));
  2109. expr_init(&v, VLOCAL, fs->freereg);
  2110. v.u.s.aux = fs->varmap[fs->freereg];
  2111. bcreg_reserve(fs, 1);
  2112. var_add(ls, 1);
  2113. parse_body(ls, &b, 0, ls->linenumber);
  2114. /* bcemit_store(fs, &v, &b) without setting VSTACK_VAR_RW. */
  2115. expr_free(fs, &b);
  2116. expr_toreg(fs, &b, v.u.s.info);
  2117. /* The upvalue is in scope, but the local is only valid after the store. */
  2118. var_get(ls, fs, fs->nactvar - 1).startpc = fs->pc;
  2119. } else { /* Local variable declaration. */
  2120. ExpDesc e;
  2121. BCReg nexps, nvars = 0;
  2122. do { /* Collect LHS. */
  2123. var_new(ls, nvars++, lex_str(ls));
  2124. } while (lex_opt(ls, ','));
  2125. if (lex_opt(ls, '=')) { /* Optional RHS. */
  2126. nexps = expr_list(ls, &e);
  2127. } else { /* Or implicitly set to nil. */
  2128. e.k = VVOID;
  2129. nexps = 0;
  2130. }
  2131. assign_adjust(ls, nvars, nexps, &e);
  2132. var_add(ls, nvars);
  2133. }
  2134. }
  2135. /* Parse 'function' statement. */
  2136. static void parse_func(LexState *ls, BCLine line)
  2137. {
  2138. FuncState *fs;
  2139. ExpDesc v, b;
  2140. int needself = 0;
  2141. lj_lex_next(ls); /* Skip 'function'. */
  2142. /* Parse function name. */
  2143. var_lookup(ls, &v);
  2144. while (ls->token == '.') /* Multiple dot-separated fields. */
  2145. expr_field(ls, &v);
  2146. if (ls->token == ':') { /* Optional colon to signify method call. */
  2147. needself = 1;
  2148. expr_field(ls, &v);
  2149. }
  2150. parse_body(ls, &b, needself, line);
  2151. fs = ls->fs;
  2152. bcemit_store(fs, &v, &b);
  2153. fs->bcbase[fs->pc - 1].line = line; /* Set line for the store. */
  2154. }
  2155. /* -- Control transfer statements ----------------------------------------- */
  2156. /* Check for end of block. */
  2157. static int endofblock(LexToken token)
  2158. {
  2159. switch (token) {
  2160. case TK_else: case TK_elseif: case TK_end: case TK_until: case TK_eof:
  2161. return 1;
  2162. default:
  2163. return 0;
  2164. }
  2165. }
  2166. /* Parse 'return' statement. */
  2167. static void parse_return(LexState *ls)
  2168. {
  2169. BCIns ins;
  2170. FuncState *fs = ls->fs;
  2171. lj_lex_next(ls); /* Skip 'return'. */
  2172. fs->flags |= PROTO_HAS_RETURN;
  2173. if (endofblock(ls->token) || ls->token == ';') { /* Bare return. */
  2174. ins = BCINS_AD(BC_RET0, 0, 1);
  2175. } else { /* Return with one or more values. */
  2176. ExpDesc e; /* Receives the _last_ expression in the list. */
  2177. BCReg nret = expr_list(ls, &e);
  2178. if (nret == 1) { /* Return one result. */
  2179. if (e.k == VCALL) { /* Check for tail call. */
  2180. BCIns *ip = bcptr(fs, &e);
  2181. /* It doesn't pay off to add BC_VARGT just for 'return ...'. */
  2182. if (bc_op(*ip) == BC_VARG) goto notailcall;
  2183. fs->pc--;
  2184. ins = BCINS_AD(bc_op(*ip)-BC_CALL+BC_CALLT, bc_a(*ip), bc_c(*ip));
  2185. } else { /* Can return the result from any register. */
  2186. ins = BCINS_AD(BC_RET1, expr_toanyreg(fs, &e), 2);
  2187. }
  2188. } else {
  2189. if (e.k == VCALL) { /* Append all results from a call. */
  2190. notailcall:
  2191. setbc_b(bcptr(fs, &e), 0);
  2192. ins = BCINS_AD(BC_RETM, fs->nactvar, e.u.s.aux - fs->nactvar);
  2193. } else {
  2194. expr_tonextreg(fs, &e); /* Force contiguous registers. */
  2195. ins = BCINS_AD(BC_RET, fs->nactvar, nret+1);
  2196. }
  2197. }
  2198. }
  2199. if (fs->flags & PROTO_CHILD)
  2200. bcemit_AJ(fs, BC_UCLO, 0, 0); /* May need to close upvalues first. */
  2201. bcemit_INS(fs, ins);
  2202. }
  2203. /* Parse 'break' statement. */
  2204. static void parse_break(LexState *ls)
  2205. {
  2206. ls->fs->bl->flags |= FSCOPE_BREAK;
  2207. gola_new(ls, NAME_BREAK, VSTACK_GOTO, bcemit_jmp(ls->fs));
  2208. }
  2209. /* Parse 'goto' statement. */
  2210. static void parse_goto(LexState *ls)
  2211. {
  2212. FuncState *fs = ls->fs;
  2213. GCstr *name = lex_str(ls);
  2214. VarInfo *vl = gola_findlabel(ls, name);
  2215. if (vl) /* Treat backwards goto within same scope like a loop. */
  2216. bcemit_AJ(fs, BC_LOOP, vl->slot, -1); /* No BC range check. */
  2217. fs->bl->flags |= FSCOPE_GOLA;
  2218. gola_new(ls, name, VSTACK_GOTO, bcemit_jmp(fs));
  2219. }
  2220. /* Parse label. */
  2221. static void parse_label(LexState *ls)
  2222. {
  2223. FuncState *fs = ls->fs;
  2224. GCstr *name;
  2225. MSize idx;
  2226. fs->lasttarget = fs->pc;
  2227. fs->bl->flags |= FSCOPE_GOLA;
  2228. lj_lex_next(ls); /* Skip '::'. */
  2229. name = lex_str(ls);
  2230. if (gola_findlabel(ls, name))
  2231. lj_lex_error(ls, 0, LJ_ERR_XLDUP, strdata(name));
  2232. idx = gola_new(ls, name, VSTACK_LABEL, fs->pc);
  2233. lex_check(ls, TK_label);
  2234. /* Recursively parse trailing statements: labels and ';' (Lua 5.2 only). */
  2235. for (;;) {
  2236. if (ls->token == TK_label) {
  2237. synlevel_begin(ls);
  2238. parse_label(ls);
  2239. synlevel_end(ls);
  2240. } else if (LJ_52 && ls->token == ';') {
  2241. lj_lex_next(ls);
  2242. } else {
  2243. break;
  2244. }
  2245. }
  2246. /* Trailing label is considered to be outside of scope. */
  2247. if (endofblock(ls->token) && ls->token != TK_until)
  2248. ls->vstack[idx].slot = fs->bl->nactvar;
  2249. gola_resolve(ls, fs->bl, idx);
  2250. }
  2251. /* -- Blocks, loops and conditional statements ---------------------------- */
  2252. /* Parse a block. */
  2253. static void parse_block(LexState *ls)
  2254. {
  2255. FuncState *fs = ls->fs;
  2256. FuncScope bl;
  2257. fscope_begin(fs, &bl, 0);
  2258. parse_chunk(ls);
  2259. fscope_end(fs);
  2260. }
  2261. /* Parse 'while' statement. */
  2262. static void parse_while(LexState *ls, BCLine line)
  2263. {
  2264. FuncState *fs = ls->fs;
  2265. BCPos start, loop, condexit;
  2266. FuncScope bl;
  2267. lj_lex_next(ls); /* Skip 'while'. */
  2268. start = fs->lasttarget = fs->pc;
  2269. condexit = expr_cond(ls);
  2270. fscope_begin(fs, &bl, FSCOPE_LOOP);
  2271. lex_check(ls, TK_do);
  2272. loop = bcemit_AD(fs, BC_LOOP, fs->nactvar, 0);
  2273. parse_block(ls);
  2274. jmp_patch(fs, bcemit_jmp(fs), start);
  2275. lex_match(ls, TK_end, TK_while, line);
  2276. fscope_end(fs);
  2277. jmp_tohere(fs, condexit);
  2278. jmp_patchins(fs, loop, fs->pc);
  2279. }
  2280. /* Parse 'repeat' statement. */
  2281. static void parse_repeat(LexState *ls, BCLine line)
  2282. {
  2283. FuncState *fs = ls->fs;
  2284. BCPos loop = fs->lasttarget = fs->pc;
  2285. BCPos condexit;
  2286. FuncScope bl1, bl2;
  2287. fscope_begin(fs, &bl1, FSCOPE_LOOP); /* Breakable loop scope. */
  2288. fscope_begin(fs, &bl2, 0); /* Inner scope. */
  2289. lj_lex_next(ls); /* Skip 'repeat'. */
  2290. bcemit_AD(fs, BC_LOOP, fs->nactvar, 0);
  2291. parse_chunk(ls);
  2292. lex_match(ls, TK_until, TK_repeat, line);
  2293. condexit = expr_cond(ls); /* Parse condition (still inside inner scope). */
  2294. if (!(bl2.flags & FSCOPE_UPVAL)) { /* No upvalues? Just end inner scope. */
  2295. fscope_end(fs);
  2296. } else { /* Otherwise generate: cond: UCLO+JMP out, !cond: UCLO+JMP loop. */
  2297. parse_break(ls); /* Break from loop and close upvalues. */
  2298. jmp_tohere(fs, condexit);
  2299. fscope_end(fs); /* End inner scope and close upvalues. */
  2300. condexit = bcemit_jmp(fs);
  2301. }
  2302. jmp_patch(fs, condexit, loop); /* Jump backwards if !cond. */
  2303. jmp_patchins(fs, loop, fs->pc);
  2304. fscope_end(fs); /* End loop scope. */
  2305. }
  2306. /* Parse numeric 'for'. */
  2307. static void parse_for_num(LexState *ls, GCstr *varname, BCLine line)
  2308. {
  2309. FuncState *fs = ls->fs;
  2310. BCReg base = fs->freereg;
  2311. FuncScope bl;
  2312. BCPos loop, loopend;
  2313. /* Hidden control variables. */
  2314. var_new_fixed(ls, FORL_IDX, VARNAME_FOR_IDX);
  2315. var_new_fixed(ls, FORL_STOP, VARNAME_FOR_STOP);
  2316. var_new_fixed(ls, FORL_STEP, VARNAME_FOR_STEP);
  2317. /* Visible copy of index variable. */
  2318. var_new(ls, FORL_EXT, varname);
  2319. lex_check(ls, '=');
  2320. expr_next(ls);
  2321. lex_check(ls, ',');
  2322. expr_next(ls);
  2323. if (lex_opt(ls, ',')) {
  2324. expr_next(ls);
  2325. } else {
  2326. bcemit_AD(fs, BC_KSHORT, fs->freereg, 1); /* Default step is 1. */
  2327. bcreg_reserve(fs, 1);
  2328. }
  2329. var_add(ls, 3); /* Hidden control variables. */
  2330. lex_check(ls, TK_do);
  2331. loop = bcemit_AJ(fs, BC_FORI, base, NO_JMP);
  2332. fscope_begin(fs, &bl, 0); /* Scope for visible variables. */
  2333. var_add(ls, 1);
  2334. bcreg_reserve(fs, 1);
  2335. parse_block(ls);
  2336. fscope_end(fs);
  2337. /* Perform loop inversion. Loop control instructions are at the end. */
  2338. loopend = bcemit_AJ(fs, BC_FORL, base, NO_JMP);
  2339. fs->bcbase[loopend].line = line; /* Fix line for control ins. */
  2340. jmp_patchins(fs, loopend, loop+1);
  2341. jmp_patchins(fs, loop, fs->pc);
  2342. }
  2343. /* Try to predict whether the iterator is next() and specialize the bytecode.
  2344. ** Detecting next() and pairs() by name is simplistic, but quite effective.
  2345. ** The interpreter backs off if the check for the closure fails at runtime.
  2346. */
  2347. static int predict_next(LexState *ls, FuncState *fs, BCPos pc)
  2348. {
  2349. BCIns ins = fs->bcbase[pc].ins;
  2350. GCstr *name;
  2351. cTValue *o;
  2352. switch (bc_op(ins)) {
  2353. case BC_MOV:
  2354. name = gco2str(gcref(var_get(ls, fs, bc_d(ins)).name));
  2355. break;
  2356. case BC_UGET:
  2357. name = gco2str(gcref(ls->vstack[fs->uvmap[bc_d(ins)]].name));
  2358. break;
  2359. case BC_GGET:
  2360. /* There's no inverse index (yet), so lookup the strings. */
  2361. o = lj_tab_getstr(fs->kt, lj_str_newlit(ls->L, "pairs"));
  2362. if (o && tvhaskslot(o) && tvkslot(o) == bc_d(ins))
  2363. return 1;
  2364. o = lj_tab_getstr(fs->kt, lj_str_newlit(ls->L, "next"));
  2365. if (o && tvhaskslot(o) && tvkslot(o) == bc_d(ins))
  2366. return 1;
  2367. return 0;
  2368. default:
  2369. return 0;
  2370. }
  2371. return (name->len == 5 && !strcmp(strdata(name), "pairs")) ||
  2372. (name->len == 4 && !strcmp(strdata(name), "next"));
  2373. }
  2374. /* Parse 'for' iterator. */
  2375. static void parse_for_iter(LexState *ls, GCstr *indexname)
  2376. {
  2377. FuncState *fs = ls->fs;
  2378. ExpDesc e;
  2379. BCReg nvars = 0;
  2380. BCLine line;
  2381. BCReg base = fs->freereg + 3;
  2382. BCPos loop, loopend, exprpc = fs->pc;
  2383. FuncScope bl;
  2384. int isnext;
  2385. /* Hidden control variables. */
  2386. var_new_fixed(ls, nvars++, VARNAME_FOR_GEN);
  2387. var_new_fixed(ls, nvars++, VARNAME_FOR_STATE);
  2388. var_new_fixed(ls, nvars++, VARNAME_FOR_CTL);
  2389. /* Visible variables returned from iterator. */
  2390. var_new(ls, nvars++, indexname);
  2391. while (lex_opt(ls, ','))
  2392. var_new(ls, nvars++, lex_str(ls));
  2393. lex_check(ls, TK_in);
  2394. line = ls->linenumber;
  2395. assign_adjust(ls, 3, expr_list(ls, &e), &e);
  2396. bcreg_bump(fs, 3); /* The iterator needs another 3 slots (func + 2 args). */
  2397. isnext = (nvars <= 5 && predict_next(ls, fs, exprpc));
  2398. var_add(ls, 3); /* Hidden control variables. */
  2399. lex_check(ls, TK_do);
  2400. loop = bcemit_AJ(fs, isnext ? BC_ISNEXT : BC_JMP, base, NO_JMP);
  2401. fscope_begin(fs, &bl, 0); /* Scope for visible variables. */
  2402. var_add(ls, nvars-3);
  2403. bcreg_reserve(fs, nvars-3);
  2404. parse_block(ls);
  2405. fscope_end(fs);
  2406. /* Perform loop inversion. Loop control instructions are at the end. */
  2407. jmp_patchins(fs, loop, fs->pc);
  2408. bcemit_ABC(fs, isnext ? BC_ITERN : BC_ITERC, base, nvars-3+1, 2+1);
  2409. loopend = bcemit_AJ(fs, BC_ITERL, base, NO_JMP);
  2410. fs->bcbase[loopend-1].line = line; /* Fix line for control ins. */
  2411. fs->bcbase[loopend].line = line;
  2412. jmp_patchins(fs, loopend, loop+1);
  2413. }
  2414. /* Parse 'for' statement. */
  2415. static void parse_for(LexState *ls, BCLine line)
  2416. {
  2417. FuncState *fs = ls->fs;
  2418. GCstr *varname;
  2419. FuncScope bl;
  2420. fscope_begin(fs, &bl, FSCOPE_LOOP);
  2421. lj_lex_next(ls); /* Skip 'for'. */
  2422. varname = lex_str(ls); /* Get first variable name. */
  2423. if (ls->token == '=')
  2424. parse_for_num(ls, varname, line);
  2425. else if (ls->token == ',' || ls->token == TK_in)
  2426. parse_for_iter(ls, varname);
  2427. else
  2428. err_syntax(ls, LJ_ERR_XFOR);
  2429. lex_match(ls, TK_end, TK_for, line);
  2430. fscope_end(fs); /* Resolve break list. */
  2431. }
  2432. /* Parse condition and 'then' block. */
  2433. static BCPos parse_then(LexState *ls)
  2434. {
  2435. BCPos condexit;
  2436. lj_lex_next(ls); /* Skip 'if' or 'elseif'. */
  2437. condexit = expr_cond(ls);
  2438. lex_check(ls, TK_then);
  2439. parse_block(ls);
  2440. return condexit;
  2441. }
  2442. /* Parse 'if' statement. */
  2443. static void parse_if(LexState *ls, BCLine line)
  2444. {
  2445. FuncState *fs = ls->fs;
  2446. BCPos flist;
  2447. BCPos escapelist = NO_JMP;
  2448. flist = parse_then(ls);
  2449. while (ls->token == TK_elseif) { /* Parse multiple 'elseif' blocks. */
  2450. jmp_append(fs, &escapelist, bcemit_jmp(fs));
  2451. jmp_tohere(fs, flist);
  2452. flist = parse_then(ls);
  2453. }
  2454. if (ls->token == TK_else) { /* Parse optional 'else' block. */
  2455. jmp_append(fs, &escapelist, bcemit_jmp(fs));
  2456. jmp_tohere(fs, flist);
  2457. lj_lex_next(ls); /* Skip 'else'. */
  2458. parse_block(ls);
  2459. } else {
  2460. jmp_append(fs, &escapelist, flist);
  2461. }
  2462. jmp_tohere(fs, escapelist);
  2463. lex_match(ls, TK_end, TK_if, line);
  2464. }
  2465. /* -- Parse statements ---------------------------------------------------- */
  2466. /* Parse a statement. Returns 1 if it must be the last one in a chunk. */
  2467. static int parse_stmt(LexState *ls)
  2468. {
  2469. BCLine line = ls->linenumber;
  2470. switch (ls->token) {
  2471. case TK_if:
  2472. parse_if(ls, line);
  2473. break;
  2474. case TK_while:
  2475. parse_while(ls, line);
  2476. break;
  2477. case TK_do:
  2478. lj_lex_next(ls);
  2479. parse_block(ls);
  2480. lex_match(ls, TK_end, TK_do, line);
  2481. break;
  2482. case TK_for:
  2483. parse_for(ls, line);
  2484. break;
  2485. case TK_repeat:
  2486. parse_repeat(ls, line);
  2487. break;
  2488. case TK_function:
  2489. parse_func(ls, line);
  2490. break;
  2491. case TK_local:
  2492. lj_lex_next(ls);
  2493. parse_local(ls);
  2494. break;
  2495. case TK_return:
  2496. parse_return(ls);
  2497. return 1; /* Must be last. */
  2498. case TK_break:
  2499. lj_lex_next(ls);
  2500. parse_break(ls);
  2501. return !LJ_52; /* Must be last in Lua 5.1. */
  2502. #if LJ_52
  2503. case ';':
  2504. lj_lex_next(ls);
  2505. break;
  2506. #endif
  2507. case TK_label:
  2508. parse_label(ls);
  2509. break;
  2510. case TK_goto:
  2511. if (LJ_52 || lj_lex_lookahead(ls) == TK_name) {
  2512. lj_lex_next(ls);
  2513. parse_goto(ls);
  2514. break;
  2515. } /* else: fallthrough */
  2516. default:
  2517. parse_call_assign(ls);
  2518. break;
  2519. }
  2520. return 0;
  2521. }
  2522. /* A chunk is a list of statements optionally separated by semicolons. */
  2523. static void parse_chunk(LexState *ls)
  2524. {
  2525. int islast = 0;
  2526. synlevel_begin(ls);
  2527. while (!islast && !endofblock(ls->token)) {
  2528. islast = parse_stmt(ls);
  2529. lex_opt(ls, ';');
  2530. lua_assert(ls->fs->framesize >= ls->fs->freereg &&
  2531. ls->fs->freereg >= ls->fs->nactvar);
  2532. ls->fs->freereg = ls->fs->nactvar; /* Free registers after each stmt. */
  2533. }
  2534. synlevel_end(ls);
  2535. }
  2536. /* Entry point of bytecode parser. */
  2537. GCproto *lj_parse(LexState *ls)
  2538. {
  2539. FuncState fs;
  2540. FuncScope bl;
  2541. GCproto *pt;
  2542. lua_State *L = ls->L;
  2543. #ifdef LUAJIT_DISABLE_DEBUGINFO
  2544. ls->chunkname = lj_str_newlit(L, "=");
  2545. #else
  2546. ls->chunkname = lj_str_newz(L, ls->chunkarg);
  2547. #endif
  2548. setstrV(L, L->top, ls->chunkname); /* Anchor chunkname string. */
  2549. incr_top(L);
  2550. ls->level = 0;
  2551. fs_init(ls, &fs);
  2552. fs.linedefined = 0;
  2553. fs.numparams = 0;
  2554. fs.bcbase = NULL;
  2555. fs.bclim = 0;
  2556. fs.flags |= PROTO_VARARG; /* Main chunk is always a vararg func. */
  2557. fscope_begin(&fs, &bl, 0);
  2558. bcemit_AD(&fs, BC_FUNCV, 0, 0); /* Placeholder. */
  2559. lj_lex_next(ls); /* Read-ahead first token. */
  2560. parse_chunk(ls);
  2561. if (ls->token != TK_eof)
  2562. err_token(ls, TK_eof);
  2563. pt = fs_finish(ls, ls->linenumber);
  2564. L->top--; /* Drop chunkname. */
  2565. lua_assert(fs.prev == NULL);
  2566. lua_assert(ls->fs == NULL);
  2567. lua_assert(pt->sizeuv == 0);
  2568. return pt;
  2569. }