2 ** $Id: opt.c,v 1.22 2000/10/31 16:57:23 lhf Exp $
4 ** See Copyright Notice in lua.h
13 static int MapConstant(Hash
* t
, int j
, const TObject
* key
)
15 const TObject
* o
=luaH_get(L
,t
,key
);
16 if (ttype(o
)==LUA_TNUMBER
)
17 return (int) nvalue(o
);
21 ttype(&val
)=LUA_TNUMBER
;
23 *luaH_set(L
,t
,key
)=val
;
24 LUA_ASSERT(j
>=0,"MapConstant returns negative!");
29 static int MapConstants(Proto
* tf
, Hash
* map
)
33 j
=0; n
=tf
->nknum
; ttype(&o
)=LUA_TNUMBER
;
36 nvalue(&o
)=tf
->knum
[i
];
37 k
=MapConstant(map
,j
,&o
);
41 j
=0; n
=tf
->nkstr
; ttype(&o
)=LUA_TSTRING
;
44 tsvalue(&o
)=tf
->kstr
[i
];
45 k
=MapConstant(map
,j
,&o
);
51 static void PackConstants(Proto
* tf
, Hash
* map
)
56 printf("%p before pack nknum=%d nkstr=%d\n",tf
,tf
->nknum
,tf
->nkstr
);
58 j
=0; n
=tf
->nknum
; ttype(&o
)=LUA_TNUMBER
;
61 nvalue(&o
)=tf
->knum
[i
];
62 k
=MapConstant(map
,-1,&o
);
63 if (k
==j
) tf
->knum
[j
++]=tf
->knum
[i
];
66 j
=0; n
=tf
->nkstr
; ttype(&o
)=LUA_TSTRING
;
69 tsvalue(&o
)=tf
->kstr
[i
];
70 k
=MapConstant(map
,-1,&o
);
71 if (k
==j
) tf
->kstr
[j
++]=tf
->kstr
[i
];
75 printf("%p after pack nknum=%d nkstr=%d\n",tf
,tf
->nknum
,tf
->nkstr
);
79 static void OptConstants(Proto
* tf
)
82 int n
=tf
->nknum
+tf
->nkstr
;
83 Hash
* map
=luaH_new(L
,n
);
84 int m
=MapConstants(tf
,map
);
86 printf("%p n=%d m=%d %s\n",tf
,n
,m
,(m
==n
)?"nothing to optimize":"yes!");
89 for (p
=tf
->code
;; p
++)
97 case OP_PUSHNUM
: case OP_PUSHNEGNUM
:
99 ttype(&o
)=LUA_TNUMBER
; nvalue(&o
)=tf
->knum
[j
];
100 k
=MapConstant(map
,-1,&o
);
101 if (k
!=j
) *p
=CREATE_U(op
,k
);
103 case OP_PUSHSTRING
: case OP_GETGLOBAL
: case OP_GETDOTTED
:
104 case OP_PUSHSELF
: case OP_SETGLOBAL
:
106 ttype(&o
)=LUA_TSTRING
; tsvalue(&o
)=tf
->kstr
[j
];
107 k
=MapConstant(map
,-1,&o
);
108 if (k
!=j
) *p
=CREATE_U(op
,k
);
111 PackConstants(tf
,map
);
120 #define OptFunction luaU_optchunk
122 void OptFunction(Proto
* tf
)
126 for (i
=0; i
<n
; i
++) OptFunction(tf
->kproto
[i
]);