jpeg pushed a commit to branch master.

http://git.enlightenment.org/core/efl.git/commit/?id=6124d0733657e425001ce51f526aea3bb8dc54e7

commit 6124d0733657e425001ce51f526aea3bb8dc54e7
Author: Jean-Philippe Andre <jp.an...@samsung.com>
Date:   Mon Aug 17 20:02:53 2015 +0900

    Evas filters: Fix for Lua 5.3 (with --enable-lua-old)
    
    Tested with LuaJIT, Lua 5.2 and Lua 5.3.
    
    @fix
---
 src/lib/evas/filters/evas_filter_parser.c | 73 +++++++++++++++++++++++++------
 src/lib/evas/filters/lua/color.lua        |  6 +--
 2 files changed, 62 insertions(+), 17 deletions(-)

diff --git a/src/lib/evas/filters/evas_filter_parser.c 
b/src/lib/evas/filters/evas_filter_parser.c
index 3846c11..ffab2de 100644
--- a/src/lib/evas/filters/evas_filter_parser.c
+++ b/src/lib/evas/filters/evas_filter_parser.c
@@ -2,6 +2,14 @@
 
 #include <stdarg.h>
 
+// Lua breaks API all the time
+#ifdef ENABLE_LUA_OLD
+// For 5.2 --> 5.1 compatibility
+# define LUA_COMPAT_ALL
+// For 5.3 --> 5.1 compatibility
+# define LUA_COMPAT_5_1
+#endif
+
 #include <lua.h>
 #include <lualib.h>
 #include <lauxlib.h>
@@ -705,7 +713,7 @@ _lua_implicit_metatable_drop(lua_State *L, const char *name)
    if (lua_istable(L, 1) && lua_getmetatable(L, 1))
      {
         luaL_getmetatable(L, name);
-        if (lua_equal(L, -1, -2))
+        if (lua_rawequal(L, -1, -2))
           {
              lua_remove(L, 1);
              ret = 1;
@@ -1869,7 +1877,11 @@ _lua_convert_color(lua_State *L)
    lua_pushvalue(L, -2); //+1 (mt)
    lua_pushvalue(L, top); //+1 (argument)
    if (lua_pcall(L, 2, 1, top + 1) != 0)
-     return EINA_FALSE;
+     {
+        ERR("Failed to call metamethod __call: %s", lua_tostring(L, -1));
+        lua_settop(L, top);
+        return EINA_FALSE;
+     }
    lua_insert(L, top);
    lua_settop(L, top);
    return EINA_TRUE;
@@ -1931,7 +1943,7 @@ _lua_parameter_parse(Evas_Filter_Program *pgm, lua_State 
*L,
              {
                 luaL_getmetatable(L, _lua_color_meta);
                 lua_getmetatable(L, i);
-                if (!lua_isnil(L, -1) && lua_equal(L, -2, -1))
+                if (!lua_isnil(L, -1) && lua_rawequal(L, -2, -1))
                   {
                      // this is a color already
                      cid = i;
@@ -2265,8 +2277,7 @@ _lua_import_class(lua_State *L, const char *name, char 
**code)
         lua_rawget(L, -3); //-1/+1
         if (lua_isfunction(L, -1))
           {
-             lua_getglobal(L, "_G"); //+1
-             if (lua_pcall(L, 1, 0, -3) != 0) //-2
+             if (lua_pcall(L, 0, 0, -2) != 0) //-1
                {
                   ERR("Failed to register globals for '%s': %s", name, 
lua_tostring(L, -1));
                   lua_pop(L, 1);
@@ -2337,6 +2348,37 @@ _lua_class_create(lua_State *L, const char *name,
    lua_setglobal(L, name);
 }
 
+#if LUA_VERSION_NUM < 502
+// From LuaJIT/src/lib_init.c
+// Prevent loading package, IO and OS libs (mini-sandbox)
+static const luaL_Reg lj_lib_load[] = {
+  { "",                 luaopen_base },
+  //{ LUA_LOADLIBNAME,    luaopen_package },
+  { LUA_TABLIBNAME,     luaopen_table },
+  //{ LUA_IOLIBNAME,      luaopen_io },
+  //{ LUA_OSLIBNAME,      luaopen_os },
+  { LUA_STRLIBNAME,     luaopen_string },
+  { LUA_MATHLIBNAME,    luaopen_math },
+  { LUA_DBLIBNAME,      luaopen_debug },
+  { LUA_BITLIBNAME,     luaopen_bit },
+#ifdef LUA_JITLIBNAME
+  { LUA_JITLIBNAME,     luaopen_jit },
+#endif
+  { NULL,               NULL }
+};
+
+static void
+_luaL_openlibs(lua_State *L)
+{
+  const luaL_Reg *lib;
+  for (lib = lj_lib_load; lib->func; lib++) {
+    lua_pushcfunction(L, lib->func);
+    lua_pushstring(L, lib->name);
+    lua_call(L, 1, 0);
+  }
+}
+#endif
+
 static lua_State *
 _lua_state_create(Evas_Filter_Program *pgm)
 {
@@ -2349,17 +2391,20 @@ _lua_state_create(Evas_Filter_Program *pgm)
         return NULL;
      }
 
-   luaopen_base(L);
-   luaopen_table(L);
-   luaopen_string(L);
-   luaopen_math(L);
-   luaopen_debug(L);
+#if LUA_VERSION_NUM >= 502
+   luaL_requiref(L, "",       luaopen_base, 1);
+   luaL_requiref(L, "table",  luaopen_table, 1);
+   luaL_requiref(L, "string", luaopen_string, 1);
+   luaL_requiref(L, "math",   luaopen_math, 1);
+   luaL_requiref(L, "debug",  luaopen_debug, 1);
+#else
+   _luaL_openlibs(L);
+#endif
    lua_settop(L, 0);
 
    // Implement print
-   lua_getglobal(L, "_G");
-   luaL_register(L, NULL, printlib);
-   lua_pop(L, 1);
+   lua_pushcfunction(L, _lua_print);
+   lua_setglobal(L, "print");
 
    // Add backtrace error function
    lua_pushcfunction(L, _lua_backtrace);
@@ -2431,7 +2476,7 @@ _lua_backtrace(lua_State *L)
    if (!lua_isstring(L, 1))  /* 'message' not a string? */
      return 1;  /* keep it intact */
    ERR("Lua error: %s", lua_tolstring(L, 1, NULL));
-   lua_getfield(L, LUA_GLOBALSINDEX, "debug");
+   lua_getglobal(L, "debug");
    if (!lua_istable(L, -1))
      {
         lua_pop(L, 1);
diff --git a/src/lib/evas/filters/lua/color.lua 
b/src/lib/evas/filters/lua/color.lua
index b4bcd4b..14468d0 100644
--- a/src/lib/evas/filters/lua/color.lua
+++ b/src/lib/evas/filters/lua/color.lua
@@ -243,9 +243,9 @@ __color = {
    end,
 
    -- Register all global values into global env (_G)
-   __register = function (tbl)
+   __register = function ()
       for k, v in pairs(__color.__names) do
-         rawset(tbl, k, __color(v))
+         rawset(_G, k, __color(v))
       end
    end,
 
@@ -290,7 +290,7 @@ __color = {
       assert(tostring(__color('#123456')) == '#123456ff')
       assert(tostring(__color('#12345678')) == '#12345678')
 
-      __color.__register(_G)
+      __color.__register()
       assert(tostring(white) == '#ffffffff')
       assert(tostring(red) == '#ff0000ff')
 

-- 


Reply via email to