aboutsummaryrefslogtreecommitdiff
path: root/lcode.c
diff options
context:
space:
mode:
Diffstat (limited to 'lcode.c')
-rw-r--r--lcode.c27
1 files changed, 6 insertions, 21 deletions
diff --git a/lcode.c b/lcode.c
index 835dc25d..c5151942 100644
--- a/lcode.c
+++ b/lcode.c
@@ -31,27 +31,15 @@ void luaK_error (LexState *ls, const char *msg) {
31} 31}
32 32
33 33
34/*
35** Returns the the previous instruction, for optimizations.
36** If there is a jump target between this and the current instruction,
37** returns a dummy instruction to avoid wrong optimizations.
38*/
39static Instruction previous_instruction (FuncState *fs) {
40 if (fs->pc > fs->lasttarget) /* no jumps to current position? */
41 return fs->f->code[fs->pc-1]; /* returns previous instruction */
42 else
43 return cast(Instruction, -1);/* invalid instruction avoids optimizations */
44}
45
46
47void luaK_nil (FuncState *fs, int from, int n) { 34void luaK_nil (FuncState *fs, int from, int n) {
48 Instruction previous = previous_instruction(fs); 35 Instruction *previous;
49 if (GET_OPCODE(previous) == OP_LOADNIL) { 36 if (fs->pc > fs->lasttarget && /* no jumps to current position? */
50 int pfrom = GETARG_A(previous); 37 GET_OPCODE(*(previous = &fs->f->code[fs->pc-1])) == OP_LOADNIL) {
51 int pto = GETARG_B(previous); 38 int pfrom = GETARG_A(*previous);
39 int pto = GETARG_B(*previous);
52 if (pfrom <= from && from <= pto+1) { /* can connect both? */ 40 if (pfrom <= from && from <= pto+1) { /* can connect both? */
53 if (from+n-1 > pto) 41 if (from+n-1 > pto)
54 SETARG_B(fs->f->code[fs->pc-1], from+n-1); 42 SETARG_B(*previous, from+n-1);
55 return; 43 return;
56 } 44 }
57 } 45 }
@@ -126,8 +114,6 @@ static int luaK_getjump (FuncState *fs, int pc) {
126 114
127static Instruction *getjumpcontrol (FuncState *fs, int pc) { 115static Instruction *getjumpcontrol (FuncState *fs, int pc) {
128 Instruction *pi = &fs->f->code[pc]; 116 Instruction *pi = &fs->f->code[pc];
129 OpCode op = GET_OPCODE(*pi);
130 lua_assert(op == OP_JMP || op == OP_FORLOOP || op == OP_TFORLOOP);
131 if (pc >= 1 && testOpMode(GET_OPCODE(*(pi-1)), OpModeT)) 117 if (pc >= 1 && testOpMode(GET_OPCODE(*(pi-1)), OpModeT))
132 return pi-1; 118 return pi-1;
133 else 119 else
@@ -790,7 +776,6 @@ static int luaK_code (FuncState *fs, Instruction i) {
790 luaM_growvector(fs->L, f->code, fs->pc, f->sizecode, Instruction, 776 luaM_growvector(fs->L, f->code, fs->pc, f->sizecode, Instruction,
791 MAX_INT, "code size overflow"); 777 MAX_INT, "code size overflow");
792 f->code[fs->pc] = i; 778 f->code[fs->pc] = i;
793/*printf("free: %d ", fs->freereg); printopcode(f, fs->pc);*/
794 return fs->pc++; 779 return fs->pc++;
795} 780}
796 781