タイトルはかなり説明しています。 私はちょうどコレクト機能でcollect関数でtolua ++のカスタムコードを呼び出す方法
delete self;
を呼び出すコードを生成するtolua ++を望んでいません。
some_custom_collector(self);
このことは.pkgファイルで指定できますか?
タイトルはかなり説明しています。 私はちょうどコレクト機能でcollect関数でtolua ++のカスタムコードを呼び出す方法
delete self;
を呼び出すコードを生成するtolua ++を望んでいません。
some_custom_collector(self);
このことは.pkgファイルで指定できますか?
数日後、私はこの問題に戻りました。私はすぐに解決策が必要でした。私はこれを行う方法がないことに気づいた。そこで、私は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 ++のバインドコードを再作成して再コンパイルする必要があります。