progress on twnlua bindgen
This commit is contained in:
		| @@ -31,6 +31,20 @@ def default(parameter): | ||||
|     raise BaseException("Unhandled default value of type '%s'" % parameter["type"]) | ||||
|  | ||||
|  | ||||
| def to_table(typedesc, variable, indent = 0): | ||||
|     binding = ' ' * indent + "lua_newtable(L);\n" | ||||
|     for field in typedesc["fields"]: | ||||
|         if field["type"] == "float": | ||||
|             binding += ' ' * indent + "lua_pushnumber(L, (double)(%s));\n" % (variable + ".%s" % field["name"]) | ||||
|         elif field["type"] in api["types"]: | ||||
|             binding += to_table(api["types"][field["type"]], variable + ".%s" % field["name"], indent + 4) | ||||
|         else: | ||||
|             raise BaseException("Unhandled return field type '%s'" % (field["type"])) | ||||
|         binding += ' ' * indent + "lua_setfield(L, -2, \"%s\");\n" % field["name"] | ||||
|     # binding += ' ' * indent + "lua_pop(L, 1);\n" | ||||
|     return binding | ||||
|  | ||||
|  | ||||
| print('#include "twn_game_api.h"\n') | ||||
| print('#define STB_DS_IMPLEMENTATION') # TODO: reuse implementation from the engine | ||||
| print('#include <stb_ds.h>') | ||||
| @@ -115,8 +129,15 @@ for procedure, procedure_desc in api["procedures"].items(): | ||||
|             binding += "    lua_pushboolean(L, (int)%s(%s));\n" % (procedure, ", ".join(param["name"] for param in procedure_desc["params"])) | ||||
|         elif procedure_desc["return"] == "float": | ||||
|             binding += "    lua_pushnumber(L, (double)%s(%s));\n" % (procedure, ", ".join(param["name"] for param in procedure_desc["params"])) | ||||
|         elif procedure_desc["return"] == "char *": | ||||
|             binding += "    lua_pushstring(L, %s(%s));\n" % (procedure, ", ".join(param["name"] for param in procedure_desc["params"])) | ||||
|         elif type(procedure_desc["return"]) is dict or procedure_desc["return"] in api["types"]: | ||||
|             # TODO: handle enums | ||||
|             type_desc = procedure_desc["return"] if type(procedure_desc["return"]) is dict else api["types"][procedure_desc["return"]] | ||||
|             binding += "    %s result = %s(%s);\n" % (type_desc["c_type"], procedure, ", ".join(param["name"] for param in procedure_desc["params"])) | ||||
|             binding += to_table(type_desc, "result", 4) | ||||
|         else: | ||||
|             binding += "    lua_warning(L, \"Unhandled return type!\", 0);\n" | ||||
|             raise BaseException("Unhandled return type '%s'" % (procedure_desc["return"])) | ||||
|         binding += "    return 1;\n}\n" | ||||
|     else: | ||||
|         binding += "    %s(%s);\n" % (procedure, ", ".join(param["name"] for param in procedure_desc["params"])) | ||||
| @@ -132,9 +153,8 @@ for module in modules: | ||||
|     loader += "    lua_newtable(L);\n" | ||||
|     for procedure, procedure_desc in api["procedures"].items(): | ||||
|         if procedure_desc["module"] == module: | ||||
|             loader += "    lua_pushstring(L, \"%s\");\n" % procedure_desc["symbol"] | ||||
|             loader += "    lua_pushcfunction(L, binding_%s);\n" % procedure | ||||
|             loader += "    lua_settable(L, -3);\n" | ||||
|             loader += "    lua_setfield(L, -2, \"%s\");\n" % procedure_desc["symbol"] | ||||
|     loader += "    lua_setglobal(L, \"%s\");\n" % module | ||||
|  | ||||
| loader += "}" | ||||
|   | ||||
		Reference in New Issue
	
	Block a user