small optimizations; try to find previous use when coding a real constant.
diff --git a/lua.stx b/lua.stx
index 66b27e1..45dbb7e 100644
--- a/lua.stx
+++ b/lua.stx
@@ -1,6 +1,6 @@
%{
-char *rcs_luastx = "$Id: lua.stx,v 3.48 1997/07/29 20:38:45 roberto Exp roberto $";
+char *rcs_luastx = "$Id: lua.stx,v 3.49 1997/07/30 22:00:50 roberto Exp roberto $";
#include <stdlib.h>
@@ -50,8 +50,6 @@
static int nvarbuffer=0; /* number of variables at a list */
-#define MAXFIELDS FIELDS_PER_FLUSH*2
-
int lua_debug = 0;
/* Internal functions */
@@ -106,65 +104,75 @@
static int next_constant (void)
{
- if (currState->f->nconsts >= currState->maxconsts) {
+ TFunc *f = currState->f;
+ if (f->nconsts >= currState->maxconsts) {
currState->maxconsts =
- growvector(&currState->f->consts, currState->maxconsts,
- TObject, constantEM, MAX_WORD);
+ growvector(&f->consts, currState->maxconsts, TObject,
+ constantEM, MAX_WORD);
}
- return currState->f->nconsts++;
+ return f->nconsts++;
}
static int string_constant (TaggedString *s)
{
+ TFunc *f = currState->f;
int c = s->u.s.constindex;
- if (!(0 <= c && c < currState->f->nconsts &&
- ttype(&currState->f->consts[c]) == LUA_T_STRING &&
- tsvalue(&currState->f->consts[c]) == s)) {
+ if (!(0 <= c && c < f->nconsts &&
+ ttype(&f->consts[c]) == LUA_T_STRING && tsvalue(&f->consts[c]) == s)) {
c = next_constant();
- ttype(&currState->f->consts[c]) = LUA_T_STRING;
- tsvalue(&currState->f->consts[c]) = s;
+ ttype(&f->consts[c]) = LUA_T_STRING;
+ tsvalue(&f->consts[c]) = s;
s->u.s.constindex = c; /* hint for next time */
- luaI_releasestring(s);
}
+ luaI_releasestring(s);
return c;
}
static void code_string (TaggedString *s)
{
- int c = string_constant(s);
- code_constant(c);
+ code_constant(string_constant(s));
}
-static void code_float (real n)
+
+#define LIM 10
+static int real_constant (real r)
{
- int c = next_constant();
- ttype(&currState->f->consts[c]) = LUA_T_NUMBER;
- nvalue(&currState->f->consts[c]) = n;
- code_constant(c);
+ /* check whether 'r' has appeared within the last LIM entries */
+ TObject *cnt = currState->f->consts;
+ int c = currState->f->nconsts;
+ int lim = c < LIM ? 0 : c-LIM;
+ while (--c >= lim) {
+ if (ttype(&cnt[c]) == LUA_T_NUMBER && nvalue(&cnt[c]) == r)
+ return c;
+ }
+ /* not found; create a new entry */
+ c = next_constant();
+ cnt = currState->f->consts; /* 'next_constant' may reallocate this vector */
+ ttype(&cnt[c]) = LUA_T_NUMBER;
+ nvalue(&cnt[c]) = r;
+ return c;
}
-static void code_number (float f)
+static void code_number (real f)
{
Word i;
- if (f >= 0 && f <= (float)MAX_WORD && (float)(i=(Word)f) == f) {
- /* f has an (short) integer value */
- if (i <= 2) code_byte(PUSH0 + i);
- else if (i <= 255)
- {
- code_byte(PUSHBYTE);
- code_byte(i);
- }
- else
- {
- code_byte(PUSHWORD);
- code_word(i);
- }
+ if (f >= 0 && f <= (real)MAX_WORD && (real)(i=(Word)f) == f) {
+ /* f has an (short) integer value */
+ if (i <= 2) code_byte(PUSH0 + i);
+ else if (i <= 255) {
+ code_byte(PUSHBYTE);
+ code_byte(i);
+ }
+ else {
+ code_byte(PUSHWORD);
+ code_word(i);
+ }
}
else
- code_float(f);
+ code_constant(real_constant(f));
}
@@ -483,7 +491,7 @@
%union
{
int vInt;
- float vFloat;
+ real vReal;
char *pChar;
Long vLong;
TaggedString *pTStr;
@@ -498,7 +506,7 @@
%token LOCAL
%token FUNCTION
%token DOTS
-%token <vFloat> NUMBER
+%token <vReal> NUMBER
%token <pTStr> NAME STRING
%type <vLong> PrepJump