Mercurial > paraspace
diff paraspace/injection.py @ 106:7821c6e89622
dexfile_redirect_types() is almost ready.
fakefile.dex must be updated to provide correctly constructor signature.
author | Thinker K.F. Li <thinker@codemud.net> |
---|---|
date | Fri, 29 Jul 2011 16:17:15 +0800 |
parents | f14c32108164 |
children | 4b3573d039af |
line wrap: on
line diff
--- a/paraspace/injection.py Thu Jul 28 13:25:55 2011 +0800 +++ b/paraspace/injection.py Fri Jul 29 16:17:15 2011 +0800 @@ -1,16 +1,17 @@ def _relocatable_children(obj): + from paraspace.dex_deptracker import _dex_tree_get_child from paraspace.dexfile import relocatable, array - + if isinstance(obj, array): - if not obj.items: - return [] - rel_children = [(repr(idx), elt) - for idx, elt in enumerate(obj.items) - if isinstance(elt, relocatable)] + rel_children = [('items.' + str(idx), value) + for idx, value in enumerate(obj.items) + if isinstance(value, relocatable)] return rel_children - attr_value_pairs = [(attr, getattr(obj, attr)) for attr in dir(obj)] + attrs = obj.children() + attr_value_pairs = [(attr, _dex_tree_get_child(obj, attr)) + for attr in attrs] rel_children = [(attr, value) for attr, value in attr_value_pairs if isinstance(value, relocatable)] return rel_children @@ -113,10 +114,8 @@ def relink_dependencies(clone): rel_children = _relocatable_children(clone) - print clone for attr, value in rel_children: clone_value = visit_log[id(value)] - print attr, _dex_tree_get_child(clone, attr), clone_value _dex_tree_set_child(clone, attr, clone_value) pass pass @@ -187,7 +186,6 @@ merge_unique_strid() merge_unique_typeid() - print visit_log for obj in visit_log.values(): if isinstance(obj, (_DEX_StringDataItem, _DEX_StringId, @@ -244,6 +242,7 @@ method_typeid = methodid.classIdx method_typeidx = dex.get_idx_typeid(method_typeid) if method_typeidx not in redirect_map: + method_typeid = dex.find_typeid_idx(method_typeidx - 1) return opcode, args new_method_typeidx = redirect_map[method_typeidx] @@ -257,6 +256,8 @@ method_proto, classdef) except: + print 'NOT FOUND', method_name, method_proto, dex.get_classdef_name(classdef) + print DEXFile_linked.dump_protoid(method_proto) return opcode, args new_method_idx = dex.get_index_method(new_method) return opcode, (args[0], args[1], new_method_idx,