diff paraspace/injection.py @ 131:044bfc415577

Fix issue of data map verification. - Dalvik complain that data map generated by inject_redir.py is unexpected. - Test case map_verify_error_test() - Refactor inject_redir.py to paraspace.injection.inject_redir().
author Thinker K.F. Li <thinker@codemud.net>
date Tue, 09 Aug 2011 11:47:43 +0800
parents 4f508f84c8a1
children 3dee4d929e1f
line wrap: on
line diff
--- a/paraspace/injection.py	Tue Aug 09 00:07:04 2011 +0800
+++ b/paraspace/injection.py	Tue Aug 09 11:47:43 2011 +0800
@@ -645,3 +645,37 @@
         dexfile_insert_classdefs_relative(dex_dst, dex_src, classdefs)
     redirect_injected_code(dex_dst, dex_src, classdefs)
     return injected_classdefs
+
+
+## \brief Inject and redirect a _DEX_ClassDef from one linked to another.
+#
+# The _DEX_ClassDef given by inj_classname would be inserted to dst_linked,
+# and redirect all invoking of type, given by redir_classname, to
+# the injected one.
+#
+def inject_redir(src_linked, inj_classname,
+                 dst_linked, redir_classname, decls):
+    from paraspace.dex_deptracker import dex_sort_sorted_arrays
+    from paraspace.dex_deptracker import restore_dependencies
+    
+    inj_classdef = src_linked.find_class_name(inj_classname)
+    injected_classdefs = inject_classdefs(dst_linked, src_linked,
+                                          [inj_classdef])
+    
+    redir_typeid = dst_linked.find_typeid_name(redir_classname)
+    redir_typeidx = dst_linked.get_idx_typeid(redir_typeid)
+    inj_typeid = dst_linked.find_typeid_name(inj_classname)
+    inj_typeidx = dst_linked.get_idx_typeid(inj_typeid)
+    typeidxs_redir = {redir_typeidx: inj_typeidx}
+    
+    methodidxs_redir = \
+        make_methodidxs_redir_map(dst_linked, dst_linked, typeidxs_redir)
+    
+    injected_typeidxs = [dst_linked.get_idx_classdef(classdef)
+                         for classdef in injected_classdefs]
+    dexfile_redirect_types(dst_linked, typeidxs_redir, methodidxs_redir,
+                           excludes=injected_typeidxs)
+    
+    dex_sort_sorted_arrays(dst_linked)
+    restore_dependencies(dst_linked, decls)
+    pass