aboutsummaryrefslogtreecommitdiff
path: root/ltm.c
diff options
context:
space:
mode:
Diffstat (limited to 'ltm.c')
-rw-r--r--ltm.c83
1 files changed, 20 insertions, 63 deletions
diff --git a/ltm.c b/ltm.c
index a171d78a..44d2c491 100644
--- a/ltm.c
+++ b/ltm.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: ltm.c,v 1.4 1997/10/24 17:17:24 roberto Exp roberto $ 2** $Id: ltm.c,v 1.5 1997/11/03 20:45:23 roberto Exp roberto $
3** Tag methods 3** Tag methods
4** See Copyright Notice in lua.h 4** See Copyright Notice in lua.h
5*/ 5*/
@@ -14,53 +14,6 @@
14#include "lobject.h" 14#include "lobject.h"
15#include "ltm.h" 15#include "ltm.h"
16 16
17static struct IM init_IM[NUM_TAGS] = {
18{{{LUA_T_NIL, {NULL}}, {LUA_T_NIL, {NULL}}, {LUA_T_NIL, {NULL}},
19 {LUA_T_NIL, {NULL}}, {LUA_T_NIL, {NULL}}, {LUA_T_NIL, {NULL}},
20 {LUA_T_NIL, {NULL}}, {LUA_T_NIL, {NULL}}, {LUA_T_NIL, {NULL}},
21 {LUA_T_NIL, {NULL}}, {LUA_T_NIL, {NULL}}, {LUA_T_NIL, {NULL}},
22 {LUA_T_NIL, {NULL}}, {LUA_T_NIL, {NULL}}, {LUA_T_NIL, {NULL}},
23 {LUA_T_NIL, {NULL}}, {LUA_T_NIL, {NULL}}, {LUA_T_NIL, {NULL}}}},
24{{{LUA_T_NIL, {NULL}}, {LUA_T_NIL, {NULL}}, {LUA_T_NIL, {NULL}},
25 {LUA_T_NIL, {NULL}}, {LUA_T_NIL, {NULL}}, {LUA_T_NIL, {NULL}},
26 {LUA_T_NIL, {NULL}}, {LUA_T_NIL, {NULL}}, {LUA_T_NIL, {NULL}},
27 {LUA_T_NIL, {NULL}}, {LUA_T_NIL, {NULL}}, {LUA_T_NIL, {NULL}},
28 {LUA_T_NIL, {NULL}}, {LUA_T_NIL, {NULL}}, {LUA_T_NIL, {NULL}},
29 {LUA_T_NIL, {NULL}}, {LUA_T_NIL, {NULL}}, {LUA_T_NIL, {NULL}}}},
30{{{LUA_T_NIL, {NULL}}, {LUA_T_NIL, {NULL}}, {LUA_T_NIL, {NULL}},
31 {LUA_T_NIL, {NULL}}, {LUA_T_NIL, {NULL}}, {LUA_T_NIL, {NULL}},
32 {LUA_T_NIL, {NULL}}, {LUA_T_NIL, {NULL}}, {LUA_T_NIL, {NULL}},
33 {LUA_T_NIL, {NULL}}, {LUA_T_NIL, {NULL}}, {LUA_T_NIL, {NULL}},
34 {LUA_T_NIL, {NULL}}, {LUA_T_NIL, {NULL}}, {LUA_T_NIL, {NULL}},
35 {LUA_T_NIL, {NULL}}, {LUA_T_NIL, {NULL}}, {LUA_T_NIL, {NULL}}}},
36{{{LUA_T_NIL, {NULL}}, {LUA_T_NIL, {NULL}}, {LUA_T_NIL, {NULL}},
37 {LUA_T_NIL, {NULL}}, {LUA_T_NIL, {NULL}}, {LUA_T_NIL, {NULL}},
38 {LUA_T_NIL, {NULL}}, {LUA_T_NIL, {NULL}}, {LUA_T_NIL, {NULL}},
39 {LUA_T_NIL, {NULL}}, {LUA_T_NIL, {NULL}}, {LUA_T_NIL, {NULL}},
40 {LUA_T_NIL, {NULL}}, {LUA_T_NIL, {NULL}}, {LUA_T_NIL, {NULL}},
41 {LUA_T_NIL, {NULL}}, {LUA_T_NIL, {NULL}}, {LUA_T_NIL, {NULL}}}},
42{{{LUA_T_NIL, {NULL}}, {LUA_T_NIL, {NULL}}, {LUA_T_NIL, {NULL}},
43 {LUA_T_NIL, {NULL}}, {LUA_T_NIL, {NULL}}, {LUA_T_NIL, {NULL}},
44 {LUA_T_NIL, {NULL}}, {LUA_T_NIL, {NULL}}, {LUA_T_NIL, {NULL}},
45 {LUA_T_NIL, {NULL}}, {LUA_T_NIL, {NULL}}, {LUA_T_NIL, {NULL}},
46 {LUA_T_NIL, {NULL}}, {LUA_T_NIL, {NULL}}, {LUA_T_NIL, {NULL}},
47 {LUA_T_NIL, {NULL}}, {LUA_T_NIL, {NULL}}, {LUA_T_NIL, {NULL}}}},
48{{{LUA_T_NIL, {NULL}}, {LUA_T_NIL, {NULL}}, {LUA_T_NIL, {NULL}},
49 {LUA_T_NIL, {NULL}}, {LUA_T_NIL, {NULL}}, {LUA_T_NIL, {NULL}},
50 {LUA_T_NIL, {NULL}}, {LUA_T_NIL, {NULL}}, {LUA_T_NIL, {NULL}},
51 {LUA_T_NIL, {NULL}}, {LUA_T_NIL, {NULL}}, {LUA_T_NIL, {NULL}},
52 {LUA_T_NIL, {NULL}}, {LUA_T_NIL, {NULL}}, {LUA_T_NIL, {NULL}},
53 {LUA_T_NIL, {NULL}}, {LUA_T_NIL, {NULL}}, {LUA_T_NIL, {NULL}}}},
54{{{LUA_T_NIL, {NULL}}, {LUA_T_NIL, {NULL}}, {LUA_T_NIL, {NULL}},
55 {LUA_T_NIL, {NULL}}, {LUA_T_NIL, {NULL}}, {LUA_T_NIL, {NULL}},
56 {LUA_T_NIL, {NULL}}, {LUA_T_NIL, {NULL}}, {LUA_T_NIL, {NULL}},
57 {LUA_T_NIL, {NULL}}, {LUA_T_NIL, {NULL}}, {LUA_T_NIL, {NULL}},
58 {LUA_T_NIL, {NULL}}, {LUA_T_NIL, {NULL}}, {LUA_T_NIL, {NULL}},
59 {LUA_T_NIL, {NULL}}, {LUA_T_NIL, {NULL}}, {LUA_T_NIL, {NULL}}}}
60};
61
62
63
64 17
65char *luaT_eventname[] = { /* ORDER IM */ 18char *luaT_eventname[] = { /* ORDER IM */
66 "gettable", "settable", "index", "getglobal", "setglobal", "add", 19 "gettable", "settable", "index", "getglobal", "setglobal", "add",
@@ -78,11 +31,9 @@ static int luaI_checkevent (char *name, char *list[])
78} 31}
79 32
80 33
81struct IM *luaT_IMtable = init_IM; 34struct IM *luaT_IMtable;
82 35static int IMtable_size;
83static int IMtable_size = NUM_TAGS; 36static int last_tag;
84
85static int last_tag = -(NUM_TAGS-1);
86 37
87 38
88/* events in LUA_T_NIL are all allowed, since this is used as a 39/* events in LUA_T_NIL are all allowed, since this is used as a
@@ -98,6 +49,7 @@ static char validevents[NUM_TAGS][IM_N] = { /* ORDER LUA_T, ORDER IM */
98{1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1} /* LUA_T_NIL */ 49{1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1} /* LUA_T_NIL */
99}; 50};
100 51
52
101static int validevent (lua_Type t, int e) 53static int validevent (lua_Type t, int e)
102{ /* ORDER LUA_T */ 54{ /* ORDER LUA_T */
103 return (t < LUA_T_NIL) ? 1 : validevents[-t][e]; 55 return (t < LUA_T_NIL) ? 1 : validevents[-t][e];
@@ -111,19 +63,24 @@ static void init_entry (int tag)
111 ttype(luaT_getim(tag, i)) = LUA_T_NIL; 63 ttype(luaT_getim(tag, i)) = LUA_T_NIL;
112} 64}
113 65
66
67void luaT_init (void)
68{
69 int t;
70 IMtable_size = NUM_TAGS;
71 last_tag = -(NUM_TAGS-1);
72 luaT_IMtable = luaM_newvector(IMtable_size, struct IM);
73 for (t=last_tag; t<=0; t++)
74 init_entry(t);
75}
76
77
114int lua_newtag (void) 78int lua_newtag (void)
115{ 79{
116 --last_tag; 80 --last_tag;
117 if ((-last_tag) >= IMtable_size) { 81 if ((-last_tag) >= IMtable_size)
118 if (luaT_IMtable == init_IM) { /* fist time? */ 82 IMtable_size = luaM_growvector(&luaT_IMtable, IMtable_size,
119 IMtable_size *= 2; 83 struct IM, memEM, MAX_INT);
120 luaT_IMtable = luaM_newvector(IMtable_size, struct IM);
121 memcpy(luaT_IMtable, init_IM, sizeof(init_IM));
122 }
123 else
124 IMtable_size = luaM_growvector(&luaT_IMtable, IMtable_size,
125 struct IM, memEM, MAX_INT);
126 }
127 init_entry(last_tag); 84 init_entry(last_tag);
128 return last_tag; 85 return last_tag;
129} 86}