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,