UniLua icon indicating copy to clipboard operation
UniLua copied to clipboard

UliLua stack增长代码的bug

Open honemle opened this issue 11 years ago • 3 comments

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,能否给一个解决方案。

期待回复!谢谢!

honemle avatar Dec 07 '14 03:12 honemle

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

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

邮件原文如下:

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

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

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

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

xebecnan avatar Dec 07 '14 06:12 xebecnan

你好,

刚看到你的邮件。这个转菊花是我们自己游戏内部的转菊花,我暂时也没想到办法如何让你复现。不过确实是把小于改为小于等于之后才出现的。你跑的时那个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 https://github.com/xebecnan/UniLua/issues/53#issuecomment-65928038.

honemle avatar Dec 07 '14 06:12 honemle

嗯,能不能查一下是什么原因引起你的程序转菊花的?确认一下是不是 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 https://github.com/xebecnan/UniLua/issues/53#issuecomment-65928038.

— Reply to this email directly or view it on GitHub https://github.com/xebecnan/UniLua/issues/53#issuecomment-65928101.

xebecnan avatar Dec 07 '14 16:12 xebecnan