Преглед изворни кода

Fixed event handling errors with LuaJIT

Ivan Safrin пре 13 година
родитељ
комит
35a12c27db

+ 8 - 0
Bindings/Contents/LUA/API/defaults.lua

@@ -7,6 +7,8 @@ _G["count"] = function(T)
 end
 
 _G["same_c_class"] = function(a,b)
+	if a == nil or b == nil then return false end
+	if a.__ptr == nil or b.__ptr == nil then return false end
 	return __are_same_c_class(a.__ptr,b.__ptr)
 end
 
@@ -38,6 +40,12 @@ _G["print"] = function(msg)
 	_G["debugPrint"](tostring(msg))
 end
 
+_G["__handleEvent"] = function(target, event)
+	evt = _G["Event"]("__skip_ptr__")
+	evt.__ptr = event
+	target:handleEvent(evt)
+end
+
 __core__services__instance = Polycore.CoreServices_getInstance()
 
 Services = {}

+ 9 - 18
Bindings/Scripts/create_lua_library/create_lua_library.py

@@ -130,15 +130,19 @@ def createLUABindings(inputPath, prefix, mainInclude, libSmallName, libName, api
 		wrappersHeaderOut += "public:\n"
 		wrappersHeaderOut += "	LuaEventHandler() : EventHandler() {}\n"
 		wrappersHeaderOut += "	void handleEvent(Event *e) {\n"
-		wrappersHeaderOut += "		lua_getfield(L, LUA_GLOBALSINDEX, \"EventHandler\" );\n"
-		wrappersHeaderOut += "		lua_getfield(L, -1, \"__handleEvent\");\n"
+#		wrappersHeaderOut += "		lua_pop(L, 1);\n"
+#		wrappersHeaderOut += "		lua_getfield(L, LUA_GLOBALSINDEX, \"EventHandler\" );\n"
+		wrappersHeaderOut += "		lua_settop(L, 0);\n"
+		wrappersHeaderOut += "		lua_getfield (L, LUA_GLOBALSINDEX, \"__customError\");\n"
+		wrappersHeaderOut += "		int errH = lua_gettop(L);\n"
+		wrappersHeaderOut += "		lua_getfield(L, LUA_GLOBALSINDEX, \"__handleEvent\");\n"
 		wrappersHeaderOut += "		lua_rawgeti( L, LUA_REGISTRYINDEX, wrapperIndex );\n"
 		wrappersHeaderOut += "		PolyBase **userdataPtr = (PolyBase**)lua_newuserdata(L, sizeof(PolyBase*));\n"
 		wrappersHeaderOut += "		*userdataPtr = (PolyBase*)e;\n"
-#		wrappersHeaderOut += "		lua_getfield (L, LUA_GLOBALSINDEX, \"__customError\");\n"
-#		wrappersHeaderOut += "		int errH = lua_gettop(L);\n"
 #		wrappersHeaderOut += "		lua_pcall(L, 2, 0, errH);\n"
-		wrappersHeaderOut += "		lua_pcall(L, 2, 0, 0);\n"
+		wrappersHeaderOut += "		int stackSize = lua_gettop(L);\n"
+		wrappersHeaderOut += "		printf(\"MARCO! (stacksize: %d)\\n\", stackSize);\n"
+		wrappersHeaderOut += "		lua_pcall(L, 2, 0, errH);\n"
 		wrappersHeaderOut += "	}\n"
 		wrappersHeaderOut += "	int wrapperIndex;\n"
 		wrappersHeaderOut += "	lua_State *L;\n"
@@ -717,19 +721,6 @@ def createLUABindings(inputPath, prefix, mainInclude, libSmallName, libName, api
 				luaClassBindingOut += "function %s:__delete()\n" % (ckey)
 				luaClassBindingOut += "\t%s.delete_%s(self.__ptr)\n" % (libName, ckey)
 				luaClassBindingOut += "end\n"
-				if ckey == "EventHandler": # See LuaEventHandler above
-					luaClassBindingOut += "\n\n"
-					luaClassBindingOut += "function EventHandler:__handleEvent(event)\n"
-					luaClassBindingOut += "\tevt = _G[\"Event\"](\"__skip_ptr__\")\n"
-					luaClassBindingOut += "\tevt.__ptr = event\n"
-					luaClassBindingOut += "\tself:handleEvent(evt)\n"
-					#luaClassBindingOut += "\tself:handleEvent(event)\n"
-					luaClassBindingOut += "end\n\n"
-					
-					# Let's use this opportunity to put in some other "generated" utility functions.
-					luaClassBindingOut += "function __ptrToTable(className, ptr)\n"
-					luaClassBindingOut += template_returnPtrLookup("\t","className","ptr")
-					luaClassBindingOut += "end\n\n"
 					
 				# Add class to lua index file
 				luaIndexOut += "require \"%s/%s\"\n" % (prefix, ckey)

+ 2 - 0
IDE/Contents/Source/PolycodeIDEApp.cpp

@@ -183,6 +183,8 @@ void PolycodeIDEApp::openProject() {
 	ext.description = "Polycode Project File";
 	extensions.push_back(ext);
 	std::vector<String> paths = core->openFilePicker(extensions, false);
+	if(paths.size() == 0) 
+		return;
 	if(paths[0] != "") {
 		PolycodeProject *project = projectManager->openProject(paths[0]);
 		if(project) {

+ 1 - 1
Player/Contents/Source/PolycodePlayer.cpp

@@ -841,7 +841,7 @@ void PolycodePlayer::handleEvent(Event *event) {
 
 bool PolycodePlayer::Update() {
 	if(L) {
-				
+		lua_settop(L, 0);				
 		if(doCodeInject) {
 			printf("INJECTING CODE:[%s]\n", injectCodeString.c_str());
 			doCodeInject = false;