summaryrefslogtreecommitdiff
path: root/plugins/dex/pool.c
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/dex/pool.c')
-rw-r--r--plugins/dex/pool.c46
1 files changed, 23 insertions, 23 deletions
diff --git a/plugins/dex/pool.c b/plugins/dex/pool.c
index bfc463a..1ed2c44 100644
--- a/plugins/dex/pool.c
+++ b/plugins/dex/pool.c
@@ -547,7 +547,6 @@ GBinRoutine *get_prototype_from_dex_pool(GDexFormat *format, uint32_t index)
vmpa2t addr; /* Tête de lecture générique */
proto_id_item proto_id; /* Prototype de routine */
GDataType *type; /* Type de retour */
- const char *name; /* Description compressée */
type_list args; /* Liste des arguments */
uint32_t i; /* Boucle de parcours */
GBinVariable *arg; /* Argument reconstitué */
@@ -571,51 +570,52 @@ GBinRoutine *get_prototype_from_dex_pool(GDexFormat *format, uint32_t index)
if (!read_dex_proto_id_item(format, &addr, &proto_id))
goto grfdp_error;
+ /**
+ * On choisit d'ignore le champ proto_id.shorty_idx : c'est un descripteur
+ * qui doit correspondre au retour et aux paramètres précisés avec les
+ * autres champs de la structure, donc l'information paraît redondante.
+ */
+
/* Type de retour */
type = get_type_from_dex_pool(format, proto_id.return_type_idx);
+ if (type == NULL) goto grfdp_error;
- /* Nom de la méthode */
+ result = g_binary_routine_new();
- name = get_string_from_dex_pool(format, proto_id.shorty_idx, NULL);
+ g_binary_routine_set_return_type(result, type);
- /* Liste des arguments */
+ /* Liste des arguments, s'il y a */
pos = proto_id.parameters_off;
- init_vmpa(&addr, pos, VMPA_NO_VIRTUAL);
- result = g_binary_routine_new();///////////////////////
+ if (pos > 0)
+ {
+ init_vmpa(&addr, pos, VMPA_NO_VIRTUAL);
+
+ if (!read_dex_type_list(format, &addr, &args))
+ goto grfdp_error;
- if (read_dex_type_list(format, &addr, &args))
for (i = 0; i < args.size; i++)
{
type = get_type_from_dex_pool(format, args.list[i].type_idx);
- if (type == NULL) continue;
+ if (type == NULL) goto grfdp_error;
arg = g_binary_variable_new(type);
- g_binary_routine_add_arg(result, arg);///////////////////////
+ g_binary_routine_add_arg(result, arg);
}
- /* Mise en place finale */
-
- ///////result = demangle_routine(G_TYPE_DEX_DEMANGLER, name);
+ }
- //g_binary_routine_set_name(result, strdup("..."));
+ return result;
-#if 1
- if (result != NULL)///////////////////////
- g_binary_routine_set_return_type(result, type);
-#endif
+ grfdp_error:
- /*
if (result != NULL)
- g_object_ref(G_OBJECT(result));
- */
+ g_object_unref(G_OBJECT(result));
- grfdp_error:
-
- return result;
+ return NULL;
}