tolua中的联合类型

我认为tolua中存在关于联合体的错误。如果您有这样的声明:

struct SDL_WindowEvent {
    int type;
    int windowID;
};

union SDL_Event {
    int type;
    SDL_WindowEvent window;
};

extern SDL_Event * create(void);
extern void frobnicate(SDL_Event *);

那么应该可以有以下lua代码:

event = create()
frobnicate(event)
print(event.window.windowId)
frobnicate(event)

但是第二次调用frobnicate(event)将导致错误:

argument #1 is 'SDL_WindowEvent'; 'SDL_Event' expected.

通过调试器对此进行了一些探索,发现事件.window访问中的tolua_pushusertype重写了我的变量类型!

到目前为止,我尝试过以下内容:从我的声明中,tolua将为声明SDL_WindowEvent类创建以下调用:

tolua_cclass(tolua_S,"SDL_WindowEvent","SDL_WindowEvent","",NULL);

这使得SDL_Event和SDL_WindowEvent成为两个不相关的类,彼此并非基础类。假设我以后有等效于以下代码的代码:

tolua_pushusertype(tolua_S, event, "SDL_Event");
assert(tolua_isusertype(tolua_S,1,"SDL_Event",0,&tolua_err));
tolua_pushusertype(tolua_S, event->window, "SDL_WindowEvent");
assert(tolua_isusertype(tolua_S,2,"SDL_Event",0,&tolua_err));

那么第四行中的assert将失败,因为自从第二行的assert以来,堆栈上的值的类型已经神奇地改变了。这是由于tolua_pushusertype()对其进行了更改-foo和foo.window具有相同的地址,并且在内部,tolua仅针对每个地址跟踪一个类型。如果对象是基类型SDL_Event,则tolua_isusertype()将会满足,但是这需要tolua_cclass声明在其第四个参数中具有"SDL_Event"。手动修复这个问题,两个assert都可以通过,但我每次无法手动更改它 - 我想修复tolua以解决此问题,但我还不足够了解它以完成这项任务。即使我能够这样做,我也不知道这是否是正确的做法。

我使用的是tolua 5.1.4,但是tolua++ 1.92.3也出现了相同的问题。

首先,我是否做错了什么?是否有办法重写我的声明,以便此工作与tolua as-is一起使用?或者,如果失败,有什么解决方案可以应用于tolua,以使其正常工作?

原文链接 https://stackoverflow.com/questions/9450228

点赞
stackoverflow用户30404
stackoverflow用户30404

我解决了这个问题!解决方案是像这样编辑我的 .pkg 文件:

struct SDL_WindowEvent : SDL_Event {
    int type;
    int windowID;
};

这样可以使 tolua 明确类继承关系。我似乎太专注于 .pkg 文件内容是有效的 C 代码了。

2012-02-26 04:17:57