Coverage Report

Created: 2023-09-30 06:10

/src/testdir/build/lua-master/source/lcode.c
Line
Count
Source (jump to first uncovered line)
1
/*
2
** $Id: lcode.c $
3
** Code generator for Lua
4
** See Copyright Notice in lua.h
5
*/
6
7
#define lcode_c
8
#define LUA_CORE
9
10
#include "lprefix.h"
11
12
13
#include <float.h>
14
#include <limits.h>
15
#include <math.h>
16
#include <stdlib.h>
17
18
#include "lua.h"
19
20
#include "lcode.h"
21
#include "ldebug.h"
22
#include "ldo.h"
23
#include "lgc.h"
24
#include "llex.h"
25
#include "lmem.h"
26
#include "lobject.h"
27
#include "lopcodes.h"
28
#include "lparser.h"
29
#include "lstring.h"
30
#include "ltable.h"
31
#include "lvm.h"
32
33
34
/* Maximum number of registers in a Lua function (must fit in 8 bits) */
35
22.6k
#define MAXREGS   255
36
37
38
52.5M
#define hasjumps(e) ((e)->t != (e)->f)
39
40
41
static int codesJ (FuncState *fs, OpCode o, int sj, int k);
42
43
44
45
/* semantic error */
46
3
l_noret luaK_semerror (LexState *ls, const char *msg) {
47
3
  ls->t.token = 0;  /* remove "near <token>" from final message */
48
3
  luaX_syntaxerror(ls, msg);
49
3
}
50
51
52
/*
53
** If expression is a numeric constant, fills 'v' with its value
54
** and returns 1. Otherwise, returns 0.
55
*/
56
8.85M
static int tonumeral (const expdesc *e, TValue *v) {
57
8.85M
  if (hasjumps(e))
58
4.09k
    return 0;  /* not a numeral */
59
8.84M
  switch (e->k) {
60
229k
    case VKINT:
61
229k
      if (v) setivalue(v, e->u.ival);
62
229k
      return 1;
63
70.8k
    case VKFLT:
64
70.8k
      if (v) setfltvalue(v, e->u.nval);
65
70.8k
      return 1;
66
8.54M
    default: return 0;
67
8.84M
  }
68
8.84M
}
69
70
71
/*
72
** Get the constant value from a constant expression
73
*/
74
183k
static TValue *const2val (FuncState *fs, const expdesc *e) {
75
183k
  lua_assert(e->k == VCONST);
76
183k
  return &fs->ls->dyd->actvar.arr[e->u.info].k;
77
183k
}
78
79
80
/*
81
** If expression is a constant, fills 'v' with its value
82
** and returns 1. Otherwise, returns 0.
83
*/
84
516
int luaK_exp2const (FuncState *fs, const expdesc *e, TValue *v) {
85
516
  if (hasjumps(e))
86
8
    return 0;  /* not a constant */
87
508
  switch (e->k) {
88
6
    case VFALSE:
89
6
      setbfvalue(v);
90
6
      return 1;
91
69
    case VTRUE:
92
69
      setbtvalue(v);
93
69
      return 1;
94
196
    case VNIL:
95
196
      setnilvalue(v);
96
196
      return 1;
97
145
    case VKSTR: {
98
145
      setsvalue(fs->ls->L, v, e->u.strval);
99
145
      return 1;
100
145
    }
101
0
    case VCONST: {
102
0
      setobj(fs->ls->L, v, const2val(fs, e));
103
0
      return 1;
104
0
    }
105
92
    default: return tonumeral(e, v);
106
508
  }
107
508
}
108
109
110
/*
111
** Return the previous instruction of the current code. If there
112
** may be a jump target between the current instruction and the
113
** previous one, return an invalid instruction (to avoid wrong
114
** optimizations).
115
*/
116
182k
static Instruction *previousinstruction (FuncState *fs) {
117
182k
  static const Instruction invalidinstruction = ~(Instruction)0;
118
182k
  if (fs->pc > fs->lasttarget)
119
92.0k
    return &fs->f->code[fs->pc - 1];  /* previous instruction */
120
90.2k
  else
121
90.2k
    return cast(Instruction*, &invalidinstruction);
122
182k
}
123
124
125
/*
126
** Create a OP_LOADNIL instruction, but try to optimize: if the previous
127
** instruction is also OP_LOADNIL and ranges are compatible, adjust
128
** range of previous instruction instead of emitting a new one. (For
129
** instance, 'local a; local b' will generate a single opcode.)
130
*/
131
168k
void luaK_nil (FuncState *fs, int from, int n) {
132
168k
  int l = from + n - 1;  /* last register to set nil */
133
168k
  Instruction *previous = previousinstruction(fs);
134
168k
  if (GET_OPCODE(*previous) == OP_LOADNIL) {  /* previous is LOADNIL? */
135
1.01k
    int pfrom = GETARG_A(*previous);  /* get previous range */
136
1.01k
    int pl = pfrom + GETARG_B(*previous);
137
1.01k
    if ((pfrom <= from && from <= pl + 1) ||
138
1.01k
        (from <= pfrom && pfrom <= l + 1)) {  /* can connect both? */
139
745
      if (pfrom < from) from = pfrom;  /* from = min(from, pfrom) */
140
745
      if (pl > l) l = pl;  /* l = max(l, pl) */
141
745
      SETARG_A(*previous, from);
142
745
      SETARG_B(*previous, l - from);
143
745
      return;
144
745
    }  /* else go through */
145
1.01k
  }
146
168k
  luaK_codeABC(fs, OP_LOADNIL, from, n - 1, 0);  /* else no optimization */
147
168k
}
148
149
150
/*
151
** Gets the destination address of a jump instruction. Used to traverse
152
** a list of jumps.
153
*/
154
36.2M
static int getjump (FuncState *fs, int pc) {
155
36.2M
  int offset = GETARG_sJ(fs->f->code[pc]);
156
36.2M
  if (offset == NO_JUMP)  /* point to itself represents end of list */
157
2.11M
    return NO_JUMP;  /* end of list */
158
34.1M
  else
159
34.1M
    return (pc+1)+offset;  /* turn offset into absolute position */
160
36.2M
}
161
162
163
/*
164
** Fix jump instruction at position 'pc' to jump to 'dest'.
165
** (Jump addresses are relative in Lua)
166
*/
167
2.59M
static void fixjump (FuncState *fs, int pc, int dest) {
168
2.59M
  Instruction *jmp = &fs->f->code[pc];
169
2.59M
  int offset = dest - (pc + 1);
170
2.59M
  lua_assert(dest != NO_JUMP);
171
2.59M
  if (!(-OFFSET_sJ <= offset && offset <= MAXARG_sJ - OFFSET_sJ))
172
0
    luaX_syntaxerror(fs->ls, "control structure too long");
173
2.59M
  lua_assert(GET_OPCODE(*jmp) == OP_JMP);
174
2.59M
  SETARG_sJ(*jmp, offset);
175
2.59M
}
176
177
178
/*
179
** Concatenate jump-list 'l2' into jump-list 'l1'
180
*/
181
2.17M
void luaK_concat (FuncState *fs, int *l1, int l2) {
182
2.17M
  if (l2 == NO_JUMP) return;  /* nothing to concatenate? */
183
2.17M
  else if (*l1 == NO_JUMP)  /* no original list? */
184
2.11M
    *l1 = l2;  /* 'l1' points to 'l2' */
185
59.4k
  else {
186
59.4k
    int list = *l1;
187
59.4k
    int next;
188
34.1M
    while ((next = getjump(fs, list)) != NO_JUMP)  /* find last element */
189
34.0M
      list = next;
190
59.4k
    fixjump(fs, list, l2);  /* last element links to 'l2' */
191
59.4k
  }
192
2.17M
}
193
194
195
/*
196
** Create a jump instruction and return its position, so its destination
197
** can be fixed later (with 'fixjump').
198
*/
199
2.10M
int luaK_jump (FuncState *fs) {
200
2.10M
  return codesJ(fs, OP_JMP, NO_JUMP, 0);
201
2.10M
}
202
203
204
/*
205
** Code a 'return' instruction
206
*/
207
5.69k
void luaK_ret (FuncState *fs, int first, int nret) {
208
5.69k
  OpCode op;
209
5.69k
  switch (nret) {
210
2.73k
    case 0: op = OP_RETURN0; break;
211
863
    case 1: op = OP_RETURN1; break;
212
2.09k
    default: op = OP_RETURN; break;
213
5.69k
  }
214
5.69k
  luaK_codeABC(fs, op, first, nret + 1, 0);
215
5.69k
}
216
217
218
/*
219
** Code a "conditional jump", that is, a test or comparison opcode
220
** followed by a jump. Return jump position.
221
*/
222
2.09M
static int condjump (FuncState *fs, OpCode op, int A, int B, int C, int k) {
223
2.09M
  luaK_codeABCk(fs, op, A, B, C, k);
224
2.09M
  return luaK_jump(fs);
225
2.09M
}
226
227
228
/*
229
** returns current 'pc' and marks it as a jump target (to avoid wrong
230
** optimizations with consecutive instructions not in the same basic block).
231
*/
232
8.19M
int luaK_getlabel (FuncState *fs) {
233
8.19M
  fs->lasttarget = fs->pc;
234
8.19M
  return fs->pc;
235
8.19M
}
236
237
238
/*
239
** Returns the position of the instruction "controlling" a given
240
** jump (that is, its condition), or the jump itself if it is
241
** unconditional.
242
*/
243
4.16M
static Instruction *getjumpcontrol (FuncState *fs, int pc) {
244
4.16M
  Instruction *pi = &fs->f->code[pc];
245
4.16M
  if (pc >= 1 && testTMode(GET_OPCODE(*(pi-1))))
246
4.15M
    return pi-1;
247
7.09k
  else
248
7.09k
    return pi;
249
4.16M
}
250
251
252
/*
253
** Patch destination register for a TESTSET instruction.
254
** If instruction in position 'node' is not a TESTSET, return 0 ("fails").
255
** Otherwise, if 'reg' is not 'NO_REG', set it as the destination
256
** register. Otherwise, change instruction to a simple 'TEST' (produces
257
** no register value)
258
*/
259
2.12M
static int patchtestreg (FuncState *fs, int node, int reg) {
260
2.12M
  Instruction *i = getjumpcontrol(fs, node);
261
2.12M
  if (GET_OPCODE(*i) != OP_TESTSET)
262
2.10M
    return 0;  /* cannot patch other instructions */
263
17.5k
  if (reg != NO_REG && reg != GETARG_B(*i))
264
17.5k
    SETARG_A(*i, reg);
265
17.0k
  else {
266
     /* no register to put value or register already has the value;
267
        change instruction to simple test */
268
34.0k
    *i = CREATE_ABCk(OP_TEST, GETARG_B(*i), 0, 0, GETARG_k(*i));
269
34.0k
  }
270
17.5k
  return 1;
271
17.5k
}
272
273
274
/*
275
** Traverse a list of tests ensuring no one produces a value
276
*/
277
4.03k
static void removevalues (FuncState *fs, int list) {
278
26.8k
  for (; list != NO_JUMP; list = getjump(fs, list))
279
22.7k
      patchtestreg(fs, list, NO_REG);
280
4.03k
}
281
282
283
/*
284
** Traverse a list of tests, patching their destination address and
285
** registers: tests producing values jump to 'vtarget' (and put their
286
** values in 'reg'), other tests jump to 'dtarget'.
287
*/
288
static void patchlistaux (FuncState *fs, int list, int vtarget, int reg,
289
6.17M
                          int dtarget) {
290
8.27M
  while (list != NO_JUMP) {
291
2.09M
    int next = getjump(fs, list);
292
2.09M
    if (patchtestreg(fs, list, reg))
293
17.2k
      fixjump(fs, list, vtarget);
294
2.08M
    else
295
2.08M
      fixjump(fs, list, dtarget);  /* jump to default target */
296
2.09M
    list = next;
297
2.09M
  }
298
6.17M
}
299
300
301
/*
302
** Path all jumps in 'list' to jump to 'target'.
303
** (The assert means that we cannot fix a jump to a forward address
304
** because we only know addresses once code is generated.)
305
*/
306
2.10M
void luaK_patchlist (FuncState *fs, int list, int target) {
307
2.10M
  lua_assert(target <= fs->pc);
308
2.10M
  patchlistaux(fs, list, target, NO_REG, target);
309
2.10M
}
310
311
312
2.10M
void luaK_patchtohere (FuncState *fs, int list) {
313
2.10M
  int hr = luaK_getlabel(fs);  /* mark "here" as a jump target */
314
2.10M
  luaK_patchlist(fs, list, hr);
315
2.10M
}
316
317
318
/* limit for difference between lines in relative line info. */
319
59.3M
#define LIMLINEDIFF 0x80
320
321
322
/*
323
** Save line info for a new instruction. If difference from last line
324
** does not fit in a byte, of after that many instructions, save a new
325
** absolute line info; (in that case, the special value 'ABSLINEINFO'
326
** in 'lineinfo' signals the existence of this absolute information.)
327
** Otherwise, store the difference from last line in 'lineinfo'.
328
*/
329
29.6M
static void savelineinfo (FuncState *fs, Proto *f, int line) {
330
29.6M
  int linedif = line - fs->previousline;
331
29.6M
  int pc = fs->pc - 1;  /* last instruction coded */
332
29.6M
  if (abs(linedif) >= LIMLINEDIFF || fs->iwthabs++ >= MAXIWTHABS) {
333
230k
    luaM_growvector(fs->ls->L, f->abslineinfo, fs->nabslineinfo,
334
230k
                    f->sizeabslineinfo, AbsLineInfo, MAX_INT, "lines");
335
230k
    f->abslineinfo[fs->nabslineinfo].pc = pc;
336
230k
    f->abslineinfo[fs->nabslineinfo++].line = line;
337
230k
    linedif = ABSLINEINFO;  /* signal that there is absolute information */
338
230k
    fs->iwthabs = 1;  /* restart counter */
339
230k
  }
340
29.6M
  luaM_growvector(fs->ls->L, f->lineinfo, pc, f->sizelineinfo, ls_byte,
341
29.6M
                  MAX_INT, "opcodes");
342
29.6M
  f->lineinfo[pc] = linedif;
343
29.6M
  fs->previousline = line;  /* last line saved */
344
29.6M
}
345
346
347
/*
348
** Remove line information from the last instruction.
349
** If line information for that instruction is absolute, set 'iwthabs'
350
** above its max to force the new (replacing) instruction to have
351
** absolute line info, too.
352
*/
353
6.04M
static void removelastlineinfo (FuncState *fs) {
354
6.04M
  Proto *f = fs->f;
355
6.04M
  int pc = fs->pc - 1;  /* last instruction coded */
356
6.04M
  if (f->lineinfo[pc] != ABSLINEINFO) {  /* relative line info? */
357
5.99M
    fs->previousline -= f->lineinfo[pc];  /* correct last line saved */
358
5.99M
    fs->iwthabs--;  /* undo previous increment */
359
5.99M
  }
360
46.9k
  else {  /* absolute line information */
361
46.9k
    lua_assert(f->abslineinfo[fs->nabslineinfo - 1].pc == pc);
362
46.9k
    fs->nabslineinfo--;  /* remove it */
363
46.9k
    fs->iwthabs = MAXIWTHABS + 1;  /* force next line info to be absolute */
364
46.9k
  }
365
6.04M
}
366
367
368
/*
369
** Remove the last instruction created, correcting line information
370
** accordingly.
371
*/
372
182
static void removelastinstruction (FuncState *fs) {
373
182
  removelastlineinfo(fs);
374
182
  fs->pc--;
375
182
}
376
377
378
/*
379
** Emit instruction 'i', checking for array sizes and saving also its
380
** line information. Return 'i' position.
381
*/
382
23.6M
int luaK_code (FuncState *fs, Instruction i) {
383
23.6M
  Proto *f = fs->f;
384
  /* put new instruction in code array */
385
23.6M
  luaM_growvector(fs->ls->L, f->code, fs->pc, f->sizecode, Instruction,
386
23.6M
                  MAX_INT, "opcodes");
387
23.6M
  f->code[fs->pc++] = i;
388
23.6M
  savelineinfo(fs, f, fs->ls->lastline);
389
23.6M
  return fs->pc - 1;  /* index of new instruction */
390
23.6M
}
391
392
393
/*
394
** Format and emit an 'iABC' instruction. (Assertions check consistency
395
** of parameters versus opcode.)
396
*/
397
19.3M
int luaK_codeABCk (FuncState *fs, OpCode o, int a, int b, int c, int k) {
398
19.3M
  lua_assert(getOpMode(o) == iABC);
399
19.3M
  lua_assert(a <= MAXARG_A && b <= MAXARG_B &&
400
19.3M
             c <= MAXARG_C && (k & ~1) == 0);
401
19.3M
  return luaK_code(fs, CREATE_ABCk(o, a, b, c, k));
402
19.3M
}
403
404
405
/*
406
** Format and emit an 'iABx' instruction.
407
*/
408
2.10M
int luaK_codeABx (FuncState *fs, OpCode o, int a, unsigned int bc) {
409
2.10M
  lua_assert(getOpMode(o) == iABx);
410
2.10M
  lua_assert(a <= MAXARG_A && bc <= MAXARG_Bx);
411
2.10M
  return luaK_code(fs, CREATE_ABx(o, a, bc));
412
2.10M
}
413
414
415
/*
416
** Format and emit an 'iAsBx' instruction.
417
*/
418
32.0k
static int codeAsBx (FuncState *fs, OpCode o, int a, int bc) {
419
32.0k
  unsigned int b = bc + OFFSET_sBx;
420
32.0k
  lua_assert(getOpMode(o) == iAsBx);
421
32.0k
  lua_assert(a <= MAXARG_A && b <= MAXARG_Bx);
422
32.0k
  return luaK_code(fs, CREATE_ABx(o, a, b));
423
32.0k
}
424
425
426
/*
427
** Format and emit an 'isJ' instruction.
428
*/
429
2.10M
static int codesJ (FuncState *fs, OpCode o, int sj, int k) {
430
2.10M
  unsigned int j = sj + OFFSET_sJ;
431
2.10M
  lua_assert(getOpMode(o) == isJ);
432
2.10M
  lua_assert(j <= MAXARG_sJ && (k & ~1) == 0);
433
2.10M
  return luaK_code(fs, CREATE_sJ(o, j, k));
434
2.10M
}
435
436
437
/*
438
** Emit an "extra argument" instruction (format 'iAx')
439
*/
440
0
static int codeextraarg (FuncState *fs, int a) {
441
0
  lua_assert(a <= MAXARG_Ax);
442
0
  return luaK_code(fs, CREATE_Ax(OP_EXTRAARG, a));
443
0
}
444
445
446
/*
447
** Emit a "load constant" instruction, using either 'OP_LOADK'
448
** (if constant index 'k' fits in 18 bits) or an 'OP_LOADKX'
449
** instruction with "extra argument".
450
*/
451
2.09M
static int luaK_codek (FuncState *fs, int reg, int k) {
452
2.09M
  if (k <= MAXARG_Bx)
453
2.09M
    return luaK_codeABx(fs, OP_LOADK, reg, k);
454
0
  else {
455
0
    int p = luaK_codeABx(fs, OP_LOADKX, reg, 0);
456
0
    codeextraarg(fs, k);
457
0
    return p;
458
0
  }
459
2.09M
}
460
461
462
/*
463
** Check register-stack level, keeping track of its maximum size
464
** in field 'maxstacksize'
465
*/
466
14.3M
void luaK_checkstack (FuncState *fs, int n) {
467
14.3M
  int newstack = fs->freereg + n;
468
14.3M
  if (newstack > fs->f->maxstacksize) {
469
22.6k
    if (newstack >= MAXREGS)
470
0
      luaX_syntaxerror(fs->ls,
471
0
        "function or expression needs too many registers");
472
22.6k
    fs->f->maxstacksize = cast_byte(newstack);
473
22.6k
  }
474
14.3M
}
475
476
477
/*
478
** Reserve 'n' registers in register stack
479
*/
480
14.3M
void luaK_reserveregs (FuncState *fs, int n) {
481
14.3M
  luaK_checkstack(fs, n);
482
14.3M
  fs->freereg += n;
483
14.3M
}
484
485
486
/*
487
** Free register 'reg', if it is neither a constant index nor
488
** a local variable.
489
)
490
*/
491
14.3M
static void freereg (FuncState *fs, int reg) {
492
14.3M
  if (reg >= luaY_nvarstack(fs)) {
493
14.1M
    fs->freereg--;
494
14.1M
    lua_assert(reg == fs->freereg);
495
14.1M
  }
496
14.3M
}
497
498
499
/*
500
** Free two registers in proper order
501
*/
502
6.90M
static void freeregs (FuncState *fs, int r1, int r2) {
503
6.90M
  if (r1 > r2) {
504
72.8k
    freereg(fs, r1);
505
72.8k
    freereg(fs, r2);
506
72.8k
  }
507
6.83M
  else {
508
6.83M
    freereg(fs, r2);
509
6.83M
    freereg(fs, r1);
510
6.83M
  }
511
6.90M
}
512
513
514
/*
515
** Free register used by expression 'e' (if any)
516
*/
517
14.5M
static void freeexp (FuncState *fs, expdesc *e) {
518
14.5M
  if (e->k == VNONRELOC)
519
257k
    freereg(fs, e->u.info);
520
14.5M
}
521
522
523
/*
524
** Free registers used by expressions 'e1' and 'e2' (if any) in proper
525
** order.
526
*/
527
4.96M
static void freeexps (FuncState *fs, expdesc *e1, expdesc *e2) {
528
4.96M
  int r1 = (e1->k == VNONRELOC) ? e1->u.info : -1;
529
4.96M
  int r2 = (e2->k == VNONRELOC) ? e2->u.info : -1;
530
4.96M
  freeregs(fs, r1, r2);
531
4.96M
}
532
533
534
/*
535
** Add constant 'v' to prototype's list of constants (field 'k').
536
** Use scanner's table to cache position of constants in constant list
537
** and try to reuse constants. Because some values should not be used
538
** as keys (nil cannot be a key, integer keys can collapse with float
539
** keys), the caller must provide a useful 'key' for indexing the cache.
540
** Note that all functions share the same table, so entering or exiting
541
** a function can make some indices wrong.
542
*/
543
5.20M
static int addk (FuncState *fs, TValue *key, TValue *v) {
544
5.20M
  TValue val;
545
5.20M
  lua_State *L = fs->ls->L;
546
5.20M
  Proto *f = fs->f;
547
5.20M
  const TValue *idx = luaH_get(fs->ls->h, key);  /* query scanner table */
548
5.20M
  int k, oldsize;
549
5.20M
  if (ttisinteger(idx)) {  /* is there an index there? */
550
5.18M
    k = cast_int(ivalue(idx));
551
    /* correct value? (warning: must distinguish floats from integers!) */
552
5.18M
    if (k < fs->nk && ttypetag(&f->k[k]) == ttypetag(v) &&
553
5.18M
                      luaV_rawequalobj(&f->k[k], v))
554
5.14M
      return k;  /* reuse index */
555
5.18M
  }
556
  /* constant not found; create a new entry */
557
53.2k
  oldsize = f->sizek;
558
53.2k
  k = fs->nk;
559
  /* numerical value does not need GC barrier;
560
     table has no metatable, so it does not need to invalidate cache */
561
53.2k
  setivalue(&val, k);
562
53.2k
  luaH_finishset(L, fs->ls->h, key, idx, &val);
563
53.2k
  luaM_growvector(L, f->k, k, f->sizek, TValue, MAXARG_Ax, "constants");
564
129k
  while (oldsize < f->sizek) setnilvalue(&f->k[oldsize++]);
565
53.2k
  setobj(L, &f->k[k], v);
566
53.2k
  fs->nk++;
567
53.2k
  luaC_barrier(L, f, v);
568
0
  return k;
569
53.2k
}
570
571
572
/*
573
** Add a string to list of constants and return its index.
574
*/
575
5.14M
static int stringK (FuncState *fs, TString *s) {
576
5.14M
  TValue o;
577
5.14M
  setsvalue(fs->ls->L, &o, s);
578
5.14M
  return addk(fs, &o, &o);  /* use string itself as key */
579
5.14M
}
580
581
582
/*
583
** Add an integer to list of constants and return its index.
584
*/
585
26.9k
static int luaK_intK (FuncState *fs, lua_Integer n) {
586
26.9k
  TValue o;
587
26.9k
  setivalue(&o, n);
588
26.9k
  return addk(fs, &o, &o);  /* use integer itself as key */
589
26.9k
}
590
591
/*
592
** Add a float to list of constants and return its index. Floats
593
** with integral values need a different key, to avoid collision
594
** with actual integers. To that, we add to the number its smaller
595
** power-of-two fraction that is still significant in its scale.
596
** For doubles, that would be 1/2^52.
597
** (This method is not bulletproof: there may be another float
598
** with that value, and for floats larger than 2^53 the result is
599
** still an integer. At worst, this only wastes an entry with
600
** a duplicate.)
601
*/
602
32.7k
static int luaK_numberK (FuncState *fs, lua_Number r) {
603
32.7k
  TValue o;
604
32.7k
  lua_Integer ik;
605
32.7k
  setfltvalue(&o, r);
606
32.7k
  if (!luaV_flttointeger(r, &ik, F2Ieq))  /* not an integral value? */
607
14.9k
    return addk(fs, &o, &o);  /* use number itself as key */
608
17.7k
  else {  /* must build an alternative key */
609
17.7k
    const int nbm = l_floatatt(MANT_DIG);
610
17.7k
    const lua_Number q = l_mathop(ldexp)(l_mathop(1.0), -nbm + 1);
611
17.7k
    const lua_Number k = (ik == 0) ? q : r + r*q;  /* new key */
612
17.7k
    TValue kv;
613
17.7k
    setfltvalue(&kv, k);
614
    /* result is not an integral value, unless value is too large */
615
17.7k
    lua_assert(!luaV_flttointeger(k, &ik, F2Ieq) ||
616
17.7k
                l_mathop(fabs)(r) >= l_mathop(1e6));
617
17.7k
    return addk(fs, &kv, &o);
618
17.7k
  }
619
32.7k
}
620
621
622
/*
623
** Add a false to list of constants and return its index.
624
*/
625
15
static int boolF (FuncState *fs) {
626
15
  TValue o;
627
15
  setbfvalue(&o);
628
15
  return addk(fs, &o, &o);  /* use boolean itself as key */
629
15
}
630
631
632
/*
633
** Add a true to list of constants and return its index.
634
*/
635
462
static int boolT (FuncState *fs) {
636
462
  TValue o;
637
462
  setbtvalue(&o);
638
462
  return addk(fs, &o, &o);  /* use boolean itself as key */
639
462
}
640
641
642
/*
643
** Add nil to list of constants and return its index.
644
*/
645
541
static int nilK (FuncState *fs) {
646
541
  TValue k, v;
647
541
  setnilvalue(&v);
648
  /* cannot use nil as key; instead use table itself to represent nil */
649
541
  sethvalue(fs->ls->L, &k, fs->ls->h);
650
541
  return addk(fs, &k, &v);
651
541
}
652
653
654
/*
655
** Check whether 'i' can be stored in an 'sC' operand. Equivalent to
656
** (0 <= int2sC(i) && int2sC(i) <= MAXARG_C) but without risk of
657
** overflows in the hidden addition inside 'int2sC'.
658
*/
659
31.5k
static int fitsC (lua_Integer i) {
660
31.5k
  return (l_castS2U(i) + OFFSET_sC <= cast_uint(MAXARG_C));
661
31.5k
}
662
663
664
/*
665
** Check whether 'i' can be stored in an 'sBx' operand.
666
*/
667
36.1k
static int fitsBx (lua_Integer i) {
668
36.1k
  return (-OFFSET_sBx <= i && i <= MAXARG_Bx - OFFSET_sBx);
669
36.1k
}
670
671
672
23.2k
void luaK_int (FuncState *fs, int reg, lua_Integer i) {
673
23.2k
  if (fitsBx(i))
674
21.1k
    codeAsBx(fs, OP_LOADI, reg, cast_int(i));
675
2.10k
  else
676
2.10k
    luaK_codek(fs, reg, luaK_intK(fs, i));
677
23.2k
}
678
679
680
22.4k
static void luaK_float (FuncState *fs, int reg, lua_Number f) {
681
22.4k
  lua_Integer fi;
682
22.4k
  if (luaV_flttointeger(f, &fi, F2Ieq) && fitsBx(fi))
683
10.8k
    codeAsBx(fs, OP_LOADF, reg, cast_int(fi));
684
11.6k
  else
685
11.6k
    luaK_codek(fs, reg, luaK_numberK(fs, f));
686
22.4k
}
687
688
689
/*
690
** Convert a constant in 'v' into an expression description 'e'
691
*/
692
183k
static void const2exp (TValue *v, expdesc *e) {
693
183k
  switch (ttypetag(v)) {
694
2.37k
    case LUA_VNUMINT:
695
2.37k
      e->k = VKINT; e->u.ival = ivalue(v);
696
0
      break;
697
0
    case LUA_VNUMFLT:
698
0
      e->k = VKFLT; e->u.nval = fltvalue(v);
699
0
      break;
700
43.5k
    case LUA_VFALSE:
701
43.5k
      e->k = VFALSE;
702
43.5k
      break;
703
164
    case LUA_VTRUE:
704
164
      e->k = VTRUE;
705
164
      break;
706
137k
    case LUA_VNIL:
707
137k
      e->k = VNIL;
708
137k
      break;
709
200
    case LUA_VSHRSTR:  case LUA_VLNGSTR:
710
200
      e->k = VKSTR; e->u.strval = tsvalue(v);
711
0
      break;
712
0
    default: lua_assert(0);
713
183k
  }
714
183k
}
715
716
717
/*
718
** Fix an expression to return the number of results 'nresults'.
719
** 'e' must be a multi-ret expression (function call or vararg).
720
*/
721
1.79k
void luaK_setreturns (FuncState *fs, expdesc *e, int nresults) {
722
1.79k
  Instruction *pc = &getinstruction(fs, e);
723
1.79k
  if (e->k == VCALL)  /* expression is an open function call? */
724
1.79k
    SETARG_C(*pc, nresults + 1);
725
54
  else {
726
54
    lua_assert(e->k == VVARARG);
727
54
    SETARG_C(*pc, nresults + 1);
728
54
    SETARG_A(*pc, fs->freereg);
729
54
    luaK_reserveregs(fs, 1);
730
54
  }
731
1.79k
}
732
733
734
/*
735
** Convert a VKSTR to a VK
736
*/
737
5.13M
static void str2K (FuncState *fs, expdesc *e) {
738
5.13M
  lua_assert(e->k == VKSTR);
739
5.13M
  e->u.info = stringK(fs, e->u.strval);
740
5.13M
  e->k = VK;
741
5.13M
}
742
743
744
/*
745
** Fix an expression to return one result.
746
** If expression is not a multi-ret expression (function call or
747
** vararg), it already returns one result, so nothing needs to be done.
748
** Function calls become VNONRELOC expressions (as its result comes
749
** fixed in the base register of the call), while vararg expressions
750
** become VRELOC (as OP_VARARG puts its results where it wants).
751
** (Calls are created returning one result, so that does not need
752
** to be fixed.)
753
*/
754
179k
void luaK_setoneret (FuncState *fs, expdesc *e) {
755
179k
  if (e->k == VCALL) {  /* expression is an open function call? */
756
    /* already returns 1 value */
757
161k
    lua_assert(GETARG_C(getinstruction(fs, e)) == 2);
758
161k
    e->k = VNONRELOC;  /* result has fixed position */
759
161k
    e->u.info = GETARG_A(getinstruction(fs, e));
760
161k
  }
761
18.3k
  else if (e->k == VVARARG) {
762
817
    SETARG_C(getinstruction(fs, e), 2);
763
817
    e->k = VRELOC;  /* can relocate its simple result */
764
817
  }
765
179k
}
766
767
768
/*
769
** Ensure that expression 'e' is not a variable (nor a <const>).
770
** (Expression still may have jump lists.)
771
*/
772
58.3M
void luaK_dischargevars (FuncState *fs, expdesc *e) {
773
58.3M
  switch (e->k) {
774
183k
    case VCONST: {
775
183k
      const2exp(const2val(fs, e), e);
776
183k
      break;
777
0
    }
778
137k
    case VLOCAL: {  /* already in a register */
779
137k
      e->u.info = e->u.var.ridx;
780
137k
      e->k = VNONRELOC;  /* becomes a non-relocatable value */
781
137k
      break;
782
0
    }
783
1.93M
    case VUPVAL: {  /* move value to some (pending) register */
784
1.93M
      e->u.info = luaK_codeABC(fs, OP_GETUPVAL, 0, e->u.info, 0);
785
1.93M
      e->k = VRELOC;
786
1.93M
      break;
787
0
    }
788
2.75M
    case VINDEXUP: {
789
2.75M
      e->u.info = luaK_codeABC(fs, OP_GETTABUP, 0, e->u.ind.t, e->u.ind.idx);
790
2.75M
      e->k = VRELOC;
791
2.75M
      break;
792
0
    }
793
229
    case VINDEXI: {
794
229
      freereg(fs, e->u.ind.t);
795
229
      e->u.info = luaK_codeABC(fs, OP_GETI, 0, e->u.ind.t, e->u.ind.idx);
796
229
      e->k = VRELOC;
797
229
      break;
798
0
    }
799
280k
    case VINDEXSTR: {
800
280k
      freereg(fs, e->u.ind.t);
801
280k
      e->u.info = luaK_codeABC(fs, OP_GETFIELD, 0, e->u.ind.t, e->u.ind.idx);
802
280k
      e->k = VRELOC;
803
280k
      break;
804
0
    }
805
1.93M
    case VINDEXED: {
806
1.93M
      freeregs(fs, e->u.ind.t, e->u.ind.idx);
807
1.93M
      e->u.info = luaK_codeABC(fs, OP_GETTABLE, 0, e->u.ind.t, e->u.ind.idx);
808
1.93M
      e->k = VRELOC;
809
1.93M
      break;
810
0
    }
811
162k
    case VVARARG: case VCALL: {
812
162k
      luaK_setoneret(fs, e);
813
162k
      break;
814
817
    }
815
50.9M
    default: break;  /* there is one value available (somewhere) */
816
58.3M
  }
817
58.3M
}
818
819
820
/*
821
** Ensure expression value is in register 'reg', making 'e' a
822
** non-relocatable expression.
823
** (Expression still may have jump lists.)
824
*/
825
14.3M
static void discharge2reg (FuncState *fs, expdesc *e, int reg) {
826
14.3M
  luaK_dischargevars(fs, e);
827
14.3M
  switch (e->k) {
828
166k
    case VNIL: {
829
166k
      luaK_nil(fs, reg, 1);
830
166k
      break;
831
0
    }
832
43.8k
    case VFALSE: {
833
43.8k
      luaK_codeABC(fs, OP_LOADFALSE, reg, 0, 0);
834
43.8k
      break;
835
0
    }
836
681
    case VTRUE: {
837
681
      luaK_codeABC(fs, OP_LOADTRUE, reg, 0, 0);
838
681
      break;
839
0
    }
840
154k
    case VKSTR: {
841
154k
      str2K(fs, e);
842
154k
    }  /* FALLTHROUGH */
843
2.08M
    case VK: {
844
2.08M
      luaK_codek(fs, reg, e->u.info);
845
2.08M
      break;
846
154k
    }
847
22.4k
    case VKFLT: {
848
22.4k
      luaK_float(fs, reg, e->u.nval);
849
22.4k
      break;
850
154k
    }
851
21.3k
    case VKINT: {
852
21.3k
      luaK_int(fs, reg, e->u.ival);
853
21.3k
      break;
854
154k
    }
855
9.89M
    case VRELOC: {
856
9.89M
      Instruction *pc = &getinstruction(fs, e);
857
9.89M
      SETARG_A(*pc, reg);  /* instruction will put result in 'reg' */
858
9.89M
      break;
859
154k
    }
860
122k
    case VNONRELOC: {
861
122k
      if (reg != e->u.info)
862
18.6k
        luaK_codeABC(fs, OP_MOVE, reg, e->u.info, 0);
863
122k
      break;
864
154k
    }
865
2.02M
    default: {
866
2.02M
      lua_assert(e->k == VJMP);
867
2.02M
      return;  /* nothing to do... */
868
2.02M
    }
869
14.3M
  }
870
12.3M
  e->u.info = reg;
871
12.3M
  e->k = VNONRELOC;
872
12.3M
}
873
874
875
/*
876
** Ensure expression value is in a register, making 'e' a
877
** non-relocatable expression.
878
** (Expression still may have jump lists.)
879
*/
880
19.9k
static void discharge2anyreg (FuncState *fs, expdesc *e) {
881
19.9k
  if (e->k != VNONRELOC) {  /* no fixed register yet? */
882
14.3k
    luaK_reserveregs(fs, 1);  /* get a register */
883
14.3k
    discharge2reg(fs, e, fs->freereg-1);  /* put value there */
884
14.3k
  }
885
19.9k
}
886
887
888
4.05M
static int code_loadbool (FuncState *fs, int A, OpCode op) {
889
4.05M
  luaK_getlabel(fs);  /* those instructions may be jump targets */
890
4.05M
  return luaK_codeABC(fs, op, A, 0, 0);
891
4.05M
}
892
893
894
/*
895
** check whether list has any jump that do not produce a value
896
** or produce an inverted value
897
*/
898
2.04M
static int need_value (FuncState *fs, int list) {
899
2.05M
  for (; list != NO_JUMP; list = getjump(fs, list)) {
900
2.03M
    Instruction i = *getjumpcontrol(fs, list);
901
2.03M
    if (GET_OPCODE(i) != OP_TESTSET) return 1;
902
2.03M
  }
903
18.5k
  return 0;  /* not found */
904
2.04M
}
905
906
907
/*
908
** Ensures final expression result (which includes results from its
909
** jump lists) is in register 'reg'.
910
** If expression has jumps, need to patch these jumps either to
911
** its final position or to "load" instructions (for those tests
912
** that do not produce values).
913
*/
914
14.3M
static void exp2reg (FuncState *fs, expdesc *e, int reg) {
915
14.3M
  discharge2reg(fs, e, reg);
916
14.3M
  if (e->k == VJMP)  /* expression itself is a test? */
917
2.02M
    luaK_concat(fs, &e->t, e->u.info);  /* put this jump in 't' list */
918
14.3M
  if (hasjumps(e)) {
919
2.03M
    int final;  /* position after whole expression */
920
2.03M
    int p_f = NO_JUMP;  /* position of an eventual LOAD false */
921
2.03M
    int p_t = NO_JUMP;  /* position of an eventual LOAD true */
922
2.03M
    if (need_value(fs, e->t) || need_value(fs, e->f)) {
923
2.02M
      int fj = (e->k == VJMP) ? NO_JUMP : luaK_jump(fs);
924
2.02M
      p_f = code_loadbool(fs, reg, OP_LFALSESKIP);  /* skip next inst. */
925
2.02M
      p_t = code_loadbool(fs, reg, OP_LOADTRUE);
926
      /* jump around these booleans if 'e' is not a test */
927
2.02M
      luaK_patchtohere(fs, fj);
928
2.02M
    }
929
2.03M
    final = luaK_getlabel(fs);
930
2.03M
    patchlistaux(fs, e->f, final, reg, p_f);
931
2.03M
    patchlistaux(fs, e->t, final, reg, p_t);
932
2.03M
  }
933
14.3M
  e->f = e->t = NO_JUMP;
934
14.3M
  e->u.info = reg;
935
14.3M
  e->k = VNONRELOC;
936
14.3M
}
937
938
939
/*
940
** Ensures final expression result is in next available register.
941
*/
942
14.3M
void luaK_exp2nextreg (FuncState *fs, expdesc *e) {
943
14.3M
  luaK_dischargevars(fs, e);
944
14.3M
  freeexp(fs, e);
945
14.3M
  luaK_reserveregs(fs, 1);
946
14.3M
  exp2reg(fs, e, fs->freereg - 1);
947
14.3M
}
948
949
950
/*
951
** Ensures final expression result is in some (any) register
952
** and return that register.
953
*/
954
19.1M
int luaK_exp2anyreg (FuncState *fs, expdesc *e) {
955
19.1M
  luaK_dischargevars(fs, e);
956
19.1M
  if (e->k == VNONRELOC) {  /* expression already has a register? */
957
5.15M
    if (!hasjumps(e))  /* no jumps? */
958
5.14M
      return e->u.info;  /* result is already in a register */
959
7.52k
    if (e->u.info >= luaY_nvarstack(fs)) {  /* reg. is not a local? */
960
5.87k
      exp2reg(fs, e, e->u.info);  /* put final result in it */
961
5.87k
      return e->u.info;
962
5.87k
    }
963
    /* else expression has jumps and cannot change its register
964
       to hold the jump values, because it is a local variable.
965
       Go through to the default case. */
966
7.52k
  }
967
13.9M
  luaK_exp2nextreg(fs, e);  /* default: use next available register */
968
13.9M
  return e->u.info;
969
19.1M
}
970
971
972
/*
973
** Ensures final expression result is either in a register
974
** or in an upvalue.
975
*/
976
4.99M
void luaK_exp2anyregup (FuncState *fs, expdesc *e) {
977
4.99M
  if (e->k != VUPVAL || hasjumps(e))
978
295k
    luaK_exp2anyreg(fs, e);
979
4.99M
}
980
981
982
/*
983
** Ensures final expression result is either in a register
984
** or it is a constant.
985
*/
986
12.6k
void luaK_exp2val (FuncState *fs, expdesc *e) {
987
12.6k
  if (hasjumps(e))
988
611
    luaK_exp2anyreg(fs, e);
989
12.0k
  else
990
12.0k
    luaK_dischargevars(fs, e);
991
12.6k
}
992
993
994
/*
995
** Try to make 'e' a K expression with an index in the range of R/K
996
** indices. Return true iff succeeded.
997
*/
998
69.3k
static int luaK_exp2K (FuncState *fs, expdesc *e) {
999
69.3k
  if (!hasjumps(e)) {
1000
67.5k
    int info;
1001
67.5k
    switch (e->k) {  /* move constants to 'k' */
1002
462
      case VTRUE: info = boolT(fs); break;
1003
15
      case VFALSE: info = boolF(fs); break;
1004
541
      case VNIL: info = nilK(fs); break;
1005
24.8k
      case VKINT: info = luaK_intK(fs, e->u.ival); break;
1006
21.1k
      case VKFLT: info = luaK_numberK(fs, e->u.nval); break;
1007
2.96k
      case VKSTR: info = stringK(fs, e->u.strval); break;
1008
330
      case VK: info = e->u.info; break;
1009
17.2k
      default: return 0;  /* not a constant */
1010
67.5k
    }
1011
50.3k
    if (info <= MAXINDEXRK) {  /* does constant fit in 'argC'? */
1012
37.9k
      e->k = VK;  /* make expression a 'K' expression */
1013
37.9k
      e->u.info = info;
1014
37.9k
      return 1;
1015
37.9k
    }
1016
50.3k
  }
1017
  /* else, expression doesn't fit; leave it unchanged */
1018
14.1k
  return 0;
1019
69.3k
}
1020
1021
1022
/*
1023
** Ensures final expression result is in a valid R/K index
1024
** (that is, it is either in a register or in 'k' with an index
1025
** in the range of R/K indices).
1026
** Returns 1 iff expression is K.
1027
*/
1028
26.6k
static int exp2RK (FuncState *fs, expdesc *e) {
1029
26.6k
  if (luaK_exp2K(fs, e))
1030
7.48k
    return 1;
1031
19.1k
  else {  /* not a constant in the right range: put it in a register */
1032
19.1k
    luaK_exp2anyreg(fs, e);
1033
19.1k
    return 0;
1034
19.1k
  }
1035
26.6k
}
1036
1037
1038
static void codeABRK (FuncState *fs, OpCode o, int a, int b,
1039
21.8k
                      expdesc *ec) {
1040
21.8k
  int k = exp2RK(fs, ec);
1041
21.8k
  luaK_codeABCk(fs, o, a, b, ec->u.info, k);
1042
21.8k
}
1043
1044
1045
/*
1046
** Generate code to store result of expression 'ex' into variable 'var'.
1047
*/
1048
27.5k
void luaK_storevar (FuncState *fs, expdesc *var, expdesc *ex) {
1049
27.5k
  switch (var->k) {
1050
4.44k
    case VLOCAL: {
1051
4.44k
      freeexp(fs, ex);
1052
4.44k
      exp2reg(fs, ex, var->u.var.ridx);  /* compute 'ex' into proper place */
1053
4.44k
      return;
1054
0
    }
1055
1.75k
    case VUPVAL: {
1056
1.75k
      int e = luaK_exp2anyreg(fs, ex);
1057
1.75k
      luaK_codeABC(fs, OP_SETUPVAL, e, var->u.info, 0);
1058
1.75k
      break;
1059
0
    }
1060
14.0k
    case VINDEXUP: {
1061
14.0k
      codeABRK(fs, OP_SETTABUP, var->u.ind.t, var->u.ind.idx, ex);
1062
14.0k
      break;
1063
0
    }
1064
165
    case VINDEXI: {
1065
165
      codeABRK(fs, OP_SETI, var->u.ind.t, var->u.ind.idx, ex);
1066
165
      break;
1067
0
    }
1068
4.63k
    case VINDEXSTR: {
1069
4.63k
      codeABRK(fs, OP_SETFIELD, var->u.ind.t, var->u.ind.idx, ex);
1070
4.63k
      break;
1071
0
    }
1072
2.53k
    case VINDEXED: {
1073
2.53k
      codeABRK(fs, OP_SETTABLE, var->u.ind.t, var->u.ind.idx, ex);
1074
2.53k
      break;
1075
0
    }
1076
0
    default: lua_assert(0);  /* invalid var kind to store */
1077
27.5k
  }
1078
23.1k
  freeexp(fs, ex);
1079
23.1k
}
1080
1081
1082
/*
1083
** Emit SELF instruction (convert expression 'e' into 'e:key(e,').
1084
*/
1085
542
void luaK_self (FuncState *fs, expdesc *e, expdesc *key) {
1086
542
  int ereg;
1087
542
  luaK_exp2anyreg(fs, e);
1088
542
  ereg = e->u.info;  /* register where 'e' was placed */
1089
542
  freeexp(fs, e);
1090
542
  e->u.info = fs->freereg;  /* base register for op_self */
1091
542
  e->k = VNONRELOC;  /* self expression has a fixed register */
1092
542
  luaK_reserveregs(fs, 2);  /* function and 'self' produced by op_self */
1093
542
  codeABRK(fs, OP_SELF, e->u.info, ereg, key);
1094
542
  freeexp(fs, key);
1095
542
}
1096
1097
1098
/*
1099
** Negate condition 'e' (where 'e' is a comparison).
1100
*/
1101
2.72k
static void negatecondition (FuncState *fs, expdesc *e) {
1102
2.72k
  Instruction *pc = getjumpcontrol(fs, e->u.info);
1103
2.72k
  lua_assert(testTMode(GET_OPCODE(*pc)) && GET_OPCODE(*pc) != OP_TESTSET &&
1104
2.72k
                                           GET_OPCODE(*pc) != OP_TEST);
1105
5.44k
  SETARG_k(*pc, (GETARG_k(*pc) ^ 1));
1106
5.44k
}
1107
1108
1109
/*
1110
** Emit instruction to jump if 'e' is 'cond' (that is, if 'cond'
1111
** is true, code will jump if 'e' is true.) Return jump position.
1112
** Optimize when 'e' is 'not' something, inverting the condition
1113
** and removing the 'not'.
1114
*/
1115
18.6k
static int jumponcond (FuncState *fs, expdesc *e, int cond) {
1116
18.6k
  if (e->k == VRELOC) {
1117
13.0k
    Instruction ie = getinstruction(fs, e);
1118
13.0k
    if (GET_OPCODE(ie) == OP_NOT) {
1119
182
      removelastinstruction(fs);  /* remove previous OP_NOT */
1120
182
      return condjump(fs, OP_TEST, GETARG_B(ie), 0, 0, !cond);
1121
182
    }
1122
    /* else go through */
1123
13.0k
  }
1124
18.4k
  discharge2anyreg(fs, e);
1125
18.4k
  freeexp(fs, e);
1126
18.4k
  return condjump(fs, OP_TESTSET, NO_REG, e->u.info, 0, cond);
1127
18.6k
}
1128
1129
1130
/*
1131
** Emit code to go through if 'e' is true, jump otherwise.
1132
*/
1133
13.1k
void luaK_goiftrue (FuncState *fs, expdesc *e) {
1134
13.1k
  int pc;  /* pc of new jump */
1135
13.1k
  luaK_dischargevars(fs, e);
1136
13.1k
  switch (e->k) {
1137
2.45k
    case VJMP: {  /* condition? */
1138
2.45k
      negatecondition(fs, e);  /* jump when it is false */
1139
2.45k
      pc = e->u.info;  /* save jump position */
1140
2.45k
      break;
1141
0
    }
1142
2.18k
    case VK: case VKFLT: case VKINT: case VKSTR: case VTRUE: {
1143
2.18k
      pc = NO_JUMP;  /* always true; do nothing */
1144
2.18k
      break;
1145
1.94k
    }
1146
8.52k
    default: {
1147
8.52k
      pc = jumponcond(fs, e, 0);  /* jump when false */
1148
8.52k
      break;
1149
1.94k
    }
1150
13.1k
  }
1151
13.1k
  luaK_concat(fs, &e->f, pc);  /* insert new jump in false list */
1152
13.1k
  luaK_patchtohere(fs, e->t);  /* true list jumps to here (to go through) */
1153
13.1k
  e->t = NO_JUMP;
1154
13.1k
}
1155
1156
1157
/*
1158
** Emit code to go through if 'e' is false, jump otherwise.
1159
*/
1160
67.4k
void luaK_goiffalse (FuncState *fs, expdesc *e) {
1161
67.4k
  int pc;  /* pc of new jump */
1162
67.4k
  luaK_dischargevars(fs, e);
1163
67.4k
  switch (e->k) {
1164
57.3k
    case VJMP: {
1165
57.3k
      pc = e->u.info;  /* already jump if true */
1166
57.3k
      break;
1167
0
    }
1168
0
    case VNIL: case VFALSE: {
1169
0
      pc = NO_JUMP;  /* always false; do nothing */
1170
0
      break;
1171
0
    }
1172
10.0k
    default: {
1173
10.0k
      pc = jumponcond(fs, e, 1);  /* jump if true */
1174
10.0k
      break;
1175
0
    }
1176
67.4k
  }
1177
67.4k
  luaK_concat(fs, &e->t, pc);  /* insert new jump in 't' list */
1178
67.4k
  luaK_patchtohere(fs, e->f);  /* false list jumps to here (to go through) */
1179
67.4k
  e->f = NO_JUMP;
1180
67.4k
}
1181
1182
1183
/*
1184
** Code 'not e', doing constant folding.
1185
*/
1186
2.01k
static void codenot (FuncState *fs, expdesc *e) {
1187
2.01k
  switch (e->k) {
1188
70
    case VNIL: case VFALSE: {
1189
70
      e->k = VTRUE;  /* true == not nil == not false */
1190
70
      break;
1191
0
    }
1192
124
    case VK: case VKFLT: case VKINT: case VKSTR: case VTRUE: {
1193
124
      e->k = VFALSE;  /* false == not "x" == not 0.5 == not 1 == not true */
1194
124
      break;
1195
48
    }
1196
271
    case VJMP: {
1197
271
      negatecondition(fs, e);
1198
271
      break;
1199
48
    }
1200
983
    case VRELOC:
1201
1.55k
    case VNONRELOC: {
1202
1.55k
      discharge2anyreg(fs, e);
1203
1.55k
      freeexp(fs, e);
1204
1.55k
      e->u.info = luaK_codeABC(fs, OP_NOT, 0, e->u.info, 0);
1205
1.55k
      e->k = VRELOC;
1206
1.55k
      break;
1207
983
    }
1208
0
    default: lua_assert(0);  /* cannot happen */
1209
2.01k
  }
1210
  /* interchange true and false lists */
1211
2.01k
  { int temp = e->f; e->f = e->t; e->t = temp; }
1212
2.01k
  removevalues(fs, e->f);  /* values are useless when negated */
1213
2.01k
  removevalues(fs, e->t);
1214
2.01k
}
1215
1216
1217
/*
1218
** Check whether expression 'e' is a short literal string
1219
*/
1220
9.69M
static int isKstr (FuncState *fs, expdesc *e) {
1221
9.69M
  return (e->k == VK && !hasjumps(e) && e->u.info <= MAXARG_B &&
1222
9.69M
          ttisshrstring(&fs->f->k[e->u.info]));
1223
9.69M
}
1224
1225
/*
1226
** Check whether expression 'e' is a literal integer.
1227
*/
1228
2.18M
static int isKint (expdesc *e) {
1229
2.18M
  return (e->k == VKINT && !hasjumps(e));
1230
2.18M
}
1231
1232
1233
/*
1234
** Check whether expression 'e' is a literal integer in
1235
** proper range to fit in register C
1236
*/
1237
1.94M
static int isCint (expdesc *e) {
1238
1.94M
  return isKint(e) && (l_castS2U(e->u.ival) <= l_castS2U(MAXARG_C));
1239
1.94M
}
1240
1241
1242
/*
1243
** Check whether expression 'e' is a literal integer in
1244
** proper range to fit in register sC
1245
*/
1246
115k
static int isSCint (expdesc *e) {
1247
115k
  return isKint(e) && fitsC(e->u.ival);
1248
115k
}
1249
1250
1251
/*
1252
** Check whether expression 'e' is a literal integer or float in
1253
** proper range to fit in a register (sB or sC).
1254
*/
1255
6.22M
static int isSCnumber (expdesc *e, int *pi, int *isfloat) {
1256
6.22M
  lua_Integer i;
1257
6.22M
  if (e->k == VKINT)
1258
12.3k
    i = e->u.ival;
1259
6.21M
  else if (e->k == VKFLT && luaV_flttointeger(e->u.nval, &i, F2Ieq))
1260
1.75k
    *isfloat = 1;
1261
6.21M
  else
1262
6.21M
    return 0;  /* not a number */
1263
14.0k
  if (!hasjumps(e) && fitsC(i)) {
1264
11.6k
    *pi = int2sC(cast_int(i));
1265
11.6k
    return 1;
1266
11.6k
  }
1267
2.41k
  else
1268
2.41k
    return 0;
1269
14.0k
}
1270
1271
1272
/*
1273
** Create expression 't[k]'. 't' must have its final result already in a
1274
** register or upvalue. Upvalues can only be indexed by literal strings.
1275
** Keys can be literal strings in the constant table or arbitrary
1276
** values in registers.
1277
*/
1278
4.99M
void luaK_indexed (FuncState *fs, expdesc *t, expdesc *k) {
1279
4.99M
  if (k->k == VKSTR)
1280
4.98M
    str2K(fs, k);
1281
4.99M
  lua_assert(!hasjumps(t) &&
1282
4.99M
             (t->k == VLOCAL || t->k == VNONRELOC || t->k == VUPVAL));
1283
4.99M
  if (t->k == VUPVAL && !isKstr(fs, k))  /* upvalue indexed by non 'Kstr'? */
1284
1.93M
    luaK_exp2anyreg(fs, t);  /* put it in a register */
1285
4.99M
  if (t->k == VUPVAL) {
1286
2.76M
    lua_assert(isKstr(fs, k));
1287
2.76M
    t->u.ind.t = t->u.info;  /* upvalue index */
1288
2.76M
    t->u.ind.idx = k->u.info;  /* literal short string */
1289
2.76M
    t->k = VINDEXUP;
1290
2.76M
  }
1291
2.22M
  else {
1292
    /* register index of the table */
1293
2.22M
    t->u.ind.t = (t->k == VLOCAL) ? t->u.var.ridx: t->u.info;
1294
2.22M
    if (isKstr(fs, k)) {
1295
285k
      t->u.ind.idx = k->u.info;  /* literal short string */
1296
285k
      t->k = VINDEXSTR;
1297
285k
    }
1298
1.94M
    else if (isCint(k)) {
1299
395
      t->u.ind.idx = cast_int(k->u.ival);  /* int. constant in proper range */
1300
395
      t->k = VINDEXI;
1301
395
    }
1302
1.94M
    else {
1303
1.94M
      t->u.ind.idx = luaK_exp2anyreg(fs, k);  /* register */
1304
1.94M
      t->k = VINDEXED;
1305
1.94M
    }
1306
2.22M
  }
1307
4.99M
}
1308
1309
1310
/*
1311
** Return false if folding can raise an error.
1312
** Bitwise operations need operands convertible to integers; division
1313
** operations cannot have 0 as divisor.
1314
*/
1315
91.2k
static int validop (int op, TValue *v1, TValue *v2) {
1316
91.2k
  switch (op) {
1317
2.50k
    case LUA_OPBAND: case LUA_OPBOR: case LUA_OPBXOR:
1318
31.8k
    case LUA_OPSHL: case LUA_OPSHR: case LUA_OPBNOT: {  /* conversion errors */
1319
31.8k
      lua_Integer i;
1320
31.8k
      return (luaV_tointegerns(v1, &i, LUA_FLOORN2I) &&
1321
31.8k
              luaV_tointegerns(v2, &i, LUA_FLOORN2I));
1322
2.66k
    }
1323
3.86k
    case LUA_OPDIV: case LUA_OPIDIV: case LUA_OPMOD:  /* division by 0 */
1324
3.86k
      return (nvalue(v2) != 0);
1325
55.5k
    default: return 1;  /* everything else is valid */
1326
91.2k
  }
1327
91.2k
}
1328
1329
1330
/*
1331
** Try to "constant-fold" an operation; return 1 iff successful.
1332
** (In this case, 'e1' has the final result.)
1333
*/
1334
static int constfolding (FuncState *fs, int op, expdesc *e1,
1335
3.04M
                                        const expdesc *e2) {
1336
3.04M
  TValue v1, v2, res;
1337
3.04M
  if (!tonumeral(e1, &v1) || !tonumeral(e2, &v2) || !validop(op, &v1, &v2))
1338
2.96M
    return 0;  /* non-numeric operands or not safe to fold */
1339
84.7k
  luaO_rawarith(fs->ls->L, op, &v1, &v2, &res);  /* does operation */
1340
84.7k
  if (ttisinteger(&res)) {
1341
35.2k
    e1->k = VKINT;
1342
35.2k
    e1->u.ival = ivalue(&res);
1343
35.2k
  }
1344
49.4k
  else {  /* folds neither NaN nor 0.0 (to avoid problems with -0.0) */
1345
49.4k
    lua_Number n = fltvalue(&res);
1346
49.4k
    if (luai_numisnan(n) || n == 0)
1347
4.60k
      return 0;
1348
44.8k
    e1->k = VKFLT;
1349
44.8k
    e1->u.nval = n;
1350
44.8k
  }
1351
80.1k
  return 1;
1352
84.7k
}
1353
1354
1355
/*
1356
** Convert a BinOpr to an OpCode  (ORDER OPR - ORDER OP)
1357
*/
1358
4.95M
l_sinline OpCode binopr2op (BinOpr opr, BinOpr baser, OpCode base) {
1359
4.95M
  lua_assert(baser <= opr &&
1360
4.95M
            ((baser == OPR_ADD && opr <= OPR_SHR) ||
1361
4.95M
             (baser == OPR_LT && opr <= OPR_LE)));
1362
4.95M
  return cast(OpCode, (cast_int(opr) - cast_int(baser)) + cast_int(base));
1363
4.95M
}
1364
1365
1366
/*
1367
** Convert a UnOpr to an OpCode  (ORDER OPR - ORDER OP)
1368
*/
1369
89.1k
l_sinline OpCode unopr2op (UnOpr opr) {
1370
89.1k
  return cast(OpCode, (cast_int(opr) - cast_int(OPR_MINUS)) +
1371
89.1k
                                       cast_int(OP_UNM));
1372
89.1k
}
1373
1374
1375
/*
1376
** Convert a BinOpr to a tag method  (ORDER OPR - ORDER TM)
1377
*/
1378
2.87M
l_sinline TMS binopr2TM (BinOpr opr) {
1379
2.87M
  lua_assert(OPR_ADD <= opr && opr <= OPR_SHR);
1380
2.87M
  return cast(TMS, (cast_int(opr) - cast_int(OPR_ADD)) + cast_int(TM_ADD));
1381
2.87M
}
1382
1383
1384
/*
1385
** Emit code for unary expressions that "produce values"
1386
** (everything but 'not').
1387
** Expression to produce final result will be encoded in 'e'.
1388
*/
1389
89.1k
static void codeunexpval (FuncState *fs, OpCode op, expdesc *e, int line) {
1390
89.1k
  int r = luaK_exp2anyreg(fs, e);  /* opcodes operate only on registers */
1391
89.1k
  freeexp(fs, e);
1392
89.1k
  e->u.info = luaK_codeABC(fs, op, 0, r, 0);  /* generate opcode */
1393
89.1k
  e->k = VRELOC;  /* all those operations are relocatable */
1394
89.1k
  luaK_fixline(fs, line);
1395
89.1k
}
1396
1397
1398
/*
1399
** Emit code for binary expressions that "produce values"
1400
** (everything but logical operators 'and'/'or' and comparison
1401
** operators).
1402
** Expression to produce final result will be encoded in 'e1'.
1403
*/
1404
static void finishbinexpval (FuncState *fs, expdesc *e1, expdesc *e2,
1405
                             OpCode op, int v2, int flip, int line,
1406
2.88M
                             OpCode mmop, TMS event) {
1407
2.88M
  int v1 = luaK_exp2anyreg(fs, e1);
1408
2.88M
  int pc = luaK_codeABCk(fs, op, 0, v1, v2, 0);
1409
2.88M
  freeexps(fs, e1, e2);
1410
2.88M
  e1->u.info = pc;
1411
2.88M
  e1->k = VRELOC;  /* all those operations are relocatable */
1412
2.88M
  luaK_fixline(fs, line);
1413
2.88M
  luaK_codeABCk(fs, mmop, v1, v2, event, flip);  /* to call metamethod */
1414
2.88M
  luaK_fixline(fs, line);
1415
2.88M
}
1416
1417
1418
/*
1419
** Emit code for binary expressions that "produce values" over
1420
** two registers.
1421
*/
1422
static void codebinexpval (FuncState *fs, BinOpr opr,
1423
2.84M
                           expdesc *e1, expdesc *e2, int line) {
1424
2.84M
  OpCode op = binopr2op(opr, OPR_ADD, OP_ADD);
1425
2.84M
  int v2 = luaK_exp2anyreg(fs, e2);  /* make sure 'e2' is in a register */
1426
  /* 'e1' must be already in a register or it is a constant */
1427
2.84M
  lua_assert((VNIL <= e1->k && e1->k <= VKSTR) ||
1428
2.84M
             e1->k == VNONRELOC || e1->k == VRELOC);
1429
2.84M
  lua_assert(OP_ADD <= op && op <= OP_SHR);
1430
2.84M
  finishbinexpval(fs, e1, e2, op, v2, 0, line, OP_MMBIN, binopr2TM(opr));
1431
2.84M
}
1432
1433
1434
/*
1435
** Code binary operators with immediate operands.
1436
*/
1437
static void codebini (FuncState *fs, OpCode op,
1438
                       expdesc *e1, expdesc *e2, int flip, int line,
1439
2.69k
                       TMS event) {
1440
2.69k
  int v2 = int2sC(cast_int(e2->u.ival));  /* immediate operand */
1441
2.69k
  lua_assert(e2->k == VKINT);
1442
2.69k
  finishbinexpval(fs, e1, e2, op, v2, flip, line, OP_MMBINI, event);
1443
2.69k
}
1444
1445
1446
/*
1447
** Code binary operators with K operand.
1448
*/
1449
static void codebinK (FuncState *fs, BinOpr opr,
1450
30.4k
                      expdesc *e1, expdesc *e2, int flip, int line) {
1451
30.4k
  TMS event = binopr2TM(opr);
1452
30.4k
  int v2 = e2->u.info;  /* K index */
1453
30.4k
  OpCode op = binopr2op(opr, OPR_ADD, OP_ADDK);
1454
30.4k
  finishbinexpval(fs, e1, e2, op, v2, flip, line, OP_MMBINK, event);
1455
30.4k
}
1456
1457
1458
/* Try to code a binary operator negating its second operand.
1459
** For the metamethod, 2nd operand must keep its original value.
1460
*/
1461
static int finishbinexpneg (FuncState *fs, expdesc *e1, expdesc *e2,
1462
124k
                             OpCode op, int line, TMS event) {
1463
124k
  if (!isKint(e2))
1464
116k
    return 0;  /* not an integer constant */
1465
7.64k
  else {
1466
7.64k
    lua_Integer i2 = e2->u.ival;
1467
7.64k
    if (!(fitsC(i2) && fitsC(-i2)))
1468
141
      return 0;  /* not in the proper range */
1469
7.50k
    else {  /* operating a small integer constant */
1470
7.50k
      int v2 = cast_int(i2);
1471
7.50k
      finishbinexpval(fs, e1, e2, op, int2sC(-v2), 0, line, OP_MMBINI, event);
1472
      /* correct metamethod argument */
1473
7.50k
      SETARG_B(fs->f->code[fs->pc - 1], int2sC(v2));
1474
7.50k
      return 1;  /* successfully coded */
1475
7.50k
    }
1476
7.64k
  }
1477
124k
}
1478
1479
1480
24.6k
static void swapexps (expdesc *e1, expdesc *e2) {
1481
24.6k
  expdesc temp = *e1; *e1 = *e2; *e2 = temp;  /* swap 'e1' and 'e2' */
1482
24.6k
}
1483
1484
1485
/*
1486
** Code binary operators with no constant operand.
1487
*/
1488
static void codebinNoK (FuncState *fs, BinOpr opr,
1489
2.73M
                        expdesc *e1, expdesc *e2, int flip, int line) {
1490
2.73M
  if (flip)
1491
617
    swapexps(e1, e2);  /* back to original order */
1492
2.73M
  codebinexpval(fs, opr, e1, e2, line);  /* use standard operators */
1493
2.73M
}
1494
1495
1496
/*
1497
** Code arithmetic operators ('+', '-', ...). If second operand is a
1498
** constant in the proper range, use variant opcodes with K operands.
1499
*/
1500
static void codearith (FuncState *fs, BinOpr opr,
1501
2.73M
                       expdesc *e1, expdesc *e2, int flip, int line) {
1502
2.73M
  if (tonumeral(e2, NULL) && luaK_exp2K(fs, e2))  /* K operand? */
1503
21.1k
    codebinK(fs, opr, e1, e2, flip, line);
1504
2.71M
  else  /* 'e2' is neither an immediate nor a K operand */
1505
2.71M
    codebinNoK(fs, opr, e1, e2, flip, line);
1506
2.73M
}
1507
1508
1509
/*
1510
** Code commutative operators ('+', '*'). If first operand is a
1511
** numeric constant, change order of operands to try to use an
1512
** immediate or K operator.
1513
*/
1514
static void codecommutative (FuncState *fs, BinOpr op,
1515
17.0k
                             expdesc *e1, expdesc *e2, int line) {
1516
17.0k
  int flip = 0;
1517
17.0k
  if (tonumeral(e1, NULL)) {  /* is first operand a numeric constant? */
1518
2.96k
    swapexps(e1, e2);  /* change order */
1519
2.96k
    flip = 1;
1520
2.96k
  }
1521
17.0k
  if (op == OPR_ADD && isSCint(e2))  /* immediate operand? */
1522
227
    codebini(fs, OP_ADDI, e1, e2, flip, line, TM_ADD);
1523
16.8k
  else
1524
16.8k
    codearith(fs, op, e1, e2, flip, line);
1525
17.0k
}
1526
1527
1528
/*
1529
** Code bitwise operations; they are all commutative, so the function
1530
** tries to put an integer constant as the 2nd operand (a K operand).
1531
*/
1532
static void codebitwise (FuncState *fs, BinOpr opr,
1533
30.4k
                         expdesc *e1, expdesc *e2, int line) {
1534
30.4k
  int flip = 0;
1535
30.4k
  if (e1->k == VKINT) {
1536
1.05k
    swapexps(e1, e2);  /* 'e2' will be the constant operand */
1537
1.05k
    flip = 1;
1538
1.05k
  }
1539
30.4k
  if (e2->k == VKINT && luaK_exp2K(fs, e2))  /* K operand? */
1540
9.30k
    codebinK(fs, opr, e1, e2, flip, line);
1541
21.1k
  else  /* no constants */
1542
21.1k
    codebinNoK(fs, opr, e1, e2, flip, line);
1543
30.4k
}
1544
1545
1546
/*
1547
** Emit code for order comparisons. When using an immediate operand,
1548
** 'isfloat' tells whether the original value was a float.
1549
*/
1550
2.07M
static void codeorder (FuncState *fs, BinOpr opr, expdesc *e1, expdesc *e2) {
1551
2.07M
  int r1, r2;
1552
2.07M
  int im;
1553
2.07M
  int isfloat = 0;
1554
2.07M
  OpCode op;
1555
2.07M
  if (isSCnumber(e2, &im, &isfloat)) {
1556
    /* use immediate operand */
1557
5.43k
    r1 = luaK_exp2anyreg(fs, e1);
1558
5.43k
    r2 = im;
1559
5.43k
    op = binopr2op(opr, OPR_LT, OP_LTI);
1560
5.43k
  }
1561
2.07M
  else if (isSCnumber(e1, &im, &isfloat)) {
1562
    /* transform (A < B) to (B > A) and (A <= B) to (B >= A) */
1563
2.14k
    r1 = luaK_exp2anyreg(fs, e2);
1564
2.14k
    r2 = im;
1565
2.14k
    op = binopr2op(opr, OPR_LT, OP_GTI);
1566
2.14k
  }
1567
2.06M
  else {  /* regular case, compare two registers */
1568
2.06M
    r1 = luaK_exp2anyreg(fs, e1);
1569
2.06M
    r2 = luaK_exp2anyreg(fs, e2);
1570
2.06M
    op = binopr2op(opr, OPR_LT, OP_LT);
1571
2.06M
  }
1572
2.07M
  freeexps(fs, e1, e2);
1573
2.07M
  e1->u.info = condjump(fs, op, r1, r2, isfloat, 1);
1574
2.07M
  e1->k = VJMP;
1575
2.07M
}
1576
1577
1578
/*
1579
** Emit code for equality comparisons ('==', '~=').
1580
** 'e1' was already put as RK by 'luaK_infix'.
1581
*/
1582
3.47k
static void codeeq (FuncState *fs, BinOpr opr, expdesc *e1, expdesc *e2) {
1583
3.47k
  int r1, r2;
1584
3.47k
  int im;
1585
3.47k
  int isfloat = 0;  /* not needed here, but kept for symmetry */
1586
3.47k
  OpCode op;
1587
3.47k
  if (e1->k != VNONRELOC) {
1588
1.90k
    lua_assert(e1->k == VK || e1->k == VKINT || e1->k == VKFLT);
1589
1.90k
    swapexps(e1, e2);
1590
1.90k
  }
1591
3.47k
  r1 = luaK_exp2anyreg(fs, e1);  /* 1st expression must be in register */
1592
3.47k
  if (isSCnumber(e2, &im, &isfloat)) {
1593
702
    op = OP_EQI;
1594
702
    r2 = im;  /* immediate operand */
1595
702
  }
1596
2.76k
  else if (exp2RK(fs, e2)) {  /* 2nd expression is constant? */
1597
1.38k
    op = OP_EQK;
1598
1.38k
    r2 = e2->u.info;  /* constant index */
1599
1.38k
  }
1600
1.37k
  else {
1601
1.37k
    op = OP_EQ;  /* will compare two registers */
1602
1.37k
    r2 = luaK_exp2anyreg(fs, e2);
1603
1.37k
  }
1604
3.47k
  freeexps(fs, e1, e2);
1605
3.47k
  e1->u.info = condjump(fs, op, r1, r2, isfloat, (opr == OPR_EQ));
1606
3.47k
  e1->k = VJMP;
1607
3.47k
}
1608
1609
1610
/*
1611
** Apply prefix operation 'op' to expression 'e'.
1612
*/
1613
119k
void luaK_prefix (FuncState *fs, UnOpr opr, expdesc *e, int line) {
1614
119k
  static const expdesc ef = {VKINT, {0}, NO_JUMP, NO_JUMP};
1615
119k
  luaK_dischargevars(fs, e);
1616
119k
  switch (opr) {
1617
107k
    case OPR_MINUS: case OPR_BNOT:  /* use 'ef' as fake 2nd operand */
1618
107k
      if (constfolding(fs, opr + LUA_OPUNM, e, &ef))
1619
28.6k
        break;
1620
      /* else */ /* FALLTHROUGH */
1621
89.1k
    case OPR_LEN:
1622
89.1k
      codeunexpval(fs, unopr2op(opr), e, line);
1623
89.1k
      break;
1624
2.01k
    case OPR_NOT: codenot(fs, e); break;
1625
0
    default: lua_assert(0);
1626
119k
  }
1627
119k
}
1628
1629
1630
/*
1631
** Process 1st operand 'v' of binary operation 'op' before reading
1632
** 2nd operand.
1633
*/
1634
5.11M
void luaK_infix (FuncState *fs, BinOpr op, expdesc *v) {
1635
5.11M
  luaK_dischargevars(fs, v);
1636
5.11M
  switch (op) {
1637
12.1k
    case OPR_AND: {
1638
12.1k
      luaK_goiftrue(fs, v);  /* go ahead only if 'v' is true */
1639
12.1k
      break;
1640
0
    }
1641
67.4k
    case OPR_OR: {
1642
67.4k
      luaK_goiffalse(fs, v);  /* go ahead only if 'v' is false */
1643
67.4k
      break;
1644
0
    }
1645
13.6k
    case OPR_CONCAT: {
1646
13.6k
      luaK_exp2nextreg(fs, v);  /* operand must be on the stack */
1647
13.6k
      break;
1648
0
    }
1649
19.0k
    case OPR_ADD: case OPR_SUB:
1650
2.59M
    case OPR_MUL: case OPR_DIV: case OPR_IDIV:
1651
2.79M
    case OPR_MOD: case OPR_POW:
1652
2.82M
    case OPR_BAND: case OPR_BOR: case OPR_BXOR:
1653
2.94M
    case OPR_SHL: case OPR_SHR: {
1654
2.94M
      if (!tonumeral(v, NULL))
1655
2.87M
        luaK_exp2anyreg(fs, v);
1656
      /* else keep numeral, which may be folded or used as an immediate
1657
         operand */
1658
2.94M
      break;
1659
2.94M
    }
1660
3.55k
    case OPR_EQ: case OPR_NE: {
1661
3.55k
      if (!tonumeral(v, NULL))
1662
1.96k
        exp2RK(fs, v);
1663
      /* else keep numeral, which may be an immediate operand */
1664
3.55k
      break;
1665
1.77k
    }
1666
2.06M
    case OPR_LT: case OPR_LE:
1667
2.07M
    case OPR_GT: case OPR_GE: {
1668
2.07M
      int dummy, dummy2;
1669
2.07M
      if (!isSCnumber(v, &dummy, &dummy2))
1670
2.07M
        luaK_exp2anyreg(fs, v);
1671
      /* else keep numeral, which may be an immediate operand */
1672
2.07M
      break;
1673
2.07M
    }
1674
0
    default: lua_assert(0);
1675
5.11M
  }
1676
5.11M
}
1677
1678
/*
1679
** Create code for '(e1 .. e2)'.
1680
** For '(e1 .. e2.1 .. e2.2)' (which is '(e1 .. (e2.1 .. e2.2))',
1681
** because concatenation is right associative), merge both CONCATs.
1682
*/
1683
13.5k
static void codeconcat (FuncState *fs, expdesc *e1, expdesc *e2, int line) {
1684
13.5k
  Instruction *ie2 = previousinstruction(fs);
1685
13.5k
  if (GET_OPCODE(*ie2) == OP_CONCAT) {  /* is 'e2' a concatenation? */
1686
5.46k
    int n = GETARG_B(*ie2);  /* # of elements concatenated in 'e2' */
1687
5.46k
    lua_assert(e1->u.info + 1 == GETARG_A(*ie2));
1688
5.46k
    freeexp(fs, e2);
1689
5.46k
    SETARG_A(*ie2, e1->u.info);  /* correct first element ('e1') */
1690
5.46k
    SETARG_B(*ie2, n + 1);  /* will concatenate one more element */
1691
5.46k
  }
1692
8.08k
  else {  /* 'e2' is not a concatenation */
1693
8.08k
    luaK_codeABC(fs, OP_CONCAT, e1->u.info, 2, 0);  /* new concat opcode */
1694
8.08k
    freeexp(fs, e2);
1695
8.08k
    luaK_fixline(fs, line);
1696
8.08k
  }
1697
13.5k
}
1698
1699
1700
/*
1701
** Finalize code for binary operation, after reading 2nd operand.
1702
*/
1703
void luaK_posfix (FuncState *fs, BinOpr opr,
1704
5.11M
                  expdesc *e1, expdesc *e2, int line) {
1705
5.11M
  luaK_dischargevars(fs, e2);
1706
5.11M
  if (foldbinop(opr) && constfolding(fs, opr + LUA_OPADD, e1, e2))
1707
51.4k
    return;  /* done by folding */
1708
5.06M
  switch (opr) {
1709
11.5k
    case OPR_AND: {
1710
11.5k
      lua_assert(e1->t == NO_JUMP);  /* list closed by 'luaK_infix' */
1711
11.5k
      luaK_concat(fs, &e2->f, e1->f);
1712
11.5k
      *e1 = *e2;
1713
11.5k
      break;
1714
11.5k
    }
1715
67.1k
    case OPR_OR: {
1716
67.1k
      lua_assert(e1->f == NO_JUMP);  /* list closed by 'luaK_infix' */
1717
67.1k
      luaK_concat(fs, &e2->t, e1->t);
1718
67.1k
      *e1 = *e2;
1719
67.1k
      break;
1720
67.1k
    }
1721
13.5k
    case OPR_CONCAT: {  /* e1 .. e2 */
1722
13.5k
      luaK_exp2nextreg(fs, e2);
1723
13.5k
      codeconcat(fs, e1, e2, line);
1724
13.5k
      break;
1725
67.1k
    }
1726
17.0k
    case OPR_ADD: case OPR_MUL: {
1727
17.0k
      codecommutative(fs, opr, e1, e2, line);
1728
17.0k
      break;
1729
2.21k
    }
1730
13.0k
    case OPR_SUB: {
1731
13.0k
      if (finishbinexpneg(fs, e1, e2, OP_ADDI, line, TM_SUB))
1732
6.94k
        break; /* coded as (r1 + -I) */
1733
      /* ELSE */
1734
13.0k
    }  /* FALLTHROUGH */
1735
2.72M
    case OPR_DIV: case OPR_IDIV: case OPR_MOD: case OPR_POW: {
1736
2.72M
      codearith(fs, opr, e1, e2, 0, line);
1737
2.72M
      break;
1738
2.57M
    }
1739
30.4k
    case OPR_BAND: case OPR_BOR: case OPR_BXOR: {
1740
30.4k
      codebitwise(fs, opr, e1, e2, line);
1741
30.4k
      break;
1742
10.6k
    }
1743
113k
    case OPR_SHL: {
1744
113k
      if (isSCint(e1)) {
1745
2.43k
        swapexps(e1, e2);
1746
2.43k
        codebini(fs, OP_SHLI, e1, e2, 1, line, TM_SHL);  /* I << r2 */
1747
2.43k
      }
1748
110k
      else if (finishbinexpneg(fs, e1, e2, OP_SHRI, line, TM_SHL)) {
1749
562
        /* coded as (r1 >> -I) */;
1750
562
      }
1751
110k
      else  /* regular case (two registers) */
1752
110k
       codebinexpval(fs, opr, e1, e2, line);
1753
113k
      break;
1754
10.6k
    }
1755
318
    case OPR_SHR: {
1756
318
      if (isSCint(e2))
1757
29
        codebini(fs, OP_SHRI, e1, e2, 0, line, TM_SHR);  /* r1 >> I */
1758
289
      else  /* regular case (two registers) */
1759
289
        codebinexpval(fs, opr, e1, e2, line);
1760
318
      break;
1761
10.6k
    }
1762
3.47k
    case OPR_EQ: case OPR_NE: {
1763
3.47k
      codeeq(fs, opr, e1, e2);
1764
3.47k
      break;
1765
1.74k
    }
1766
15.6k
    case OPR_GT: case OPR_GE: {
1767
      /* '(a > b)' <=> '(b < a)';  '(a >= b)' <=> '(b <= a)' */
1768
15.6k
      swapexps(e1, e2);
1769
15.6k
      opr = cast(BinOpr, (opr - OPR_GT) + OPR_LT);
1770
15.6k
    }  /* FALLTHROUGH */
1771
2.07M
    case OPR_LT: case OPR_LE: {
1772
2.07M
      codeorder(fs, opr, e1, e2);
1773
2.07M
      break;
1774
2.07M
    }
1775
0
    default: lua_assert(0);
1776
5.06M
  }
1777
5.06M
}
1778
1779
1780
/*
1781
** Change line information associated with current position, by removing
1782
** previous info and adding it again with new line.
1783
*/
1784
6.04M
void luaK_fixline (FuncState *fs, int line) {
1785
6.04M
  removelastlineinfo(fs);
1786
6.04M
  savelineinfo(fs, fs->f, line);
1787
6.04M
}
1788
1789
1790
82
void luaK_settablesize (FuncState *fs, int pc, int ra, int asize, int hsize) {
1791
82
  Instruction *inst = &fs->f->code[pc];
1792
82
  int rb = (hsize != 0) ? luaO_ceillog2(hsize) + 1 : 0;  /* hash size */
1793
82
  int extra = asize / (MAXARG_C + 1);  /* higher bits of array size */
1794
82
  int rc = asize % (MAXARG_C + 1);  /* lower bits of array size */
1795
82
  int k = (extra > 0);  /* true iff needs extra argument */
1796
82
  *inst = CREATE_ABCk(OP_NEWTABLE, ra, rb, rc, k);
1797
82
  *(inst + 1) = CREATE_Ax(OP_EXTRAARG, extra);
1798
82
}
1799
1800
1801
/*
1802
** Emit a SETLIST instruction.
1803
** 'base' is register that keeps table;
1804
** 'nelems' is #table plus those to be stored now;
1805
** 'tostore' is number of values (in registers 'base + 1',...) to add to
1806
** table (or LUA_MULTRET to add up to stack top).
1807
*/
1808
54
void luaK_setlist (FuncState *fs, int base, int nelems, int tostore) {
1809
54
  lua_assert(tostore != 0 && tostore <= LFIELDS_PER_FLUSH);
1810
54
  if (tostore == LUA_MULTRET)
1811
2
    tostore = 0;
1812
54
  if (nelems <= MAXARG_C)
1813
54
    luaK_codeABC(fs, OP_SETLIST, base, tostore, nelems);
1814
0
  else {
1815
0
    int extra = nelems / (MAXARG_C + 1);
1816
0
    nelems %= (MAXARG_C + 1);
1817
0
    luaK_codeABCk(fs, OP_SETLIST, base, tostore, nelems, 1);
1818
0
    codeextraarg(fs, extra);
1819
0
  }
1820
54
  fs->freereg = base + 1;  /* free registers with list values */
1821
54
}
1822
1823
1824
/*
1825
** return the final target of a jump (skipping jumps to jumps)
1826
*/
1827
441k
static int finaltarget (Instruction *code, int i) {
1828
441k
  int count;
1829
883k
  for (count = 0; count < 100; count++) {  /* avoid infinite loops */
1830
883k
    Instruction pc = code[i];
1831
883k
    if (GET_OPCODE(pc) != OP_JMP)
1832
441k
      break;
1833
442k
     else
1834
442k
       i += GETARG_sJ(pc) + 1;
1835
883k
  }
1836
441k
  return i;
1837
441k
}
1838
1839
1840
/*
1841
** Do a final pass over the code of a function, doing small peephole
1842
** optimizations and adjustments.
1843
*/
1844
2.73k
void luaK_finish (FuncState *fs) {
1845
2.73k
  int i;
1846
2.73k
  Proto *p = fs->f;
1847
2.58M
  for (i = 0; i < fs->pc; i++) {
1848
2.57M
    Instruction *pc = &p->code[i];
1849
2.57M
    lua_assert(i == 0 || isOT(*(pc - 1)) == isIT(*pc));
1850
2.57M
    switch (GET_OPCODE(*pc)) {
1851
3.50k
      case OP_RETURN0: case OP_RETURN1: {
1852
3.50k
        if (!(fs->needclose || p->is_vararg))
1853
2.64k
          break;  /* no extra work */
1854
        /* else use OP_RETURN to do the extra work */
1855
861
        SET_OPCODE(*pc, OP_RETURN);
1856
861
      }  /* FALLTHROUGH */
1857
3.14k
      case OP_RETURN: case OP_TAILCALL: {
1858
3.14k
        if (fs->needclose)
1859
3.14k
          SETARG_k(*pc, 1);  /* signal that it needs to close */
1860
3.14k
        if (p->is_vararg)
1861
3.14k
          SETARG_C(*pc, p->numparams + 1);  /* signal that it is vararg */
1862
3.14k
        break;
1863
2.47k
      }
1864
441k
      case OP_JMP: {
1865
441k
        int target = finaltarget(p->code, i);
1866
441k
        fixjump(fs, i, target);
1867
441k
        break;
1868
2.47k
      }
1869
2.13M
      default: break;
1870
2.57M
    }
1871
2.57M
  }
1872
2.73k
}