annotate paraspace/injection.py @ 154:c659b8c7d6cb

Use right opcode formats
author Thinker K.F. Li <thinker@codemud.net>
date Wed, 17 Aug 2011 08:36:33 +0800
parents bc213cb88636
children
rev   line source
87
cd1ee85853f4 Add injection.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1
88
bbe8d5cbe368 Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents: 87
diff changeset
2 def _relocatable_children(obj):
106
7821c6e89622 dexfile_redirect_types() is almost ready.
Thinker K.F. Li <thinker@codemud.net>
parents: 105
diff changeset
3 from paraspace.dex_deptracker import _dex_tree_get_child
100
355986e5cfbd Make surce methods of injected class are also being and bug fixed.
Thinker K.F. Li <thinker@codemud.net>
parents: 99
diff changeset
4 from paraspace.dexfile import relocatable, array
106
7821c6e89622 dexfile_redirect_types() is almost ready.
Thinker K.F. Li <thinker@codemud.net>
parents: 105
diff changeset
5
100
355986e5cfbd Make surce methods of injected class are also being and bug fixed.
Thinker K.F. Li <thinker@codemud.net>
parents: 99
diff changeset
6 if isinstance(obj, array):
106
7821c6e89622 dexfile_redirect_types() is almost ready.
Thinker K.F. Li <thinker@codemud.net>
parents: 105
diff changeset
7 rel_children = [('items.' + str(idx), value)
7821c6e89622 dexfile_redirect_types() is almost ready.
Thinker K.F. Li <thinker@codemud.net>
parents: 105
diff changeset
8 for idx, value in enumerate(obj.items)
7821c6e89622 dexfile_redirect_types() is almost ready.
Thinker K.F. Li <thinker@codemud.net>
parents: 105
diff changeset
9 if isinstance(value, relocatable)]
100
355986e5cfbd Make surce methods of injected class are also being and bug fixed.
Thinker K.F. Li <thinker@codemud.net>
parents: 99
diff changeset
10 return rel_children
87
cd1ee85853f4 Add injection.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
11
106
7821c6e89622 dexfile_redirect_types() is almost ready.
Thinker K.F. Li <thinker@codemud.net>
parents: 105
diff changeset
12 attrs = obj.children()
7821c6e89622 dexfile_redirect_types() is almost ready.
Thinker K.F. Li <thinker@codemud.net>
parents: 105
diff changeset
13 attr_value_pairs = [(attr, _dex_tree_get_child(obj, attr))
7821c6e89622 dexfile_redirect_types() is almost ready.
Thinker K.F. Li <thinker@codemud.net>
parents: 105
diff changeset
14 for attr in attrs]
88
bbe8d5cbe368 Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents: 87
diff changeset
15 rel_children = [(attr, value) for attr, value in attr_value_pairs
bbe8d5cbe368 Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents: 87
diff changeset
16 if isinstance(value, relocatable)]
bbe8d5cbe368 Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents: 87
diff changeset
17 return rel_children
bbe8d5cbe368 Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents: 87
diff changeset
18
87
cd1ee85853f4 Add injection.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
19
88
bbe8d5cbe368 Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents: 87
diff changeset
20 ## \brief Travel relocatable descendants.
bbe8d5cbe368 Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents: 87
diff changeset
21 #
bbe8d5cbe368 Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents: 87
diff changeset
22 # \param cloner is the function to return a clone.
bbe8d5cbe368 Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents: 87
diff changeset
23 # \param adjuster is called to adjust the clone.
bbe8d5cbe368 Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents: 87
diff changeset
24 # \param visit_log is a dictionary to keep clones.
bbe8d5cbe368 Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents: 87
diff changeset
25 #
bbe8d5cbe368 Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents: 87
diff changeset
26 def _travel_desc_relocatable(obj, worker, visit_log):
87
cd1ee85853f4 Add injection.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
27 if id(obj) in visit_log:
cd1ee85853f4 Add injection.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
28 return visit_log[id(obj)]
cd1ee85853f4 Add injection.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
29
88
bbe8d5cbe368 Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents: 87
diff changeset
30 result = worker(obj)
bbe8d5cbe368 Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents: 87
diff changeset
31 visit_log[id(obj)] = result
bbe8d5cbe368 Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents: 87
diff changeset
32
bbe8d5cbe368 Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents: 87
diff changeset
33 rel_children = _relocatable_children(obj)
bbe8d5cbe368 Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents: 87
diff changeset
34 for attr, value in rel_children:
96
1769e52bdd9d Make dexfile_insert_class() pass the testcase
Thinker K.F. Li <thinker@codemud.net>
parents: 94
diff changeset
35 _travel_desc_relocatable(value, worker, visit_log)
88
bbe8d5cbe368 Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents: 87
diff changeset
36 pass
bbe8d5cbe368 Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents: 87
diff changeset
37 pass
bbe8d5cbe368 Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents: 87
diff changeset
38
bbe8d5cbe368 Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents: 87
diff changeset
39
bbe8d5cbe368 Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents: 87
diff changeset
40 ## \brief Return name string of a linked class definition item.
bbe8d5cbe368 Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents: 87
diff changeset
41 def classdef_name(classdef):
bbe8d5cbe368 Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents: 87
diff changeset
42 return classdef.classIdx.descriptorIdx.stringDataOff.data
bbe8d5cbe368 Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents: 87
diff changeset
43
bbe8d5cbe368 Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents: 87
diff changeset
44
bbe8d5cbe368 Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents: 87
diff changeset
45 ## \brief Return a map that map type of a object to the list of a DEXFile.
bbe8d5cbe368 Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents: 87
diff changeset
46 def dex_type_2_array_attr_map():
bbe8d5cbe368 Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents: 87
diff changeset
47 global dex_type_2_array_attr_map
bbe8d5cbe368 Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents: 87
diff changeset
48 from paraspace.dexfile import DEXFile, array
98
c0c127c7b37e Check and fix issues of map sizes
Thinker K.F. Li <thinker@codemud.net>
parents: 96
diff changeset
49 from paraspace.dex_deptracker import _marker
c0c127c7b37e Check and fix issues of map sizes
Thinker K.F. Li <thinker@codemud.net>
parents: 96
diff changeset
50
c0c127c7b37e Check and fix issues of map sizes
Thinker K.F. Li <thinker@codemud.net>
parents: 96
diff changeset
51 def skip_marker_type(clazz):
c0c127c7b37e Check and fix issues of map sizes
Thinker K.F. Li <thinker@codemud.net>
parents: 96
diff changeset
52 while isinstance(clazz, _marker):
c0c127c7b37e Check and fix issues of map sizes
Thinker K.F. Li <thinker@codemud.net>
parents: 96
diff changeset
53 clazz = clazz.back_type
c0c127c7b37e Check and fix issues of map sizes
Thinker K.F. Li <thinker@codemud.net>
parents: 96
diff changeset
54 pass
c0c127c7b37e Check and fix issues of map sizes
Thinker K.F. Li <thinker@codemud.net>
parents: 96
diff changeset
55 return clazz
88
bbe8d5cbe368 Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents: 87
diff changeset
56
100
355986e5cfbd Make surce methods of injected class are also being and bug fixed.
Thinker K.F. Li <thinker@codemud.net>
parents: 99
diff changeset
57 attr_values = [(attr, skip_marker_type(getattr(DEXFile, attr)))
88
bbe8d5cbe368 Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents: 87
diff changeset
58 for attr in dir(DEXFile)]
100
355986e5cfbd Make surce methods of injected class are also being and bug fixed.
Thinker K.F. Li <thinker@codemud.net>
parents: 99
diff changeset
59 array_attrs = [(skip_marker_type(value.child_type), attr)
355986e5cfbd Make surce methods of injected class are also being and bug fixed.
Thinker K.F. Li <thinker@codemud.net>
parents: 99
diff changeset
60 for attr, value in attr_values
355986e5cfbd Make surce methods of injected class are also being and bug fixed.
Thinker K.F. Li <thinker@codemud.net>
parents: 99
diff changeset
61 if isinstance(value, array)]
355986e5cfbd Make surce methods of injected class are also being and bug fixed.
Thinker K.F. Li <thinker@codemud.net>
parents: 99
diff changeset
62 type_2_attr = dict(array_attrs)
88
bbe8d5cbe368 Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents: 87
diff changeset
63
bbe8d5cbe368 Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents: 87
diff changeset
64 dex_type_2_array_attr_map = lambda: type_2_attr
bbe8d5cbe368 Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents: 87
diff changeset
65
bbe8d5cbe368 Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents: 87
diff changeset
66 return type_2_attr
bbe8d5cbe368 Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents: 87
diff changeset
67
bbe8d5cbe368 Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents: 87
diff changeset
68
105
f14c32108164 Test dexfile_redirect_types
Thinker K.F. Li <thinker@codemud.net>
parents: 104
diff changeset
69 _saved_dex_type_2_array_attr_map = dex_type_2_array_attr_map
f14c32108164 Test dexfile_redirect_types
Thinker K.F. Li <thinker@codemud.net>
parents: 104
diff changeset
70
f14c32108164 Test dexfile_redirect_types
Thinker K.F. Li <thinker@codemud.net>
parents: 104
diff changeset
71
88
bbe8d5cbe368 Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents: 87
diff changeset
72 ## \brief Append a object to appropriate list of a DEXFile object.
bbe8d5cbe368 Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents: 87
diff changeset
73 #
bbe8d5cbe368 Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents: 87
diff changeset
74 # Skip the object if found no appropriate list.
bbe8d5cbe368 Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents: 87
diff changeset
75 #
bbe8d5cbe368 Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents: 87
diff changeset
76 def dex_append_obj_list(dex, obj):
bbe8d5cbe368 Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents: 87
diff changeset
77 from paraspace.dex_deptracker import _dex_tree_get_child
bbe8d5cbe368 Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents: 87
diff changeset
78 from paraspace.dex_deptracker import _dex_tree_set_child
134
3dee4d929e1f Wrap _DEX_TypeList to _DEX_TypeList_align before append to list.
Thinker K.F. Li <thinker@codemud.net>
parents: 131
diff changeset
79 from paraspace.dexfile import _DEX_TypeList, _DEX_TypeList_align
135
b488ca519709 Make sure elements are absolute incremental for sorted arrays when injecting.
Thinker K.F. Li <thinker@codemud.net>
parents: 134
diff changeset
80 from paraspace.dexfile import array_sorted
134
3dee4d929e1f Wrap _DEX_TypeList to _DEX_TypeList_align before append to list.
Thinker K.F. Li <thinker@codemud.net>
parents: 131
diff changeset
81
147
a95b69de2e22 Fix bug of returning _DEX_TypeList_align of dex_append_obj_list()
Thinker K.F. Li <thinker@codemud.net>
parents: 146
diff changeset
82 ret_obj = obj
134
3dee4d929e1f Wrap _DEX_TypeList to _DEX_TypeList_align before append to list.
Thinker K.F. Li <thinker@codemud.net>
parents: 131
diff changeset
83 if isinstance(obj, _DEX_TypeList):
3dee4d929e1f Wrap _DEX_TypeList to _DEX_TypeList_align before append to list.
Thinker K.F. Li <thinker@codemud.net>
parents: 131
diff changeset
84 wrapper = _DEX_TypeList_align()
3dee4d929e1f Wrap _DEX_TypeList to _DEX_TypeList_align before append to list.
Thinker K.F. Li <thinker@codemud.net>
parents: 131
diff changeset
85 wrapper.value = obj
3dee4d929e1f Wrap _DEX_TypeList to _DEX_TypeList_align before append to list.
Thinker K.F. Li <thinker@codemud.net>
parents: 131
diff changeset
86 obj = wrapper
3dee4d929e1f Wrap _DEX_TypeList to _DEX_TypeList_align before append to list.
Thinker K.F. Li <thinker@codemud.net>
parents: 131
diff changeset
87 pass
88
bbe8d5cbe368 Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents: 87
diff changeset
88
bbe8d5cbe368 Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents: 87
diff changeset
89 type_2_attr = dex_type_2_array_attr_map()
bbe8d5cbe368 Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents: 87
diff changeset
90 try:
bbe8d5cbe368 Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents: 87
diff changeset
91 attr = type_2_attr[obj.__class__]
bbe8d5cbe368 Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents: 87
diff changeset
92 except KeyError:
bbe8d5cbe368 Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents: 87
diff changeset
93 return
bbe8d5cbe368 Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents: 87
diff changeset
94
bbe8d5cbe368 Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents: 87
diff changeset
95 array = getattr(dex, attr)
135
b488ca519709 Make sure elements are absolute incremental for sorted arrays when injecting.
Thinker K.F. Li <thinker@codemud.net>
parents: 134
diff changeset
96
b488ca519709 Make sure elements are absolute incremental for sorted arrays when injecting.
Thinker K.F. Li <thinker@codemud.net>
parents: 134
diff changeset
97 if isinstance(array, array_sorted):
b488ca519709 Make sure elements are absolute incremental for sorted arrays when injecting.
Thinker K.F. Li <thinker@codemud.net>
parents: 134
diff changeset
98 if obj in array.items:
b488ca519709 Make sure elements are absolute incremental for sorted arrays when injecting.
Thinker K.F. Li <thinker@codemud.net>
parents: 134
diff changeset
99 idx = array.items.index(obj)
147
a95b69de2e22 Fix bug of returning _DEX_TypeList_align of dex_append_obj_list()
Thinker K.F. Li <thinker@codemud.net>
parents: 146
diff changeset
100 obj = array.items[idx]
a95b69de2e22 Fix bug of returning _DEX_TypeList_align of dex_append_obj_list()
Thinker K.F. Li <thinker@codemud.net>
parents: 146
diff changeset
101 if isinstance(obj, _DEX_TypeList_align):
a95b69de2e22 Fix bug of returning _DEX_TypeList_align of dex_append_obj_list()
Thinker K.F. Li <thinker@codemud.net>
parents: 146
diff changeset
102 return obj.value
a95b69de2e22 Fix bug of returning _DEX_TypeList_align of dex_append_obj_list()
Thinker K.F. Li <thinker@codemud.net>
parents: 146
diff changeset
103 return obj
135
b488ca519709 Make sure elements are absolute incremental for sorted arrays when injecting.
Thinker K.F. Li <thinker@codemud.net>
parents: 134
diff changeset
104 pass
b488ca519709 Make sure elements are absolute incremental for sorted arrays when injecting.
Thinker K.F. Li <thinker@codemud.net>
parents: 134
diff changeset
105
88
bbe8d5cbe368 Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents: 87
diff changeset
106 array.items.append(obj)
bbe8d5cbe368 Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents: 87
diff changeset
107
bbe8d5cbe368 Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents: 87
diff changeset
108 count_name = array.count_name
96
1769e52bdd9d Make dexfile_insert_class() pass the testcase
Thinker K.F. Li <thinker@codemud.net>
parents: 94
diff changeset
109 if count_name:
1769e52bdd9d Make dexfile_insert_class() pass the testcase
Thinker K.F. Li <thinker@codemud.net>
parents: 94
diff changeset
110 count = _dex_tree_get_child(dex, count_name)
1769e52bdd9d Make dexfile_insert_class() pass the testcase
Thinker K.F. Li <thinker@codemud.net>
parents: 94
diff changeset
111 _dex_tree_set_child(dex, count_name, count + 1)
1769e52bdd9d Make dexfile_insert_class() pass the testcase
Thinker K.F. Li <thinker@codemud.net>
parents: 94
diff changeset
112 pass
135
b488ca519709 Make sure elements are absolute incremental for sorted arrays when injecting.
Thinker K.F. Li <thinker@codemud.net>
parents: 134
diff changeset
113
147
a95b69de2e22 Fix bug of returning _DEX_TypeList_align of dex_append_obj_list()
Thinker K.F. Li <thinker@codemud.net>
parents: 146
diff changeset
114 return ret_obj
88
bbe8d5cbe368 Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents: 87
diff changeset
115
bbe8d5cbe368 Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents: 87
diff changeset
116
111
3820379b34e8 Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents: 110
diff changeset
117 ## \brief Clone a composite object.
88
bbe8d5cbe368 Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents: 87
diff changeset
118 #
111
3820379b34e8 Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents: 110
diff changeset
119 # \param dex is the DEXFile that the composite object is cloning for.
3820379b34e8 Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents: 110
diff changeset
120 # \param comobj is composite object that is cloning.
88
bbe8d5cbe368 Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents: 87
diff changeset
121 #
111
3820379b34e8 Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents: 110
diff changeset
122 def _clone_composite(dex, comobj):
88
bbe8d5cbe368 Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents: 87
diff changeset
123 from copy import copy
bbe8d5cbe368 Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents: 87
diff changeset
124 from paraspace.dexfile import _DEX_StringDataItem, _DEX_StringId
bbe8d5cbe368 Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents: 87
diff changeset
125 from paraspace.dexfile import _DEX_TypeId
105
f14c32108164 Test dexfile_redirect_types
Thinker K.F. Li <thinker@codemud.net>
parents: 104
diff changeset
126 from paraspace.dex_deptracker import _dex_tree_set_child
f14c32108164 Test dexfile_redirect_types
Thinker K.F. Li <thinker@codemud.net>
parents: 104
diff changeset
127 from paraspace.dex_deptracker import _dex_tree_get_child
88
bbe8d5cbe368 Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents: 87
diff changeset
128
bbe8d5cbe368 Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents: 87
diff changeset
129 visit_log = {}
87
cd1ee85853f4 Add injection.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
130
88
bbe8d5cbe368 Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents: 87
diff changeset
131 def cloner(obj):
bbe8d5cbe368 Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents: 87
diff changeset
132 clone = copy(obj)
bbe8d5cbe368 Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents: 87
diff changeset
133 return clone
bbe8d5cbe368 Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents: 87
diff changeset
134
bbe8d5cbe368 Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents: 87
diff changeset
135 def relink_dependencies(clone):
bbe8d5cbe368 Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents: 87
diff changeset
136 rel_children = _relocatable_children(clone)
bbe8d5cbe368 Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents: 87
diff changeset
137 for attr, value in rel_children:
bbe8d5cbe368 Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents: 87
diff changeset
138 clone_value = visit_log[id(value)]
105
f14c32108164 Test dexfile_redirect_types
Thinker K.F. Li <thinker@codemud.net>
parents: 104
diff changeset
139 _dex_tree_set_child(clone, attr, clone_value)
88
bbe8d5cbe368 Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents: 87
diff changeset
140 pass
bbe8d5cbe368 Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents: 87
diff changeset
141 pass
bbe8d5cbe368 Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents: 87
diff changeset
142
bbe8d5cbe368 Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents: 87
diff changeset
143 def merge_unique_strdata():
bbe8d5cbe368 Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents: 87
diff changeset
144 strdatas = [(obj_id, obj)
bbe8d5cbe368 Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents: 87
diff changeset
145 for obj_id, obj in visit_log.items()
bbe8d5cbe368 Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents: 87
diff changeset
146 if isinstance(obj, _DEX_StringDataItem)]
99
3898711adb2c Make sure string data list is consistent.
Thinker K.F. Li <thinker@codemud.net>
parents: 98
diff changeset
147 dex_str_2_strdata = dict([(strdata.data.data, strdata)
88
bbe8d5cbe368 Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents: 87
diff changeset
148 for strdata in dex.stringDataItems.items])
bbe8d5cbe368 Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents: 87
diff changeset
149 for obj_id, strdata in strdatas:
99
3898711adb2c Make sure string data list is consistent.
Thinker K.F. Li <thinker@codemud.net>
parents: 98
diff changeset
150 if strdata.data.data in dex_str_2_strdata:
3898711adb2c Make sure string data list is consistent.
Thinker K.F. Li <thinker@codemud.net>
parents: 98
diff changeset
151 visit_log[obj_id] = dex_str_2_strdata[strdata.data.data]
88
bbe8d5cbe368 Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents: 87
diff changeset
152 else:
bbe8d5cbe368 Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents: 87
diff changeset
153 dex_append_obj_list(dex, strdata)
bbe8d5cbe368 Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents: 87
diff changeset
154 pass
bbe8d5cbe368 Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents: 87
diff changeset
155 pass
bbe8d5cbe368 Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents: 87
diff changeset
156 pass
bbe8d5cbe368 Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents: 87
diff changeset
157
bbe8d5cbe368 Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents: 87
diff changeset
158 def merge_unique_strid():
bbe8d5cbe368 Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents: 87
diff changeset
159 strids = [(obj_id, obj)
bbe8d5cbe368 Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents: 87
diff changeset
160 for obj_id, obj in visit_log.items()
bbe8d5cbe368 Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents: 87
diff changeset
161 if isinstance(obj, _DEX_StringId)]
bbe8d5cbe368 Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents: 87
diff changeset
162
bbe8d5cbe368 Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents: 87
diff changeset
163 for obj_id, strid in strids:
bbe8d5cbe368 Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents: 87
diff changeset
164 relink_dependencies(strid)
bbe8d5cbe368 Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents: 87
diff changeset
165 pass
bbe8d5cbe368 Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents: 87
diff changeset
166
bbe8d5cbe368 Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents: 87
diff changeset
167 strdata_2_strid = dict([(strid.stringDataOff, strid)
bbe8d5cbe368 Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents: 87
diff changeset
168 for strid in dex.stringIds.items])
bbe8d5cbe368 Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents: 87
diff changeset
169 for obj_id, strid in strids:
bbe8d5cbe368 Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents: 87
diff changeset
170 if strid.stringDataOff in strdata_2_strid:
bbe8d5cbe368 Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents: 87
diff changeset
171 visit_log[obj_id] = strdata_2_strid[strid.stringDataOff]
bbe8d5cbe368 Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents: 87
diff changeset
172 else:
bbe8d5cbe368 Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents: 87
diff changeset
173 dex_append_obj_list(dex, strid)
bbe8d5cbe368 Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents: 87
diff changeset
174 pass
bbe8d5cbe368 Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents: 87
diff changeset
175 pass
bbe8d5cbe368 Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents: 87
diff changeset
176 pass
bbe8d5cbe368 Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents: 87
diff changeset
177
bbe8d5cbe368 Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents: 87
diff changeset
178 def merge_unique_typeid():
bbe8d5cbe368 Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents: 87
diff changeset
179 typeids = [(obj_id, obj)
bbe8d5cbe368 Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents: 87
diff changeset
180 for obj_id, obj in visit_log.items()
bbe8d5cbe368 Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents: 87
diff changeset
181 if isinstance(obj, _DEX_TypeId)]
bbe8d5cbe368 Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents: 87
diff changeset
182
bbe8d5cbe368 Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents: 87
diff changeset
183 for obj_id, typeid in typeids:
bbe8d5cbe368 Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents: 87
diff changeset
184 relink_dependencies(typeid)
bbe8d5cbe368 Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents: 87
diff changeset
185 pass
bbe8d5cbe368 Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents: 87
diff changeset
186
bbe8d5cbe368 Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents: 87
diff changeset
187 strid_2_typeid = dict([(typeid.descriptorIdx, typeid)
bbe8d5cbe368 Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents: 87
diff changeset
188 for typeid in dex.typeIds.items])
bbe8d5cbe368 Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents: 87
diff changeset
189 for obj_id, typeid in typeids:
bbe8d5cbe368 Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents: 87
diff changeset
190 if typeid.descriptorIdx in strid_2_typeid:
bbe8d5cbe368 Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents: 87
diff changeset
191 visit_log[obj_id] = strid_2_typeid[typeid.descriptorIdx]
bbe8d5cbe368 Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents: 87
diff changeset
192 else:
bbe8d5cbe368 Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents: 87
diff changeset
193 dex_append_obj_list(dex, typeid)
bbe8d5cbe368 Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents: 87
diff changeset
194 pass
bbe8d5cbe368 Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents: 87
diff changeset
195 pass
bbe8d5cbe368 Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents: 87
diff changeset
196 pass
bbe8d5cbe368 Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents: 87
diff changeset
197
111
3820379b34e8 Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents: 110
diff changeset
198 _travel_desc_relocatable(comobj, cloner, visit_log)
88
bbe8d5cbe368 Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents: 87
diff changeset
199
bbe8d5cbe368 Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents: 87
diff changeset
200 merge_unique_strdata()
bbe8d5cbe368 Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents: 87
diff changeset
201 merge_unique_strid()
bbe8d5cbe368 Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents: 87
diff changeset
202 merge_unique_typeid()
bbe8d5cbe368 Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents: 87
diff changeset
203
135
b488ca519709 Make sure elements are absolute incremental for sorted arrays when injecting.
Thinker K.F. Li <thinker@codemud.net>
parents: 134
diff changeset
204 relink_list = []
b488ca519709 Make sure elements are absolute incremental for sorted arrays when injecting.
Thinker K.F. Li <thinker@codemud.net>
parents: 134
diff changeset
205 for key, obj in visit_log.items():
b488ca519709 Make sure elements are absolute incremental for sorted arrays when injecting.
Thinker K.F. Li <thinker@codemud.net>
parents: 134
diff changeset
206 if isinstance(obj, (_DEX_StringDataItem,
b488ca519709 Make sure elements are absolute incremental for sorted arrays when injecting.
Thinker K.F. Li <thinker@codemud.net>
parents: 134
diff changeset
207 _DEX_StringId,
b488ca519709 Make sure elements are absolute incremental for sorted arrays when injecting.
Thinker K.F. Li <thinker@codemud.net>
parents: 134
diff changeset
208 _DEX_TypeId)):
b488ca519709 Make sure elements are absolute incremental for sorted arrays when injecting.
Thinker K.F. Li <thinker@codemud.net>
parents: 134
diff changeset
209 continue
b488ca519709 Make sure elements are absolute incremental for sorted arrays when injecting.
Thinker K.F. Li <thinker@codemud.net>
parents: 134
diff changeset
210 r = dex_append_obj_list(dex, obj)
b488ca519709 Make sure elements are absolute incremental for sorted arrays when injecting.
Thinker K.F. Li <thinker@codemud.net>
parents: 134
diff changeset
211 if r and r is not obj:
b488ca519709 Make sure elements are absolute incremental for sorted arrays when injecting.
Thinker K.F. Li <thinker@codemud.net>
parents: 134
diff changeset
212 visit_log[key] = r
b488ca519709 Make sure elements are absolute incremental for sorted arrays when injecting.
Thinker K.F. Li <thinker@codemud.net>
parents: 134
diff changeset
213 else:
b488ca519709 Make sure elements are absolute incremental for sorted arrays when injecting.
Thinker K.F. Li <thinker@codemud.net>
parents: 134
diff changeset
214 relink_list.append(obj)
b488ca519709 Make sure elements are absolute incremental for sorted arrays when injecting.
Thinker K.F. Li <thinker@codemud.net>
parents: 134
diff changeset
215 pass
b488ca519709 Make sure elements are absolute incremental for sorted arrays when injecting.
Thinker K.F. Li <thinker@codemud.net>
parents: 134
diff changeset
216 pass
b488ca519709 Make sure elements are absolute incremental for sorted arrays when injecting.
Thinker K.F. Li <thinker@codemud.net>
parents: 134
diff changeset
217
b488ca519709 Make sure elements are absolute incremental for sorted arrays when injecting.
Thinker K.F. Li <thinker@codemud.net>
parents: 134
diff changeset
218 for obj in relink_list:
88
bbe8d5cbe368 Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents: 87
diff changeset
219 if isinstance(obj, (_DEX_StringDataItem,
bbe8d5cbe368 Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents: 87
diff changeset
220 _DEX_StringId,
bbe8d5cbe368 Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents: 87
diff changeset
221 _DEX_TypeId)):
bbe8d5cbe368 Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents: 87
diff changeset
222 continue
bbe8d5cbe368 Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents: 87
diff changeset
223 relink_dependencies(obj)
bbe8d5cbe368 Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents: 87
diff changeset
224 pass
bbe8d5cbe368 Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents: 87
diff changeset
225
111
3820379b34e8 Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents: 110
diff changeset
226 clone = visit_log[id(comobj)]
3820379b34e8 Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents: 110
diff changeset
227 return clone
3820379b34e8 Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents: 110
diff changeset
228
3820379b34e8 Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents: 110
diff changeset
229
3820379b34e8 Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents: 110
diff changeset
230 ## \brief Clone a class definition item
3820379b34e8 Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents: 110
diff changeset
231 #
3820379b34e8 Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents: 110
diff changeset
232 # \param dex is the DEXFile that clazz is cloning for.
3820379b34e8 Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents: 110
diff changeset
233 # \param clazz is the class definition item that is cloning.
3820379b34e8 Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents: 110
diff changeset
234 # \return the cloning _DEX_ClassDef.
3820379b34e8 Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents: 110
diff changeset
235 #
3820379b34e8 Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents: 110
diff changeset
236 def _clone_classdef(dex, clazz):
3820379b34e8 Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents: 110
diff changeset
237 from paraspace.dexfile import DEXFile_linked, _DEX_ClassDef
3820379b34e8 Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents: 110
diff changeset
238
3820379b34e8 Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents: 110
diff changeset
239 def has_classdef(clazz):
3820379b34e8 Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents: 110
diff changeset
240 classname = DEXFile_linked.get_classdef_name(clazz)
3820379b34e8 Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents: 110
diff changeset
241 try:
3820379b34e8 Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents: 110
diff changeset
242 dex.find_class_name(classname)
3820379b34e8 Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents: 110
diff changeset
243 except ValueError:
3820379b34e8 Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents: 110
diff changeset
244 return False
3820379b34e8 Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents: 110
diff changeset
245 return True
3820379b34e8 Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents: 110
diff changeset
246
3820379b34e8 Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents: 110
diff changeset
247 assert isinstance(clazz, _DEX_ClassDef)
3820379b34e8 Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents: 110
diff changeset
248
96
1769e52bdd9d Make dexfile_insert_class() pass the testcase
Thinker K.F. Li <thinker@codemud.net>
parents: 94
diff changeset
249 if has_classdef(clazz):
88
bbe8d5cbe368 Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents: 87
diff changeset
250 raise RuntimeError, \
bbe8d5cbe368 Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents: 87
diff changeset
251 'clone a class \'%s\'that is already in the DEXFile' % \
bbe8d5cbe368 Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents: 87
diff changeset
252 classdef_name(clazz)
94
88645ab29aeb dexfile_insert_class() returns a clone object
Thinker K.F. Li <thinker@codemud.net>
parents: 88
diff changeset
253
111
3820379b34e8 Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents: 110
diff changeset
254 clone = _clone_composite(dex, clazz)
94
88645ab29aeb dexfile_insert_class() returns a clone object
Thinker K.F. Li <thinker@codemud.net>
parents: 88
diff changeset
255 return clone
87
cd1ee85853f4 Add injection.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
256
cd1ee85853f4 Add injection.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
257
94
88645ab29aeb dexfile_insert_class() returns a clone object
Thinker K.F. Li <thinker@codemud.net>
parents: 88
diff changeset
258 ## \brief Clone a class definition and insert into a DEXFile.
88645ab29aeb dexfile_insert_class() returns a clone object
Thinker K.F. Li <thinker@codemud.net>
parents: 88
diff changeset
259 #
88645ab29aeb dexfile_insert_class() returns a clone object
Thinker K.F. Li <thinker@codemud.net>
parents: 88
diff changeset
260 # This function clone a class definition from a linked DEXFile and
88645ab29aeb dexfile_insert_class() returns a clone object
Thinker K.F. Li <thinker@codemud.net>
parents: 88
diff changeset
261 # insert it into another one.
88645ab29aeb dexfile_insert_class() returns a clone object
Thinker K.F. Li <thinker@codemud.net>
parents: 88
diff changeset
262 #
88645ab29aeb dexfile_insert_class() returns a clone object
Thinker K.F. Li <thinker@codemud.net>
parents: 88
diff changeset
263 # \param dex is a DEXFile_linked to insert the clone.
88645ab29aeb dexfile_insert_class() returns a clone object
Thinker K.F. Li <thinker@codemud.net>
parents: 88
diff changeset
264 # \param class_def is a class definition going to be cloned.
88645ab29aeb dexfile_insert_class() returns a clone object
Thinker K.F. Li <thinker@codemud.net>
parents: 88
diff changeset
265 #
111
3820379b34e8 Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents: 110
diff changeset
266 def dexfile_insert_class(dex, classdef):
3820379b34e8 Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents: 110
diff changeset
267 clone = _clone_classdef(dex, classdef)
94
88645ab29aeb dexfile_insert_class() returns a clone object
Thinker K.F. Li <thinker@codemud.net>
parents: 88
diff changeset
268 return clone
104
61cef1662035 Redirect types
Thinker K.F. Li <thinker@codemud.net>
parents: 100
diff changeset
269
61cef1662035 Redirect types
Thinker K.F. Li <thinker@codemud.net>
parents: 100
diff changeset
270
150
1eb1b2ca5de4 Use classdef_rel_set to carry relative information.
Thinker K.F. Li <thinker@codemud.net>
parents: 149
diff changeset
271 ## \biref Relative object set for a _DEX_ClassData.
1eb1b2ca5de4 Use classdef_rel_set to carry relative information.
Thinker K.F. Li <thinker@codemud.net>
parents: 149
diff changeset
272 class classdef_rel_set(object):
1eb1b2ca5de4 Use classdef_rel_set to carry relative information.
Thinker K.F. Li <thinker@codemud.net>
parents: 149
diff changeset
273 classdefs = None
1eb1b2ca5de4 Use classdef_rel_set to carry relative information.
Thinker K.F. Li <thinker@codemud.net>
parents: 149
diff changeset
274 typeids = None
1eb1b2ca5de4 Use classdef_rel_set to carry relative information.
Thinker K.F. Li <thinker@codemud.net>
parents: 149
diff changeset
275 strids = None
152
bc213cb88636 Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents: 151
diff changeset
276 fieldids = None
150
1eb1b2ca5de4 Use classdef_rel_set to carry relative information.
Thinker K.F. Li <thinker@codemud.net>
parents: 149
diff changeset
277
152
bc213cb88636 Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents: 151
diff changeset
278 def __init__(self, classdefs, typeids, strids, fieldids):
150
1eb1b2ca5de4 Use classdef_rel_set to carry relative information.
Thinker K.F. Li <thinker@codemud.net>
parents: 149
diff changeset
279 self.classdefs = set(classdefs)
1eb1b2ca5de4 Use classdef_rel_set to carry relative information.
Thinker K.F. Li <thinker@codemud.net>
parents: 149
diff changeset
280 self.typeids = set(typeids)
1eb1b2ca5de4 Use classdef_rel_set to carry relative information.
Thinker K.F. Li <thinker@codemud.net>
parents: 149
diff changeset
281 self.strids = set(strids)
152
bc213cb88636 Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents: 151
diff changeset
282 self.fieldids = set(fieldids)
150
1eb1b2ca5de4 Use classdef_rel_set to carry relative information.
Thinker K.F. Li <thinker@codemud.net>
parents: 149
diff changeset
283 pass
1eb1b2ca5de4 Use classdef_rel_set to carry relative information.
Thinker K.F. Li <thinker@codemud.net>
parents: 149
diff changeset
284
1eb1b2ca5de4 Use classdef_rel_set to carry relative information.
Thinker K.F. Li <thinker@codemud.net>
parents: 149
diff changeset
285 @staticmethod
1eb1b2ca5de4 Use classdef_rel_set to carry relative information.
Thinker K.F. Li <thinker@codemud.net>
parents: 149
diff changeset
286 def dup(src):
152
bc213cb88636 Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents: 151
diff changeset
287 return relative_obj_set(src.classdefs, src.typeids,
bc213cb88636 Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents: 151
diff changeset
288 src.strids, str.fieldids)
150
1eb1b2ca5de4 Use classdef_rel_set to carry relative information.
Thinker K.F. Li <thinker@codemud.net>
parents: 149
diff changeset
289
1eb1b2ca5de4 Use classdef_rel_set to carry relative information.
Thinker K.F. Li <thinker@codemud.net>
parents: 149
diff changeset
290 def update(self, new_data):
1eb1b2ca5de4 Use classdef_rel_set to carry relative information.
Thinker K.F. Li <thinker@codemud.net>
parents: 149
diff changeset
291 self.classdefs.update(new_data.classdefs)
1eb1b2ca5de4 Use classdef_rel_set to carry relative information.
Thinker K.F. Li <thinker@codemud.net>
parents: 149
diff changeset
292 self.typeids.update(new_data.typeids)
1eb1b2ca5de4 Use classdef_rel_set to carry relative information.
Thinker K.F. Li <thinker@codemud.net>
parents: 149
diff changeset
293 self.strids.update(new_data.strids)
152
bc213cb88636 Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents: 151
diff changeset
294 self.fieldids.update(new_data.fieldids)
150
1eb1b2ca5de4 Use classdef_rel_set to carry relative information.
Thinker K.F. Li <thinker@codemud.net>
parents: 149
diff changeset
295 pass
1eb1b2ca5de4 Use classdef_rel_set to carry relative information.
Thinker K.F. Li <thinker@codemud.net>
parents: 149
diff changeset
296 pass
1eb1b2ca5de4 Use classdef_rel_set to carry relative information.
Thinker K.F. Li <thinker@codemud.net>
parents: 149
diff changeset
297
1eb1b2ca5de4 Use classdef_rel_set to carry relative information.
Thinker K.F. Li <thinker@codemud.net>
parents: 149
diff changeset
298
151
91fabeaffce8 Move functions
Thinker K.F. Li <thinker@codemud.net>
parents: 150
diff changeset
299 ## \brief Collect all type and string indices mentioned in the method code.
91fabeaffce8 Move functions
Thinker K.F. Li <thinker@codemud.net>
parents: 150
diff changeset
300 #
91fabeaffce8 Move functions
Thinker K.F. Li <thinker@codemud.net>
parents: 150
diff changeset
301 # \param method is a \ref _DEX_Method.
91fabeaffce8 Move functions
Thinker K.F. Li <thinker@codemud.net>
parents: 150
diff changeset
302 # \return a list of type indices mentioned in the code.
91fabeaffce8 Move functions
Thinker K.F. Li <thinker@codemud.net>
parents: 150
diff changeset
303 #
152
bc213cb88636 Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents: 151
diff changeset
304 def collect_typeidxs_stridxs_fieldidxs_in_method(dex, method):
151
91fabeaffce8 Move functions
Thinker K.F. Li <thinker@codemud.net>
parents: 150
diff changeset
305 from paraspace.dexfile import _DEX_Method, DEXFile_linked
91fabeaffce8 Move functions
Thinker K.F. Li <thinker@codemud.net>
parents: 150
diff changeset
306 from paraspace.dalvik_opcodes import decode_insn_blk, all_opcodes
152
bc213cb88636 Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents: 151
diff changeset
307 from paraspace.dalvik_opcodes import all_opcodes
151
91fabeaffce8 Move functions
Thinker K.F. Li <thinker@codemud.net>
parents: 150
diff changeset
308
91fabeaffce8 Move functions
Thinker K.F. Li <thinker@codemud.net>
parents: 150
diff changeset
309 assert isinstance(method, _DEX_Method)
91fabeaffce8 Move functions
Thinker K.F. Li <thinker@codemud.net>
parents: 150
diff changeset
310
91fabeaffce8 Move functions
Thinker K.F. Li <thinker@codemud.net>
parents: 150
diff changeset
311 def get_typeidx_methodidx(methodidx):
91fabeaffce8 Move functions
Thinker K.F. Li <thinker@codemud.net>
parents: 150
diff changeset
312 methodid = dex.find_methodid_idx(methodidx)
91fabeaffce8 Move functions
Thinker K.F. Li <thinker@codemud.net>
parents: 150
diff changeset
313 method_typeid = methodid.classIdx
91fabeaffce8 Move functions
Thinker K.F. Li <thinker@codemud.net>
parents: 150
diff changeset
314 method_typeidx = dex.get_idx_typeid(method_typeid)
91fabeaffce8 Move functions
Thinker K.F. Li <thinker@codemud.net>
parents: 150
diff changeset
315 return method_typeidx
91fabeaffce8 Move functions
Thinker K.F. Li <thinker@codemud.net>
parents: 150
diff changeset
316
91fabeaffce8 Move functions
Thinker K.F. Li <thinker@codemud.net>
parents: 150
diff changeset
317 def collect_types_in_op_vector(op_vector):
91fabeaffce8 Move functions
Thinker K.F. Li <thinker@codemud.net>
parents: 150
diff changeset
318 code, args = op_vector
91fabeaffce8 Move functions
Thinker K.F. Li <thinker@codemud.net>
parents: 150
diff changeset
319
91fabeaffce8 Move functions
Thinker K.F. Li <thinker@codemud.net>
parents: 150
diff changeset
320 if code == all_opcodes.OP_NEW_INSTANCE:
91fabeaffce8 Move functions
Thinker K.F. Li <thinker@codemud.net>
parents: 150
diff changeset
321 return args[1]
91fabeaffce8 Move functions
Thinker K.F. Li <thinker@codemud.net>
parents: 150
diff changeset
322
91fabeaffce8 Move functions
Thinker K.F. Li <thinker@codemud.net>
parents: 150
diff changeset
323 if code in (all_opcodes.OP_INVOKE_DIRECT,
91fabeaffce8 Move functions
Thinker K.F. Li <thinker@codemud.net>
parents: 150
diff changeset
324 all_opcodes.OP_INVOKE_VIRTUAL,
91fabeaffce8 Move functions
Thinker K.F. Li <thinker@codemud.net>
parents: 150
diff changeset
325 all_opcodes.OP_INVOKE_SUPER,
91fabeaffce8 Move functions
Thinker K.F. Li <thinker@codemud.net>
parents: 150
diff changeset
326 all_opcodes.OP_INVOKE_STATIC,
91fabeaffce8 Move functions
Thinker K.F. Li <thinker@codemud.net>
parents: 150
diff changeset
327 all_opcodes.OP_INVOKE_INTERFACE):
91fabeaffce8 Move functions
Thinker K.F. Li <thinker@codemud.net>
parents: 150
diff changeset
328 methodidx = args[2]
91fabeaffce8 Move functions
Thinker K.F. Li <thinker@codemud.net>
parents: 150
diff changeset
329 method_typeidx = get_typeidx_methodidx(methodidx)
91fabeaffce8 Move functions
Thinker K.F. Li <thinker@codemud.net>
parents: 150
diff changeset
330 return method_typeidx
91fabeaffce8 Move functions
Thinker K.F. Li <thinker@codemud.net>
parents: 150
diff changeset
331
91fabeaffce8 Move functions
Thinker K.F. Li <thinker@codemud.net>
parents: 150
diff changeset
332 if code in (all_opcodes.OP_INVOKE_VIRTUAL_RANGE,
91fabeaffce8 Move functions
Thinker K.F. Li <thinker@codemud.net>
parents: 150
diff changeset
333 all_opcodes.OP_INVOKE_DIRECT_RANGE,
91fabeaffce8 Move functions
Thinker K.F. Li <thinker@codemud.net>
parents: 150
diff changeset
334 all_opcodes.OP_INVOKE_SUPER_RANGE,
91fabeaffce8 Move functions
Thinker K.F. Li <thinker@codemud.net>
parents: 150
diff changeset
335 all_opcodes.OP_INVOKE_STATIC_RANGE,
91fabeaffce8 Move functions
Thinker K.F. Li <thinker@codemud.net>
parents: 150
diff changeset
336 all_opcodes.OP_INVOKE_INTERFACE_RANGE):
91fabeaffce8 Move functions
Thinker K.F. Li <thinker@codemud.net>
parents: 150
diff changeset
337 methodidx = args[1]
91fabeaffce8 Move functions
Thinker K.F. Li <thinker@codemud.net>
parents: 150
diff changeset
338 method_typeidx = get_typeidx_methodidx(methodidx)
91fabeaffce8 Move functions
Thinker K.F. Li <thinker@codemud.net>
parents: 150
diff changeset
339 return method_typeidx
91fabeaffce8 Move functions
Thinker K.F. Li <thinker@codemud.net>
parents: 150
diff changeset
340
91fabeaffce8 Move functions
Thinker K.F. Li <thinker@codemud.net>
parents: 150
diff changeset
341 return None
91fabeaffce8 Move functions
Thinker K.F. Li <thinker@codemud.net>
parents: 150
diff changeset
342
91fabeaffce8 Move functions
Thinker K.F. Li <thinker@codemud.net>
parents: 150
diff changeset
343 def collect_strings_in_op_vector(op_vector):
91fabeaffce8 Move functions
Thinker K.F. Li <thinker@codemud.net>
parents: 150
diff changeset
344 code, args = op_vector
91fabeaffce8 Move functions
Thinker K.F. Li <thinker@codemud.net>
parents: 150
diff changeset
345 if code == all_opcodes.OP_CONST_STRING:
91fabeaffce8 Move functions
Thinker K.F. Li <thinker@codemud.net>
parents: 150
diff changeset
346 stridx = args[1]
91fabeaffce8 Move functions
Thinker K.F. Li <thinker@codemud.net>
parents: 150
diff changeset
347 return stridx
91fabeaffce8 Move functions
Thinker K.F. Li <thinker@codemud.net>
parents: 150
diff changeset
348
91fabeaffce8 Move functions
Thinker K.F. Li <thinker@codemud.net>
parents: 150
diff changeset
349 return None
91fabeaffce8 Move functions
Thinker K.F. Li <thinker@codemud.net>
parents: 150
diff changeset
350
154
c659b8c7d6cb Use right opcode formats
Thinker K.F. Li <thinker@codemud.net>
parents: 152
diff changeset
351 field2_opcodes = set([all_opcodes.OP_IGET,
152
bc213cb88636 Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents: 151
diff changeset
352 all_opcodes.OP_IGET_WIDE,
bc213cb88636 Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents: 151
diff changeset
353 all_opcodes.OP_IGET_OBJECT,
bc213cb88636 Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents: 151
diff changeset
354 all_opcodes.OP_IGET_BOOLEAN,
bc213cb88636 Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents: 151
diff changeset
355 all_opcodes.OP_IGET_BYTE,
bc213cb88636 Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents: 151
diff changeset
356 all_opcodes.OP_IGET_CHAR,
bc213cb88636 Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents: 151
diff changeset
357 all_opcodes.OP_IGET_SHORT,
bc213cb88636 Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents: 151
diff changeset
358 all_opcodes.OP_IPUT,
bc213cb88636 Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents: 151
diff changeset
359 all_opcodes.OP_IPUT_WIDE,
bc213cb88636 Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents: 151
diff changeset
360 all_opcodes.OP_IPUT_OBJECT,
bc213cb88636 Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents: 151
diff changeset
361 all_opcodes.OP_IPUT_BOOLEAN,
bc213cb88636 Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents: 151
diff changeset
362 all_opcodes.OP_IPUT_BYTE,
bc213cb88636 Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents: 151
diff changeset
363 all_opcodes.OP_IPUT_CHAR,
154
c659b8c7d6cb Use right opcode formats
Thinker K.F. Li <thinker@codemud.net>
parents: 152
diff changeset
364 all_opcodes.OP_IPUT_SHORT])
c659b8c7d6cb Use right opcode formats
Thinker K.F. Li <thinker@codemud.net>
parents: 152
diff changeset
365
c659b8c7d6cb Use right opcode formats
Thinker K.F. Li <thinker@codemud.net>
parents: 152
diff changeset
366 field1_opcodes = set([all_opcodes.OP_SGET,
c659b8c7d6cb Use right opcode formats
Thinker K.F. Li <thinker@codemud.net>
parents: 152
diff changeset
367 all_opcodes.OP_SGET_WIDE,
c659b8c7d6cb Use right opcode formats
Thinker K.F. Li <thinker@codemud.net>
parents: 152
diff changeset
368 all_opcodes.OP_SGET_OBJECT,
c659b8c7d6cb Use right opcode formats
Thinker K.F. Li <thinker@codemud.net>
parents: 152
diff changeset
369 all_opcodes.OP_SGET_BOOLEAN,
c659b8c7d6cb Use right opcode formats
Thinker K.F. Li <thinker@codemud.net>
parents: 152
diff changeset
370 all_opcodes.OP_SGET_BYTE,
c659b8c7d6cb Use right opcode formats
Thinker K.F. Li <thinker@codemud.net>
parents: 152
diff changeset
371 all_opcodes.OP_SGET_CHAR,
c659b8c7d6cb Use right opcode formats
Thinker K.F. Li <thinker@codemud.net>
parents: 152
diff changeset
372 all_opcodes.OP_SGET_SHORT,
c659b8c7d6cb Use right opcode formats
Thinker K.F. Li <thinker@codemud.net>
parents: 152
diff changeset
373 all_opcodes.OP_SPUT,
c659b8c7d6cb Use right opcode formats
Thinker K.F. Li <thinker@codemud.net>
parents: 152
diff changeset
374 all_opcodes.OP_SPUT_WIDE,
c659b8c7d6cb Use right opcode formats
Thinker K.F. Li <thinker@codemud.net>
parents: 152
diff changeset
375 all_opcodes.OP_SPUT_OBJECT,
c659b8c7d6cb Use right opcode formats
Thinker K.F. Li <thinker@codemud.net>
parents: 152
diff changeset
376 all_opcodes.OP_SPUT_BOOLEAN,
c659b8c7d6cb Use right opcode formats
Thinker K.F. Li <thinker@codemud.net>
parents: 152
diff changeset
377 all_opcodes.OP_SPUT_BYTE,
c659b8c7d6cb Use right opcode formats
Thinker K.F. Li <thinker@codemud.net>
parents: 152
diff changeset
378 all_opcodes.OP_SPUT_CHAR,
c659b8c7d6cb Use right opcode formats
Thinker K.F. Li <thinker@codemud.net>
parents: 152
diff changeset
379 all_opcodes.OP_SPUT_SHORT])
c659b8c7d6cb Use right opcode formats
Thinker K.F. Li <thinker@codemud.net>
parents: 152
diff changeset
380
152
bc213cb88636 Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents: 151
diff changeset
381 def collect_fields_in_op_vector(op_vector):
bc213cb88636 Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents: 151
diff changeset
382 code, args = op_vector
154
c659b8c7d6cb Use right opcode formats
Thinker K.F. Li <thinker@codemud.net>
parents: 152
diff changeset
383 if code in field2_opcodes:
152
bc213cb88636 Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents: 151
diff changeset
384 fieldidx = args[2]
bc213cb88636 Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents: 151
diff changeset
385 return fieldidx
154
c659b8c7d6cb Use right opcode formats
Thinker K.F. Li <thinker@codemud.net>
parents: 152
diff changeset
386 elif code in field1_opcodes:
c659b8c7d6cb Use right opcode formats
Thinker K.F. Li <thinker@codemud.net>
parents: 152
diff changeset
387 fieldidx = args[1]
c659b8c7d6cb Use right opcode formats
Thinker K.F. Li <thinker@codemud.net>
parents: 152
diff changeset
388 return fieldidx
152
bc213cb88636 Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents: 151
diff changeset
389 pass
bc213cb88636 Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents: 151
diff changeset
390
151
91fabeaffce8 Move functions
Thinker K.F. Li <thinker@codemud.net>
parents: 150
diff changeset
391 code_blk = DEXFile_linked.get_code_block_method(method)
91fabeaffce8 Move functions
Thinker K.F. Li <thinker@codemud.net>
parents: 150
diff changeset
392 op_vectors = decode_insn_blk(code_blk)
91fabeaffce8 Move functions
Thinker K.F. Li <thinker@codemud.net>
parents: 150
diff changeset
393 types_insns = [collect_types_in_op_vector(op_vector)
91fabeaffce8 Move functions
Thinker K.F. Li <thinker@codemud.net>
parents: 150
diff changeset
394 for op_vector in op_vectors]
91fabeaffce8 Move functions
Thinker K.F. Li <thinker@codemud.net>
parents: 150
diff changeset
395 typeidxs = [idx for idx in types_insns if idx is not None]
91fabeaffce8 Move functions
Thinker K.F. Li <thinker@codemud.net>
parents: 150
diff changeset
396
152
bc213cb88636 Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents: 151
diff changeset
397 strs_insns = [collect_strings_in_op_vector(op_vector)
bc213cb88636 Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents: 151
diff changeset
398 for op_vector in op_vectors]
151
91fabeaffce8 Move functions
Thinker K.F. Li <thinker@codemud.net>
parents: 150
diff changeset
399 stridxs = [idx for idx in strs_insns if idx is not None]
152
bc213cb88636 Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents: 151
diff changeset
400
bc213cb88636 Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents: 151
diff changeset
401 fields_insns = [collect_fields_in_op_vector(op_vector)
bc213cb88636 Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents: 151
diff changeset
402 for op_vector in op_vectors]
bc213cb88636 Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents: 151
diff changeset
403 fieldidxs = [idx for idx in fields_insns if idx is not None]
151
91fabeaffce8 Move functions
Thinker K.F. Li <thinker@codemud.net>
parents: 150
diff changeset
404
152
bc213cb88636 Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents: 151
diff changeset
405 return typeidxs, stridxs, fieldidxs
151
91fabeaffce8 Move functions
Thinker K.F. Li <thinker@codemud.net>
parents: 150
diff changeset
406
91fabeaffce8 Move functions
Thinker K.F. Li <thinker@codemud.net>
parents: 150
diff changeset
407
91fabeaffce8 Move functions
Thinker K.F. Li <thinker@codemud.net>
parents: 150
diff changeset
408 ## \brief Collect all type and string indices mentioned by the class code.
152
bc213cb88636 Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents: 151
diff changeset
409 def collect_typeidxs_stridxs_fieldidxs_mentioned_by_class(dex, classdef):
151
91fabeaffce8 Move functions
Thinker K.F. Li <thinker@codemud.net>
parents: 150
diff changeset
410 from paraspace.dexfile import DEXFile_linked
91fabeaffce8 Move functions
Thinker K.F. Li <thinker@codemud.net>
parents: 150
diff changeset
411
91fabeaffce8 Move functions
Thinker K.F. Li <thinker@codemud.net>
parents: 150
diff changeset
412 assert isinstance(dex, DEXFile_linked)
91fabeaffce8 Move functions
Thinker K.F. Li <thinker@codemud.net>
parents: 150
diff changeset
413
91fabeaffce8 Move functions
Thinker K.F. Li <thinker@codemud.net>
parents: 150
diff changeset
414 typeidxs = set()
91fabeaffce8 Move functions
Thinker K.F. Li <thinker@codemud.net>
parents: 150
diff changeset
415 stridxs = set()
152
bc213cb88636 Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents: 151
diff changeset
416 fieldidxs = set()
151
91fabeaffce8 Move functions
Thinker K.F. Li <thinker@codemud.net>
parents: 150
diff changeset
417 methods = DEXFile_linked.get_methods_classdef(classdef)
91fabeaffce8 Move functions
Thinker K.F. Li <thinker@codemud.net>
parents: 150
diff changeset
418 for method in methods:
152
bc213cb88636 Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents: 151
diff changeset
419 method_typeidxs, method_stridxs, method_fieldidxs = \
bc213cb88636 Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents: 151
diff changeset
420 collect_typeidxs_stridxs_fieldidxs_in_method(dex, method)
151
91fabeaffce8 Move functions
Thinker K.F. Li <thinker@codemud.net>
parents: 150
diff changeset
421 typeidxs.update(method_typeidxs)
91fabeaffce8 Move functions
Thinker K.F. Li <thinker@codemud.net>
parents: 150
diff changeset
422 stridxs.update(method_stridxs)
152
bc213cb88636 Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents: 151
diff changeset
423 fieldidxs.update(method_fieldidxs)
151
91fabeaffce8 Move functions
Thinker K.F. Li <thinker@codemud.net>
parents: 150
diff changeset
424 pass
91fabeaffce8 Move functions
Thinker K.F. Li <thinker@codemud.net>
parents: 150
diff changeset
425
152
bc213cb88636 Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents: 151
diff changeset
426 return list(typeidxs), list(stridxs), list(fieldidxs)
151
91fabeaffce8 Move functions
Thinker K.F. Li <thinker@codemud.net>
parents: 150
diff changeset
427
91fabeaffce8 Move functions
Thinker K.F. Li <thinker@codemud.net>
parents: 150
diff changeset
428
111
3820379b34e8 Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents: 110
diff changeset
429 ## \brief Collect info of classes mentioned by the code of given class.
3820379b34e8 Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents: 110
diff changeset
430 def _find_class_relative(dex, classdef):
3820379b34e8 Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents: 110
diff changeset
431 def classify_typeids_defined(dex, typeids):
3820379b34e8 Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents: 110
diff changeset
432 classdefs = []
3820379b34e8 Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents: 110
diff changeset
433 undef_typeids = []
3820379b34e8 Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents: 110
diff changeset
434 for typeid in typeids:
3820379b34e8 Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents: 110
diff changeset
435 try:
3820379b34e8 Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents: 110
diff changeset
436 classdef = dex.find_class_typeid(typeid)
3820379b34e8 Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents: 110
diff changeset
437 except ValueError:
3820379b34e8 Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents: 110
diff changeset
438 undef_typeids.append(typeid)
3820379b34e8 Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents: 110
diff changeset
439 else:
3820379b34e8 Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents: 110
diff changeset
440 classdefs.append(classdef)
3820379b34e8 Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents: 110
diff changeset
441 pass
3820379b34e8 Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents: 110
diff changeset
442 pass
3820379b34e8 Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents: 110
diff changeset
443 return classdefs, undef_typeids
3820379b34e8 Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents: 110
diff changeset
444
152
bc213cb88636 Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents: 151
diff changeset
445 typeidxs, stridxs, fieldidxs = \
bc213cb88636 Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents: 151
diff changeset
446 collect_typeidxs_stridxs_fieldidxs_mentioned_by_class(dex, classdef)
111
3820379b34e8 Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents: 110
diff changeset
447 typeids = [dex.find_typeid_idx(typeidx)
3820379b34e8 Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents: 110
diff changeset
448 for typeidx in typeidxs]
149
d4533a59c694 inject_classdefs() also inject relative _DEX_StringIds.
Thinker K.F. Li <thinker@codemud.net>
parents: 148
diff changeset
449 strids = [dex.find_strid_idx(idx) for idx in stridxs]
152
bc213cb88636 Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents: 151
diff changeset
450 fieldids = [dex.find_fieldid_idx(idx) for idx in fieldidxs]
111
3820379b34e8 Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents: 110
diff changeset
451
3820379b34e8 Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents: 110
diff changeset
452 classdefs, typeids = classify_typeids_defined(dex, typeids)
3820379b34e8 Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents: 110
diff changeset
453
152
bc213cb88636 Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents: 151
diff changeset
454 rel_set = classdef_rel_set(classdefs, typeids, strids, fieldids)
150
1eb1b2ca5de4 Use classdef_rel_set to carry relative information.
Thinker K.F. Li <thinker@codemud.net>
parents: 149
diff changeset
455 return rel_set
111
3820379b34e8 Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents: 110
diff changeset
456
3820379b34e8 Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents: 110
diff changeset
457
3820379b34e8 Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents: 110
diff changeset
458 def dexfile_insert_classdefs(dex_dst, dex_src, classdefs):
115
d112c27f657a Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents: 114
diff changeset
459 clones = [dexfile_insert_class(dex_dst, classdef)
d112c27f657a Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents: 114
diff changeset
460 for classdef in classdefs]
d112c27f657a Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents: 114
diff changeset
461 return clones
111
3820379b34e8 Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents: 110
diff changeset
462
3820379b34e8 Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents: 110
diff changeset
463
149
d4533a59c694 inject_classdefs() also inject relative _DEX_StringIds.
Thinker K.F. Li <thinker@codemud.net>
parents: 148
diff changeset
464 ## \brief Insert _DEX_StringId into another DEX.
d4533a59c694 inject_classdefs() also inject relative _DEX_StringIds.
Thinker K.F. Li <thinker@codemud.net>
parents: 148
diff changeset
465 def dexfile_insert_stringid(dex_dst, dex_src, strid):
d4533a59c694 inject_classdefs() also inject relative _DEX_StringIds.
Thinker K.F. Li <thinker@codemud.net>
parents: 148
diff changeset
466 clone = _clone_composite(dex_dst, strid)
d4533a59c694 inject_classdefs() also inject relative _DEX_StringIds.
Thinker K.F. Li <thinker@codemud.net>
parents: 148
diff changeset
467 return clone
d4533a59c694 inject_classdefs() also inject relative _DEX_StringIds.
Thinker K.F. Li <thinker@codemud.net>
parents: 148
diff changeset
468
d4533a59c694 inject_classdefs() also inject relative _DEX_StringIds.
Thinker K.F. Li <thinker@codemud.net>
parents: 148
diff changeset
469
d4533a59c694 inject_classdefs() also inject relative _DEX_StringIds.
Thinker K.F. Li <thinker@codemud.net>
parents: 148
diff changeset
470 ## \brief Insert _DEX_StringIds into another DEX.
d4533a59c694 inject_classdefs() also inject relative _DEX_StringIds.
Thinker K.F. Li <thinker@codemud.net>
parents: 148
diff changeset
471 def dexfile_insert_stringids(dex_dst, dex_src, strids):
d4533a59c694 inject_classdefs() also inject relative _DEX_StringIds.
Thinker K.F. Li <thinker@codemud.net>
parents: 148
diff changeset
472 clones = [dexfile_insert_stringid(dex_dst, dex_src, strid)
d4533a59c694 inject_classdefs() also inject relative _DEX_StringIds.
Thinker K.F. Li <thinker@codemud.net>
parents: 148
diff changeset
473 for strid in strids]
d4533a59c694 inject_classdefs() also inject relative _DEX_StringIds.
Thinker K.F. Li <thinker@codemud.net>
parents: 148
diff changeset
474 return clones
d4533a59c694 inject_classdefs() also inject relative _DEX_StringIds.
Thinker K.F. Li <thinker@codemud.net>
parents: 148
diff changeset
475
d4533a59c694 inject_classdefs() also inject relative _DEX_StringIds.
Thinker K.F. Li <thinker@codemud.net>
parents: 148
diff changeset
476
152
bc213cb88636 Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents: 151
diff changeset
477 ## \brief Insert _DEX_FieldId into another DEX.
bc213cb88636 Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents: 151
diff changeset
478 def dexfile_insert_fieldid(dex_dst, dex_src, fieldid):
bc213cb88636 Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents: 151
diff changeset
479 clone = _clone_composite(dex_dst, fieldid)
bc213cb88636 Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents: 151
diff changeset
480 return clone
bc213cb88636 Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents: 151
diff changeset
481
bc213cb88636 Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents: 151
diff changeset
482
bc213cb88636 Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents: 151
diff changeset
483 ## \brief Insert _DEX_FieldIds into another DEX.
bc213cb88636 Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents: 151
diff changeset
484 def dexfile_insert_fieldids(dex_dst, dex_src, fieldids):
bc213cb88636 Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents: 151
diff changeset
485 clones = [dexfile_insert_fieldid(dex_dst, dex_src, fieldid)
bc213cb88636 Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents: 151
diff changeset
486 for fieldid in fieldids]
bc213cb88636 Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents: 151
diff changeset
487 return clones
bc213cb88636 Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents: 151
diff changeset
488
bc213cb88636 Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents: 151
diff changeset
489
111
3820379b34e8 Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents: 110
diff changeset
490 ## \brief Clone and insert a _DEX_TypeId to another DEXFile_linked.
3820379b34e8 Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents: 110
diff changeset
491 #
3820379b34e8 Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents: 110
diff changeset
492 # \param dex_dst is a DEXFile_linked where the cloning one is inserted.
3820379b34e8 Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents: 110
diff changeset
493 # \param dex_src is a DEXFile_linked where the cloned one is from.
3820379b34e8 Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents: 110
diff changeset
494 # \param typeid is a _DEX_TypeId that is cloned.
3820379b34e8 Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents: 110
diff changeset
495 # \return the cloning _DEX_TypeId.
3820379b34e8 Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents: 110
diff changeset
496 #
146
032877e14560 Merge typeid and methodids if injected type is already in destinate
Thinker K.F. Li <thinker@codemud.net>
parents: 145
diff changeset
497 def dexfile_insert_or_merge_typeid(dex_dst, dex_src, typeid):
032877e14560 Merge typeid and methodids if injected type is already in destinate
Thinker K.F. Li <thinker@codemud.net>
parents: 145
diff changeset
498 from paraspace.dexfile import _DEX_TypeId, DEXFile_linked, _DEX_MethodId
111
3820379b34e8 Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents: 110
diff changeset
499
3820379b34e8 Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents: 110
diff changeset
500 assert isinstance(typeid, _DEX_TypeId)
3820379b34e8 Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents: 110
diff changeset
501
146
032877e14560 Merge typeid and methodids if injected type is already in destinate
Thinker K.F. Li <thinker@codemud.net>
parents: 145
diff changeset
502 def typeid_not_in_dst(typeid):
032877e14560 Merge typeid and methodids if injected type is already in destinate
Thinker K.F. Li <thinker@codemud.net>
parents: 145
diff changeset
503 typename = DEXFile_linked.get_typeid_name(typeid)
032877e14560 Merge typeid and methodids if injected type is already in destinate
Thinker K.F. Li <thinker@codemud.net>
parents: 145
diff changeset
504 try:
032877e14560 Merge typeid and methodids if injected type is already in destinate
Thinker K.F. Li <thinker@codemud.net>
parents: 145
diff changeset
505 dex_dst.find_typeid_name(typename)
032877e14560 Merge typeid and methodids if injected type is already in destinate
Thinker K.F. Li <thinker@codemud.net>
parents: 145
diff changeset
506 except ValueError:
032877e14560 Merge typeid and methodids if injected type is already in destinate
Thinker K.F. Li <thinker@codemud.net>
parents: 145
diff changeset
507 return True
032877e14560 Merge typeid and methodids if injected type is already in destinate
Thinker K.F. Li <thinker@codemud.net>
parents: 145
diff changeset
508 return False
111
3820379b34e8 Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents: 110
diff changeset
509
146
032877e14560 Merge typeid and methodids if injected type is already in destinate
Thinker K.F. Li <thinker@codemud.net>
parents: 145
diff changeset
510 if typeid_not_in_dst(typeid):
032877e14560 Merge typeid and methodids if injected type is already in destinate
Thinker K.F. Li <thinker@codemud.net>
parents: 145
diff changeset
511 cloning = _clone_composite(dex_dst, typeid)
032877e14560 Merge typeid and methodids if injected type is already in destinate
Thinker K.F. Li <thinker@codemud.net>
parents: 145
diff changeset
512
032877e14560 Merge typeid and methodids if injected type is already in destinate
Thinker K.F. Li <thinker@codemud.net>
parents: 145
diff changeset
513 methodids = dex_src.find_methodids_typeid(dex_src, typeid)
032877e14560 Merge typeid and methodids if injected type is already in destinate
Thinker K.F. Li <thinker@codemud.net>
parents: 145
diff changeset
514 for methodid in methodids:
032877e14560 Merge typeid and methodids if injected type is already in destinate
Thinker K.F. Li <thinker@codemud.net>
parents: 145
diff changeset
515 _clone_composite(dex_dst, methodid)
032877e14560 Merge typeid and methodids if injected type is already in destinate
Thinker K.F. Li <thinker@codemud.net>
parents: 145
diff changeset
516 pass
111
3820379b34e8 Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents: 110
diff changeset
517 pass
146
032877e14560 Merge typeid and methodids if injected type is already in destinate
Thinker K.F. Li <thinker@codemud.net>
parents: 145
diff changeset
518 else:
032877e14560 Merge typeid and methodids if injected type is already in destinate
Thinker K.F. Li <thinker@codemud.net>
parents: 145
diff changeset
519 typename = DEXFile_linked.get_typeid_name(typeid)
032877e14560 Merge typeid and methodids if injected type is already in destinate
Thinker K.F. Li <thinker@codemud.net>
parents: 145
diff changeset
520 cloning = dex_dst.find_typeid_name(typename)
032877e14560 Merge typeid and methodids if injected type is already in destinate
Thinker K.F. Li <thinker@codemud.net>
parents: 145
diff changeset
521
032877e14560 Merge typeid and methodids if injected type is already in destinate
Thinker K.F. Li <thinker@codemud.net>
parents: 145
diff changeset
522 methodids = dex_src.find_methodids_typeid(typeid)
032877e14560 Merge typeid and methodids if injected type is already in destinate
Thinker K.F. Li <thinker@codemud.net>
parents: 145
diff changeset
523 for methodid in methodids:
032877e14560 Merge typeid and methodids if injected type is already in destinate
Thinker K.F. Li <thinker@codemud.net>
parents: 145
diff changeset
524 methodname = DEXFile_linked.get_methodid_name(methodid)
032877e14560 Merge typeid and methodids if injected type is already in destinate
Thinker K.F. Li <thinker@codemud.net>
parents: 145
diff changeset
525 try:
032877e14560 Merge typeid and methodids if injected type is already in destinate
Thinker K.F. Li <thinker@codemud.net>
parents: 145
diff changeset
526 dex_dst.find_methodid_name_proto(methodname, methodid.protoIdx,
032877e14560 Merge typeid and methodids if injected type is already in destinate
Thinker K.F. Li <thinker@codemud.net>
parents: 145
diff changeset
527 cloning)
032877e14560 Merge typeid and methodids if injected type is already in destinate
Thinker K.F. Li <thinker@codemud.net>
parents: 145
diff changeset
528 except ValueError:
032877e14560 Merge typeid and methodids if injected type is already in destinate
Thinker K.F. Li <thinker@codemud.net>
parents: 145
diff changeset
529 cloning_methodid = _clone_composite(dex_dst, methodid)
032877e14560 Merge typeid and methodids if injected type is already in destinate
Thinker K.F. Li <thinker@codemud.net>
parents: 145
diff changeset
530 pass
032877e14560 Merge typeid and methodids if injected type is already in destinate
Thinker K.F. Li <thinker@codemud.net>
parents: 145
diff changeset
531 pass
111
3820379b34e8 Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents: 110
diff changeset
532
3820379b34e8 Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents: 110
diff changeset
533 return cloning
3820379b34e8 Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents: 110
diff changeset
534
3820379b34e8 Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents: 110
diff changeset
535
3820379b34e8 Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents: 110
diff changeset
536 ## \brief Clone and insert a list of _DEX_TypeId objects to a DEXFile_linked.
146
032877e14560 Merge typeid and methodids if injected type is already in destinate
Thinker K.F. Li <thinker@codemud.net>
parents: 145
diff changeset
537 def dexfile_insert_or_merge_typeids(dex_dst, dex_src, typeids):
032877e14560 Merge typeid and methodids if injected type is already in destinate
Thinker K.F. Li <thinker@codemud.net>
parents: 145
diff changeset
538 clones = [dexfile_insert_or_merge_typeid(dex_dst, dex_src, typeid)
115
d112c27f657a Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents: 114
diff changeset
539 for typeid in typeids]
d112c27f657a Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents: 114
diff changeset
540 return clones
111
3820379b34e8 Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents: 110
diff changeset
541
3820379b34e8 Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents: 110
diff changeset
542
3820379b34e8 Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents: 110
diff changeset
543 ## \brief Collects relative type IDs and classes definition for given class.
114
867184e01852 Change interface of dexfile_insert_classdefs_relative
Thinker K.F. Li <thinker@codemud.net>
parents: 113
diff changeset
544 def collect_classdefs_relative(dex, classdefs):
152
bc213cb88636 Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents: 151
diff changeset
545 rel_set = classdef_rel_set(classdefs, [], [], [])
111
3820379b34e8 Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents: 110
diff changeset
546
114
867184e01852 Change interface of dexfile_insert_classdefs_relative
Thinker K.F. Li <thinker@codemud.net>
parents: 113
diff changeset
547 classdef_queue = list(classdefs)
111
3820379b34e8 Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents: 110
diff changeset
548 while classdef_queue:
3820379b34e8 Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents: 110
diff changeset
549 cur_classdef = classdef_queue.pop(0)
3820379b34e8 Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents: 110
diff changeset
550
150
1eb1b2ca5de4 Use classdef_rel_set to carry relative information.
Thinker K.F. Li <thinker@codemud.net>
parents: 149
diff changeset
551 new_rel_set = _find_class_relative(dex, cur_classdef)
1eb1b2ca5de4 Use classdef_rel_set to carry relative information.
Thinker K.F. Li <thinker@codemud.net>
parents: 149
diff changeset
552 rel_set.update(new_rel_set)
1eb1b2ca5de4 Use classdef_rel_set to carry relative information.
Thinker K.F. Li <thinker@codemud.net>
parents: 149
diff changeset
553 new_classdefs = new_rel_set.classdefs - rel_set.classdefs
1eb1b2ca5de4 Use classdef_rel_set to carry relative information.
Thinker K.F. Li <thinker@codemud.net>
parents: 149
diff changeset
554 classdef_queue = classdef_queue + list(new_classdefs)
111
3820379b34e8 Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents: 110
diff changeset
555 pass
150
1eb1b2ca5de4 Use classdef_rel_set to carry relative information.
Thinker K.F. Li <thinker@codemud.net>
parents: 149
diff changeset
556 return rel_set
111
3820379b34e8 Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents: 110
diff changeset
557
3820379b34e8 Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents: 110
diff changeset
558
3820379b34e8 Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents: 110
diff changeset
559 ## \brief Clone and insert given and relative classes into another DEXFile.
3820379b34e8 Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents: 110
diff changeset
560 #
3820379b34e8 Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents: 110
diff changeset
561 # \param dex_dst is a DEXFile_linked where the class will be inserted.
3820379b34e8 Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents: 110
diff changeset
562 # \param dex_src is a DEXFile_linked where the cloned class is from.
3820379b34e8 Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents: 110
diff changeset
563 # \param classdef is a _DEX_ClassDef that will be cloned.
115
d112c27f657a Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents: 114
diff changeset
564 # \return a vector of a list of classdefs and a list of typeids.
111
3820379b34e8 Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents: 110
diff changeset
565 #
114
867184e01852 Change interface of dexfile_insert_classdefs_relative
Thinker K.F. Li <thinker@codemud.net>
parents: 113
diff changeset
566 def dexfile_insert_classdefs_relative(dex_dst, dex_src, classdefs):
111
3820379b34e8 Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents: 110
diff changeset
567 from paraspace.dexfile import DEXFile_linked
3820379b34e8 Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents: 110
diff changeset
568
3820379b34e8 Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents: 110
diff changeset
569 def classdef_not_in_dst(classdef):
3820379b34e8 Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents: 110
diff changeset
570 classname = DEXFile_linked.get_classdef_name(classdef)
3820379b34e8 Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents: 110
diff changeset
571 try:
3820379b34e8 Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents: 110
diff changeset
572 dex_dst.find_class_name(classname)
3820379b34e8 Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents: 110
diff changeset
573 except ValueError:
3820379b34e8 Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents: 110
diff changeset
574 return True
3820379b34e8 Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents: 110
diff changeset
575 return False
3820379b34e8 Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents: 110
diff changeset
576
150
1eb1b2ca5de4 Use classdef_rel_set to carry relative information.
Thinker K.F. Li <thinker@codemud.net>
parents: 149
diff changeset
577 rel_set = collect_classdefs_relative(dex_src, classdefs)
111
3820379b34e8 Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents: 110
diff changeset
578
150
1eb1b2ca5de4 Use classdef_rel_set to carry relative information.
Thinker K.F. Li <thinker@codemud.net>
parents: 149
diff changeset
579 for classdef in rel_set.classdefs:
115
d112c27f657a Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents: 114
diff changeset
580 if classdef_not_in_dst(classdef):
d112c27f657a Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents: 114
diff changeset
581 continue
d112c27f657a Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents: 114
diff changeset
582 raise ValueError, '%s is already in DEX %s: can not insert it' % \
d112c27f657a Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents: 114
diff changeset
583 (repr(classdef), repr(dex_dst))
d112c27f657a Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents: 114
diff changeset
584
d112c27f657a Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents: 114
diff changeset
585 cloning_classdefs = \
150
1eb1b2ca5de4 Use classdef_rel_set to carry relative information.
Thinker K.F. Li <thinker@codemud.net>
parents: 149
diff changeset
586 dexfile_insert_classdefs(dex_dst, dex_src, rel_set.classdefs)
115
d112c27f657a Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents: 114
diff changeset
587 cloning_typeids = \
150
1eb1b2ca5de4 Use classdef_rel_set to carry relative information.
Thinker K.F. Li <thinker@codemud.net>
parents: 149
diff changeset
588 dexfile_insert_or_merge_typeids(dex_dst, dex_src, rel_set.typeids)
149
d4533a59c694 inject_classdefs() also inject relative _DEX_StringIds.
Thinker K.F. Li <thinker@codemud.net>
parents: 148
diff changeset
589 cloning_strids = \
150
1eb1b2ca5de4 Use classdef_rel_set to carry relative information.
Thinker K.F. Li <thinker@codemud.net>
parents: 149
diff changeset
590 dexfile_insert_stringids(dex_dst, dex_src, rel_set.strids)
152
bc213cb88636 Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents: 151
diff changeset
591 cloning_fieldids = \
bc213cb88636 Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents: 151
diff changeset
592 dexfile_insert_fieldids(dex_dst, dex_src, rel_set.fieldids)
111
3820379b34e8 Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents: 110
diff changeset
593
150
1eb1b2ca5de4 Use classdef_rel_set to carry relative information.
Thinker K.F. Li <thinker@codemud.net>
parents: 149
diff changeset
594 cloning = classdef_rel_set(cloning_classdefs, cloning_typeids,
152
bc213cb88636 Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents: 151
diff changeset
595 cloning_strids, cloning_fieldids)
150
1eb1b2ca5de4 Use classdef_rel_set to carry relative information.
Thinker K.F. Li <thinker@codemud.net>
parents: 149
diff changeset
596 return cloning
111
3820379b34e8 Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents: 110
diff changeset
597
3820379b34e8 Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents: 110
diff changeset
598
145
c4324c3461e8 Redirect string indices.
Thinker K.F. Li <thinker@codemud.net>
parents: 144
diff changeset
599 ## \brief Redirect types, methods and strings for the code of given method.
c4324c3461e8 Redirect string indices.
Thinker K.F. Li <thinker@codemud.net>
parents: 144
diff changeset
600 def method_redirect_indices(dex, method, typeidxs_redir, methods_redir,
152
bc213cb88636 Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents: 151
diff changeset
601 stridxs_redir, fieldidxs_redir):
104
61cef1662035 Redirect types
Thinker K.F. Li <thinker@codemud.net>
parents: 100
diff changeset
602 from paraspace.dalvik_opcodes import decode_insn_blk, all_opcodes
61cef1662035 Redirect types
Thinker K.F. Li <thinker@codemud.net>
parents: 100
diff changeset
603 from paraspace.dalvik_opcodes import encode_opcode_vectors
61cef1662035 Redirect types
Thinker K.F. Li <thinker@codemud.net>
parents: 100
diff changeset
604 from paraspace.dexfile import DEXFile_linked
61cef1662035 Redirect types
Thinker K.F. Li <thinker@codemud.net>
parents: 100
diff changeset
605
61cef1662035 Redirect types
Thinker K.F. Li <thinker@codemud.net>
parents: 100
diff changeset
606 if not method.codeOffRef.is_true:
61cef1662035 Redirect types
Thinker K.F. Li <thinker@codemud.net>
parents: 100
diff changeset
607 return
61cef1662035 Redirect types
Thinker K.F. Li <thinker@codemud.net>
parents: 100
diff changeset
608
61cef1662035 Redirect types
Thinker K.F. Li <thinker@codemud.net>
parents: 100
diff changeset
609 code = method.codeOffRef.value
61cef1662035 Redirect types
Thinker K.F. Li <thinker@codemud.net>
parents: 100
diff changeset
610 insns_blk = code.insns.data
61cef1662035 Redirect types
Thinker K.F. Li <thinker@codemud.net>
parents: 100
diff changeset
611 op_vectors = decode_insn_blk(insns_blk)
61cef1662035 Redirect types
Thinker K.F. Li <thinker@codemud.net>
parents: 100
diff changeset
612
154
c659b8c7d6cb Use right opcode formats
Thinker K.F. Li <thinker@codemud.net>
parents: 152
diff changeset
613 field2_opcodes = set([all_opcodes.OP_IGET,
152
bc213cb88636 Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents: 151
diff changeset
614 all_opcodes.OP_IGET_WIDE,
bc213cb88636 Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents: 151
diff changeset
615 all_opcodes.OP_IGET_OBJECT,
bc213cb88636 Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents: 151
diff changeset
616 all_opcodes.OP_IGET_BOOLEAN,
bc213cb88636 Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents: 151
diff changeset
617 all_opcodes.OP_IGET_BYTE,
bc213cb88636 Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents: 151
diff changeset
618 all_opcodes.OP_IGET_CHAR,
bc213cb88636 Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents: 151
diff changeset
619 all_opcodes.OP_IGET_SHORT,
bc213cb88636 Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents: 151
diff changeset
620 all_opcodes.OP_IPUT,
bc213cb88636 Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents: 151
diff changeset
621 all_opcodes.OP_IPUT_WIDE,
bc213cb88636 Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents: 151
diff changeset
622 all_opcodes.OP_IPUT_OBJECT,
bc213cb88636 Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents: 151
diff changeset
623 all_opcodes.OP_IPUT_BOOLEAN,
bc213cb88636 Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents: 151
diff changeset
624 all_opcodes.OP_IPUT_BYTE,
bc213cb88636 Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents: 151
diff changeset
625 all_opcodes.OP_IPUT_CHAR,
154
c659b8c7d6cb Use right opcode formats
Thinker K.F. Li <thinker@codemud.net>
parents: 152
diff changeset
626 all_opcodes.OP_IPUT_SHORT])
c659b8c7d6cb Use right opcode formats
Thinker K.F. Li <thinker@codemud.net>
parents: 152
diff changeset
627
c659b8c7d6cb Use right opcode formats
Thinker K.F. Li <thinker@codemud.net>
parents: 152
diff changeset
628 field1_opcodes = set([all_opcodes.OP_SGET,
c659b8c7d6cb Use right opcode formats
Thinker K.F. Li <thinker@codemud.net>
parents: 152
diff changeset
629 all_opcodes.OP_SGET_WIDE,
c659b8c7d6cb Use right opcode formats
Thinker K.F. Li <thinker@codemud.net>
parents: 152
diff changeset
630 all_opcodes.OP_SGET_OBJECT,
c659b8c7d6cb Use right opcode formats
Thinker K.F. Li <thinker@codemud.net>
parents: 152
diff changeset
631 all_opcodes.OP_SGET_BOOLEAN,
c659b8c7d6cb Use right opcode formats
Thinker K.F. Li <thinker@codemud.net>
parents: 152
diff changeset
632 all_opcodes.OP_SGET_BYTE,
c659b8c7d6cb Use right opcode formats
Thinker K.F. Li <thinker@codemud.net>
parents: 152
diff changeset
633 all_opcodes.OP_SGET_CHAR,
c659b8c7d6cb Use right opcode formats
Thinker K.F. Li <thinker@codemud.net>
parents: 152
diff changeset
634 all_opcodes.OP_SGET_SHORT,
c659b8c7d6cb Use right opcode formats
Thinker K.F. Li <thinker@codemud.net>
parents: 152
diff changeset
635 all_opcodes.OP_SPUT,
c659b8c7d6cb Use right opcode formats
Thinker K.F. Li <thinker@codemud.net>
parents: 152
diff changeset
636 all_opcodes.OP_SPUT_WIDE,
c659b8c7d6cb Use right opcode formats
Thinker K.F. Li <thinker@codemud.net>
parents: 152
diff changeset
637 all_opcodes.OP_SPUT_OBJECT,
c659b8c7d6cb Use right opcode formats
Thinker K.F. Li <thinker@codemud.net>
parents: 152
diff changeset
638 all_opcodes.OP_SPUT_BOOLEAN,
c659b8c7d6cb Use right opcode formats
Thinker K.F. Li <thinker@codemud.net>
parents: 152
diff changeset
639 all_opcodes.OP_SPUT_BYTE,
c659b8c7d6cb Use right opcode formats
Thinker K.F. Li <thinker@codemud.net>
parents: 152
diff changeset
640 all_opcodes.OP_SPUT_CHAR,
c659b8c7d6cb Use right opcode formats
Thinker K.F. Li <thinker@codemud.net>
parents: 152
diff changeset
641 all_opcodes.OP_SPUT_SHORT])
c659b8c7d6cb Use right opcode formats
Thinker K.F. Li <thinker@codemud.net>
parents: 152
diff changeset
642
104
61cef1662035 Redirect types
Thinker K.F. Li <thinker@codemud.net>
parents: 100
diff changeset
643 def redirect(opcode, args):
61cef1662035 Redirect types
Thinker K.F. Li <thinker@codemud.net>
parents: 100
diff changeset
644 if opcode == all_opcodes.OP_NEW_INSTANCE:
61cef1662035 Redirect types
Thinker K.F. Li <thinker@codemud.net>
parents: 100
diff changeset
645 typeidx = args[1]
115
d112c27f657a Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents: 114
diff changeset
646 if typeidx in typeidxs_redir:
d112c27f657a Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents: 114
diff changeset
647 to_type = typeidxs_redir[typeidx]
104
61cef1662035 Redirect types
Thinker K.F. Li <thinker@codemud.net>
parents: 100
diff changeset
648 return opcode, (args[0], to_type)
61cef1662035 Redirect types
Thinker K.F. Li <thinker@codemud.net>
parents: 100
diff changeset
649 pass
115
d112c27f657a Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents: 114
diff changeset
650 elif opcode in (all_opcodes.OP_INVOKE_DIRECT,
d112c27f657a Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents: 114
diff changeset
651 all_opcodes.OP_INVOKE_VIRTUAL,
d112c27f657a Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents: 114
diff changeset
652 all_opcodes.OP_INVOKE_SUPER,
d112c27f657a Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents: 114
diff changeset
653 all_opcodes.OP_INVOKE_STATIC,
d112c27f657a Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents: 114
diff changeset
654 all_opcodes.OP_INVOKE_INTERFACE):
104
61cef1662035 Redirect types
Thinker K.F. Li <thinker@codemud.net>
parents: 100
diff changeset
655 methodidx = args[2]
108
18be67af7f1e Use method redirection map for defining redirection
Thinker K.F. Li <thinker@codemud.net>
parents: 107
diff changeset
656 if methodidx not in methods_redir:
18be67af7f1e Use method redirection map for defining redirection
Thinker K.F. Li <thinker@codemud.net>
parents: 107
diff changeset
657 return opcode, args
18be67af7f1e Use method redirection map for defining redirection
Thinker K.F. Li <thinker@codemud.net>
parents: 107
diff changeset
658
18be67af7f1e Use method redirection map for defining redirection
Thinker K.F. Li <thinker@codemud.net>
parents: 107
diff changeset
659 return opcode, (args[0], args[1], methods_redir[methodidx],
18be67af7f1e Use method redirection map for defining redirection
Thinker K.F. Li <thinker@codemud.net>
parents: 107
diff changeset
660 args[3], args[4], args[5], args[6])
115
d112c27f657a Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents: 114
diff changeset
661 elif opcode in (all_opcodes.OP_INVOKE_VIRTUAL_RANGE,
d112c27f657a Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents: 114
diff changeset
662 all_opcodes.OP_INVOKE_DIRECT_RANGE,
d112c27f657a Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents: 114
diff changeset
663 all_opcodes.OP_INVOKE_SUPER_RANGE,
d112c27f657a Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents: 114
diff changeset
664 all_opcodes.OP_INVOKE_STATIC_RANGE,
d112c27f657a Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents: 114
diff changeset
665 all_opcodes.OP_INVOKE_INTERFACE_RANGE):
d112c27f657a Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents: 114
diff changeset
666 methodidx = args[1]
d112c27f657a Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents: 114
diff changeset
667 if methodidx not in methods_redir:
d112c27f657a Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents: 114
diff changeset
668 return opcode, args
d112c27f657a Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents: 114
diff changeset
669
138
372009418896 Fix bug of redirect methodid for XXX_RANGE istructions
Thinker K.F. Li <thinker@codemud.net>
parents: 137
diff changeset
670 return opcode, (args[0], methods_redir[methodidx], args[2])
145
c4324c3461e8 Redirect string indices.
Thinker K.F. Li <thinker@codemud.net>
parents: 144
diff changeset
671 elif opcode == all_opcodes.OP_CONST_STRING:
c4324c3461e8 Redirect string indices.
Thinker K.F. Li <thinker@codemud.net>
parents: 144
diff changeset
672 stridx = args[1]
c4324c3461e8 Redirect string indices.
Thinker K.F. Li <thinker@codemud.net>
parents: 144
diff changeset
673 if stridx not in stridxs_redir:
c4324c3461e8 Redirect string indices.
Thinker K.F. Li <thinker@codemud.net>
parents: 144
diff changeset
674 return opcode, args
c4324c3461e8 Redirect string indices.
Thinker K.F. Li <thinker@codemud.net>
parents: 144
diff changeset
675
c4324c3461e8 Redirect string indices.
Thinker K.F. Li <thinker@codemud.net>
parents: 144
diff changeset
676 return opcode, (args[0], stridxs_redir[stridx])
154
c659b8c7d6cb Use right opcode formats
Thinker K.F. Li <thinker@codemud.net>
parents: 152
diff changeset
677 elif opcode in field2_opcodes:
152
bc213cb88636 Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents: 151
diff changeset
678 fieldidx = args[2]
bc213cb88636 Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents: 151
diff changeset
679 if fieldidx not in fieldidxs_redir:
bc213cb88636 Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents: 151
diff changeset
680 return opcode, args
bc213cb88636 Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents: 151
diff changeset
681 return opcode, (args[0], args[1], fieldidxs_redir[fieldidx])
154
c659b8c7d6cb Use right opcode formats
Thinker K.F. Li <thinker@codemud.net>
parents: 152
diff changeset
682 elif opcode in field1_opcodes:
c659b8c7d6cb Use right opcode formats
Thinker K.F. Li <thinker@codemud.net>
parents: 152
diff changeset
683 fieldidx = args[1]
c659b8c7d6cb Use right opcode formats
Thinker K.F. Li <thinker@codemud.net>
parents: 152
diff changeset
684 if fieldidx not in fieldidxs_redir:
c659b8c7d6cb Use right opcode formats
Thinker K.F. Li <thinker@codemud.net>
parents: 152
diff changeset
685 return opcode, args
c659b8c7d6cb Use right opcode formats
Thinker K.F. Li <thinker@codemud.net>
parents: 152
diff changeset
686 return opcode, (args[0], fieldidxs_redir[fieldidx])
104
61cef1662035 Redirect types
Thinker K.F. Li <thinker@codemud.net>
parents: 100
diff changeset
687 return opcode, args
61cef1662035 Redirect types
Thinker K.F. Li <thinker@codemud.net>
parents: 100
diff changeset
688
61cef1662035 Redirect types
Thinker K.F. Li <thinker@codemud.net>
parents: 100
diff changeset
689 new_op_vectors = [redirect(opcode, args) for opcode, args in op_vectors]
61cef1662035 Redirect types
Thinker K.F. Li <thinker@codemud.net>
parents: 100
diff changeset
690 new_insns_blk = encode_opcode_vectors(new_op_vectors)
61cef1662035 Redirect types
Thinker K.F. Li <thinker@codemud.net>
parents: 100
diff changeset
691
61cef1662035 Redirect types
Thinker K.F. Li <thinker@codemud.net>
parents: 100
diff changeset
692 code.insns.data = new_insns_blk
61cef1662035 Redirect types
Thinker K.F. Li <thinker@codemud.net>
parents: 100
diff changeset
693 pass
61cef1662035 Redirect types
Thinker K.F. Li <thinker@codemud.net>
parents: 100
diff changeset
694
61cef1662035 Redirect types
Thinker K.F. Li <thinker@codemud.net>
parents: 100
diff changeset
695
108
18be67af7f1e Use method redirection map for defining redirection
Thinker K.F. Li <thinker@codemud.net>
parents: 107
diff changeset
696 ## \brief Make a map for methods from source type ID to ones from desinate.
18be67af7f1e Use method redirection map for defining redirection
Thinker K.F. Li <thinker@codemud.net>
parents: 107
diff changeset
697 def make_redir_classes_methods_map(dex_src, typeid_src,
18be67af7f1e Use method redirection map for defining redirection
Thinker K.F. Li <thinker@codemud.net>
parents: 107
diff changeset
698 dex_dst, typeid_dst):
18be67af7f1e Use method redirection map for defining redirection
Thinker K.F. Li <thinker@codemud.net>
parents: 107
diff changeset
699 from paraspace.dexfile import DEXFile_linked
18be67af7f1e Use method redirection map for defining redirection
Thinker K.F. Li <thinker@codemud.net>
parents: 107
diff changeset
700
18be67af7f1e Use method redirection map for defining redirection
Thinker K.F. Li <thinker@codemud.net>
parents: 107
diff changeset
701 methods_src = [(idx, methodid)
18be67af7f1e Use method redirection map for defining redirection
Thinker K.F. Li <thinker@codemud.net>
parents: 107
diff changeset
702 for idx, methodid in enumerate(dex_src.methodIds.items)
18be67af7f1e Use method redirection map for defining redirection
Thinker K.F. Li <thinker@codemud.net>
parents: 107
diff changeset
703 if methodid.classIdx == typeid_src]
18be67af7f1e Use method redirection map for defining redirection
Thinker K.F. Li <thinker@codemud.net>
parents: 107
diff changeset
704
18be67af7f1e Use method redirection map for defining redirection
Thinker K.F. Li <thinker@codemud.net>
parents: 107
diff changeset
705 def make_map_methodid(methodid_src):
18be67af7f1e Use method redirection map for defining redirection
Thinker K.F. Li <thinker@codemud.net>
parents: 107
diff changeset
706 name = DEXFile_linked.get_methodid_name(methodid_src)
18be67af7f1e Use method redirection map for defining redirection
Thinker K.F. Li <thinker@codemud.net>
parents: 107
diff changeset
707 proto = methodid_src.protoIdx
18be67af7f1e Use method redirection map for defining redirection
Thinker K.F. Li <thinker@codemud.net>
parents: 107
diff changeset
708 try:
18be67af7f1e Use method redirection map for defining redirection
Thinker K.F. Li <thinker@codemud.net>
parents: 107
diff changeset
709 methodid_dst = \
18be67af7f1e Use method redirection map for defining redirection
Thinker K.F. Li <thinker@codemud.net>
parents: 107
diff changeset
710 dex_dst.find_methodid_name_proto(name, proto, typeid_dst)
18be67af7f1e Use method redirection map for defining redirection
Thinker K.F. Li <thinker@codemud.net>
parents: 107
diff changeset
711 except ValueError:
18be67af7f1e Use method redirection map for defining redirection
Thinker K.F. Li <thinker@codemud.net>
parents: 107
diff changeset
712 return -1
18be67af7f1e Use method redirection map for defining redirection
Thinker K.F. Li <thinker@codemud.net>
parents: 107
diff changeset
713 methodidx_dst = dex_dst.get_idx_methodid(methodid_dst)
18be67af7f1e Use method redirection map for defining redirection
Thinker K.F. Li <thinker@codemud.net>
parents: 107
diff changeset
714 return methodidx_dst
18be67af7f1e Use method redirection map for defining redirection
Thinker K.F. Li <thinker@codemud.net>
parents: 107
diff changeset
715
18be67af7f1e Use method redirection map for defining redirection
Thinker K.F. Li <thinker@codemud.net>
parents: 107
diff changeset
716 methods_map = [(methodidx_src, make_map_methodid(methodid_src))
18be67af7f1e Use method redirection map for defining redirection
Thinker K.F. Li <thinker@codemud.net>
parents: 107
diff changeset
717 for methodidx_src, methodid_src in methods_src]
18be67af7f1e Use method redirection map for defining redirection
Thinker K.F. Li <thinker@codemud.net>
parents: 107
diff changeset
718 methods_map = [(methodidx_src, methodidx_dst)
18be67af7f1e Use method redirection map for defining redirection
Thinker K.F. Li <thinker@codemud.net>
parents: 107
diff changeset
719 for methodidx_src, methodidx_dst in methods_map
18be67af7f1e Use method redirection map for defining redirection
Thinker K.F. Li <thinker@codemud.net>
parents: 107
diff changeset
720 if methodidx_dst != -1]
18be67af7f1e Use method redirection map for defining redirection
Thinker K.F. Li <thinker@codemud.net>
parents: 107
diff changeset
721 methods_map = dict(methods_map)
18be67af7f1e Use method redirection map for defining redirection
Thinker K.F. Li <thinker@codemud.net>
parents: 107
diff changeset
722 return methods_map
18be67af7f1e Use method redirection map for defining redirection
Thinker K.F. Li <thinker@codemud.net>
parents: 107
diff changeset
723
18be67af7f1e Use method redirection map for defining redirection
Thinker K.F. Li <thinker@codemud.net>
parents: 107
diff changeset
724
18be67af7f1e Use method redirection map for defining redirection
Thinker K.F. Li <thinker@codemud.net>
parents: 107
diff changeset
725 ## \brief Redirect types and methods mentioned in the code of a class.
18be67af7f1e Use method redirection map for defining redirection
Thinker K.F. Li <thinker@codemud.net>
parents: 107
diff changeset
726 #
18be67af7f1e Use method redirection map for defining redirection
Thinker K.F. Li <thinker@codemud.net>
parents: 107
diff changeset
727 # For code of given class definition, Every mentions of types and
115
d112c27f657a Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents: 114
diff changeset
728 # methods are rewrote to types and methods according typeidxs_redir and
108
18be67af7f1e Use method redirection map for defining redirection
Thinker K.F. Li <thinker@codemud.net>
parents: 107
diff changeset
729 # methods_redir respectively.
18be67af7f1e Use method redirection map for defining redirection
Thinker K.F. Li <thinker@codemud.net>
parents: 107
diff changeset
730 #
18be67af7f1e Use method redirection map for defining redirection
Thinker K.F. Li <thinker@codemud.net>
parents: 107
diff changeset
731 # \param dex is a DEXFile_linked.
18be67af7f1e Use method redirection map for defining redirection
Thinker K.F. Li <thinker@codemud.net>
parents: 107
diff changeset
732 # \param classdef is a class definition.
115
d112c27f657a Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents: 114
diff changeset
733 # \param typeidxs_redir is a map of types.
152
bc213cb88636 Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents: 151
diff changeset
734 # \param methods_redir is a map of methods.
145
c4324c3461e8 Redirect string indices.
Thinker K.F. Li <thinker@codemud.net>
parents: 144
diff changeset
735 # \param stridxs_redir is a map of strings.
152
bc213cb88636 Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents: 151
diff changeset
736 # \param fieldidxs_redir is a map of fields.
108
18be67af7f1e Use method redirection map for defining redirection
Thinker K.F. Li <thinker@codemud.net>
parents: 107
diff changeset
737 #
145
c4324c3461e8 Redirect string indices.
Thinker K.F. Li <thinker@codemud.net>
parents: 144
diff changeset
738 def class_redirect_indices(dex, classdef, typeidxs_redir, methods_redir,
152
bc213cb88636 Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents: 151
diff changeset
739 stridxs_redir, fieldidxs_redir):
104
61cef1662035 Redirect types
Thinker K.F. Li <thinker@codemud.net>
parents: 100
diff changeset
740 if not classdef.classDataOffRef.is_true:
61cef1662035 Redirect types
Thinker K.F. Li <thinker@codemud.net>
parents: 100
diff changeset
741 return
61cef1662035 Redirect types
Thinker K.F. Li <thinker@codemud.net>
parents: 100
diff changeset
742
61cef1662035 Redirect types
Thinker K.F. Li <thinker@codemud.net>
parents: 100
diff changeset
743 classdata = classdef.classDataOffRef.value
61cef1662035 Redirect types
Thinker K.F. Li <thinker@codemud.net>
parents: 100
diff changeset
744 for method in classdata.directMethods.items:
145
c4324c3461e8 Redirect string indices.
Thinker K.F. Li <thinker@codemud.net>
parents: 144
diff changeset
745 method_redirect_indices(dex, method, typeidxs_redir, methods_redir,
152
bc213cb88636 Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents: 151
diff changeset
746 stridxs_redir, fieldidxs_redir)
104
61cef1662035 Redirect types
Thinker K.F. Li <thinker@codemud.net>
parents: 100
diff changeset
747 pass
61cef1662035 Redirect types
Thinker K.F. Li <thinker@codemud.net>
parents: 100
diff changeset
748 for method in classdata.virtualMethods.items:
145
c4324c3461e8 Redirect string indices.
Thinker K.F. Li <thinker@codemud.net>
parents: 144
diff changeset
749 method_redirect_indices(dex, method, typeidxs_redir, methods_redir,
152
bc213cb88636 Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents: 151
diff changeset
750 stridxs_redir, fieldidxs_redir)
104
61cef1662035 Redirect types
Thinker K.F. Li <thinker@codemud.net>
parents: 100
diff changeset
751 pass
61cef1662035 Redirect types
Thinker K.F. Li <thinker@codemud.net>
parents: 100
diff changeset
752 pass
61cef1662035 Redirect types
Thinker K.F. Li <thinker@codemud.net>
parents: 100
diff changeset
753
61cef1662035 Redirect types
Thinker K.F. Li <thinker@codemud.net>
parents: 100
diff changeset
754
108
18be67af7f1e Use method redirection map for defining redirection
Thinker K.F. Li <thinker@codemud.net>
parents: 107
diff changeset
755 ## \brief Make a map to map methods from source types to destinate types.
18be67af7f1e Use method redirection map for defining redirection
Thinker K.F. Li <thinker@codemud.net>
parents: 107
diff changeset
756 #
18be67af7f1e Use method redirection map for defining redirection
Thinker K.F. Li <thinker@codemud.net>
parents: 107
diff changeset
757 # This function create a map to map methods from source types to
115
d112c27f657a Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents: 114
diff changeset
758 # methods from destinate types in \ref typeidxs_redir.
108
18be67af7f1e Use method redirection map for defining redirection
Thinker K.F. Li <thinker@codemud.net>
parents: 107
diff changeset
759 #
119
4f508f84c8a1 Add inject_redir.py example
Thinker K.F. Li <thinker@codemud.net>
parents: 115
diff changeset
760 # \param dex_src is a DEXFile_linked that owns source types.
4f508f84c8a1 Add inject_redir.py example
Thinker K.F. Li <thinker@codemud.net>
parents: 115
diff changeset
761 # \param dex_dst is a DEXFile_linked that owns destinate types.
115
d112c27f657a Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents: 114
diff changeset
762 # \param typeidxs_redir is a map of type indices for redirecting types.
108
18be67af7f1e Use method redirection map for defining redirection
Thinker K.F. Li <thinker@codemud.net>
parents: 107
diff changeset
763 # \return a map of method indices.
18be67af7f1e Use method redirection map for defining redirection
Thinker K.F. Li <thinker@codemud.net>
parents: 107
diff changeset
764 #
115
d112c27f657a Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents: 114
diff changeset
765 def make_methodidxs_redir_map(dex_src, dex_dst, typeidxs_redir):
108
18be67af7f1e Use method redirection map for defining redirection
Thinker K.F. Li <thinker@codemud.net>
parents: 107
diff changeset
766 methods_map = {}
115
d112c27f657a Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents: 114
diff changeset
767 for typeidx_src, typeidx_dst in typeidxs_redir.items():
113
ee13c86d84f2 Let user specify redirection map for methods
Thinker K.F. Li <thinker@codemud.net>
parents: 112
diff changeset
768 typeid_src = dex_src.find_typeid_idx(typeidx_src)
ee13c86d84f2 Let user specify redirection map for methods
Thinker K.F. Li <thinker@codemud.net>
parents: 112
diff changeset
769 typeid_dst = dex_dst.find_typeid_idx(typeidx_dst)
ee13c86d84f2 Let user specify redirection map for methods
Thinker K.F. Li <thinker@codemud.net>
parents: 112
diff changeset
770 class_methods_map = make_redir_classes_methods_map(dex_src,
108
18be67af7f1e Use method redirection map for defining redirection
Thinker K.F. Li <thinker@codemud.net>
parents: 107
diff changeset
771 typeid_src,
113
ee13c86d84f2 Let user specify redirection map for methods
Thinker K.F. Li <thinker@codemud.net>
parents: 112
diff changeset
772 dex_dst,
108
18be67af7f1e Use method redirection map for defining redirection
Thinker K.F. Li <thinker@codemud.net>
parents: 107
diff changeset
773 typeid_dst)
18be67af7f1e Use method redirection map for defining redirection
Thinker K.F. Li <thinker@codemud.net>
parents: 107
diff changeset
774 methods_map.update(class_methods_map)
18be67af7f1e Use method redirection map for defining redirection
Thinker K.F. Li <thinker@codemud.net>
parents: 107
diff changeset
775 pass
18be67af7f1e Use method redirection map for defining redirection
Thinker K.F. Li <thinker@codemud.net>
parents: 107
diff changeset
776 return methods_map
18be67af7f1e Use method redirection map for defining redirection
Thinker K.F. Li <thinker@codemud.net>
parents: 107
diff changeset
777
18be67af7f1e Use method redirection map for defining redirection
Thinker K.F. Li <thinker@codemud.net>
parents: 107
diff changeset
778
145
c4324c3461e8 Redirect string indices.
Thinker K.F. Li <thinker@codemud.net>
parents: 144
diff changeset
779 ## \brief Make a map to map string indices from source to destinate DEX.
c4324c3461e8 Redirect string indices.
Thinker K.F. Li <thinker@codemud.net>
parents: 144
diff changeset
780 #
c4324c3461e8 Redirect string indices.
Thinker K.F. Li <thinker@codemud.net>
parents: 144
diff changeset
781 # \param dex_src is soruce of the mapping.
c4324c3461e8 Redirect string indices.
Thinker K.F. Li <thinker@codemud.net>
parents: 144
diff changeset
782 # \param dex_dst is destination of the mapping.
c4324c3461e8 Redirect string indices.
Thinker K.F. Li <thinker@codemud.net>
parents: 144
diff changeset
783 # \param classdefs is _DEX_ClassDefs from dex_src.
c4324c3461e8 Redirect string indices.
Thinker K.F. Li <thinker@codemud.net>
parents: 144
diff changeset
784 # \return a mapping for string indices.
c4324c3461e8 Redirect string indices.
Thinker K.F. Li <thinker@codemud.net>
parents: 144
diff changeset
785 #
c4324c3461e8 Redirect string indices.
Thinker K.F. Li <thinker@codemud.net>
parents: 144
diff changeset
786 def make_stridxs_redir_map(dex_src, dex_dst):
c4324c3461e8 Redirect string indices.
Thinker K.F. Li <thinker@codemud.net>
parents: 144
diff changeset
787 stridxs_map = {}
c4324c3461e8 Redirect string indices.
Thinker K.F. Li <thinker@codemud.net>
parents: 144
diff changeset
788 for idx, strid in enumerate(dex_src.stringIds.items):
c4324c3461e8 Redirect string indices.
Thinker K.F. Li <thinker@codemud.net>
parents: 144
diff changeset
789 try:
c4324c3461e8 Redirect string indices.
Thinker K.F. Li <thinker@codemud.net>
parents: 144
diff changeset
790 tgt_idx = dex_dst.stringIds.items.index(strid)
c4324c3461e8 Redirect string indices.
Thinker K.F. Li <thinker@codemud.net>
parents: 144
diff changeset
791 except ValueError:
c4324c3461e8 Redirect string indices.
Thinker K.F. Li <thinker@codemud.net>
parents: 144
diff changeset
792 continue
c4324c3461e8 Redirect string indices.
Thinker K.F. Li <thinker@codemud.net>
parents: 144
diff changeset
793 stridxs_map[idx] = tgt_idx
c4324c3461e8 Redirect string indices.
Thinker K.F. Li <thinker@codemud.net>
parents: 144
diff changeset
794 pass
c4324c3461e8 Redirect string indices.
Thinker K.F. Li <thinker@codemud.net>
parents: 144
diff changeset
795 return stridxs_map
c4324c3461e8 Redirect string indices.
Thinker K.F. Li <thinker@codemud.net>
parents: 144
diff changeset
796
c4324c3461e8 Redirect string indices.
Thinker K.F. Li <thinker@codemud.net>
parents: 144
diff changeset
797
152
bc213cb88636 Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents: 151
diff changeset
798 def make_fieldidxs_redir_map(dex_src, dex_dst):
bc213cb88636 Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents: 151
diff changeset
799 fieldidxs_map = {}
bc213cb88636 Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents: 151
diff changeset
800 for idx, fieldid in enumerate(dex_src.fieldIds.items):
bc213cb88636 Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents: 151
diff changeset
801 try:
bc213cb88636 Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents: 151
diff changeset
802 tgt_idx = dex_dst.fieldIds.items.index(fieldid)
bc213cb88636 Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents: 151
diff changeset
803 except ValueError:
bc213cb88636 Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents: 151
diff changeset
804 continue
bc213cb88636 Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents: 151
diff changeset
805 fieldidxs_map[idx] = tgt_idx
bc213cb88636 Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents: 151
diff changeset
806 pass
bc213cb88636 Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents: 151
diff changeset
807 return fieldidxs_map
bc213cb88636 Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents: 151
diff changeset
808
bc213cb88636 Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents: 151
diff changeset
809
108
18be67af7f1e Use method redirection map for defining redirection
Thinker K.F. Li <thinker@codemud.net>
parents: 107
diff changeset
810 ## \biref Redirect types of all code in given DEXFile_linked.
145
c4324c3461e8 Redirect string indices.
Thinker K.F. Li <thinker@codemud.net>
parents: 144
diff changeset
811 def dexfile_redirect_indices(dex, typeidxs_redir, methods_redir, stridxs_redir,
152
bc213cb88636 Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents: 151
diff changeset
812 fieldidxs_redir, excludes=set([])):
104
61cef1662035 Redirect types
Thinker K.F. Li <thinker@codemud.net>
parents: 100
diff changeset
813 for classdef in dex.classDefs.items:
61cef1662035 Redirect types
Thinker K.F. Li <thinker@codemud.net>
parents: 100
diff changeset
814 typeid = classdef.classIdx
105
f14c32108164 Test dexfile_redirect_types
Thinker K.F. Li <thinker@codemud.net>
parents: 104
diff changeset
815 idx = dex.get_idx_typeid(typeid)
104
61cef1662035 Redirect types
Thinker K.F. Li <thinker@codemud.net>
parents: 100
diff changeset
816 if idx in excludes:
61cef1662035 Redirect types
Thinker K.F. Li <thinker@codemud.net>
parents: 100
diff changeset
817 continue
145
c4324c3461e8 Redirect string indices.
Thinker K.F. Li <thinker@codemud.net>
parents: 144
diff changeset
818 class_redirect_indices(dex, classdef, typeidxs_redir, methods_redir,
152
bc213cb88636 Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents: 151
diff changeset
819 stridxs_redir, fieldidxs_redir)
115
d112c27f657a Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents: 114
diff changeset
820 pass
d112c27f657a Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents: 114
diff changeset
821 pass
d112c27f657a Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents: 114
diff changeset
822
d112c27f657a Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents: 114
diff changeset
823
d112c27f657a Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents: 114
diff changeset
824 ## \brief Redirect types for code of types specified by given indices.
145
c4324c3461e8 Redirect string indices.
Thinker K.F. Li <thinker@codemud.net>
parents: 144
diff changeset
825 def dexfile_redirect_indices_typeidxs(dex, typeidxs_redir, methodidxs_redir,
152
bc213cb88636 Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents: 151
diff changeset
826 stridxs_redir, fieldidxs_redir,
bc213cb88636 Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents: 151
diff changeset
827 typeidxs):
115
d112c27f657a Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents: 114
diff changeset
828 typeidxs = set(typeidxs)
d112c27f657a Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents: 114
diff changeset
829 for classdef in dex.classDefs.items:
d112c27f657a Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents: 114
diff changeset
830 typeid = classdef.classIdx
d112c27f657a Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents: 114
diff changeset
831 idx = dex.get_idx_typeid(typeid)
d112c27f657a Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents: 114
diff changeset
832 if idx not in typeidxs:
d112c27f657a Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents: 114
diff changeset
833 continue
145
c4324c3461e8 Redirect string indices.
Thinker K.F. Li <thinker@codemud.net>
parents: 144
diff changeset
834 class_redirect_indices(dex, classdef, typeidxs_redir,
152
bc213cb88636 Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents: 151
diff changeset
835 methodidxs_redir, stridxs_redir,
bc213cb88636 Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents: 151
diff changeset
836 fieldidxs_redir)
104
61cef1662035 Redirect types
Thinker K.F. Li <thinker@codemud.net>
parents: 100
diff changeset
837 pass
61cef1662035 Redirect types
Thinker K.F. Li <thinker@codemud.net>
parents: 100
diff changeset
838 pass
109
835336632aba Add collect_typeidxs_in_method()
Thinker K.F. Li <thinker@codemud.net>
parents: 108
diff changeset
839
835336632aba Add collect_typeidxs_in_method()
Thinker K.F. Li <thinker@codemud.net>
parents: 108
diff changeset
840
115
d112c27f657a Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents: 114
diff changeset
841 ## \brief Make a mapping for type indices of injection.
d112c27f657a Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents: 114
diff changeset
842 def make_typeidxs_map_after_injection(dex_dst, dex_src,
d112c27f657a Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents: 114
diff changeset
843 relative_classdefs,
d112c27f657a Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents: 114
diff changeset
844 relative_typeids):
d112c27f657a Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents: 114
diff changeset
845 from paraspace.dexfile import DEXFile_linked
d112c27f657a Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents: 114
diff changeset
846
d112c27f657a Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents: 114
diff changeset
847 def map_src_dst_typeid(typeid):
d112c27f657a Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents: 114
diff changeset
848 idx_src = dex_src.get_idx_typeid(typeid)
d112c27f657a Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents: 114
diff changeset
849 typename = DEXFile_linked.get_typeid_name(typeid)
d112c27f657a Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents: 114
diff changeset
850 typeid_dst = dex_dst.find_typeid_name(typename)
d112c27f657a Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents: 114
diff changeset
851 idx_dst = dex_dst.get_idx_typeid(typeid_dst)
d112c27f657a Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents: 114
diff changeset
852 dex_dst.find_typeid_idx(idx_dst)
d112c27f657a Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents: 114
diff changeset
853 return idx_src, idx_dst
d112c27f657a Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents: 114
diff changeset
854
d112c27f657a Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents: 114
diff changeset
855 def map_src_dst_classdef(classdef):
d112c27f657a Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents: 114
diff changeset
856 typeid = classdef.classIdx
d112c27f657a Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents: 114
diff changeset
857 idx_src, idx_dst = map_src_dst_typeid(typeid)
d112c27f657a Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents: 114
diff changeset
858 return idx_src, idx_dst
d112c27f657a Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents: 114
diff changeset
859
d112c27f657a Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents: 114
diff changeset
860 typeidxs_classdefs = [map_src_dst_classdef(classdef)
d112c27f657a Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents: 114
diff changeset
861 for classdef in relative_classdefs]
d112c27f657a Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents: 114
diff changeset
862 typeidxs_typeids = [map_src_dst_typeid(typeid)
d112c27f657a Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents: 114
diff changeset
863 for typeid in relative_typeids]
d112c27f657a Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents: 114
diff changeset
864 typeidxs_map = dict(typeidxs_classdefs + typeidxs_typeids)
d112c27f657a Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents: 114
diff changeset
865 return typeidxs_map
d112c27f657a Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents: 114
diff changeset
866
d112c27f657a Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents: 114
diff changeset
867
d112c27f657a Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents: 114
diff changeset
868 ## \brief Redirect code for methods of injected classes.
d112c27f657a Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents: 114
diff changeset
869 def redirect_injected_code(dex_dst, dex_src, classdefs):
150
1eb1b2ca5de4 Use classdef_rel_set to carry relative information.
Thinker K.F. Li <thinker@codemud.net>
parents: 149
diff changeset
870 rel_set = collect_classdefs_relative(dex_src, classdefs)
115
d112c27f657a Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents: 114
diff changeset
871
d112c27f657a Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents: 114
diff changeset
872 typeidxs_redir = \
d112c27f657a Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents: 114
diff changeset
873 make_typeidxs_map_after_injection(dex_dst, dex_src, \
150
1eb1b2ca5de4 Use classdef_rel_set to carry relative information.
Thinker K.F. Li <thinker@codemud.net>
parents: 149
diff changeset
874 rel_set.classdefs, \
1eb1b2ca5de4 Use classdef_rel_set to carry relative information.
Thinker K.F. Li <thinker@codemud.net>
parents: 149
diff changeset
875 rel_set.typeids)
115
d112c27f657a Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents: 114
diff changeset
876 methodidxs_redir = \
d112c27f657a Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents: 114
diff changeset
877 make_methodidxs_redir_map(dex_src, dex_dst, typeidxs_redir)
145
c4324c3461e8 Redirect string indices.
Thinker K.F. Li <thinker@codemud.net>
parents: 144
diff changeset
878
c4324c3461e8 Redirect string indices.
Thinker K.F. Li <thinker@codemud.net>
parents: 144
diff changeset
879 stridxs_redir = \
c4324c3461e8 Redirect string indices.
Thinker K.F. Li <thinker@codemud.net>
parents: 144
diff changeset
880 make_stridxs_redir_map(dex_src, dex_dst)
152
bc213cb88636 Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents: 151
diff changeset
881
bc213cb88636 Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents: 151
diff changeset
882 fieldidxs_redir = \
bc213cb88636 Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents: 151
diff changeset
883 make_fieldidxs_redir_map(dex_src, dex_dst)
115
d112c27f657a Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents: 114
diff changeset
884
145
c4324c3461e8 Redirect string indices.
Thinker K.F. Li <thinker@codemud.net>
parents: 144
diff changeset
885 dexfile_redirect_indices_typeidxs(dex_dst, typeidxs_redir,
c4324c3461e8 Redirect string indices.
Thinker K.F. Li <thinker@codemud.net>
parents: 144
diff changeset
886 methodidxs_redir,
c4324c3461e8 Redirect string indices.
Thinker K.F. Li <thinker@codemud.net>
parents: 144
diff changeset
887 stridxs_redir,
152
bc213cb88636 Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents: 151
diff changeset
888 fieldidxs_redir,
145
c4324c3461e8 Redirect string indices.
Thinker K.F. Li <thinker@codemud.net>
parents: 144
diff changeset
889 typeidxs_redir.values())
115
d112c27f657a Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents: 114
diff changeset
890 pass
d112c27f657a Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents: 114
diff changeset
891
d112c27f657a Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents: 114
diff changeset
892
d112c27f657a Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents: 114
diff changeset
893 ## \brief Inject classes and relative information to a DEX file.
d112c27f657a Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents: 114
diff changeset
894 #
d112c27f657a Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents: 114
diff changeset
895 # \param dex_dst is a DEXFile_linked where to inject classes.
d112c27f657a Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents: 114
diff changeset
896 # \param dex_src is a DEXFile_linked where the class is from.
d112c27f657a Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents: 114
diff changeset
897 # \param classdefs is a list of _DEX_ClassDef instances from \ref dex_src.
d112c27f657a Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents: 114
diff changeset
898 # \return a list of _DEX_ClassDef instances for injection.
d112c27f657a Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents: 114
diff changeset
899 #
d112c27f657a Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents: 114
diff changeset
900 def inject_classdefs(dex_dst, dex_src, classdefs):
d112c27f657a Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents: 114
diff changeset
901 from paraspace.dexfile import DEXFile_linked
d112c27f657a Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents: 114
diff changeset
902
d112c27f657a Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents: 114
diff changeset
903 assert isinstance(classdefs, (list, tuple))
d112c27f657a Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents: 114
diff changeset
904 assert isinstance(dex_dst, DEXFile_linked)
d112c27f657a Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents: 114
diff changeset
905 assert isinstance(dex_src, DEXFile_linked)
d112c27f657a Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents: 114
diff changeset
906
150
1eb1b2ca5de4 Use classdef_rel_set to carry relative information.
Thinker K.F. Li <thinker@codemud.net>
parents: 149
diff changeset
907 rel_set = dexfile_insert_classdefs_relative(dex_dst, dex_src, classdefs)
115
d112c27f657a Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents: 114
diff changeset
908 redirect_injected_code(dex_dst, dex_src, classdefs)
150
1eb1b2ca5de4 Use classdef_rel_set to carry relative information.
Thinker K.F. Li <thinker@codemud.net>
parents: 149
diff changeset
909 return list(rel_set.classdefs)
131
044bfc415577 Fix issue of data map verification.
Thinker K.F. Li <thinker@codemud.net>
parents: 119
diff changeset
910
044bfc415577 Fix issue of data map verification.
Thinker K.F. Li <thinker@codemud.net>
parents: 119
diff changeset
911
145
c4324c3461e8 Redirect string indices.
Thinker K.F. Li <thinker@codemud.net>
parents: 144
diff changeset
912 ## \brief Redirect all references of given class and its methods.
c4324c3461e8 Redirect string indices.
Thinker K.F. Li <thinker@codemud.net>
parents: 144
diff changeset
913 #
c4324c3461e8 Redirect string indices.
Thinker K.F. Li <thinker@codemud.net>
parents: 144
diff changeset
914 # Redirect all references of given class and its methods to target class.
c4324c3461e8 Redirect string indices.
Thinker K.F. Li <thinker@codemud.net>
parents: 144
diff changeset
915 #
c4324c3461e8 Redirect string indices.
Thinker K.F. Li <thinker@codemud.net>
parents: 144
diff changeset
916 def redirect_type(dex, src_classname, tgt_classname, exclude_classnames):
c4324c3461e8 Redirect string indices.
Thinker K.F. Li <thinker@codemud.net>
parents: 144
diff changeset
917 src_typeid = dex.find_typeid_name(src_classname)
c4324c3461e8 Redirect string indices.
Thinker K.F. Li <thinker@codemud.net>
parents: 144
diff changeset
918 src_typeidx = dex.get_idx_typeid(src_typeid)
c4324c3461e8 Redirect string indices.
Thinker K.F. Li <thinker@codemud.net>
parents: 144
diff changeset
919 tgt_typeid = dex.find_typeid_name(tgt_classname)
c4324c3461e8 Redirect string indices.
Thinker K.F. Li <thinker@codemud.net>
parents: 144
diff changeset
920 tgt_typeidx = dex.get_idx_typeid(tgt_typeid)
c4324c3461e8 Redirect string indices.
Thinker K.F. Li <thinker@codemud.net>
parents: 144
diff changeset
921 typeidxs_redir = {src_typeidx: tgt_typeidx}
c4324c3461e8 Redirect string indices.
Thinker K.F. Li <thinker@codemud.net>
parents: 144
diff changeset
922
c4324c3461e8 Redirect string indices.
Thinker K.F. Li <thinker@codemud.net>
parents: 144
diff changeset
923 methodidxs_redir = \
c4324c3461e8 Redirect string indices.
Thinker K.F. Li <thinker@codemud.net>
parents: 144
diff changeset
924 make_methodidxs_redir_map(dex, dex, typeidxs_redir)
c4324c3461e8 Redirect string indices.
Thinker K.F. Li <thinker@codemud.net>
parents: 144
diff changeset
925
c4324c3461e8 Redirect string indices.
Thinker K.F. Li <thinker@codemud.net>
parents: 144
diff changeset
926 stridxs_redir = {}
152
bc213cb88636 Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents: 151
diff changeset
927 fieldidxs_redir = {}
145
c4324c3461e8 Redirect string indices.
Thinker K.F. Li <thinker@codemud.net>
parents: 144
diff changeset
928
c4324c3461e8 Redirect string indices.
Thinker K.F. Li <thinker@codemud.net>
parents: 144
diff changeset
929 ex_typeids = [dex.find_typeid_name(name)
c4324c3461e8 Redirect string indices.
Thinker K.F. Li <thinker@codemud.net>
parents: 144
diff changeset
930 for name in exclude_classnames]
c4324c3461e8 Redirect string indices.
Thinker K.F. Li <thinker@codemud.net>
parents: 144
diff changeset
931 ex_typeidxs = [dex.get_idx_typeid(typeid)
c4324c3461e8 Redirect string indices.
Thinker K.F. Li <thinker@codemud.net>
parents: 144
diff changeset
932 for typeid in ex_typeids]
c4324c3461e8 Redirect string indices.
Thinker K.F. Li <thinker@codemud.net>
parents: 144
diff changeset
933 dexfile_redirect_indices(dex, typeidxs_redir, methodidxs_redir,
152
bc213cb88636 Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents: 151
diff changeset
934 stridxs_redir, fieldidxs_redir,
bc213cb88636 Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents: 151
diff changeset
935 excludes=ex_typeidxs)
145
c4324c3461e8 Redirect string indices.
Thinker K.F. Li <thinker@codemud.net>
parents: 144
diff changeset
936 pass
c4324c3461e8 Redirect string indices.
Thinker K.F. Li <thinker@codemud.net>
parents: 144
diff changeset
937
c4324c3461e8 Redirect string indices.
Thinker K.F. Li <thinker@codemud.net>
parents: 144
diff changeset
938
131
044bfc415577 Fix issue of data map verification.
Thinker K.F. Li <thinker@codemud.net>
parents: 119
diff changeset
939 ## \brief Inject and redirect a _DEX_ClassDef from one linked to another.
044bfc415577 Fix issue of data map verification.
Thinker K.F. Li <thinker@codemud.net>
parents: 119
diff changeset
940 #
044bfc415577 Fix issue of data map verification.
Thinker K.F. Li <thinker@codemud.net>
parents: 119
diff changeset
941 # The _DEX_ClassDef given by inj_classname would be inserted to dst_linked,
044bfc415577 Fix issue of data map verification.
Thinker K.F. Li <thinker@codemud.net>
parents: 119
diff changeset
942 # and redirect all invoking of type, given by redir_classname, to
044bfc415577 Fix issue of data map verification.
Thinker K.F. Li <thinker@codemud.net>
parents: 119
diff changeset
943 # the injected one.
044bfc415577 Fix issue of data map verification.
Thinker K.F. Li <thinker@codemud.net>
parents: 119
diff changeset
944 #
135
b488ca519709 Make sure elements are absolute incremental for sorted arrays when injecting.
Thinker K.F. Li <thinker@codemud.net>
parents: 134
diff changeset
945 def inject_redir_no_restore(src_linked, inj_classname,
b488ca519709 Make sure elements are absolute incremental for sorted arrays when injecting.
Thinker K.F. Li <thinker@codemud.net>
parents: 134
diff changeset
946 dst_linked, redir_classname, decls):
131
044bfc415577 Fix issue of data map verification.
Thinker K.F. Li <thinker@codemud.net>
parents: 119
diff changeset
947 inj_classdef = src_linked.find_class_name(inj_classname)
044bfc415577 Fix issue of data map verification.
Thinker K.F. Li <thinker@codemud.net>
parents: 119
diff changeset
948 injected_classdefs = inject_classdefs(dst_linked, src_linked,
044bfc415577 Fix issue of data map verification.
Thinker K.F. Li <thinker@codemud.net>
parents: 119
diff changeset
949 [inj_classdef])
145
c4324c3461e8 Redirect string indices.
Thinker K.F. Li <thinker@codemud.net>
parents: 144
diff changeset
950 excludes = [dst_linked.get_classdef_name(classdef)
c4324c3461e8 Redirect string indices.
Thinker K.F. Li <thinker@codemud.net>
parents: 144
diff changeset
951 for classdef in injected_classdefs]
c4324c3461e8 Redirect string indices.
Thinker K.F. Li <thinker@codemud.net>
parents: 144
diff changeset
952 redirect_type(dst_linked, redir_classname, inj_classname, excludes)
135
b488ca519709 Make sure elements are absolute incremental for sorted arrays when injecting.
Thinker K.F. Li <thinker@codemud.net>
parents: 134
diff changeset
953 pass
b488ca519709 Make sure elements are absolute incremental for sorted arrays when injecting.
Thinker K.F. Li <thinker@codemud.net>
parents: 134
diff changeset
954
b488ca519709 Make sure elements are absolute incremental for sorted arrays when injecting.
Thinker K.F. Li <thinker@codemud.net>
parents: 134
diff changeset
955
137
987fead83ce3 Fix issue that dalvik complaining fail to verify code.
Thinker K.F. Li <thinker@codemud.net>
parents: 135
diff changeset
956 ## \brief Make indices map for typeid and methodid.
987fead83ce3 Fix issue that dalvik complaining fail to verify code.
Thinker K.F. Li <thinker@codemud.net>
parents: 135
diff changeset
957 #
987fead83ce3 Fix issue that dalvik complaining fail to verify code.
Thinker K.F. Li <thinker@codemud.net>
parents: 135
diff changeset
958 # It is used to create indices maps for typeid and methodid after
987fead83ce3 Fix issue that dalvik complaining fail to verify code.
Thinker K.F. Li <thinker@codemud.net>
parents: 135
diff changeset
959 # changing order. For example, after sorting sorted array after an
987fead83ce3 Fix issue that dalvik complaining fail to verify code.
Thinker K.F. Li <thinker@codemud.net>
parents: 135
diff changeset
960 # injection, this function create maps for remapping indices mentioned
987fead83ce3 Fix issue that dalvik complaining fail to verify code.
Thinker K.F. Li <thinker@codemud.net>
parents: 135
diff changeset
961 # in the code.
987fead83ce3 Fix issue that dalvik complaining fail to verify code.
Thinker K.F. Li <thinker@codemud.net>
parents: 135
diff changeset
962 #
152
bc213cb88636 Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents: 151
diff changeset
963 def _make_idx_map(saved_typeids, saved_methodids, saved_strids, saved_fieldids,
bc213cb88636 Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents: 151
diff changeset
964 new_typeids, new_methodids, new_strids, new_fieldids):
137
987fead83ce3 Fix issue that dalvik complaining fail to verify code.
Thinker K.F. Li <thinker@codemud.net>
parents: 135
diff changeset
965 methodidxs_map = dict([(idx, new_methodids.index(methodid))
987fead83ce3 Fix issue that dalvik complaining fail to verify code.
Thinker K.F. Li <thinker@codemud.net>
parents: 135
diff changeset
966 for idx, methodid in enumerate(saved_methodids)])
987fead83ce3 Fix issue that dalvik complaining fail to verify code.
Thinker K.F. Li <thinker@codemud.net>
parents: 135
diff changeset
967 typeidxs_map = dict([(idx, new_typeids.index(typeid))
987fead83ce3 Fix issue that dalvik complaining fail to verify code.
Thinker K.F. Li <thinker@codemud.net>
parents: 135
diff changeset
968 for idx, typeid in enumerate(saved_typeids)])
145
c4324c3461e8 Redirect string indices.
Thinker K.F. Li <thinker@codemud.net>
parents: 144
diff changeset
969 stridxs_map = dict([(idx, new_strids.index(strid))
c4324c3461e8 Redirect string indices.
Thinker K.F. Li <thinker@codemud.net>
parents: 144
diff changeset
970 for idx, strid in enumerate(saved_strids)])
152
bc213cb88636 Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents: 151
diff changeset
971 fieldidxs_map = dict([(idx, new_fieldids.index(fieldid))
bc213cb88636 Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents: 151
diff changeset
972 for idx, fieldid in enumerate(saved_fieldids)])
145
c4324c3461e8 Redirect string indices.
Thinker K.F. Li <thinker@codemud.net>
parents: 144
diff changeset
973
152
bc213cb88636 Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents: 151
diff changeset
974 return typeidxs_map, methodidxs_map, stridxs_map, fieldidxs_map
137
987fead83ce3 Fix issue that dalvik complaining fail to verify code.
Thinker K.F. Li <thinker@codemud.net>
parents: 135
diff changeset
975
987fead83ce3 Fix issue that dalvik complaining fail to verify code.
Thinker K.F. Li <thinker@codemud.net>
parents: 135
diff changeset
976
987fead83ce3 Fix issue that dalvik complaining fail to verify code.
Thinker K.F. Li <thinker@codemud.net>
parents: 135
diff changeset
977 ## \brief Sort sorted arrays and remapping indices for code blocks.
987fead83ce3 Fix issue that dalvik complaining fail to verify code.
Thinker K.F. Li <thinker@codemud.net>
parents: 135
diff changeset
978 #
987fead83ce3 Fix issue that dalvik complaining fail to verify code.
Thinker K.F. Li <thinker@codemud.net>
parents: 135
diff changeset
979 # Since sorting changes the order of sorted arrays, code blocks should
987fead83ce3 Fix issue that dalvik complaining fail to verify code.
Thinker K.F. Li <thinker@codemud.net>
parents: 135
diff changeset
980 # be updated by remapping indices, typeid indices and methodid indices.
987fead83ce3 Fix issue that dalvik complaining fail to verify code.
Thinker K.F. Li <thinker@codemud.net>
parents: 135
diff changeset
981 #
987fead83ce3 Fix issue that dalvik complaining fail to verify code.
Thinker K.F. Li <thinker@codemud.net>
parents: 135
diff changeset
982 def dex_sort_sorted_arrays_consistent(dex_linked):
987fead83ce3 Fix issue that dalvik complaining fail to verify code.
Thinker K.F. Li <thinker@codemud.net>
parents: 135
diff changeset
983 from paraspace.dex_deptracker import dex_sort_sorted_arrays
987fead83ce3 Fix issue that dalvik complaining fail to verify code.
Thinker K.F. Li <thinker@codemud.net>
parents: 135
diff changeset
984
987fead83ce3 Fix issue that dalvik complaining fail to verify code.
Thinker K.F. Li <thinker@codemud.net>
parents: 135
diff changeset
985 saved_typeids = list(dex_linked.typeIds.items)
987fead83ce3 Fix issue that dalvik complaining fail to verify code.
Thinker K.F. Li <thinker@codemud.net>
parents: 135
diff changeset
986 saved_methodids = list(dex_linked.methodIds.items)
145
c4324c3461e8 Redirect string indices.
Thinker K.F. Li <thinker@codemud.net>
parents: 144
diff changeset
987 saved_strids = list(dex_linked.stringIds.items)
152
bc213cb88636 Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents: 151
diff changeset
988 saved_fieldids = list(dex_linked.fieldIds.items)
137
987fead83ce3 Fix issue that dalvik complaining fail to verify code.
Thinker K.F. Li <thinker@codemud.net>
parents: 135
diff changeset
989
987fead83ce3 Fix issue that dalvik complaining fail to verify code.
Thinker K.F. Li <thinker@codemud.net>
parents: 135
diff changeset
990 dex_sort_sorted_arrays(dex_linked)
987fead83ce3 Fix issue that dalvik complaining fail to verify code.
Thinker K.F. Li <thinker@codemud.net>
parents: 135
diff changeset
991
987fead83ce3 Fix issue that dalvik complaining fail to verify code.
Thinker K.F. Li <thinker@codemud.net>
parents: 135
diff changeset
992 new_typeids = dex_linked.typeIds.items
987fead83ce3 Fix issue that dalvik complaining fail to verify code.
Thinker K.F. Li <thinker@codemud.net>
parents: 135
diff changeset
993 new_methodids = dex_linked.methodIds.items
145
c4324c3461e8 Redirect string indices.
Thinker K.F. Li <thinker@codemud.net>
parents: 144
diff changeset
994 new_strids = dex_linked.stringIds.items
152
bc213cb88636 Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents: 151
diff changeset
995 new_fieldids = dex_linked.fieldIds.items
bc213cb88636 Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents: 151
diff changeset
996 typeidxs_map, methodidxs_map, stridxs_map, fieldidxs_map = \
145
c4324c3461e8 Redirect string indices.
Thinker K.F. Li <thinker@codemud.net>
parents: 144
diff changeset
997 _make_idx_map(saved_typeids, saved_methodids, saved_strids, \
152
bc213cb88636 Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents: 151
diff changeset
998 saved_fieldids, \
bc213cb88636 Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents: 151
diff changeset
999 new_typeids, new_methodids, new_strids, \
bc213cb88636 Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents: 151
diff changeset
1000 new_fieldids)
137
987fead83ce3 Fix issue that dalvik complaining fail to verify code.
Thinker K.F. Li <thinker@codemud.net>
parents: 135
diff changeset
1001
145
c4324c3461e8 Redirect string indices.
Thinker K.F. Li <thinker@codemud.net>
parents: 144
diff changeset
1002 dexfile_redirect_indices(dex_linked, typeidxs_map, methodidxs_map,
152
bc213cb88636 Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents: 151
diff changeset
1003 stridxs_map, fieldidxs_map)
137
987fead83ce3 Fix issue that dalvik complaining fail to verify code.
Thinker K.F. Li <thinker@codemud.net>
parents: 135
diff changeset
1004 pass
987fead83ce3 Fix issue that dalvik complaining fail to verify code.
Thinker K.F. Li <thinker@codemud.net>
parents: 135
diff changeset
1005
987fead83ce3 Fix issue that dalvik complaining fail to verify code.
Thinker K.F. Li <thinker@codemud.net>
parents: 135
diff changeset
1006
135
b488ca519709 Make sure elements are absolute incremental for sorted arrays when injecting.
Thinker K.F. Li <thinker@codemud.net>
parents: 134
diff changeset
1007 ## \brief Inject and redirect a _DEX_ClassDef from one linked to another.
b488ca519709 Make sure elements are absolute incremental for sorted arrays when injecting.
Thinker K.F. Li <thinker@codemud.net>
parents: 134
diff changeset
1008 #
b488ca519709 Make sure elements are absolute incremental for sorted arrays when injecting.
Thinker K.F. Li <thinker@codemud.net>
parents: 134
diff changeset
1009 # The _DEX_ClassDef given by inj_classname would be inserted to dst_linked,
b488ca519709 Make sure elements are absolute incremental for sorted arrays when injecting.
Thinker K.F. Li <thinker@codemud.net>
parents: 134
diff changeset
1010 # and redirect all invoking of type, given by redir_classname, to
b488ca519709 Make sure elements are absolute incremental for sorted arrays when injecting.
Thinker K.F. Li <thinker@codemud.net>
parents: 134
diff changeset
1011 # the injected one.
b488ca519709 Make sure elements are absolute incremental for sorted arrays when injecting.
Thinker K.F. Li <thinker@codemud.net>
parents: 134
diff changeset
1012 #
b488ca519709 Make sure elements are absolute incremental for sorted arrays when injecting.
Thinker K.F. Li <thinker@codemud.net>
parents: 134
diff changeset
1013 def inject_redir(src_linked, inj_classname,
b488ca519709 Make sure elements are absolute incremental for sorted arrays when injecting.
Thinker K.F. Li <thinker@codemud.net>
parents: 134
diff changeset
1014 dst_linked, redir_classname, decls):
b488ca519709 Make sure elements are absolute incremental for sorted arrays when injecting.
Thinker K.F. Li <thinker@codemud.net>
parents: 134
diff changeset
1015 from paraspace.dex_deptracker import restore_dependencies
131
044bfc415577 Fix issue of data map verification.
Thinker K.F. Li <thinker@codemud.net>
parents: 119
diff changeset
1016
135
b488ca519709 Make sure elements are absolute incremental for sorted arrays when injecting.
Thinker K.F. Li <thinker@codemud.net>
parents: 134
diff changeset
1017 inject_redir_no_restore(src_linked, inj_classname,
b488ca519709 Make sure elements are absolute incremental for sorted arrays when injecting.
Thinker K.F. Li <thinker@codemud.net>
parents: 134
diff changeset
1018 dst_linked, redir_classname, decls)
137
987fead83ce3 Fix issue that dalvik complaining fail to verify code.
Thinker K.F. Li <thinker@codemud.net>
parents: 135
diff changeset
1019 dex_sort_sorted_arrays_consistent(dst_linked)
131
044bfc415577 Fix issue of data map verification.
Thinker K.F. Li <thinker@codemud.net>
parents: 119
diff changeset
1020 restore_dependencies(dst_linked, decls)
044bfc415577 Fix issue of data map verification.
Thinker K.F. Li <thinker@codemud.net>
parents: 119
diff changeset
1021 pass