diff options
| author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 1997-03-20 17:36:19 -0300 |
|---|---|---|
| committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 1997-03-20 17:36:19 -0300 |
| commit | ae067dcddd837ca72c03998fd4d83b91dc872aa4 (patch) | |
| tree | abe720cbfa967b60df071609e686899975450b7a | |
| parent | 5d60470508aad81eac145ab4e004fbf150130267 (diff) | |
| download | lua-ae067dcddd837ca72c03998fd4d83b91dc872aa4.tar.gz lua-ae067dcddd837ca72c03998fd4d83b91dc872aa4.tar.bz2 lua-ae067dcddd837ca72c03998fd4d83b91dc872aa4.zip | |
BUG: lua_newtag can be called before luaI_IMtable is initialized.
| -rw-r--r-- | fallback.c | 20 |
1 files changed, 12 insertions, 8 deletions
| @@ -3,7 +3,7 @@ | |||
| 3 | ** TecCGraf - PUC-Rio | 3 | ** TecCGraf - PUC-Rio |
| 4 | */ | 4 | */ |
| 5 | 5 | ||
| 6 | char *rcs_fallback="$Id: fallback.c,v 1.29 1997/03/19 21:12:34 roberto Exp roberto $"; | 6 | char *rcs_fallback="$Id: fallback.c,v 1.30 1997/03/20 19:20:43 roberto Exp roberto $"; |
| 7 | 7 | ||
| 8 | #include <stdio.h> | 8 | #include <stdio.h> |
| 9 | #include <string.h> | 9 | #include <string.h> |
| @@ -174,12 +174,14 @@ static void init_entry (int tag) | |||
| 174 | 174 | ||
| 175 | void luaI_initfallbacks (void) | 175 | void luaI_initfallbacks (void) |
| 176 | { | 176 | { |
| 177 | int i; | 177 | if (luaI_IMtable == NULL) { |
| 178 | IMtable_size = NUM_TYPES+10; | 178 | int i; |
| 179 | luaI_IMtable = newvector(IMtable_size, struct IM); | 179 | IMtable_size = NUM_TYPES+10; |
| 180 | for (i=LUA_T_NIL; i<=LUA_T_USERDATA; i++) { | 180 | luaI_IMtable = newvector(IMtable_size, struct IM); |
| 181 | luaI_IMtable[-i].tp = (lua_Type)i; | 181 | for (i=LUA_T_NIL; i<=LUA_T_USERDATA; i++) { |
| 182 | init_entry(i); | 182 | luaI_IMtable[-i].tp = (lua_Type)i; |
| 183 | init_entry(i); | ||
| 184 | } | ||
| 183 | } | 185 | } |
| 184 | } | 186 | } |
| 185 | 187 | ||
| @@ -187,9 +189,11 @@ int lua_newtag (char *t) | |||
| 187 | { | 189 | { |
| 188 | int tp; | 190 | int tp; |
| 189 | --last_tag; | 191 | --last_tag; |
| 190 | if ((-last_tag) >= IMtable_size) | 192 | if ((-last_tag) >= IMtable_size) { |
| 193 | luaI_initfallbacks(); | ||
| 191 | IMtable_size = growvector(&luaI_IMtable, IMtable_size, | 194 | IMtable_size = growvector(&luaI_IMtable, IMtable_size, |
| 192 | struct IM, memEM, MAX_INT); | 195 | struct IM, memEM, MAX_INT); |
| 196 | } | ||
| 193 | tp = -findstring(t, typenames); | 197 | tp = -findstring(t, typenames); |
| 194 | if (tp == LUA_T_ARRAY || tp == LUA_T_USERDATA) | 198 | if (tp == LUA_T_ARRAY || tp == LUA_T_USERDATA) |
| 195 | luaI_IMtable[-last_tag].tp = tp; | 199 | luaI_IMtable[-last_tag].tp = tp; |
