diff options
Diffstat (limited to 'src/format/dex')
-rw-r--r-- | src/format/dex/class.c | 18 |
1 files changed, 17 insertions, 1 deletions
diff --git a/src/format/dex/class.c b/src/format/dex/class.c index a88f3f2..454cc40 100644 --- a/src/format/dex/class.c +++ b/src/format/dex/class.c @@ -24,6 +24,7 @@ #include "class.h" +#include <assert.h> #include <malloc.h> @@ -194,6 +195,7 @@ GDexClass *g_dex_class_new(GDexFormat *format, const class_def_item *def) GDexClass *result; /* Composant à retourner */ vmpa2t addr; /* Tête de lecture générique */ class_data_item data; /* Contenu de la classe */ + GDataType *ctype; /* Type créé par la classe */ uleb128_t index; /* Conservation du dernier id */ uleb128_t i; /* Boucle de parcours */ GDexMethod *method; /* Méthode chargée */ @@ -230,6 +232,9 @@ GDexClass *g_dex_class_new(GDexFormat *format, const class_def_item *def) */ if (def->access_flags & ACC_ANNOTATION) goto gdcn_done; + ctype = get_type_from_dex_pool(format, def->class_idx); + assert(ctype != NULL); + index = 0; result->dmethods_count = data.direct_methods_size; @@ -246,6 +251,9 @@ GDexClass *g_dex_class_new(GDexFormat *format, const class_def_item *def) routine = g_dex_method_get_routine(method); + g_object_ref(G_OBJECT(ctype)); + g_binary_routine_set_namespace(routine, ctype, "."); + symbol = g_binary_symbol_new(STP_ROUTINE); g_binary_symbol_attach_routine(symbol, routine); @@ -269,6 +277,9 @@ GDexClass *g_dex_class_new(GDexFormat *format, const class_def_item *def) routine = g_dex_method_get_routine(method); + g_object_ref(G_OBJECT(ctype)); + g_binary_routine_set_namespace(routine, ctype, "."); + symbol = g_binary_symbol_new(STP_ROUTINE); g_binary_symbol_attach_routine(symbol, routine); @@ -276,13 +287,18 @@ GDexClass *g_dex_class_new(GDexFormat *format, const class_def_item *def) } + g_object_unref(G_OBJECT(ctype)); + gdcn_done: return result; - gdcn_bad_item: gdcn_bad_method: + g_object_unref(G_OBJECT(ctype)); + + gdcn_bad_item: + g_object_unref(G_OBJECT(result)); return NULL; |