summaryrefslogtreecommitdiff
path: root/src/lib/elua
diff options
context:
space:
mode:
authorDaniel Kolesa <d.kolesa@osg.samsung.com>2017-08-30 20:19:24 +0200
committerDaniel Kolesa <d.kolesa@osg.samsung.com>2017-08-30 20:21:23 +0200
commit67d1c0e51c01ba159f88adc6446cc31cee79c808 (patch)
treedd4422fed624597ee2790bf1e6120a5fb464ed3b /src/lib/elua
parent8b5d555cf58f0d65a3d13ba94f61121a846eda8a (diff)
elua: load regular file if bytecode cache fails
If bytecode is requested and fails to load, load original file instead. Force re-write of bytecode if that succeeds. This is useful if there is bytecode newer than the source file that the current Lua version can't load, for example when migrating from LuaJIT 2.0 to 2.1, which changed bytecode format. Fixes confusing cases such as in T2728.
Diffstat (limited to 'src/lib/elua')
-rw-r--r--src/lib/elua/cache.c38
1 files changed, 34 insertions, 4 deletions
diff --git a/src/lib/elua/cache.c b/src/lib/elua/cache.c
index fe6825f0f9..91fcdac658 100644
--- a/src/lib/elua/cache.c
+++ b/src/lib/elua/cache.c
@@ -35,11 +35,11 @@ generate:
35} 35}
36 36
37static Eina_File * 37static Eina_File *
38open_src(const char *fname, Eina_Bool *bc) 38open_src(const char *fname, Eina_Bool *bc, Eina_Bool allow_bc)
39{ 39{
40 Eina_File *f = NULL; 40 Eina_File *f = NULL;
41 const char *ext = strstr(fname, ".lua"); 41 const char *ext = strstr(fname, ".lua");
42 if (ext && !ext[4]) 42 if (ext && !ext[4] && allow_bc)
43 { 43 {
44 char buf[PATH_MAX]; 44 char buf[PATH_MAX];
45 snprintf(buf, sizeof(buf), "%sc", fname); 45 snprintf(buf, sizeof(buf), "%sc", fname);
@@ -151,7 +151,7 @@ elua_io_loadfile(const Elua_State *es, const char *fname)
151 { 151 {
152 return elua_loadstdin(L); 152 return elua_loadstdin(L);
153 } 153 }
154 if (!(f = open_src(fname, &bcache))) 154 if (!(f = open_src(fname, &bcache, EINA_TRUE)))
155 { 155 {
156 lua_pushfstring(L, "cannot open %s: %s", fname, strerror(errno)); 156 lua_pushfstring(L, "cannot open %s: %s", fname, strerror(errno));
157 return LUA_ERRFILE; 157 return LUA_ERRFILE;
@@ -167,7 +167,37 @@ elua_io_loadfile(const Elua_State *es, const char *fname)
167 status = lua_load(L, getf_map, &s, chname); 167 status = lua_load(L, getf_map, &s, chname);
168 eina_file_map_free(f, s.fmap); 168 eina_file_map_free(f, s.fmap);
169 eina_file_close(f); 169 eina_file_close(f);
170 if (!status && bcache) write_bc(L, fname); 170 if (status)
171 {
172 /* we loaded bytecode and that failed; try loading source instead */
173 if (!bcache)
174 {
175 /* can't open real file, so return original error */
176 if (!(f = open_src(fname, &bcache, EINA_FALSE)))
177 {
178 lua_remove(L, -2);
179 return status;
180 }
181 s.flen = eina_file_size_get(f);
182 /* can't read real file, so return original error */
183 if (!(s.fmap = eina_file_map_all(f, EINA_FILE_RANDOM)))
184 {
185 lua_remove(L, -2);
186 return status;
187 }
188 /* loaded original file, pop old error and load again */
189 lua_pop(L, 1);
190 status = lua_load(L, getf_map, &s, chname);
191 eina_file_map_free(f, s.fmap);
192 eina_file_close(f);
193 /* force write new bytecode */
194 if (!status)
195 write_bc(L, fname);
196 }
197 /* whatever happened here, proceed to the end... */
198 }
199 else if (bcache)
200 write_bc(L, fname); /* success and bytecode write */
171 lua_remove(L, -2); 201 lua_remove(L, -2);
172 return status; 202 return status;
173} 203}