Commit 153c3a5139 for freeswitch.com

commit 153c3a5139e309321e97c5c6d661ef8c23734477
Author: Dmitry Verenitsin <morbit85@gmail.com>
Date:   Thu May 28 03:34:53 2026 +0500

    [mod_lua] Move SWIG wrapper patches into ".i" typemaps, drop hack.diff (#3043)

    A swig 4.1 regeneration dropped several hand-patched wrapper edits.
    Express them (and the rest) as SWIG typemaps in `freeswitch.i` so they
    survive reswig. `make reswig` now produces the final wrapper directly;
    `hack.diff` and its `patch` step are removed.

    Restored regressions:
    - `setLUA(L)` on returned `Session`: a hangup hook or input callback on
    a script-created `freeswitch.Session()` no longer crashes the process
    - binary-safe `Stream::read` (`lua_pushlstring`)

    Also moved to typemaps:
    - `Dbh`/`JSON` self-pointer guards (`%typemap(check)`), now covering
    every wrapper including four the hand-patch missed
    - type-table isolation (`#define SWIG_TYPE_TABLE mod_lua`)

diff --git a/src/mod/languages/mod_lua/Makefile.am b/src/mod/languages/mod_lua/Makefile.am
index f898c8abfa..d295cd19aa 100644
--- a/src/mod/languages/mod_lua/Makefile.am
+++ b/src/mod/languages/mod_lua/Makefile.am
@@ -27,7 +27,6 @@ swigclean: clean
 mod_lua_wrap.cpp: mod_lua_extra.c
 	swig -lua -c++ -I../../../../src/include -oh mod_lua_wrap.h -o mod_lua_wrap.cpp freeswitch.i
 	echo "#include \"mod_lua_extra.c\"" >> mod_lua_wrap.cpp
-	patch -s -p0 -i hack.diff

 noinst_PROGRAMS = test/test_mod_lua

diff --git a/src/mod/languages/mod_lua/freeswitch.i b/src/mod/languages/mod_lua/freeswitch.i
index 96a5f8c722..d6e8711852 100644
--- a/src/mod/languages/mod_lua/freeswitch.i
+++ b/src/mod/languages/mod_lua/freeswitch.i
@@ -1,4 +1,10 @@
 %module freeswitch
+
+/* Isolate this module's type table from other swig-lua modules (e.g. ESL). */
+%begin %{
+#define SWIG_TYPE_TABLE mod_lua
+%}
+
 %include ../../../../swig_common.i
 //%include "cstring.i"
 %include std_string.i
@@ -66,6 +72,13 @@
 }


+/* Stream::read returns binary data; preserve length and embedded NULs. */
+%typemap(out) const char *Stream::read %{ lua_pushlstring(L,(const char*)$1, (*arg2)); SWIG_arg++;%}
+
+/* Guard the self pointer in every Dbh/JSON method wrapper. */
+%typemap(check) LUA::Dbh *  %{ switch_assert($1);%}
+%typemap(check) LUA::JSON * %{ switch_assert($1);%}
+
 /**
  * tell swig to grok everything defined in these header files and
  * build all sorts of c wrappers and lua shadows of the c wrappers.
@@ -74,6 +87,13 @@


 namespace LUA {
+
+/* Bind Lua state into returned Session (needed by hangup/input callbacks). */
+%typemap(out) LUA::Session * {
+  SWIG_NewPointerObj(L, $1, $1_descriptor, $owner); SWIG_arg++;
+  if ($1) ($1)->setLUA(L);
+}
+
 class Session : public CoreSession {
  private:
 	virtual void do_hangup_hook();
diff --git a/src/mod/languages/mod_lua/hack.diff b/src/mod/languages/mod_lua/hack.diff
deleted file mode 100644
index e3fe191aed..0000000000
--- a/src/mod/languages/mod_lua/hack.diff
+++ /dev/null
@@ -1,122 +0,0 @@
---- mod_lua_wrap.cpp.old	2025-07-09 10:36:02.165895047 +0000
-+++ mod_lua_wrap.cpp	2025-07-09 10:46:12.289624035 +0000
-@@ -9639,6 +9639,7 @@
-     }
-
-     arg2 = (char *)lua_tostring(L, 2);
-+    switch_assert(arg1);
-     result = (bool)(arg1)->test_reactive(arg2);
-     lua_pushboolean(L,(int)(result!=0)); SWIG_arg++;
-     return SWIG_arg;
-@@ -9769,6 +9770,7 @@
-         (&arg3)->idx = 3;
-       }
-     }
-+    switch_assert(arg1);
-     result = (bool)(arg1)->query(arg2,arg3);
-     lua_pushboolean(L,(int)(result!=0)); SWIG_arg++;
-     return SWIG_arg;
-@@ -9798,6 +9800,7 @@
-     }
-
-     arg3 = (char *)lua_tostring(L, 2);
-+    switch_assert(arg1);
-     result = (arg1)->query_rows(arg2,arg3);
-     {
-       SWIG_arg += result;
-@@ -9824,6 +9827,7 @@
-       SWIG_fail_ptr("Dbh_affected_rows",1,SWIGTYPE_p_LUA__Dbh);
-     }
-
-+    switch_assert(arg1);
-     result = (int)(arg1)->affected_rows();
-     lua_pushnumber(L, (lua_Number) result); SWIG_arg++;
-     return SWIG_arg;
-@@ -9848,6 +9852,7 @@
-       SWIG_fail_ptr("Dbh_last_error",1,SWIGTYPE_p_LUA__Dbh);
-     }
-
-+    switch_assert(arg1);
-     result = (char *)(arg1)->last_error();
-     lua_pushstring(L,(const char *)result); SWIG_arg++;
-     return SWIG_arg;
-@@ -9871,6 +9876,7 @@
-       SWIG_fail_ptr("Dbh_clear_error",1,SWIGTYPE_p_LUA__Dbh);
-     }
-
-+    switch_assert(arg1);
-     (arg1)->clear_error();
-
-     return SWIG_arg;
-@@ -9898,6 +9904,7 @@
-     }
-
-     arg2 = (char *)lua_tostring(L, 2);
-+    switch_assert(arg1);
-     result = (int)(arg1)->load_extension((char const *)arg2);
-     lua_pushnumber(L, (lua_Number) result); SWIG_arg++;
-     return SWIG_arg;
-@@ -9998,6 +10005,7 @@
-     }
-
-     arg2 = (char *)lua_tostring(L, 2);
-+    switch_assert(arg1);
-     result = (cJSON *)(arg1)->decode((char const *)arg2);
-     {
-       SWIG_arg += LUA::JSON::cJSON2LuaTable(L, result);
-@@ -10031,6 +10039,7 @@
-       (&arg2)->L = L;
-       (&arg2)->idx = 2;
-     }
-+    switch_assert(arg1);
-     result = (arg1)->encode(arg2);
-     lua_pushlstring(L,(&result)->data(),(&result)->size()); SWIG_arg++;
-     return SWIG_arg;
-@@ -10058,6 +10067,7 @@
-     }
-
-     arg2 = (char *)lua_tostring(L, 2);
-+    switch_assert(arg1);
-     result = (cJSON *)(arg1)->execute((char const *)arg2);
-     {
-       SWIG_arg += LUA::JSON::cJSON2LuaTable(L, result);
-@@ -10091,6 +10101,7 @@
-       (&arg2)->L = L;
-       (&arg2)->idx = 2;
-     }
-+    switch_assert(arg1);
-     result = (cJSON *)(arg1)->execute(arg2);
-     {
-       SWIG_arg += LUA::JSON::cJSON2LuaTable(L, result);
-@@ -10175,6 +10186,7 @@
-     }
-
-     arg2 = (char *)lua_tostring(L, 2);
-+    switch_assert(arg1);
-     result = (arg1)->execute2((char const *)arg2);
-     lua_pushlstring(L,(&result)->data(),(&result)->size()); SWIG_arg++;
-     return SWIG_arg;
-@@ -10205,6 +10217,7 @@
-       (&arg2)->L = L;
-       (&arg2)->idx = 2;
-     }
-+    switch_assert(arg1);
-     result = (arg1)->execute2(arg2);
-     lua_pushlstring(L,(&result)->data(),(&result)->size()); SWIG_arg++;
-     return SWIG_arg;
-@@ -10285,6 +10298,7 @@
-     }
-
-     arg2 = (lua_toboolean(L, 2)!=0);
-+    switch_assert(arg1);
-     (arg1)->encode_empty_table_as_object(arg2);
-
-     return SWIG_arg;
-@@ -10311,6 +10325,7 @@
-     }
-
-     arg2 = (lua_toboolean(L, 2)!=0);
-+    switch_assert(arg1);
-     (arg1)->return_unformatted_json(arg2);
-
-     return SWIG_arg;
diff --git a/src/mod/languages/mod_lua/mod_lua_wrap.cpp b/src/mod/languages/mod_lua/mod_lua_wrap.cpp
index afe5d975cd..c82d4fc373 100644
--- a/src/mod/languages/mod_lua/mod_lua_wrap.cpp
+++ b/src/mod/languages/mod_lua/mod_lua_wrap.cpp
@@ -6,6 +6,9 @@
  * the SWIG interface file instead.
  * ----------------------------------------------------------------------------- */

+#define SWIG_TYPE_TABLE mod_lua
+
+

 #define SWIG_VERSION 0x040100
 #define SWIGLUA
@@ -4307,7 +4310,7 @@ static int _wrap_Stream_read(lua_State* L) {
     }

     result = (char *)(arg1)->read(arg2);
-    lua_pushstring(L,(const char *)result); SWIG_arg++;
+    lua_pushlstring(L,(const char*)result, (*arg2)); SWIG_arg++;
     lua_pushnumber(L, (lua_Number) *arg2); SWIG_arg++;
     return SWIG_arg;

@@ -8401,7 +8404,10 @@ static int _wrap_new_Session__SWIG_0(lua_State* L) {

     SWIG_check_num_args("LUA::Session::Session",0,0)
     result = (LUA::Session *)new LUA::Session();
-    SWIG_NewPointerObj(L,result,SWIGTYPE_p_LUA__Session,1); SWIG_arg++;
+    {
+      SWIG_NewPointerObj(L, result, SWIGTYPE_p_LUA__Session, 1); SWIG_arg++;
+      if (result) (result)->setLUA(L);
+    }
     return SWIG_arg;

     fail: SWIGUNUSED;
@@ -8428,7 +8434,10 @@ static int _wrap_new_Session__SWIG_1(lua_State* L) {
     }

     result = (LUA::Session *)new LUA::Session(arg1,arg2);
-    SWIG_NewPointerObj(L,result,SWIGTYPE_p_LUA__Session,1); SWIG_arg++;
+    {
+      SWIG_NewPointerObj(L, result, SWIGTYPE_p_LUA__Session, 1); SWIG_arg++;
+      if (result) (result)->setLUA(L);
+    }
     return SWIG_arg;

     fail: SWIGUNUSED;
@@ -8448,7 +8457,10 @@ static int _wrap_new_Session__SWIG_2(lua_State* L) {
     if(!SWIG_lua_isnilstring(L,1)) SWIG_fail_arg("LUA::Session::Session",1,"char *");
     arg1 = (char *)lua_tostring(L, 1);
     result = (LUA::Session *)new LUA::Session(arg1);
-    SWIG_NewPointerObj(L,result,SWIGTYPE_p_LUA__Session,1); SWIG_arg++;
+    {
+      SWIG_NewPointerObj(L, result, SWIGTYPE_p_LUA__Session, 1); SWIG_arg++;
+      if (result) (result)->setLUA(L);
+    }
     return SWIG_arg;

     fail: SWIGUNUSED;
@@ -8472,7 +8484,10 @@ static int _wrap_new_Session__SWIG_3(lua_State* L) {
     }

     result = (LUA::Session *)new LUA::Session(arg1);
-    SWIG_NewPointerObj(L,result,SWIGTYPE_p_LUA__Session,1); SWIG_arg++;
+    {
+      SWIG_NewPointerObj(L, result, SWIGTYPE_p_LUA__Session, 1); SWIG_arg++;
+      if (result) (result)->setLUA(L);
+    }
     return SWIG_arg;

     fail: SWIGUNUSED;
@@ -9525,6 +9540,7 @@ static int _wrap_Dbh_release(lua_State* L) {
       SWIG_fail_ptr("Dbh_release",1,SWIGTYPE_p_LUA__Dbh);
     }

+    switch_assert(arg1);
     result = (bool)(arg1)->release();
     lua_pushboolean(L,(int)(result!=0)); SWIG_arg++;
     return SWIG_arg;
@@ -9549,6 +9565,7 @@ static int _wrap_Dbh_connected(lua_State* L) {
       SWIG_fail_ptr("Dbh_connected",1,SWIGTYPE_p_LUA__Dbh);
     }

+    switch_assert(arg1);
     result = (bool)(arg1)->connected();
     lua_pushboolean(L,(int)(result!=0)); SWIG_arg++;
     return SWIG_arg;
@@ -9582,6 +9599,7 @@ static int _wrap_Dbh_test_reactive__SWIG_0(lua_State* L) {
     arg2 = (char *)lua_tostring(L, 2);
     arg3 = (char *)lua_tostring(L, 3);
     arg4 = (char *)lua_tostring(L, 4);
+    switch_assert(arg1);
     result = (bool)(arg1)->test_reactive(arg2,arg3,arg4);
     lua_pushboolean(L,(int)(result!=0)); SWIG_arg++;
     return SWIG_arg;
@@ -9612,6 +9630,7 @@ static int _wrap_Dbh_test_reactive__SWIG_1(lua_State* L) {

     arg2 = (char *)lua_tostring(L, 2);
     arg3 = (char *)lua_tostring(L, 3);
+    switch_assert(arg1);
     result = (bool)(arg1)->test_reactive(arg2,arg3);
     lua_pushboolean(L,(int)(result!=0)); SWIG_arg++;
     return SWIG_arg;