2016-03-24 8 views

答えて

0

数日後、私はこの問題に戻りました。私はすぐに解決策が必要でした。私はこれを行う方法がないことに気づいた。そこで、私はtolua ++のパッチを作成しましたが、CEGUIソースで見つかったバージョンのために作成しました。 それは本当に醜い方法で行われましたが、使用するのはかなり簡単ですし、それはで動作します。

tolua_outside void ~SomeClass @ SomeClass_CustomFinalizer(); 

ので、代わりにこのようなコードを生成する:あなたが、あなたがこのようなファイルSomeClass.pkgように指定することができ、

を使用すると、クラス工assがあると、あなたはLuaの関数がSomeClass_CustomFinalizerを呼び出すための関数を削除し、収集したいです:

SomeClass_CustomFinalizer(self); 

delete self; 

それは、このようなコードを生成します。

パッチはこちらです。あなたがそれを適用することに失敗したとしても、一般的な考えを手に入れて手動で適用するのはかなり簡単です。

diff --git a/lua/basic.lua b/lua/basic.lua 
index 99fc961..b4983e3 100644 
--- a/lua/basic.lua 
+++ b/lua/basic.lua 
@@ -67,7 +67,8 @@ _basic_raw_push = {} 
_usertype = {} 

-- List of types that have to be collected 
-_collect = {} 
+_collect = {{}} 
+_collect_custom_finalizers_index = 1 

-- List of types 
_global_types = {n=0} 

diff --git a/lua/class.lua b/lua/class.lua 
index 8580ce8..c8f275e 100644 
--- a/lua/class.lua 
+++ b/lua/class.lua 
@@ -78,7 +78,10 @@ function classClass:requirecollection (t) 
    -- classes that export constructors need to have a collector (overrided by -D flag on command line) 
    if self._delete or ((not flags['D']) and self._new) then 
     --t[self.type] = "tolua_collect_" .. gsub(self.type,"::","_") 
-  t[self.type] = "tolua_collect_" .. clean_template(self.type) 
+  t[self.type] = "tolua_collect_" .. clean_template(self.type) 
+  if self.custom_finalizer then 
+   t[_collect_custom_finalizers_index][self.type] = self.custom_finalizer 
+  end 
     r = true 
    end 
    return r 

diff --git a/lua/function.lua b/lua/function.lua 
index ce73cf8..0db9b2f 100644 
--- a/lua/function.lua 
+++ b/lua/function.lua 
@@ -322,7 +322,11 @@ function classFunction:supcode (local_constructor) 

    -- call function 
    if class and self.name=='delete' then 
- output(' delete self;') 
+ if self.custom_finalizer then 
+  output(' ' .. self.custom_finalizer .. '(self);') 
+ else 
+  output(' delete self;') 
+ end 
    elseif class and self.name == 'operator&[]' then 
    if flags['1'] then -- for compatibility with tolua5 ? 
    output(' self->operator[](',self.args[1].name,'-1) = ',self.args[2].name,';') 


@@ -679,14 +684,20 @@ function _Function (t) 

    append(t) 
    if t:inclass() then 
- --print ('t.name is '..t.name..', parent.name is '..t.parent.name) 
+ 
+--print ('t.name is '..t.name..', parent.name is '..t.parent.name) 
+ 
    if string.gsub(t.name, "%b<>", "") == string.gsub(t.parent.original_name or t.parent.name, "%b<>", "") then 
    t.name = 'new' 
    t.lname = 'new' 
    t.parent._new = true 
    t.type = t.parent.name 
    t.ptr = '*' 
- elseif string.gsub(t.name, "%b<>", "") == '~'..string.gsub(t.parent.original_name or t.parent.name, "%b<>", "") then 
+ elseif string.gsub(t.name, "%b<>", "") == '~'..string.gsub(t.parent.original_name or t.parent.name, "%b<>", "") then 
+ if t.lname ~= t.name then 
+  t.parent.custom_finalizer = t.lname 
+  t.custom_finalizer = t.lname 
+ end 
    t.name = 'delete' 
    t.lname = 'delete' 
    t.parent._delete = true 

diff --git a/lua/package.lua b/lua/package.lua 
index 6ba30fb..edc791a 100644 
--- a/lua/package.lua 
+++ b/lua/package.lua 
@@ -135,12 +135,20 @@ function classPackage:preamble() 
     output('/* function to release collected object via destructor */') 
     output('#ifdef __cplusplus\n') 
     for i,v in pairs(_collect) do 
-  output('\nstatic int '..v..' (lua_State* tolua_S)') 
-   output('{') 
-   output(' '..i..'* self = ('..i..'*) tolua_tousertype(tolua_S,1,0);') 
-   output(' delete self;') 
-   output(' return 0;') 
-   output('}') 
+   if i ~= _collect_custom_finalizers_index then 
+ 
+   output('\nstatic int '..v..' (lua_State* tolua_S)') 
+   output('{') 
+   output(' '..i..'* self = ('..i..'*) tolua_tousertype(tolua_S,1,0);') 
+   if _collect[_collect_custom_finalizers_index][i] then 
+    output(' ' .. _collect[_collect_custom_finalizers_index][i] .. '(self);') 
+   else 
+    output(' delete self;') 
+   end 
+   output(' return 0;') 
+   output('}') 
+ 
+   end 
     end 
     output('#endif\n\n') 
    end 

tolua ++のバインドコードを再作成して再コンパイルする必要があります。

関連する問題