comparison 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
comparison
equal deleted inserted replaced
130:117047deda64 131:044bfc415577
643 643
644 injected_classdefs, injected_typeids = \ 644 injected_classdefs, injected_typeids = \
645 dexfile_insert_classdefs_relative(dex_dst, dex_src, classdefs) 645 dexfile_insert_classdefs_relative(dex_dst, dex_src, classdefs)
646 redirect_injected_code(dex_dst, dex_src, classdefs) 646 redirect_injected_code(dex_dst, dex_src, classdefs)
647 return injected_classdefs 647 return injected_classdefs
648
649
650 ## \brief Inject and redirect a _DEX_ClassDef from one linked to another.
651 #
652 # The _DEX_ClassDef given by inj_classname would be inserted to dst_linked,
653 # and redirect all invoking of type, given by redir_classname, to
654 # the injected one.
655 #
656 def inject_redir(src_linked, inj_classname,
657 dst_linked, redir_classname, decls):
658 from paraspace.dex_deptracker import dex_sort_sorted_arrays
659 from paraspace.dex_deptracker import restore_dependencies
660
661 inj_classdef = src_linked.find_class_name(inj_classname)
662 injected_classdefs = inject_classdefs(dst_linked, src_linked,
663 [inj_classdef])
664
665 redir_typeid = dst_linked.find_typeid_name(redir_classname)
666 redir_typeidx = dst_linked.get_idx_typeid(redir_typeid)
667 inj_typeid = dst_linked.find_typeid_name(inj_classname)
668 inj_typeidx = dst_linked.get_idx_typeid(inj_typeid)
669 typeidxs_redir = {redir_typeidx: inj_typeidx}
670
671 methodidxs_redir = \
672 make_methodidxs_redir_map(dst_linked, dst_linked, typeidxs_redir)
673
674 injected_typeidxs = [dst_linked.get_idx_classdef(classdef)
675 for classdef in injected_classdefs]
676 dexfile_redirect_types(dst_linked, typeidxs_redir, methodidxs_redir,
677 excludes=injected_typeidxs)
678
679 dex_sort_sorted_arrays(dst_linked)
680 restore_dependencies(dst_linked, decls)
681 pass