aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>2003-02-18 13:02:56 -0300
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>2003-02-18 13:02:56 -0300
commit60c83ded3080a23bc661ab440c36d0a71b399e2e (patch)
tree0aa24b14c1215541b52e7885fd2f2c41aa128a06
parent07948c3181702c55b7b36069ca519b54371a4ab7 (diff)
downloadlua-60c83ded3080a23bc661ab440c36d0a71b399e2e.tar.gz
lua-60c83ded3080a23bc661ab440c36d0a71b399e2e.tar.bz2
lua-60c83ded3080a23bc661ab440c36d0a71b399e2e.zip
small optimization for sizes of array constructors
-rw-r--r--lobject.c16
-rw-r--r--lobject.h5
-rw-r--r--lparser.c5
-rw-r--r--ltests.c10
-rw-r--r--lvm.c4
5 files changed, 31 insertions, 9 deletions
diff --git a/lobject.c b/lobject.c
index ebe2728f..5c5c1383 100644
--- a/lobject.c
+++ b/lobject.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lobject.c,v 1.94 2002/12/04 17:38:31 roberto Exp roberto $ 2** $Id: lobject.c,v 1.95 2003/01/27 13:00:43 roberto Exp roberto $
3** Some generic functions over Lua objects 3** Some generic functions over Lua objects
4** See Copyright Notice in lua.h 4** See Copyright Notice in lua.h
5*/ 5*/
@@ -30,6 +30,20 @@
30const TObject luaO_nilobject = {LUA_TNIL, {NULL}}; 30const TObject luaO_nilobject = {LUA_TNIL, {NULL}};
31 31
32 32
33/*
34** converts an integer to a "floating point byte", represented as
35** (mmmmmxxx), where the real value is (xxx) * 2^(mmmmm)
36*/
37int luaO_int2fb (unsigned int x) {
38 int m = 0; /* mantissa */
39 while (x >= (1<<3)) {
40 x = (x+1) >> 1;
41 m++;
42 }
43 return (m << 3) | cast(int, x);
44}
45
46
33int luaO_log2 (unsigned int x) { 47int luaO_log2 (unsigned int x) {
34 static const lu_byte log_8[255] = { 48 static const lu_byte log_8[255] = {
35 0, 49 0,
diff --git a/lobject.h b/lobject.h
index 90533240..420eb6a9 100644
--- a/lobject.h
+++ b/lobject.h
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lobject.h,v 1.156 2002/12/19 11:11:55 roberto Exp roberto $ 2** $Id: lobject.h,v 1.157 2003/02/11 10:46:24 roberto Exp roberto $
3** Type definitions for Lua objects 3** Type definitions for Lua objects
4** See Copyright Notice in lua.h 4** See Copyright Notice in lua.h
5*/ 5*/
@@ -323,7 +323,8 @@ typedef struct Table {
323extern const TObject luaO_nilobject; 323extern const TObject luaO_nilobject;
324 324
325int luaO_log2 (unsigned int x); 325int luaO_log2 (unsigned int x);
326 326int luaO_int2fb (unsigned int x);
327#define fb2int(x) (((x) & 7) << ((x) >> 3))
327 328
328int luaO_rawequalObj (const TObject *t1, const TObject *t2); 329int luaO_rawequalObj (const TObject *t1, const TObject *t2);
329int luaO_str2d (const char *s, lua_Number *result); 330int luaO_str2d (const char *s, lua_Number *result);
diff --git a/lparser.c b/lparser.c
index 68373d54..c5b5df85 100644
--- a/lparser.c
+++ b/lparser.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lparser.c,v 1.204 2003/02/11 10:46:24 roberto Exp roberto $ 2** $Id: lparser.c,v 1.205 2003/02/11 10:49:53 roberto Exp roberto $
3** Lua Parser 3** Lua Parser
4** See Copyright Notice in lua.h 4** See Copyright Notice in lua.h
5*/ 5*/
@@ -515,8 +515,7 @@ static void constructor (LexState *ls, expdesc *t) {
515 } while (testnext(ls, ',') || testnext(ls, ';')); 515 } while (testnext(ls, ',') || testnext(ls, ';'));
516 check_match(ls, '}', '{', line); 516 check_match(ls, '}', '{', line);
517 lastlistfield(fs, &cc); 517 lastlistfield(fs, &cc);
518 if (cc.na > 0) 518 SETARG_B(fs->f->code[pc], luaO_int2fb(cc.na)); /* set initial array size */
519 SETARG_B(fs->f->code[pc], luaO_log2(cc.na-1)+2); /* set initial table size */
520 SETARG_C(fs->f->code[pc], luaO_log2(cc.nh)+1); /* set initial table size */ 519 SETARG_C(fs->f->code[pc], luaO_log2(cc.nh)+1); /* set initial table size */
521} 520}
522 521
diff --git a/ltests.c b/ltests.c
index f0fe854a..1e27c45f 100644
--- a/ltests.c
+++ b/ltests.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: ltests.c,v 1.151 2003/01/29 10:27:53 roberto Exp roberto $ 2** $Id: ltests.c,v 1.152 2003/02/10 17:31:13 roberto Exp roberto $
3** Internal Module for Debugging of the Lua Implementation 3** Internal Module for Debugging of the Lua Implementation
4** See Copyright Notice in lua.h 4** See Copyright Notice in lua.h
5*/ 5*/
@@ -512,6 +512,13 @@ static int log2_aux (lua_State *L) {
512 return 1; 512 return 1;
513} 513}
514 514
515static int int2fb_aux (lua_State *L) {
516 int b = luaO_int2fb(luaL_checkint(L, 1));
517 lua_pushnumber(L, b);
518 lua_pushnumber(L, fb2int(b));
519 return 2;
520}
521
515 522
516static int test_do (lua_State *L) { 523static int test_do (lua_State *L) {
517 const char *p = luaL_checkstring(L, 1); 524 const char *p = luaL_checkstring(L, 1);
@@ -790,6 +797,7 @@ static const struct luaL_reg tests_funcs[] = {
790 {"closestate", closestate}, 797 {"closestate", closestate},
791 {"doremote", doremote}, 798 {"doremote", doremote},
792 {"log2", log2_aux}, 799 {"log2", log2_aux},
800 {"int2fb", int2fb_aux},
793 {"totalmem", mem_query}, 801 {"totalmem", mem_query},
794 {"resume", coresume}, 802 {"resume", coresume},
795 {"setyhook", setyhook}, 803 {"setyhook", setyhook},
diff --git a/lvm.c b/lvm.c
index 31e7b083..c66bbc8a 100644
--- a/lvm.c
+++ b/lvm.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lvm.c,v 1.274 2003/01/27 15:12:52 roberto Exp roberto $ 2** $Id: lvm.c,v 1.275 2003/02/11 10:46:24 roberto Exp roberto $
3** Lua virtual machine 3** Lua virtual machine
4** See Copyright Notice in lua.h 4** See Copyright Notice in lua.h
5*/ 5*/
@@ -495,7 +495,7 @@ StkId luaV_execute (lua_State *L) {
495 } 495 }
496 case OP_NEWTABLE: { 496 case OP_NEWTABLE: {
497 int b = GETARG_B(i); 497 int b = GETARG_B(i);
498 if (b > 0) b = twoto(b-1); 498 b = fb2int(b);
499 sethvalue(ra, luaH_new(L, b, GETARG_C(i))); 499 sethvalue(ra, luaH_new(L, b, GETARG_C(i)));
500 luaC_checkGC(L); 500 luaC_checkGC(L);
501 break; 501 break;