Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

WrapPusher生成的代码导致死循环 #321

Closed
epluguo opened this issue Mar 16, 2018 · 0 comments
Closed

WrapPusher生成的代码导致死循环 #321

epluguo opened this issue Mar 16, 2018 · 0 comments

Comments

@epluguo
Copy link

epluguo commented Mar 16, 2018

使用GCOptimize标记或者配置上GCOptimizeConfig。那么Xlua会在WrapPusher.cs文件中生成一些Get方法来避免反射的方式获取或者转换lua的值到C#中,但生成的代码有bug,可能会导致死循环。

从图中的模版可以看到,当type不为UserData、Table时,就会走到else分支中从objectCasters.GetCaster继续获取caster然后调用。但是此时获取到的caster还是当前函数。
因为WrapPusher中的Init已经使用translator.RegisterCaster把该类型的caster注册进去了。

所以,对于nil等其他type,这里会进入死循环。

为了确保版本的问题,下面的图直接截github上LuaWrapPusher.tpl.txt的图。
image

这里没有单独写个例子上传。复现方式很简单。使用GCOptimize标记一个类或者struct。 比如:


//Class defined
[GCOptimize]
public class TestClass
{
}

////////


//C# function
public void TestStackOverflow(TestClass test)
{
}

//Lua Function
TestStackOverflow(nil)

如果前面的TestClass有被生成过代码,那么lua中传递TestClass类型参数为nil,则会死循环

ZeroKill1024 pushed a commit to ZeroKill1024/xLua that referenced this issue Apr 27, 2020
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant