2 ** $Id: opt.c,v 1.4 1998/04/02 20:44:08 lhf Exp $
4 ** See Copyright Notice in lua.h
12 static void FixConstants(TProtoFunc
* tf
, int* C
)
22 if (op
==ENDCODE
) break;
23 if ( op
==PUSHCONSTANT
|| op
==GETDOTTED
|| op
==PUSHSELF
||
24 op
==GETGLOBAL
|| op
==SETGLOBAL
)
35 if (j
<8) { p
[0]=op
+j
+1; p
[1]=NOP
; } else p
[1]=j
;
47 p
[1]= 0x0000FF & (j
>>8);
56 static TProtoFunc
* TF
;
58 static int compare(const void* a
, const void *b
)
63 TObject
* oa
=TF
->consts
+ia
;
64 TObject
* ob
=TF
->consts
+ib
;
65 t
=ttype(oa
)-ttype(ob
); if (t
) return t
;
66 t
=oa
->value
.i
-ob
->value
.i
; if (t
) return t
;
70 static void OptConstants(TProtoFunc
* tf
)
77 C
=luaM_reallocvector(C
,n
,int);
78 D
=luaM_reallocvector(D
,n
,int);
79 for (i
=0; i
<n
; i
++) C
[i
]=D
[i
]=i
; /* group duplicates */
80 TF
=tf
; qsort(C
,n
,sizeof(C
[0]),compare
);
81 k
=C
[0]; /* build duplicate table */
85 TObject
* oa
=tf
->consts
+k
;
86 TObject
* ob
=tf
->consts
+j
;
87 if (ttype(oa
)==ttype(ob
) && oa
->value
.i
==ob
->value
.i
) D
[j
]=k
; else k
=j
;
89 k
=0; /* build rename map & pack constants */
92 if (D
[i
]==i
) { tf
->consts
[k
]=tf
->consts
[i
]; C
[i
]=k
++; } else C
[i
]=C
[D
[i
]];
95 printf("\t\"%s\":%d reduced constants from %d to %d\n",
96 tf
->fileName
->str
,tf
->lineDefined
,n
,k
);
101 static int NoDebug(TProtoFunc
* tf
)
106 while (1) /* change SETLINE to NOP */
109 int n
=INFO(tf
,p
,&OP
);
111 if (op
==ENDCODE
) break;
113 if (op
==SETLINE
) { nop
+=n
; memset(p
,NOP
,n
); }
119 static int FixJump(TProtoFunc
* tf
, Byte
* a
, Byte
* b
)
126 int n
=INFO(tf
,p
,&OP
);
128 if (op
==ENDCODE
) break;
135 static void FixJumps(TProtoFunc
* tf
)
142 int n
=INFO(tf
,p
,&OP
);
146 if (op
==ENDCODE
) break;
148 if (op
==IFTUPJMP
|| op
==IFFUPJMP
) nop
=FixJump(tf
,p
-i
+n
,p
); else
149 if (op
==ONTJMP
|| op
==ONFJMP
|| op
==JMP
|| op
==IFFJMP
) nop
=FixJump(tf
,p
,p
+i
+n
);
158 if (j
<=255) /* does NOT work for nested loops */
160 if (op
==IFTUPJMP
|| op
==IFFUPJMP
) --j
;
161 p
[0]=OP
.op
-1; /* *JMP and *JMPW are consecutive */
168 p
[1]= 0x0000FF & (j
>>8);
179 static void PackCode(TProtoFunc
* tf
)
187 int n
=INFO(tf
,p
,&OP
);
189 if (op
!=NOP
) { memcpy(q
,p
,n
); q
+=n
; }
191 if (op
==ENDCODE
) break;
193 printf("\t\"%s\":%d reduced code from %d to %d\n",
194 tf
->fileName
->str
,tf
->lineDefined
,(int)(p
-code
),(int)(q
-code
));
197 static void OptCode(TProtoFunc
* tf
)
200 if (nop
==0) return; /* cannot improve code */
205 static void OptFunction(TProtoFunc
* tf
);
207 static void OptFunctions(TProtoFunc
* tf
)
212 TObject
* o
=tf
->consts
+i
;
213 if (ttype(o
)==LUA_T_PROTO
) OptFunction(tfvalue(o
));
217 static void OptFunction(TProtoFunc
* tf
)
219 tf
->locvars
=NULL
; /* remove local variables table */
225 void OptChunk(TProtoFunc
* Main
)