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

UliLua stack增长代码的bug #53

Open
honemle opened this issue Dec 7, 2014 · 3 comments
Open

UliLua stack增长代码的bug #53

honemle opened this issue Dec 7, 2014 · 3 comments

Comments

@honemle
Copy link

honemle commented Dec 7, 2014

Hi,

unilua中stack 增长的代码,看过之后觉得有一个bug,那就是:程序不能够分配LuaConf.LUAI_MAXSTACK的栈大小空间。源代码如下:
Do.cs:
private void D_GrowStack(int n)
{
int size = Stack.Length;
if(size > LuaConf.LUAI_MAXSTACK)
D_Throw(ThreadStatus.LUA_ERRERR);

        int needed = Top.Index + n + LuaDef.EXTRA_STACK;
        int newsize = 2 * size;
        if(newsize > LuaConf.LUAI_MAXSTACK)
            { newsize = LuaConf.LUAI_MAXSTACK; }
        if(newsize < needed)
            { newsize = needed; }
        if(newsize > LuaConf.LUAI_MAXSTACK)
        {
            D_ReallocStack(ERRORSTACKSIZE);
            G_RunError("stack overflow");
        }
        else
        {
            D_ReallocStack(newsize);
        }
    }

    private void D_ReallocStack(int size)
    {
        Utl.Assert(size < LuaConf.LUAI_MAXSTACK || size == ERRORSTACKSIZE);
        var newStack = new StkId[size];
        int i = 0;
        for( ; i<Stack.Length; ++i) {
            newStack[i] = Stack[i];
            newStack[i].SetList(newStack);
        }
        for( ; i<size; ++i) {
            newStack[i] = new StkId();
            newStack[i].SetList(newStack);
            newStack[i].SetIndex(i);
            newStack[i].V.SetNilValue();
        }
        Top = newStack[Top.Index];
        Stack = newStack;
        StackLast = size - LuaDef.EXTRA_STACK;
    }

这个代码里边,方法D_GrowStack是允许栈分配LUAI_MAXSTACK大小的,但是方法D_ReallocStack却不允许,因为这里
Utl.Assert(size < LuaConf.LUAI_MAXSTACK || size == ERRORSTACKSIZE);
只允许栈小于LUAI_MAXSTACK。

但是当我把这里的小于直接改为小于等于之后,程序一直转菊花,没反应。

所以想确认下,上述代码是否是一个bug,还是我用的unilua版本不对,我用的最新版。

如果这里确实是个bug,能否给一个解决方案。

期待回复!谢谢!

@xebecnan
Copy link
Owner

xebecnan commented Dec 7, 2014

你好,我昨天给你发过一个邮件了,不知道你收到没有?

这个问题我昨天已经作了一个提交修正了。但是没有重现出你说的转菊花的情况

邮件原文如下:

我看了一下,确实应该是个 bug。

按理说
Utl.Assert(size < LuaConf.LUAI_MAXSTACK || size == ERRORSTACKSIZE);
改为
Utl.Assert(size <= LuaConf.LUAI_MAXSTACK || size == ERRORSTACKSIZE);
就行了。

我改了之后跑了一下 UniLua 自带的例子没有发现问题

不知道你说的程序一直转菊花是什么状况,能不能给我一个重现的办法?我查一下

@honemle
Copy link
Author

honemle commented Dec 7, 2014

你好,

刚看到你的邮件。这个转菊花是我们自己游戏内部的转菊花,我暂时也没想到办法如何让你复现。不过确实是把小于改为小于等于之后才出现的。你跑的时那个unilua的例子。

在 2014年12月7日 下午2:16,阿楠 [email protected]写道:

你好,我昨天给你发过一个邮件了,不知道你收到没有?

这个问题我昨天已经作了一个提交修正了。但是没有重现出你说的转菊花的情况

邮件原文如下:

我看了一下,确实应该是个 bug。

按理说
Utl.Assert(size < LuaConf.LUAI_MAXSTACK || size == ERRORSTACKSIZE);
改为
Utl.Assert(size <= LuaConf.LUAI_MAXSTACK || size == ERRORSTACKSIZE);
就行了。

我改了之后跑了一下 UniLua 自带的例子没有发现问题

不知道你说的程序一直转菊花是什么状况,能不能给我一个重现的办法?我查一下


Reply to this email directly or view it on GitHub
#53 (comment).

@xebecnan
Copy link
Owner

xebecnan commented Dec 7, 2014

嗯,能不能查一下是什么原因引起你的程序转菊花的?确认一下是不是 UniLua 的问题,是的话应该可以定位一下 UniLua
在什么状况下运行不正常,构造一个复现的情景的。

2014-12-07 14:19 GMT+08:00 honemle [email protected]:

你好,

刚看到你的邮件。这个转菊花是我们自己游戏内部的转菊花,我暂时也没想到办法如何让你复现。不过确实是把小于改为小于等于之后才出现的。你跑的时那个unilua的例子。

在 2014年12月7日 下午2:16,阿楠 [email protected]写道:

你好,我昨天给你发过一个邮件了,不知道你收到没有?

这个问题我昨天已经作了一个提交修正了。但是没有重现出你说的转菊花的情况

邮件原文如下:


我看了一下,确实应该是个 bug。

按理说
Utl.Assert(size < LuaConf.LUAI_MAXSTACK || size == ERRORSTACKSIZE);
改为
Utl.Assert(size <= LuaConf.LUAI_MAXSTACK || size == ERRORSTACKSIZE);
就行了。

我改了之后跑了一下 UniLua 自带的例子没有发现问题

不知道你说的程序一直转菊花是什么状况,能不能给我一个重现的办法?我查一下


Reply to this email directly or view it on GitHub
#53 (comment).


Reply to this email directly or view it on GitHub
#53 (comment).

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

2 participants