diff --git a/libraries/AP_Scripting/generator/src/main.c b/libraries/AP_Scripting/generator/src/main.c index e981c1c8f7..ae94e7e3d7 100644 --- a/libraries/AP_Scripting/generator/src/main.c +++ b/libraries/AP_Scripting/generator/src/main.c @@ -1375,49 +1375,80 @@ void emit_userdata_method(const struct userdata *data, const struct method *meth fprintf(source, " AP::scheduler().get_semaphore().take_blocking();\n"); } + int static_cast = TRUE; + switch (method->return_type.type) { - case TYPE_BOOLEAN: - fprintf(source, " const bool data = ud->%s(", method->name); - break; - case TYPE_FLOAT: - fprintf(source, " const float data = ud->%s(", method->name); - break; - case TYPE_INT8_T: - fprintf(source, " const int8_t data = ud->%s(", method->name); - break; - case TYPE_INT16_T: - fprintf(source, " const int16_t data = ud->%s(", method->name); - break; - case TYPE_INT32_T: - fprintf(source, " const int32_t data = ud->%s(", method->name); - break; case TYPE_STRING: fprintf(source, " const char * data = ud->%s(", method->name); - break; - case TYPE_UINT8_T: - fprintf(source, " const uint8_t data = ud->%s(", method->name); - break; - case TYPE_UINT16_T: - fprintf(source, " const uint16_t data = ud->%s(", method->name); - break; - case TYPE_UINT32_T: - fprintf(source, " const uint32_t data = ud->%s(", method->name); + static_cast = FALSE; break; case TYPE_ENUM: fprintf(source, " const %s &data = ud->%s(", method->return_type.data.enum_name, method->name); + static_cast = FALSE; break; case TYPE_USERDATA: fprintf(source, " const %s &data = ud->%s(", method->return_type.data.ud.name, method->name); + static_cast = FALSE; break; case TYPE_AP_OBJECT: fprintf(source, " %s *data = ud->%s(", method->return_type.data.ud.name, method->name); + static_cast = FALSE; break; case TYPE_NONE: fprintf(source, " ud->%s(", method->name); + static_cast = FALSE; break; case TYPE_LITERAL: error(ERROR_USERDATA, "Can't return a literal from a method"); break; + case TYPE_BOOLEAN: + case TYPE_FLOAT: + case TYPE_INT8_T: + case TYPE_INT16_T: + case TYPE_INT32_T: + case TYPE_UINT8_T: + case TYPE_UINT16_T: + case TYPE_UINT32_T: + break; + } + + if (static_cast) { + char *var_type_name; + switch (method->return_type.type) { + case TYPE_BOOLEAN: + var_type_name = "bool"; + break; + case TYPE_FLOAT: + var_type_name = "float"; + break; + case TYPE_INT8_T: + var_type_name = "int8_t"; + break; + case TYPE_INT16_T: + var_type_name = "int16_t"; + break; + case TYPE_INT32_T: + var_type_name = "int32_t"; + break; + case TYPE_UINT8_T: + var_type_name = "uint8_t"; + break; + case TYPE_UINT16_T: + var_type_name = "uint16_t"; + break; + case TYPE_UINT32_T: + var_type_name = "uint32_t"; + break; + case TYPE_STRING: + case TYPE_ENUM: + case TYPE_USERDATA: + case TYPE_AP_OBJECT: + case TYPE_NONE: + case TYPE_LITERAL: + error(ERROR_USERDATA, "Unexpected type"); + break; + } + fprintf(source, " const %s data = static_cast<%s>(ud->%s(", var_type_name, var_type_name, method->name); } if (arg_count != 2) { @@ -1457,7 +1488,11 @@ void emit_userdata_method(const struct userdata *data, const struct method *meth fprintf(source, ",\n"); } } - fprintf(source, "%s);\n\n", ""); + if (static_cast) { + fprintf(source, "%s));\n\n", ""); + } else { + fprintf(source, "%s);\n\n", ""); + } if (data->flags & UD_FLAG_SEMAPHORE) { fprintf(source, " ud->get_semaphore().give();\n");