Skip to content

Commit

Permalink
AP_Scripting: move singleton method bindings to flash
Browse files Browse the repository at this point in the history
  • Loading branch information
IamPete1 committed Aug 7, 2021
1 parent abb6521 commit 639eba4
Showing 1 changed file with 102 additions and 32 deletions.
134 changes: 102 additions & 32 deletions libraries/AP_Scripting/generator/src/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -1893,19 +1893,72 @@ void emit_singleton_metatables(struct userdata *head) {
}
}

void emit_enum(struct userdata * data) {
fprintf(source, "struct userdata_enum %s_enums[] = {\n", data->sanatized_name);
struct userdata_enum *ud_enum = data->enums;
while (ud_enum != NULL) {
fprintf(source, " {\"%s\", %s::%s},\n", ud_enum->name, data->name, ud_enum->name);
ud_enum = ud_enum->next;
}

}

void emit_singleton_index(struct userdata *head) {

struct userdata * node = head;
while(node) {
start_dependency(source, node->dependency);

fprintf(source, "const luaL_Reg %s_meta[] = {\n", node->sanatized_name);

struct method *method = node->methods;
while (method) {
fprintf(source, " {\"%s\", %s_%s},\n", method->alias ? method->alias : method->name, node->sanatized_name, method->name);
method = method->next;
}

fprintf(source, "};\n\n");

if (node->enums != NULL) {
emit_enum(node);
fprintf(source, "};\n\n");
}

fprintf(source, "static int %s_index(lua_State *L) {\n", node->sanatized_name);
fprintf(source, " const char * name = luaL_checkstring(L, 2);\n");
fprintf(source, " for (uint32_t i = 0; i < ARRAY_SIZE(%s_meta); i++) {\n",node->sanatized_name);
fprintf(source, " if (strcmp(name,%s_meta[i].name) == 0) {\n",node->sanatized_name);
fprintf(source, " lua_pushcfunction(L, %s_meta[i].func);\n",node->sanatized_name);
fprintf(source, " return 1;\n");
fprintf(source, " };\n");
fprintf(source, " };\n");
if (node->enums != NULL) {
fprintf(source, " for (uint32_t i = 0; i < ARRAY_SIZE(%s_enums); i++) {\n",node->sanatized_name);
fprintf(source, " if (strcmp(name,%s_enums[i].name) == 0) {\n",node->sanatized_name);
fprintf(source, " lua_pushinteger(L, %s_enums[i].value);\n",node->sanatized_name);
fprintf(source, " return 1;\n");
fprintf(source, " };\n");
fprintf(source, " };\n");
}
fprintf(source, " return 0;\n");

fprintf(source, "};\n");

end_dependency(source, node->dependency);
fprintf(source, "\n");

node = node->next;
}
}

void emit_enums(struct userdata * data) {
while (data) {
if (data->enums != NULL) {
start_dependency(source, data->dependency);
fprintf(source, "struct userdata_enum %s_enums[] = {\n", data->sanatized_name);
struct userdata_enum *ud_enum = data->enums;
while (ud_enum != NULL) {
fprintf(source, " {\"%s\", %s::%s},\n", ud_enum->name, data->name, ud_enum->name);
ud_enum = ud_enum->next;
}
fprintf(source, " {NULL, 0}};\n");
end_dependency(source, data->dependency);
emit_enum(data);
fprintf(source, " {NULL, 0}\n};\n");
fprintf(source, "\n");
end_dependency(source, data->dependency);
}
data = data->next;
}
Expand All @@ -1926,23 +1979,28 @@ void emit_metas(struct userdata * data, char * meta_name) {
fprintf(source, "};\n\n");
}

void emit_index(struct userdata * data, char * meta_name) {
fprintf(source, "const struct userdata_index %s_fun[] = {\n", meta_name);
while (data) {
start_dependency(source, data->dependency);
if (data->enums) {
fprintf(source, " {\"%s\", %s_index, %s_enums},\n", data->alias ? data->alias : data->name, data->name, data->sanatized_name);
} else {
fprintf(source, " {\"%s\", %s_index, NULL},\n", data->alias ? data->alias : data->name, data->sanatized_name);
}
end_dependency(source, data->dependency);
data = data->next;
}
fprintf(source, "};\n\n");
}

void emit_loaders(void) {
// emit the enum header
fprintf(source, "struct userdata_enum {\n");
fprintf(source, " const char *name;\n");
fprintf(source, " int value;\n");
fprintf(source, "};\n\n");
emit_enums(parsed_userdata);
emit_enums(parsed_singletons);

// emit the meta table header
fprintf(source, "struct userdata_meta {\n");
fprintf(source, " const char *name;\n");
fprintf(source, " const luaL_Reg *reg;\n");
fprintf(source, " const struct userdata_enum *enums;\n");
fprintf(source, "};\n\n");
emit_metas(parsed_userdata, "userdata");
emit_metas(parsed_singletons, "singleton");
emit_index(parsed_singletons, "singleton");
emit_metas(parsed_ap_objects, "ap_object");

fprintf(source, "void load_generated_bindings(lua_State *L) {\n");
Expand Down Expand Up @@ -1972,21 +2030,12 @@ void emit_loaders(void) {
fprintf(source, " // singleton metatables\n");
fprintf(source, " for (uint32_t i = 0; i < ARRAY_SIZE(singleton_fun); i++) {\n");
fprintf(source, " luaL_newmetatable(L, singleton_fun[i].name);\n");
fprintf(source, " luaL_setfuncs(L, singleton_fun[i].reg, 0);\n");
fprintf(source, " lua_pushstring(L, \"__index\");\n");
fprintf(source, " lua_pushcclosure(L, singleton_fun[i].func, 0);\n");
fprintf(source, " lua_setfield(L, -2, \"__index\");\n");
fprintf(source, " lua_pushstring(L, \"__call\");\n");
fprintf(source, " lua_pushvalue(L, -2);\n");
fprintf(source, " lua_settable(L, -3);\n");

fprintf(source, " if (singleton_fun[i].enums != nullptr) {\n");
fprintf(source, " int j = 0;\n");
fprintf(source, " while (singleton_fun[i].enums[j].name != NULL) {\n");
fprintf(source, " lua_pushstring(L, singleton_fun[i].enums[j].name);\n");
fprintf(source, " lua_pushinteger(L, singleton_fun[i].enums[j].value);\n");
fprintf(source, " lua_settable(L, -3);\n");
fprintf(source, " j++;\n");
fprintf(source, " }\n");
fprintf(source, " }\n");

fprintf(source, " lua_pop(L, 1);\n");
fprintf(source, " lua_newuserdata(L, 0);\n");
fprintf(source, " luaL_getmetatable(L, singleton_fun[i].name);\n");
Expand Down Expand Up @@ -2073,6 +2122,25 @@ void emit_not_supported_helper(void) {
fprintf(source, "}\n\n");
}

void emit_structs(void) {
fprintf(source, "struct userdata_enum {\n");
fprintf(source, " const char *name;\n");
fprintf(source, " int value;\n");
fprintf(source, "};\n\n");

fprintf(source, "struct userdata_meta {\n");
fprintf(source, " const char *name;\n");
fprintf(source, " const luaL_Reg *reg;\n");
fprintf(source, " const struct userdata_enum *enums;\n");
fprintf(source, "};\n\n");

fprintf(source, "struct userdata_index {\n");
fprintf(source, " const char *name;\n");
fprintf(source, " const lua_CFunction func;\n");
fprintf(source, " const struct userdata_enum *enums;\n");
fprintf(source, "};\n\n");
}

char * output_path = NULL;

int main(int argc, char **argv) {
Expand Down Expand Up @@ -2161,6 +2229,8 @@ int main(int argc, char **argv) {

emit_not_supported_helper();

emit_structs();

emit_userdata_allocators();

emit_userdata_checkers();
Expand All @@ -2177,7 +2247,7 @@ int main(int argc, char **argv) {

emit_userdata_methods(parsed_singletons);

emit_singleton_metatables(parsed_singletons);
emit_singleton_index(parsed_singletons);

emit_userdata_methods(parsed_ap_objects);

Expand Down

0 comments on commit 639eba4

Please sign in to comment.