Mercurial > paraspace
annotate paraspace/dex_deptracker.py @ 137:987fead83ce3
Fix issue that dalvik complaining fail to verify code.
- Since order of typeId and methodId are changed, index values in
code block of methods are invalid after sorting sorted arrays.
- We add dex_sort_sorted_arrays_consistent() function as a wrapper
of dex_sort_sorted_arrays(). It remap indices mentioned in code
blocks after sorting.
author | Thinker K.F. Li <thinker@codemud.net> |
---|---|
date | Wed, 10 Aug 2011 14:04:02 +0800 |
parents | ddf8a20ecc4b |
children | 0704e23009e4 |
rev | line source |
---|---|
23
fff40aabefab
Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
1 from paraspace import dexfile |
fff40aabefab
Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
2 |
fff40aabefab
Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
3 |
fff40aabefab
Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
4 _nest_types = (dexfile.array, |
fff40aabefab
Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
5 dexfile.cond, |
fff40aabefab
Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
6 dexfile.switch) |
fff40aabefab
Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
7 |
fff40aabefab
Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
8 |
58
c2a4921ec83b
Fix issue misbehavior for dependency when update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents:
57
diff
changeset
|
9 def _skip_marker_clazz(marker): |
c2a4921ec83b
Fix issue misbehavior for dependency when update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents:
57
diff
changeset
|
10 while isinstance(marker, _marker): |
c2a4921ec83b
Fix issue misbehavior for dependency when update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents:
57
diff
changeset
|
11 marker = marker.back_type |
c2a4921ec83b
Fix issue misbehavior for dependency when update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents:
57
diff
changeset
|
12 pass |
c2a4921ec83b
Fix issue misbehavior for dependency when update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents:
57
diff
changeset
|
13 return marker |
c2a4921ec83b
Fix issue misbehavior for dependency when update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents:
57
diff
changeset
|
14 |
c2a4921ec83b
Fix issue misbehavior for dependency when update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents:
57
diff
changeset
|
15 |
25
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
16 def _resolve_name_path(name_path): |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
17 obj = dexfile |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
18 parent = None |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
19 for name in name_path.split('.'): |
58
c2a4921ec83b
Fix issue misbehavior for dependency when update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents:
57
diff
changeset
|
20 obj = _skip_marker_clazz(obj) |
53
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
52
diff
changeset
|
21 |
25
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
22 if isinstance(parent, dexfile.array) and obj == list: |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
23 # array.items.<num> |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
24 obj = parent.child_type |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
25 parent = list |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
26 continue |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
27 |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
28 parent = obj |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
29 if isinstance(parent, dexfile.switch): |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
30 key = eval(name) |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
31 obj = parent.map[key] |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
32 continue |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
33 |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
34 if isinstance(parent, dexfile.array) and name == 'items': |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
35 obj = list |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
36 continue |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
37 |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
38 if isinstance(parent, dexfile.cond) and name == 'value': |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
39 obj = obj.child_type |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
40 continue |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
41 |
54
870312703ba1
Fix issuge of crossing dexfile.ref when updating offset
Thinker K.F. Li <thinker@codemud.net>
parents:
53
diff
changeset
|
42 try: |
870312703ba1
Fix issuge of crossing dexfile.ref when updating offset
Thinker K.F. Li <thinker@codemud.net>
parents:
53
diff
changeset
|
43 obj = getattr(parent, name) |
870312703ba1
Fix issuge of crossing dexfile.ref when updating offset
Thinker K.F. Li <thinker@codemud.net>
parents:
53
diff
changeset
|
44 except: |
870312703ba1
Fix issuge of crossing dexfile.ref when updating offset
Thinker K.F. Li <thinker@codemud.net>
parents:
53
diff
changeset
|
45 print obj, parent, name_path |
870312703ba1
Fix issuge of crossing dexfile.ref when updating offset
Thinker K.F. Li <thinker@codemud.net>
parents:
53
diff
changeset
|
46 raise |
25
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
47 pass |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
48 return obj, parent |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
49 |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
50 |
26
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
51 def _travel_dex_type(clazz, name_path): |
27
15cb829ac442
travel_dex_type() recoganizes _dex_type correctly
Thinker K.F. Li <thinker@codemud.net>
parents:
26
diff
changeset
|
52 def travelable(attr, attr_name): |
15cb829ac442
travel_dex_type() recoganizes _dex_type correctly
Thinker K.F. Li <thinker@codemud.net>
parents:
26
diff
changeset
|
53 if attr_name.startswith('_'): |
15cb829ac442
travel_dex_type() recoganizes _dex_type correctly
Thinker K.F. Li <thinker@codemud.net>
parents:
26
diff
changeset
|
54 return False |
15cb829ac442
travel_dex_type() recoganizes _dex_type correctly
Thinker K.F. Li <thinker@codemud.net>
parents:
26
diff
changeset
|
55 if callable(attr) and ((not isinstance(attr, dexfile._dex_type)) and |
15cb829ac442
travel_dex_type() recoganizes _dex_type correctly
Thinker K.F. Li <thinker@codemud.net>
parents:
26
diff
changeset
|
56 (not (type(attr) == type and |
15cb829ac442
travel_dex_type() recoganizes _dex_type correctly
Thinker K.F. Li <thinker@codemud.net>
parents:
26
diff
changeset
|
57 issubclass(attr, dexfile._dex_type)))): |
15cb829ac442
travel_dex_type() recoganizes _dex_type correctly
Thinker K.F. Li <thinker@codemud.net>
parents:
26
diff
changeset
|
58 return False |
15cb829ac442
travel_dex_type() recoganizes _dex_type correctly
Thinker K.F. Li <thinker@codemud.net>
parents:
26
diff
changeset
|
59 return True |
26
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
60 |
58
c2a4921ec83b
Fix issue misbehavior for dependency when update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents:
57
diff
changeset
|
61 clazz = _skip_marker_clazz(clazz) |
28
5ce7ca1187b3
Pass throught markers for dex types
Thinker K.F. Li <thinker@codemud.net>
parents:
27
diff
changeset
|
62 |
26
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
63 travel_queue = [(getattr(clazz, attr_name), name_path + '.' + attr_name) |
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
64 for attr_name in dir(clazz) |
27
15cb829ac442
travel_dex_type() recoganizes _dex_type correctly
Thinker K.F. Li <thinker@codemud.net>
parents:
26
diff
changeset
|
65 if travelable(getattr(clazz, attr_name), attr_name)] |
26
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
66 while travel_queue: |
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
67 attr, name_path = travel_queue.pop(0) |
27
15cb829ac442
travel_dex_type() recoganizes _dex_type correctly
Thinker K.F. Li <thinker@codemud.net>
parents:
26
diff
changeset
|
68 if isinstance(attr, _marker): |
26
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
69 # |
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
70 # transparent. Enqueue back_type with the same name again. |
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
71 # |
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
72 child = attr.back_type |
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
73 travel_queue.append((child, name_path)) |
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
74 continue |
28
5ce7ca1187b3
Pass throught markers for dex types
Thinker K.F. Li <thinker@codemud.net>
parents:
27
diff
changeset
|
75 |
5ce7ca1187b3
Pass throught markers for dex types
Thinker K.F. Li <thinker@codemud.net>
parents:
27
diff
changeset
|
76 yield attr, name_path |
26
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
77 |
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
78 if isinstance(attr, _nest_types): |
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
79 if isinstance(attr, dexfile.array): |
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
80 child_name = name_path + '.items.*' |
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
81 child = attr.child_type |
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
82 travel_queue.append((child, child_name)) |
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
83 elif isinstance(attr, dexfile.cond): |
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
84 child_name = name_path + '.value' |
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
85 child = attr.child_type |
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
86 travel_queue.append((child, child_name)) |
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
87 elif isinstance(attr, dexfile.switch): |
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
88 for key in attr.map.keys(): |
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
89 child_name = name_path + '.' + repr(key) |
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
90 child = attr.map[key] |
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
91 travel_queue.append((child, child_name)) |
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
92 pass |
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
93 pass |
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
94 pass |
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
95 pass |
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
96 pass |
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
97 |
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
98 |
137
987fead83ce3
Fix issue that dalvik complaining fail to verify code.
Thinker K.F. Li <thinker@codemud.net>
parents:
133
diff
changeset
|
99 ## \brief Find depend attributes of a class. |
987fead83ce3
Fix issue that dalvik complaining fail to verify code.
Thinker K.F. Li <thinker@codemud.net>
parents:
133
diff
changeset
|
100 # |
987fead83ce3
Fix issue that dalvik complaining fail to verify code.
Thinker K.F. Li <thinker@codemud.net>
parents:
133
diff
changeset
|
101 # It does not cross the boundary of the class. |
987fead83ce3
Fix issue that dalvik complaining fail to verify code.
Thinker K.F. Li <thinker@codemud.net>
parents:
133
diff
changeset
|
102 # |
25
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
103 def _find_dep_decls_from_clazz(name_path, clazz, dex_types): |
26
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
104 # XXX: implements the loop with _travel_dex_type() |
25
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
105 dep_decls = {} |
23
fff40aabefab
Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
106 |
fff40aabefab
Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
107 for attr in dir(clazz): |
fff40aabefab
Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
108 namelist = [name_path, attr] |
fff40aabefab
Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
109 |
25
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
110 # |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
111 # Find dependency |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
112 # |
23
fff40aabefab
Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
113 digged_flag = False |
fff40aabefab
Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
114 |
fff40aabefab
Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
115 value_type = getattr(clazz, attr) |
fff40aabefab
Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
116 while isinstance(value_type, _nest_types) or \ |
fff40aabefab
Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
117 (type(value_type) == type and |
fff40aabefab
Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
118 issubclass(value_type, _nest_types)): |
fff40aabefab
Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
119 if isinstance(value_type, dexfile.array): |
fff40aabefab
Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
120 namelist.append('items') |
25
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
121 namelist.append('*') |
23
fff40aabefab
Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
122 value_type = value_type.child_type |
fff40aabefab
Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
123 elif isinstance(value_type, dexfile.cond): |
fff40aabefab
Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
124 namelist.append('value') |
fff40aabefab
Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
125 value_type = value_type.child_type |
fff40aabefab
Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
126 elif isinstance(value_type, dexfile.switch): |
fff40aabefab
Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
127 for key, child_type in value_type.map.items(): |
fff40aabefab
Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
128 if child_type in dex_types.values(): |
fff40aabefab
Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
129 continue |
fff40aabefab
Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
130 child_name_path = '.'.join(namelist) + '.' + repr(key) |
25
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
131 child_dep_decls = \ |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
132 _find_dep_decls_from_clazz(child_name_path, |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
133 child_type, |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
134 dex_types) |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
135 |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
136 if child_dep_decls: |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
137 raise ValueError, \ |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
138 'can not depend on elements of a switch (%s)' \ |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
139 % (child_name_path) |
23
fff40aabefab
Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
140 pass |
fff40aabefab
Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
141 digged_flag = True |
fff40aabefab
Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
142 break |
fff40aabefab
Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
143 pass |
fff40aabefab
Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
144 |
fff40aabefab
Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
145 if digged_flag: |
fff40aabefab
Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
146 continue |
25
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
147 |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
148 # |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
149 # Record dependency |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
150 # |
23
fff40aabefab
Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
151 if isinstance(value_type, dexfile.depend): |
fff40aabefab
Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
152 from_name = '.'.join(namelist) |
fff40aabefab
Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
153 if isinstance(value_type, dexfile.depend_off): |
fff40aabefab
Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
154 depend_name = value_type.depend_on |
25
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
155 dep_decls[from_name] = (dexfile.depend_off, depend_name) |
23
fff40aabefab
Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
156 elif isinstance(value_type, dexfile.depend_off_rel): |
fff40aabefab
Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
157 depend_name = value_type.depend_on |
fff40aabefab
Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
158 relative_to = value_type.relative_to |
25
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
159 dep_decls[from_name] = (dexfile.depend_off_rel, |
23
fff40aabefab
Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
160 depend_name, |
fff40aabefab
Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
161 relative_to) |
fff40aabefab
Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
162 elif isinstance(value_type, dexfile.depend_idx): |
fff40aabefab
Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
163 depend_name = value_type.depend_on |
25
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
164 dep_decls[from_name] = (dexfile.depend_idx, depend_name) |
23
fff40aabefab
Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
165 pass |
fff40aabefab
Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
166 pass |
fff40aabefab
Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
167 pass |
25
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
168 return dep_decls |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
169 |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
170 |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
171 def _dex_tree_get_child(obj, child_name): |
40
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
29
diff
changeset
|
172 child_parts = child_name.split('.') |
55
6e4cf6905729
Seeking parents in reversed order for _build_associations()
Thinker K.F. Li <thinker@codemud.net>
parents:
54
diff
changeset
|
173 last_child_part = '' |
40
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
29
diff
changeset
|
174 for child_part in child_parts: |
55
6e4cf6905729
Seeking parents in reversed order for _build_associations()
Thinker K.F. Li <thinker@codemud.net>
parents:
54
diff
changeset
|
175 if isinstance(obj, dexfile.cond) and not obj.is_true: |
6e4cf6905729
Seeking parents in reversed order for _build_associations()
Thinker K.F. Li <thinker@codemud.net>
parents:
54
diff
changeset
|
176 raise AttributeError, \ |
6e4cf6905729
Seeking parents in reversed order for _build_associations()
Thinker K.F. Li <thinker@codemud.net>
parents:
54
diff
changeset
|
177 'dexfile.cond is not true for %s of %s' % \ |
6e4cf6905729
Seeking parents in reversed order for _build_associations()
Thinker K.F. Li <thinker@codemud.net>
parents:
54
diff
changeset
|
178 (last_child_part, child_name) |
6e4cf6905729
Seeking parents in reversed order for _build_associations()
Thinker K.F. Li <thinker@codemud.net>
parents:
54
diff
changeset
|
179 last_child_part = child_part |
6e4cf6905729
Seeking parents in reversed order for _build_associations()
Thinker K.F. Li <thinker@codemud.net>
parents:
54
diff
changeset
|
180 |
40
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
29
diff
changeset
|
181 if isinstance(obj, list): |
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
29
diff
changeset
|
182 idx = int(child_part) |
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
29
diff
changeset
|
183 obj = obj[idx] |
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
29
diff
changeset
|
184 continue |
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
29
diff
changeset
|
185 |
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
29
diff
changeset
|
186 if isinstance(obj, dexfile.switch): |
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
29
diff
changeset
|
187 assert obj.map[eval(child_part)] == obj.child_type |
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
29
diff
changeset
|
188 obj = obj.value |
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
29
diff
changeset
|
189 continue |
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
29
diff
changeset
|
190 |
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
29
diff
changeset
|
191 obj = getattr(obj, child_part) |
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
29
diff
changeset
|
192 pass |
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
29
diff
changeset
|
193 return obj |
23
fff40aabefab
Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
194 |
fff40aabefab
Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
195 |
25
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
196 def _dex_tree_set_child(obj, child_name, value): |
43
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
197 child_parts = child_name.split('.') |
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
198 for child_part in child_parts[:-1]: |
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
199 if isinstance(obj, list): |
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
200 idx = int(child_part) |
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
201 obj = obj[idx] |
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
202 continue |
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
203 |
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
204 if isinstance(obj, dexfile.switch): |
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
205 assert obj.map[eval(child_part)] == obj.child_type |
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
206 obj = obj.value |
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
207 continue |
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
208 |
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
209 obj = getattr(obj, child_part) |
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
210 pass |
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
211 |
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
212 last_part = child_parts[-1] |
25
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
213 if isinstance(obj, list): |
43
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
214 idx = int(last_part) |
25
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
215 obj[idx] = value |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
216 elif isinstance(obj, dexfile.switch): |
43
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
217 assert obj.map[eval(last_part)] == obj.child_type |
25
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
218 obj.value = value |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
219 else: |
43
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
220 setattr(obj, last_part, value) |
25
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
221 pass |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
222 pass |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
223 |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
224 |
132
75a31967ebee
Following the ref in resotre_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
129
diff
changeset
|
225 class _travel_rel_node(object): |
75a31967ebee
Following the ref in resotre_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
129
diff
changeset
|
226 obj = None |
75a31967ebee
Following the ref in resotre_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
129
diff
changeset
|
227 parents = None |
75a31967ebee
Following the ref in resotre_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
129
diff
changeset
|
228 name_path = None |
75a31967ebee
Following the ref in resotre_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
129
diff
changeset
|
229 origin_path = None |
75a31967ebee
Following the ref in resotre_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
129
diff
changeset
|
230 pass |
75a31967ebee
Following the ref in resotre_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
129
diff
changeset
|
231 |
47 | 232 ## \brief Travel the tree of relocatable objects and their attributes. |
233 # | |
234 # \param skip_func is a function that returns true for skip a subtree. | |
235 # | |
236 # \ref skip_func is called for every relocatable and their attributes | |
237 # to determines if visiting the object and subtree. | |
238 # | |
132
75a31967ebee
Following the ref in resotre_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
129
diff
changeset
|
239 # NOTE: |
75a31967ebee
Following the ref in resotre_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
129
diff
changeset
|
240 # You never know what information you will use later. Use an object |
75a31967ebee
Following the ref in resotre_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
129
diff
changeset
|
241 # instead of tuple to carry information. You can extend states an object |
75a31967ebee
Following the ref in resotre_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
129
diff
changeset
|
242 # later. But, it is hard to extend a tuple. That is why _travel_rel_node |
75a31967ebee
Following the ref in resotre_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
129
diff
changeset
|
243 # instances are used to replace tuples, here. |
75a31967ebee
Following the ref in resotre_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
129
diff
changeset
|
244 # |
47 | 245 def _travel_dex_relocatable(root_obj, parents=[], skip_func=None): |
132
75a31967ebee
Following the ref in resotre_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
129
diff
changeset
|
246 root_node = _travel_rel_node() |
75a31967ebee
Following the ref in resotre_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
129
diff
changeset
|
247 root_node.obj = root_obj |
75a31967ebee
Following the ref in resotre_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
129
diff
changeset
|
248 root_node.parents = parents |
75a31967ebee
Following the ref in resotre_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
129
diff
changeset
|
249 root_node.name_path = root_obj.__class__.__name__ |
75a31967ebee
Following the ref in resotre_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
129
diff
changeset
|
250 root_node.origin_path = root_obj.__class__.__name__ |
75a31967ebee
Following the ref in resotre_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
129
diff
changeset
|
251 stk = [root_node] |
26
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
252 |
29
b0cc5da28141
pass parents to travel info
Thinker K.F. Li <thinker@codemud.net>
parents:
28
diff
changeset
|
253 def make_travel_info(obj, obj_name, child_name, parents): |
26
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
254 child_parents = parents + [obj] |
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
255 child_obj = _dex_tree_get_child(obj, child_name) |
61
3e34c7d33182
Fix and test restore_depedencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
58
diff
changeset
|
256 child_path = obj_name + '.' + child_name |
132
75a31967ebee
Following the ref in resotre_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
129
diff
changeset
|
257 origin_path = child_path |
61
3e34c7d33182
Fix and test restore_depedencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
58
diff
changeset
|
258 |
3e34c7d33182
Fix and test restore_depedencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
58
diff
changeset
|
259 child_clazz, dummy = _resolve_name_path(child_path) |
3e34c7d33182
Fix and test restore_depedencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
58
diff
changeset
|
260 if not isinstance(child_clazz, dexfile.depend): |
3e34c7d33182
Fix and test restore_depedencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
58
diff
changeset
|
261 if isinstance(child_obj, dexfile.composite): |
3e34c7d33182
Fix and test restore_depedencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
58
diff
changeset
|
262 child_path = child_obj.__class__.__name__ |
3e34c7d33182
Fix and test restore_depedencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
58
diff
changeset
|
263 pass |
26
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
264 pass |
132
75a31967ebee
Following the ref in resotre_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
129
diff
changeset
|
265 |
75a31967ebee
Following the ref in resotre_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
129
diff
changeset
|
266 node = _travel_rel_node() |
75a31967ebee
Following the ref in resotre_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
129
diff
changeset
|
267 node.obj = child_obj |
75a31967ebee
Following the ref in resotre_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
129
diff
changeset
|
268 node.parents = child_parents |
75a31967ebee
Following the ref in resotre_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
129
diff
changeset
|
269 node.name_path = child_path |
75a31967ebee
Following the ref in resotre_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
129
diff
changeset
|
270 node.origin_path = origin_path |
75a31967ebee
Following the ref in resotre_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
129
diff
changeset
|
271 |
75a31967ebee
Following the ref in resotre_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
129
diff
changeset
|
272 return node |
26
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
273 |
25
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
274 while stk: |
132
75a31967ebee
Following the ref in resotre_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
129
diff
changeset
|
275 node = stk.pop(0) |
75a31967ebee
Following the ref in resotre_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
129
diff
changeset
|
276 obj, parents, obj_name = node.obj, node.parents, node.name_path |
47 | 277 if skip_func and skip_func(obj, parents, obj_name): |
278 continue | |
132
75a31967ebee
Following the ref in resotre_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
129
diff
changeset
|
279 yield node |
25
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
280 |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
281 if isinstance(obj, list): |
29
b0cc5da28141
pass parents to travel info
Thinker K.F. Li <thinker@codemud.net>
parents:
28
diff
changeset
|
282 children = [make_travel_info(obj, obj_name, repr(idx), parents) |
26
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
283 for idx in range(len(obj))] |
25
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
284 stk.extend(children) |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
285 continue |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
286 |
61
3e34c7d33182
Fix and test restore_depedencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
58
diff
changeset
|
287 obj_clazz, dummy = _resolve_name_path(obj_name) |
3e34c7d33182
Fix and test restore_depedencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
58
diff
changeset
|
288 if isinstance(obj_clazz, dexfile.depend): |
3e34c7d33182
Fix and test restore_depedencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
58
diff
changeset
|
289 continue |
25
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
290 if not isinstance(obj, dexfile.relocatable): |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
291 continue |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
292 |
29
b0cc5da28141
pass parents to travel info
Thinker K.F. Li <thinker@codemud.net>
parents:
28
diff
changeset
|
293 children = [make_travel_info(obj, obj_name, child_name, parents) |
25
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
294 for child_name in obj.children()] |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
295 stk.extend(children) |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
296 pass |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
297 pass |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
298 |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
299 |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
300 def _all_dex_types(): |
23
fff40aabefab
Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
301 dex_types = dict([(name, value) |
fff40aabefab
Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
302 for name, value in dexfile.__dict__.items() |
fff40aabefab
Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
303 if name.startswith('_DEX_')]) |
fff40aabefab
Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
304 dex_types['DEXFile'] = dexfile.DEXFile |
fff40aabefab
Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
305 return dex_types |
fff40aabefab
Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
306 |
fff40aabefab
Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
307 |
53
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
52
diff
changeset
|
308 def _all_dex_type_to_names(): |
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
52
diff
changeset
|
309 def check_marker(value, name): |
58
c2a4921ec83b
Fix issue misbehavior for dependency when update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents:
57
diff
changeset
|
310 value = _skip_marker_clazz(value) |
53
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
52
diff
changeset
|
311 return value, name |
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
52
diff
changeset
|
312 |
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
52
diff
changeset
|
313 dex_types = dict([check_marker(value, name) |
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
52
diff
changeset
|
314 for name, value in dexfile.__dict__.items() |
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
52
diff
changeset
|
315 if name.startswith('_DEX_')]) |
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
52
diff
changeset
|
316 dex_types[dexfile.DEXFile] = 'DEXFile' |
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
52
diff
changeset
|
317 return dex_types |
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
52
diff
changeset
|
318 |
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
52
diff
changeset
|
319 |
25
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
320 def collect_all_dep_decls(): |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
321 dex_types = _all_dex_types() |
23
fff40aabefab
Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
322 |
25
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
323 all_dep_decls = {} |
23
fff40aabefab
Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
324 for name_path, clazz in dex_types.items(): |
25
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
325 dep_decls = _find_dep_decls_from_clazz(name_path, clazz, dex_types) |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
326 all_dep_decls.update(dep_decls) |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
327 pass |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
328 |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
329 return all_dep_decls |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
330 |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
331 |
124
8e42b2816893
Fixing compute_size() and sizeof() for DEX types.
Thinker K.F. Li <thinker@codemud.net>
parents:
123
diff
changeset
|
332 ## Mark where we need offset information for link dependencies. |
8e42b2816893
Fixing compute_size() and sizeof() for DEX types.
Thinker K.F. Li <thinker@codemud.net>
parents:
123
diff
changeset
|
333 # |
52
67aa8ca8fff3
untested dex_deptracker.update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents:
49
diff
changeset
|
334 class _marker(dexfile.null_relocatable): |
26
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
335 back_type = None |
53
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
52
diff
changeset
|
336 |
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
52
diff
changeset
|
337 def set_marker(self, obj, off): |
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
52
diff
changeset
|
338 raise NotImplementedError, \ |
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
52
diff
changeset
|
339 'The marker does not implement set_marker()' |
124
8e42b2816893
Fixing compute_size() and sizeof() for DEX types.
Thinker K.F. Li <thinker@codemud.net>
parents:
123
diff
changeset
|
340 |
8e42b2816893
Fixing compute_size() and sizeof() for DEX types.
Thinker K.F. Li <thinker@codemud.net>
parents:
123
diff
changeset
|
341 ## \brief Prepare data_offset for linking. |
8e42b2816893
Fixing compute_size() and sizeof() for DEX types.
Thinker K.F. Li <thinker@codemud.net>
parents:
123
diff
changeset
|
342 def link_prepare(self, obj, name_path, parents, markers_info): |
8e42b2816893
Fixing compute_size() and sizeof() for DEX types.
Thinker K.F. Li <thinker@codemud.net>
parents:
123
diff
changeset
|
343 raise NotImplementedError, \ |
8e42b2816893
Fixing compute_size() and sizeof() for DEX types.
Thinker K.F. Li <thinker@codemud.net>
parents:
123
diff
changeset
|
344 '_marker should be used to instantiate an instance directly' |
26
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
345 pass |
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
346 |
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
347 class _uid_marker(_marker): |
25
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
348 uid_seq = 0 |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
349 |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
350 def __init__(self, back_type, name_path): |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
351 self.back_type = back_type |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
352 self.name_path = name_path |
23
fff40aabefab
Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
353 pass |
fff40aabefab
Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
354 |
25
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
355 def parse(self, parent, data, off): |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
356 value = self.back_type.parse(parent, data, off) |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
357 try: |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
358 value.data_uid = _uid_marker.uid_seq |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
359 except AttributeError: |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
360 raise AttributeError, \ |
53
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
52
diff
changeset
|
361 'can not depend on non-instance (%s/%s)' % \ |
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
52
diff
changeset
|
362 (self.name_path, repr(value)) |
25
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
363 _uid_marker.uid_seq = _uid_marker.uid_seq + 1 |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
364 |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
365 return value |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
366 |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
367 def sizeof(self, value): |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
368 sz = self.back_type.sizeof(value) |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
369 return sz |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
370 |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
371 def compute_size(self, back_obj): |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
372 self.back_type.compute_size(back_obj) |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
373 pass |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
374 |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
375 def to_str(self, back_obj): |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
376 return self.back_type.to_str(back_obj) |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
377 |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
378 def link_prepare(self, obj, name_path, parents, markers_info): |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
379 try: |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
380 id_item_map = markers_info[name_path] |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
381 except KeyError: |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
382 id_item_map = {} |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
383 markers_info[name_path] = id_item_map |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
384 pass |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
385 assert obj.data_uid not in id_item_map |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
386 id_item_map[obj.data_uid] = obj |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
387 pass |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
388 |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
389 def __getattr__(self, name): |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
390 return getattr(self.back_type, name) |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
391 |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
392 def __call__(self, *args, **kws): |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
393 return self.back_type(*args, **kws) |
53
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
52
diff
changeset
|
394 |
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
52
diff
changeset
|
395 def set_marker(self, obj, off): |
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
52
diff
changeset
|
396 pass |
25
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
397 pass |
23
fff40aabefab
Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
398 |
fff40aabefab
Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
399 |
25
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
400 class _offset_marker(_uid_marker): |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
401 def parse(self, parent, data, off): |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
402 super(_offset_marker, self).parse(parent, data, off) |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
403 |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
404 value = self.back_type.parse(parent, data, off) |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
405 value.data_offset = off |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
406 return value |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
407 |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
408 def link_prepare(self, obj, name_path, parents, markers_info): |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
409 try: |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
410 id_item_map = markers_info[name_path] |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
411 except KeyError: |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
412 id_item_map = {} |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
413 markers_info[name_path] = id_item_map |
24
a57ec6a76fe3
Describe steps to track dependencies
Thinker K.F. Li <thinker@codemud.net>
parents:
23
diff
changeset
|
414 pass |
25
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
415 assert obj.data_offset not in id_item_map |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
416 id_item_map[obj.data_offset] = obj |
24
a57ec6a76fe3
Describe steps to track dependencies
Thinker K.F. Li <thinker@codemud.net>
parents:
23
diff
changeset
|
417 pass |
53
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
52
diff
changeset
|
418 |
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
52
diff
changeset
|
419 def set_marker(self, obj, off): |
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
52
diff
changeset
|
420 obj.data_offset = off |
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
52
diff
changeset
|
421 pass |
24
a57ec6a76fe3
Describe steps to track dependencies
Thinker K.F. Li <thinker@codemud.net>
parents:
23
diff
changeset
|
422 pass |
23
fff40aabefab
Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
423 |
24
a57ec6a76fe3
Describe steps to track dependencies
Thinker K.F. Li <thinker@codemud.net>
parents:
23
diff
changeset
|
424 |
25
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
425 class _rel_offset_marker(_offset_marker): |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
426 def link_prepare(self, obj, name_path, parents, markers_info): |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
427 rev_parents = list(parents) |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
428 rev_parents.reverse() |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
429 |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
430 for parent in rev_parents: |
29
b0cc5da28141
pass parents to travel info
Thinker K.F. Li <thinker@codemud.net>
parents:
28
diff
changeset
|
431 try: |
b0cc5da28141
pass parents to travel info
Thinker K.F. Li <thinker@codemud.net>
parents:
28
diff
changeset
|
432 rel_marker_info = parent.rel_marker_info |
b0cc5da28141
pass parents to travel info
Thinker K.F. Li <thinker@codemud.net>
parents:
28
diff
changeset
|
433 except AttributeError: |
b0cc5da28141
pass parents to travel info
Thinker K.F. Li <thinker@codemud.net>
parents:
28
diff
changeset
|
434 try: |
b0cc5da28141
pass parents to travel info
Thinker K.F. Li <thinker@codemud.net>
parents:
28
diff
changeset
|
435 rel_marker_info = {} |
b0cc5da28141
pass parents to travel info
Thinker K.F. Li <thinker@codemud.net>
parents:
28
diff
changeset
|
436 parent.rel_marker_info = rel_marker_info |
b0cc5da28141
pass parents to travel info
Thinker K.F. Li <thinker@codemud.net>
parents:
28
diff
changeset
|
437 except AttributeError: |
b0cc5da28141
pass parents to travel info
Thinker K.F. Li <thinker@codemud.net>
parents:
28
diff
changeset
|
438 continue |
b0cc5da28141
pass parents to travel info
Thinker K.F. Li <thinker@codemud.net>
parents:
28
diff
changeset
|
439 pass |
b0cc5da28141
pass parents to travel info
Thinker K.F. Li <thinker@codemud.net>
parents:
28
diff
changeset
|
440 depons = rel_marker_info.setdefault(name_path, []) |
b0cc5da28141
pass parents to travel info
Thinker K.F. Li <thinker@codemud.net>
parents:
28
diff
changeset
|
441 depons.append(obj) |
25
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
442 pass |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
443 pass |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
444 |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
445 @staticmethod |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
446 def find_depon(name_path, parents): |
40
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
29
diff
changeset
|
447 name_parts = name_path.split('.') |
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
29
diff
changeset
|
448 dex_types = _all_dex_types() |
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
29
diff
changeset
|
449 comp_type_name = name_parts[0] |
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
29
diff
changeset
|
450 comp_type = dex_types[comp_type_name] |
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
29
diff
changeset
|
451 |
25
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
452 rev_parents = list(parents) |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
453 rev_parents.reverse() |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
454 |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
455 for parent in rev_parents: |
40
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
29
diff
changeset
|
456 if isinstance(parent, comp_type): |
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
29
diff
changeset
|
457 attr_name = '.'.join(name_parts[1:]) |
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
29
diff
changeset
|
458 depon = _dex_tree_get_child(parent, attr_name) |
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
29
diff
changeset
|
459 return depon |
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
29
diff
changeset
|
460 |
25
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
461 try: |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
462 rel_marker_info = parent.rel_marker_info |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
463 except: |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
464 continue |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
465 if name_path in rel_marker_info: |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
466 depons = rel_marker_info[name_path] |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
467 assert len(depons) == 1 |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
468 depon = depons[0] |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
469 return depon |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
470 pass |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
471 |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
472 raise RuntimeError, 'can not find relative offset depend' |
53
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
52
diff
changeset
|
473 |
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
52
diff
changeset
|
474 def set_marker(self, obj, off): |
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
52
diff
changeset
|
475 obj.data_offset = off |
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
52
diff
changeset
|
476 pass |
25
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
477 pass |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
478 |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
479 |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
480 class _idx_marker(_uid_marker): |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
481 def parse(self, parent, data, off): |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
482 assert isinstance(self.back_type, dexfile.array) |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
483 array = self.back_type.parse(parent, data, off) |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
484 for item in array.items: |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
485 item.data_uid = _uid_marker.uid_seq |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
486 _uid_marker.uid_seq = _uid_marker.uid_seq + 1 |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
487 pass |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
488 return array |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
489 |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
490 def link_prepare(self, obj, name_path, parents, markers_info): |
40
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
29
diff
changeset
|
491 try: |
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
29
diff
changeset
|
492 id_item_map = markers_info[name_path] |
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
29
diff
changeset
|
493 except KeyError: |
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
29
diff
changeset
|
494 id_item_map = [] |
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
29
diff
changeset
|
495 markers_info[name_path] = id_item_map |
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
29
diff
changeset
|
496 pass |
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
29
diff
changeset
|
497 for idx, item in enumerate(obj.items): |
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
29
diff
changeset
|
498 id_item_map[idx] = item |
58
c2a4921ec83b
Fix issue misbehavior for dependency when update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents:
57
diff
changeset
|
499 item.data_idx = idx |
40
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
29
diff
changeset
|
500 pass |
25
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
501 pass |
53
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
52
diff
changeset
|
502 |
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
52
diff
changeset
|
503 def set_marker(self, obj, off): |
129
52749d91cc22
update index of elements while calling update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents:
127
diff
changeset
|
504 for idx, elt in enumerate(obj.items): |
52749d91cc22
update index of elements while calling update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents:
127
diff
changeset
|
505 elt.data_idx = idx |
52749d91cc22
update index of elements while calling update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents:
127
diff
changeset
|
506 pass |
53
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
52
diff
changeset
|
507 pass |
25
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
508 pass |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
509 |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
510 |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
511 def _install_offset_marker(name_path): |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
512 obj, parent = _resolve_name_path(name_path) |
53
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
52
diff
changeset
|
513 while isinstance(obj, dexfile.ref): |
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
52
diff
changeset
|
514 name_path = obj.target_path |
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
52
diff
changeset
|
515 obj, parent = _resolve_name_path(name_path) |
40
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
29
diff
changeset
|
516 pass |
25
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
517 marker = _offset_marker(obj, name_path) |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
518 name = name_path.split('.')[-1] |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
519 _dex_tree_set_child(parent, name, marker) |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
520 pass |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
521 |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
522 |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
523 def _install_rel_offset_marker(name_path): |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
524 obj, parent = _resolve_name_path(name_path) |
53
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
52
diff
changeset
|
525 while isinstance(obj, dexfile.ref): |
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
52
diff
changeset
|
526 name_path = obj.target_path |
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
52
diff
changeset
|
527 obj, parent = _resolve_name_path(name_path) |
40
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
29
diff
changeset
|
528 pass |
25
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
529 marker = _rel_offset_marker(obj, name_path) |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
530 name = name_path.split('.')[-1] |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
531 _dex_tree_set_child(parent, name, marker) |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
532 pass |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
533 |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
534 |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
535 def _install_uid_marker(name_path): |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
536 obj, parent = _resolve_name_path(name_path) |
53
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
52
diff
changeset
|
537 while isinstance(obj, dexfile.ref): |
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
52
diff
changeset
|
538 name_path = obj.target_path |
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
52
diff
changeset
|
539 obj, parent = _resolve_name_path(name_path) |
40
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
29
diff
changeset
|
540 pass |
25
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
541 marker = _uid_marker(obj, name_path) |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
542 name = name_path.split('.')[-1] |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
543 _dex_tree_set_child(parent, name, marker) |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
544 pass |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
545 |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
546 |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
547 def _install_idx_marker(name_path): |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
548 obj, parent = _resolve_name_path(name_path) |
53
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
52
diff
changeset
|
549 while isinstance(obj, dexfile.ref): |
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
52
diff
changeset
|
550 name_path = obj.target_path |
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
52
diff
changeset
|
551 obj, parent = _resolve_name_path(name_path) |
40
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
29
diff
changeset
|
552 pass |
25
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
553 marker = _idx_marker(obj, name_path) |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
554 name = name_path.split('.')[-1] |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
555 _dex_tree_set_child(parent, name, marker) |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
556 pass |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
557 |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
558 |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
559 def _install_markers(all_dep_decls): |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
560 all_markers = set() |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
561 |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
562 for from_path, dep in all_dep_decls.items(): |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
563 dep_type = dep[0] |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
564 if issubclass(dep_type, dexfile.depend_off_rel): |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
565 name_path1 = dep[1] |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
566 if name_path1 not in all_markers: |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
567 all_markers.add(name_path1) |
57
fa8fe7d714b9
Fix semantic bug of dexfile.depend_off_rel by searching relative offset.
Thinker K.F. Li <thinker@codemud.net>
parents:
56
diff
changeset
|
568 _install_offset_marker(name_path1) |
25
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
569 pass |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
570 |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
571 name_path2 = dep[2] |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
572 if name_path2 not in all_markers: |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
573 all_markers.add(name_path2) |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
574 _install_rel_offset_marker(name_path2) |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
575 pass |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
576 pass |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
577 elif dep_type == dexfile.depend_off: |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
578 name_path = dep[1] |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
579 if name_path not in all_markers: |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
580 all_markers.add(name_path) |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
581 _install_offset_marker(name_path) |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
582 pass |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
583 pass |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
584 elif dep_type == dexfile.depend_idx: |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
585 name_path = dep[1] |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
586 if name_path not in all_markers: |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
587 all_markers.add(name_path) |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
588 _install_idx_marker(name_path) |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
589 pass |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
590 pass |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
591 else: |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
592 raise TypeError, 'Invalid type of depend %s' % (repr(dep_type)) |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
593 pass |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
594 pass |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
595 |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
596 |
89
7a059ab408f0
Refactoring procedure of initialize dependency declarations
Thinker K.F. Li <thinker@codemud.net>
parents:
88
diff
changeset
|
597 ## \brief Re-link dependencies that depend on a composite type. |
7a059ab408f0
Refactoring procedure of initialize dependency declarations
Thinker K.F. Li <thinker@codemud.net>
parents:
88
diff
changeset
|
598 # |
7a059ab408f0
Refactoring procedure of initialize dependency declarations
Thinker K.F. Li <thinker@codemud.net>
parents:
88
diff
changeset
|
599 # If an attribute depends on a composite type, it is still reference |
7a059ab408f0
Refactoring procedure of initialize dependency declarations
Thinker K.F. Li <thinker@codemud.net>
parents:
88
diff
changeset
|
600 # composite type itself after a marker been installed on the composite |
7a059ab408f0
Refactoring procedure of initialize dependency declarations
Thinker K.F. Li <thinker@codemud.net>
parents:
88
diff
changeset
|
601 # type. This function will fix it. |
7a059ab408f0
Refactoring procedure of initialize dependency declarations
Thinker K.F. Li <thinker@codemud.net>
parents:
88
diff
changeset
|
602 # |
26
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
603 def _patch_dex_type_markers(all_dep_decls): |
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
604 import itertools |
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
605 marked_types = dict([(marker.back_type, name) |
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
606 for name, marker in _all_dex_types().items() |
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
607 if isinstance(marker, _marker)]) |
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
608 |
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
609 travel_iters = [_travel_dex_type(dex_type, name_path) |
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
610 for name_path, dex_type in _all_dex_types().items()] |
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
611 marked_type_refs = [(name_path, marked_types[attr]) |
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
612 for attr, name_path in itertools.chain(*travel_iters) |
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
613 if type(attr) == type and |
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
614 issubclass(attr, dexfile.composite) and |
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
615 attr in marked_types] |
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
616 |
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
617 def patch_ref(name_path, depon_path): |
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
618 depon, depon_parent = _resolve_name_path(depon_path) |
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
619 |
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
620 path_elms = name_path.split('.') |
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
621 parent_path = '.'.join(path_elms[:-1]) |
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
622 parent, grand = _resolve_name_path(parent_path) |
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
623 |
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
624 if isinstance(grand, _nest_types): |
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
625 if isinstance(grand, (dexfile.array, dexfile.cond)): |
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
626 grand.child_type = depon |
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
627 elif isinstance(grand, dexfile.switch): |
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
628 key = eval(path_elms[-1]) |
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
629 grand.map[key] = depon |
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
630 else: |
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
631 raise RuntimeError, 'should not be here' |
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
632 pass |
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
633 else: |
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
634 name = path_elms[-1] |
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
635 setattr(parent, name, depon) |
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
636 pass |
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
637 pass |
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
638 |
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
639 for name_path, depon_path in marked_type_refs: |
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
640 patch_ref(name_path, depon_path) |
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
641 pass |
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
642 pass |
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
643 |
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
644 |
40
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
29
diff
changeset
|
645 def _build_associations(root_obj): |
56
7f23def22a95
Resolve problem of false of cond objects when build associations
Thinker K.F. Li <thinker@codemud.net>
parents:
55
diff
changeset
|
646 def get_elts(parent, path): |
7f23def22a95
Resolve problem of false of cond objects when build associations
Thinker K.F. Li <thinker@codemud.net>
parents:
55
diff
changeset
|
647 parts = path.split('.') |
7f23def22a95
Resolve problem of false of cond objects when build associations
Thinker K.F. Li <thinker@codemud.net>
parents:
55
diff
changeset
|
648 obj = parent |
7f23def22a95
Resolve problem of false of cond objects when build associations
Thinker K.F. Li <thinker@codemud.net>
parents:
55
diff
changeset
|
649 for part in parts: |
7f23def22a95
Resolve problem of false of cond objects when build associations
Thinker K.F. Li <thinker@codemud.net>
parents:
55
diff
changeset
|
650 obj = _dex_tree_get_child(obj, part) |
7f23def22a95
Resolve problem of false of cond objects when build associations
Thinker K.F. Li <thinker@codemud.net>
parents:
55
diff
changeset
|
651 if isinstance(obj, dexfile.cond) and not obj.is_true: |
7f23def22a95
Resolve problem of false of cond objects when build associations
Thinker K.F. Li <thinker@codemud.net>
parents:
55
diff
changeset
|
652 return () |
7f23def22a95
Resolve problem of false of cond objects when build associations
Thinker K.F. Li <thinker@codemud.net>
parents:
55
diff
changeset
|
653 pass |
7f23def22a95
Resolve problem of false of cond objects when build associations
Thinker K.F. Li <thinker@codemud.net>
parents:
55
diff
changeset
|
654 return obj |
7f23def22a95
Resolve problem of false of cond objects when build associations
Thinker K.F. Li <thinker@codemud.net>
parents:
55
diff
changeset
|
655 |
132
75a31967ebee
Following the ref in resotre_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
129
diff
changeset
|
656 for node in _travel_dex_relocatable(root_obj): |
75a31967ebee
Following the ref in resotre_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
129
diff
changeset
|
657 obj = node.obj |
75a31967ebee
Following the ref in resotre_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
129
diff
changeset
|
658 parents = node.parents |
75a31967ebee
Following the ref in resotre_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
129
diff
changeset
|
659 |
40
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
29
diff
changeset
|
660 if isinstance(obj, dexfile._objs_asso): |
55
6e4cf6905729
Seeking parents in reversed order for _build_associations()
Thinker K.F. Li <thinker@codemud.net>
parents:
54
diff
changeset
|
661 rev_parents = list(parents) |
6e4cf6905729
Seeking parents in reversed order for _build_associations()
Thinker K.F. Li <thinker@codemud.net>
parents:
54
diff
changeset
|
662 rev_parents.reverse() |
6e4cf6905729
Seeking parents in reversed order for _build_associations()
Thinker K.F. Li <thinker@codemud.net>
parents:
54
diff
changeset
|
663 for parent in rev_parents: |
40
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
29
diff
changeset
|
664 if isinstance(parent, dexfile.composite): |
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
29
diff
changeset
|
665 break |
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
29
diff
changeset
|
666 pass |
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
29
diff
changeset
|
667 |
56
7f23def22a95
Resolve problem of false of cond objects when build associations
Thinker K.F. Li <thinker@codemud.net>
parents:
55
diff
changeset
|
668 left_elts = get_elts(parent, obj.left) |
7f23def22a95
Resolve problem of false of cond objects when build associations
Thinker K.F. Li <thinker@codemud.net>
parents:
55
diff
changeset
|
669 right_elts = get_elts(parent, obj.right) |
55
6e4cf6905729
Seeking parents in reversed order for _build_associations()
Thinker K.F. Li <thinker@codemud.net>
parents:
54
diff
changeset
|
670 obj.build_associations(left_elts, right_elts) |
40
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
29
diff
changeset
|
671 pass |
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
29
diff
changeset
|
672 pass |
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
29
diff
changeset
|
673 pass |
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
29
diff
changeset
|
674 |
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
29
diff
changeset
|
675 |
43
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
676 ## \brief Find a parent that is an instance of given clazz from a list. |
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
677 # |
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
678 def _find_parent_of_clazz(clazz, parents): |
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
679 rev_parents = list(parents) |
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
680 rev_parents.reverse() |
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
681 for parent in rev_parents: |
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
682 if isinstance(parent, clazz): |
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
683 return parent |
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
684 pass |
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
685 raise TypeError, 'can not find a prent of %s type' % (repr(clazz)) |
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
686 |
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
687 |
132
75a31967ebee
Following the ref in resotre_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
129
diff
changeset
|
688 ## \brief Split a name path into class and attribute parts. |
75a31967ebee
Following the ref in resotre_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
129
diff
changeset
|
689 # |
75a31967ebee
Following the ref in resotre_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
129
diff
changeset
|
690 # \param name_path is a name path string. |
75a31967ebee
Following the ref in resotre_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
129
diff
changeset
|
691 # \return a tuple in pattern (class name, attribute name) |
75a31967ebee
Following the ref in resotre_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
129
diff
changeset
|
692 # |
43
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
693 def _split_name_path_clazz_attr(name_path): |
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
694 idx = name_path.index('.') |
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
695 if idx >= 0: |
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
696 clazz = name_path[:idx] |
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
697 attr = name_path[idx + 1:] |
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
698 else: |
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
699 clazz = name_path |
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
700 attr = None |
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
701 pass |
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
702 return clazz, attr |
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
703 |
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
704 |
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
705 ## \brief Setup value of refs. |
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
706 # |
41
c5cfc796af8b
Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents:
40
diff
changeset
|
707 def _build_refs(root_obj): |
132
75a31967ebee
Following the ref in resotre_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
129
diff
changeset
|
708 for node in _travel_dex_relocatable(root_obj): |
75a31967ebee
Following the ref in resotre_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
129
diff
changeset
|
709 name_path = node.name_path |
75a31967ebee
Following the ref in resotre_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
129
diff
changeset
|
710 parents = node.parents |
75a31967ebee
Following the ref in resotre_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
129
diff
changeset
|
711 |
43
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
712 if not parents: |
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
713 continue |
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
714 |
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
715 imm_parent = parents[-1] |
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
716 if isinstance(imm_parent, dexfile.cond) and not imm_parent.is_true: |
41
c5cfc796af8b
Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents:
40
diff
changeset
|
717 continue |
43
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
718 |
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
719 clazz, pclazz = _resolve_name_path(name_path) |
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
720 while isinstance(clazz, dexfile.depend): |
49
38fdd422f611
depend.child_type is replaced by null_relocatable.back_type
Thinker K.F. Li <thinker@codemud.net>
parents:
47
diff
changeset
|
721 clazz = clazz.back_type |
43
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
722 pass |
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
723 |
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
724 if isinstance(clazz, dexfile.ref): |
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
725 pclazz_name, attr_name = _split_name_path_clazz_attr(name_path) |
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
726 if not attr_name: |
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
727 raise ValueError, \ |
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
728 'not attribute name in name path (%s)' % (name_path) |
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
729 |
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
730 parent = _find_parent_of_clazz(dexfile.composite, parents) |
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
731 |
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
732 value = clazz.get_value(parents) |
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
733 _dex_tree_set_child(parent, attr_name, value) |
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
734 pass |
41
c5cfc796af8b
Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents:
40
diff
changeset
|
735 pass |
c5cfc796af8b
Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents:
40
diff
changeset
|
736 pass |
c5cfc796af8b
Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents:
40
diff
changeset
|
737 |
c5cfc796af8b
Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents:
40
diff
changeset
|
738 |
88
bbe8d5cbe368
Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents:
61
diff
changeset
|
739 ## \brief Link objects to their dependencies . |
25
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
740 def _link_dependencies(root_obj, all_dep_decls): |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
741 markers_info = {} |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
742 depon_src_map = {} |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
743 for dep_src, depon in all_dep_decls.items(): |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
744 for tgt in depon[1:]: |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
745 markers_info[tgt] = {} |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
746 depon_src_map[depon] = dep_src |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
747 pass |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
748 pass |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
749 |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
750 # |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
751 # Collect marked objects |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
752 # |
132
75a31967ebee
Following the ref in resotre_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
129
diff
changeset
|
753 for node in _travel_dex_relocatable(root_obj): |
75a31967ebee
Following the ref in resotre_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
129
diff
changeset
|
754 obj = node.obj |
75a31967ebee
Following the ref in resotre_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
129
diff
changeset
|
755 parents = node.parents |
75a31967ebee
Following the ref in resotre_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
129
diff
changeset
|
756 name_path = node.name_path |
75a31967ebee
Following the ref in resotre_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
129
diff
changeset
|
757 |
25
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
758 if name_path not in markers_info: |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
759 continue |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
760 |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
761 marker, dummy_parent = _resolve_name_path(name_path) |
53
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
52
diff
changeset
|
762 while isinstance(marker, dexfile.ref): |
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
52
diff
changeset
|
763 marker, dummy = _resolve_name_path(marker.target_path) |
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
52
diff
changeset
|
764 pass |
25
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
765 marker.link_prepare(obj, name_path, parents, markers_info) |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
766 pass |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
767 |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
768 # |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
769 # Link depend source to marked target |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
770 # |
132
75a31967ebee
Following the ref in resotre_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
129
diff
changeset
|
771 for node in _travel_dex_relocatable(root_obj): |
75a31967ebee
Following the ref in resotre_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
129
diff
changeset
|
772 obj = node.obj |
75a31967ebee
Following the ref in resotre_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
129
diff
changeset
|
773 parents = node.parents |
75a31967ebee
Following the ref in resotre_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
129
diff
changeset
|
774 name_path = node.name_path |
25
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
775 if name_path not in all_dep_decls: |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
776 continue |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
777 |
43
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
778 imm_parent = parents[-1] |
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
779 if isinstance(imm_parent, dexfile.cond) and not imm_parent.is_true: |
41
c5cfc796af8b
Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents:
40
diff
changeset
|
780 continue |
c5cfc796af8b
Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents:
40
diff
changeset
|
781 |
25
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
782 dep = all_dep_decls[name_path] |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
783 dep_type = dep[0] |
26
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
784 if dep_type == dexfile.depend_off_rel: |
29
b0cc5da28141
pass parents to travel info
Thinker K.F. Li <thinker@codemud.net>
parents:
28
diff
changeset
|
785 depon2 = _rel_offset_marker.find_depon(dep[2], parents) |
57
fa8fe7d714b9
Fix semantic bug of dexfile.depend_off_rel by searching relative offset.
Thinker K.F. Li <thinker@codemud.net>
parents:
56
diff
changeset
|
786 offset = depon2.data_offset + obj |
fa8fe7d714b9
Fix semantic bug of dexfile.depend_off_rel by searching relative offset.
Thinker K.F. Li <thinker@codemud.net>
parents:
56
diff
changeset
|
787 depon1 = markers_info[dep[1]][offset] |
124
8e42b2816893
Fixing compute_size() and sizeof() for DEX types.
Thinker K.F. Li <thinker@codemud.net>
parents:
123
diff
changeset
|
788 dep_type._depon2_log[depon1] = depon2 |
25
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
789 |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
790 name = name_path.split('.')[-1] |
58
c2a4921ec83b
Fix issue misbehavior for dependency when update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents:
57
diff
changeset
|
791 _dex_tree_set_child(imm_parent, name, depon1) |
26
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
792 elif dep_type == dexfile.depend_off: |
25
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
793 depon_name_path = dep[1] |
40
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
29
diff
changeset
|
794 depon = markers_info[depon_name_path][obj] |
25
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
795 name = name_path.split('.')[-1] |
43
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
796 _dex_tree_set_child(imm_parent, name, depon) |
26
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
797 elif dep_type == dexfile.depend_idx: |
25
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
798 depon_name_path = dep[1] |
40
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
29
diff
changeset
|
799 depon = markers_info[depon_name_path][obj] |
25
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
800 name = name_path.split('.')[-1] |
43
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
801 _dex_tree_set_child(imm_parent, name, depon) |
25
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
802 else: |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
803 raise TypeError, 'invalid depend type %s' % (repr(dep_type)) |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
804 pass |
23
fff40aabefab
Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
805 pass |
fff40aabefab
Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
806 |
24
a57ec6a76fe3
Describe steps to track dependencies
Thinker K.F. Li <thinker@codemud.net>
parents:
23
diff
changeset
|
807 |
42
8ca4a6bc6b79
Extract to dex_deptracker.build_dependencies
Thinker K.F. Li <thinker@codemud.net>
parents:
41
diff
changeset
|
808 def build_dependencies(dexroot, all_dep_decls): |
8ca4a6bc6b79
Extract to dex_deptracker.build_dependencies
Thinker K.F. Li <thinker@codemud.net>
parents:
41
diff
changeset
|
809 _build_associations(dexroot) |
8ca4a6bc6b79
Extract to dex_deptracker.build_dependencies
Thinker K.F. Li <thinker@codemud.net>
parents:
41
diff
changeset
|
810 _build_refs(dexroot) |
8ca4a6bc6b79
Extract to dex_deptracker.build_dependencies
Thinker K.F. Li <thinker@codemud.net>
parents:
41
diff
changeset
|
811 _link_dependencies(dexroot, all_dep_decls) |
8ca4a6bc6b79
Extract to dex_deptracker.build_dependencies
Thinker K.F. Li <thinker@codemud.net>
parents:
41
diff
changeset
|
812 pass |
8ca4a6bc6b79
Extract to dex_deptracker.build_dependencies
Thinker K.F. Li <thinker@codemud.net>
parents:
41
diff
changeset
|
813 |
8ca4a6bc6b79
Extract to dex_deptracker.build_dependencies
Thinker K.F. Li <thinker@codemud.net>
parents:
41
diff
changeset
|
814 |
47 | 815 def _build_depon_dep_map(all_dep_decls): |
53
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
52
diff
changeset
|
816 from itertools import chain |
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
52
diff
changeset
|
817 |
47 | 818 def _build_sub_depon_dep(from_path, dep): |
819 depon1 = dep[1] | |
820 sub = [(depon1, from_path)] | |
821 dep_type = dep[0] | |
822 if dep_type == dexfile.depend_off_rel: | |
823 depon2 = dep[2] | |
824 sub.append((depon2, from_path)) | |
825 pass | |
826 | |
827 return sub | |
828 | |
829 depon_dep_lsts = [_build_sub_depon_dep(from_path, dep) | |
830 for from_path, dep in all_dep_decls.items()] | |
831 depon_dep_lst = chain(*depon_dep_lsts) | |
832 depon_dep_map = dict(depon_dep_lst) | |
53
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
52
diff
changeset
|
833 return depon_dep_map |
47 | 834 |
835 | |
127
650244dcdd82
Sort arrays in rules requested by dalvik
Thinker K.F. Li <thinker@codemud.net>
parents:
126
diff
changeset
|
836 ## \brief Make sorted arrays being sorted. |
650244dcdd82
Sort arrays in rules requested by dalvik
Thinker K.F. Li <thinker@codemud.net>
parents:
126
diff
changeset
|
837 # |
650244dcdd82
Sort arrays in rules requested by dalvik
Thinker K.F. Li <thinker@codemud.net>
parents:
126
diff
changeset
|
838 # Some array in a DEXFile must be sorted in some kind of rule. They |
650244dcdd82
Sort arrays in rules requested by dalvik
Thinker K.F. Li <thinker@codemud.net>
parents:
126
diff
changeset
|
839 # are typed by \ref array_sorted, the type of a sorted array. Child |
650244dcdd82
Sort arrays in rules requested by dalvik
Thinker K.F. Li <thinker@codemud.net>
parents:
126
diff
changeset
|
840 # type of a sorted array must implement __cmp__ method to define the |
650244dcdd82
Sort arrays in rules requested by dalvik
Thinker K.F. Li <thinker@codemud.net>
parents:
126
diff
changeset
|
841 # rule. |
650244dcdd82
Sort arrays in rules requested by dalvik
Thinker K.F. Li <thinker@codemud.net>
parents:
126
diff
changeset
|
842 # |
650244dcdd82
Sort arrays in rules requested by dalvik
Thinker K.F. Li <thinker@codemud.net>
parents:
126
diff
changeset
|
843 # This function must be applied on a DEXFile_linked before calling |
650244dcdd82
Sort arrays in rules requested by dalvik
Thinker K.F. Li <thinker@codemud.net>
parents:
126
diff
changeset
|
844 # restore_dependencies(). |
650244dcdd82
Sort arrays in rules requested by dalvik
Thinker K.F. Li <thinker@codemud.net>
parents:
126
diff
changeset
|
845 # |
650244dcdd82
Sort arrays in rules requested by dalvik
Thinker K.F. Li <thinker@codemud.net>
parents:
126
diff
changeset
|
846 def dex_sort_sorted_arrays(dex): |
650244dcdd82
Sort arrays in rules requested by dalvik
Thinker K.F. Li <thinker@codemud.net>
parents:
126
diff
changeset
|
847 assert isinstance(dex, dexfile.DEXFile_linked) |
650244dcdd82
Sort arrays in rules requested by dalvik
Thinker K.F. Li <thinker@codemud.net>
parents:
126
diff
changeset
|
848 |
132
75a31967ebee
Following the ref in resotre_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
129
diff
changeset
|
849 for node in _travel_dex_relocatable(dex): |
75a31967ebee
Following the ref in resotre_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
129
diff
changeset
|
850 obj = node.obj |
127
650244dcdd82
Sort arrays in rules requested by dalvik
Thinker K.F. Li <thinker@codemud.net>
parents:
126
diff
changeset
|
851 if isinstance(obj, dexfile.array_sorted): |
650244dcdd82
Sort arrays in rules requested by dalvik
Thinker K.F. Li <thinker@codemud.net>
parents:
126
diff
changeset
|
852 obj.items.sort() |
650244dcdd82
Sort arrays in rules requested by dalvik
Thinker K.F. Li <thinker@codemud.net>
parents:
126
diff
changeset
|
853 pass |
650244dcdd82
Sort arrays in rules requested by dalvik
Thinker K.F. Li <thinker@codemud.net>
parents:
126
diff
changeset
|
854 pass |
650244dcdd82
Sort arrays in rules requested by dalvik
Thinker K.F. Li <thinker@codemud.net>
parents:
126
diff
changeset
|
855 pass |
650244dcdd82
Sort arrays in rules requested by dalvik
Thinker K.F. Li <thinker@codemud.net>
parents:
126
diff
changeset
|
856 |
650244dcdd82
Sort arrays in rules requested by dalvik
Thinker K.F. Li <thinker@codemud.net>
parents:
126
diff
changeset
|
857 |
123
78357afb4a9d
Test case for restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
121
diff
changeset
|
858 ## \brief Update offset for all relocatable of a DEXFile. |
78357afb4a9d
Test case for restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
121
diff
changeset
|
859 # |
78357afb4a9d
Test case for restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
121
diff
changeset
|
860 # Update offset of instances of \ref _dex_type. |
78357afb4a9d
Test case for restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
121
diff
changeset
|
861 # |
78357afb4a9d
Test case for restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
121
diff
changeset
|
862 # \param dexroot is a linked (called build_dependencies()) \ref DEXFile. |
78357afb4a9d
Test case for restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
121
diff
changeset
|
863 # \param all_dep_decls is a dictionary returned by prepare_dep_decls(). |
78357afb4a9d
Test case for restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
121
diff
changeset
|
864 # |
47 | 865 def update_offset(dexroot, all_dep_decls): |
124
8e42b2816893
Fixing compute_size() and sizeof() for DEX types.
Thinker K.F. Li <thinker@codemud.net>
parents:
123
diff
changeset
|
866 from paraspace.dexfile import man_off |
53
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
52
diff
changeset
|
867 |
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
52
diff
changeset
|
868 depon_dep_map = _build_depon_dep_map(all_dep_decls) |
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
52
diff
changeset
|
869 dex_type_names = _all_dex_type_to_names() |
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
52
diff
changeset
|
870 |
58
c2a4921ec83b
Fix issue misbehavior for dependency when update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents:
57
diff
changeset
|
871 def make_path(obj, parent_path, obj_name): |
c2a4921ec83b
Fix issue misbehavior for dependency when update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents:
57
diff
changeset
|
872 name_path = parent_path + '.' + obj_name |
c2a4921ec83b
Fix issue misbehavior for dependency when update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents:
57
diff
changeset
|
873 |
53
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
52
diff
changeset
|
874 if isinstance(obj, dexfile.composite): |
58
c2a4921ec83b
Fix issue misbehavior for dependency when update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents:
57
diff
changeset
|
875 if name_path not in all_dep_decls: |
c2a4921ec83b
Fix issue misbehavior for dependency when update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents:
57
diff
changeset
|
876 type_name = dex_type_names[obj.__class__] |
c2a4921ec83b
Fix issue misbehavior for dependency when update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents:
57
diff
changeset
|
877 return type_name |
c2a4921ec83b
Fix issue misbehavior for dependency when update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents:
57
diff
changeset
|
878 pass |
c2a4921ec83b
Fix issue misbehavior for dependency when update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents:
57
diff
changeset
|
879 return name_path |
52
67aa8ca8fff3
untested dex_deptracker.update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents:
49
diff
changeset
|
880 |
67aa8ca8fff3
untested dex_deptracker.update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents:
49
diff
changeset
|
881 moff = man_off(0) |
123
78357afb4a9d
Test case for restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
121
diff
changeset
|
882 queue = [(dexroot, 'DEXFile', None)] |
47 | 883 |
52
67aa8ca8fff3
untested dex_deptracker.update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents:
49
diff
changeset
|
884 while queue: |
123
78357afb4a9d
Test case for restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
121
diff
changeset
|
885 obj, name_path, parent = queue.pop() |
53
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
52
diff
changeset
|
886 |
58
c2a4921ec83b
Fix issue misbehavior for dependency when update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents:
57
diff
changeset
|
887 obj_clazz, parent_clazz = _resolve_name_path(name_path) |
54
870312703ba1
Fix issuge of crossing dexfile.ref when updating offset
Thinker K.F. Li <thinker@codemud.net>
parents:
53
diff
changeset
|
888 if isinstance(obj_clazz, dexfile.depend): |
125
b9688a3badaa
Add compute_size() for DEX types that missed it
Thinker K.F. Li <thinker@codemud.net>
parents:
124
diff
changeset
|
889 obj_clazz.compute_size(obj) |
58
c2a4921ec83b
Fix issue misbehavior for dependency when update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents:
57
diff
changeset
|
890 moff(obj_clazz.sizeof(obj)) |
54
870312703ba1
Fix issuge of crossing dexfile.ref when updating offset
Thinker K.F. Li <thinker@codemud.net>
parents:
53
diff
changeset
|
891 continue |
870312703ba1
Fix issuge of crossing dexfile.ref when updating offset
Thinker K.F. Li <thinker@codemud.net>
parents:
53
diff
changeset
|
892 |
53
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
52
diff
changeset
|
893 if name_path in depon_dep_map: |
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
52
diff
changeset
|
894 marker, dummy = _resolve_name_path(name_path) |
54
870312703ba1
Fix issuge of crossing dexfile.ref when updating offset
Thinker K.F. Li <thinker@codemud.net>
parents:
53
diff
changeset
|
895 while isinstance(marker, dexfile.ref): |
870312703ba1
Fix issuge of crossing dexfile.ref when updating offset
Thinker K.F. Li <thinker@codemud.net>
parents:
53
diff
changeset
|
896 marker, dummy = _resolve_name_path(marker.target_path) |
870312703ba1
Fix issuge of crossing dexfile.ref when updating offset
Thinker K.F. Li <thinker@codemud.net>
parents:
53
diff
changeset
|
897 try: |
870312703ba1
Fix issuge of crossing dexfile.ref when updating offset
Thinker K.F. Li <thinker@codemud.net>
parents:
53
diff
changeset
|
898 obj = obj[0] |
870312703ba1
Fix issuge of crossing dexfile.ref when updating offset
Thinker K.F. Li <thinker@codemud.net>
parents:
53
diff
changeset
|
899 except: |
870312703ba1
Fix issuge of crossing dexfile.ref when updating offset
Thinker K.F. Li <thinker@codemud.net>
parents:
53
diff
changeset
|
900 print name_path |
870312703ba1
Fix issuge of crossing dexfile.ref when updating offset
Thinker K.F. Li <thinker@codemud.net>
parents:
53
diff
changeset
|
901 raise |
870312703ba1
Fix issuge of crossing dexfile.ref when updating offset
Thinker K.F. Li <thinker@codemud.net>
parents:
53
diff
changeset
|
902 pass |
53
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
52
diff
changeset
|
903 marker.set_marker(obj, moff()) |
52
67aa8ca8fff3
untested dex_deptracker.update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents:
49
diff
changeset
|
904 pass |
53
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
52
diff
changeset
|
905 |
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
52
diff
changeset
|
906 if isinstance(obj, (tuple, list)): |
123
78357afb4a9d
Test case for restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
121
diff
changeset
|
907 attrs = [(elt, make_path(elt, name_path, str(idx)), obj) |
53
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
52
diff
changeset
|
908 for idx, elt in enumerate(obj)] |
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
52
diff
changeset
|
909 attrs.reverse() |
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
52
diff
changeset
|
910 queue = queue + attrs |
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
52
diff
changeset
|
911 continue |
52
67aa8ca8fff3
untested dex_deptracker.update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents:
49
diff
changeset
|
912 |
67aa8ca8fff3
untested dex_deptracker.update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents:
49
diff
changeset
|
913 if isinstance(obj, dexfile.ref): |
47 | 914 continue |
53
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
52
diff
changeset
|
915 |
52
67aa8ca8fff3
untested dex_deptracker.update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents:
49
diff
changeset
|
916 if not isinstance(obj, dexfile.relocatable): |
124
8e42b2816893
Fixing compute_size() and sizeof() for DEX types.
Thinker K.F. Li <thinker@codemud.net>
parents:
123
diff
changeset
|
917 if isinstance(obj_clazz, dexfile.auto_align): |
8e42b2816893
Fixing compute_size() and sizeof() for DEX types.
Thinker K.F. Li <thinker@codemud.net>
parents:
123
diff
changeset
|
918 obj = obj_clazz.recompute_align(moff()) |
8e42b2816893
Fixing compute_size() and sizeof() for DEX types.
Thinker K.F. Li <thinker@codemud.net>
parents:
123
diff
changeset
|
919 name = name_path.split('.')[-1] |
8e42b2816893
Fixing compute_size() and sizeof() for DEX types.
Thinker K.F. Li <thinker@codemud.net>
parents:
123
diff
changeset
|
920 _dex_tree_set_child(parent, name, obj) |
8e42b2816893
Fixing compute_size() and sizeof() for DEX types.
Thinker K.F. Li <thinker@codemud.net>
parents:
123
diff
changeset
|
921 pass |
125
b9688a3badaa
Add compute_size() for DEX types that missed it
Thinker K.F. Li <thinker@codemud.net>
parents:
124
diff
changeset
|
922 obj_clazz.compute_size(obj) |
123
78357afb4a9d
Test case for restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
121
diff
changeset
|
923 moff(obj_clazz.sizeof(obj)) |
52
67aa8ca8fff3
untested dex_deptracker.update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents:
49
diff
changeset
|
924 continue |
67aa8ca8fff3
untested dex_deptracker.update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents:
49
diff
changeset
|
925 |
53
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
52
diff
changeset
|
926 children = obj.children() |
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
52
diff
changeset
|
927 attr_n_names = [(_dex_tree_get_child(obj, child_name), child_name) |
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
52
diff
changeset
|
928 for child_name in children] |
123
78357afb4a9d
Test case for restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
121
diff
changeset
|
929 attrs = [(attr, make_path(attr, name_path, attr_name), obj) |
53
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
52
diff
changeset
|
930 for attr, attr_name in attr_n_names] |
52
67aa8ca8fff3
untested dex_deptracker.update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents:
49
diff
changeset
|
931 attrs.reverse() |
67aa8ca8fff3
untested dex_deptracker.update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents:
49
diff
changeset
|
932 queue = queue + attrs |
47 | 933 pass |
934 pass | |
935 | |
936 | |
121
7644cb633d4b
Synchronize value of fields of DEXFile.
Thinker K.F. Li <thinker@codemud.net>
parents:
120
diff
changeset
|
937 def _sync_dex_header(dex): |
123
78357afb4a9d
Test case for restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
121
diff
changeset
|
938 from paraspace.dexfile import auto_align |
78357afb4a9d
Test case for restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
121
diff
changeset
|
939 |
121
7644cb633d4b
Synchronize value of fields of DEXFile.
Thinker K.F. Li <thinker@codemud.net>
parents:
120
diff
changeset
|
940 header = dex.header |
7644cb633d4b
Synchronize value of fields of DEXFile.
Thinker K.F. Li <thinker@codemud.net>
parents:
120
diff
changeset
|
941 map_items = dex.maps.items.items |
7644cb633d4b
Synchronize value of fields of DEXFile.
Thinker K.F. Li <thinker@codemud.net>
parents:
120
diff
changeset
|
942 for map_item in map_items: |
7644cb633d4b
Synchronize value of fields of DEXFile.
Thinker K.F. Li <thinker@codemud.net>
parents:
120
diff
changeset
|
943 itype = map_item.type |
7644cb633d4b
Synchronize value of fields of DEXFile.
Thinker K.F. Li <thinker@codemud.net>
parents:
120
diff
changeset
|
944 map_name = dexfile._DEX_MapItem.types[itype] |
7644cb633d4b
Synchronize value of fields of DEXFile.
Thinker K.F. Li <thinker@codemud.net>
parents:
120
diff
changeset
|
945 if map_name == 'kDexTypeHeaderItem': |
7644cb633d4b
Synchronize value of fields of DEXFile.
Thinker K.F. Li <thinker@codemud.net>
parents:
120
diff
changeset
|
946 pass |
7644cb633d4b
Synchronize value of fields of DEXFile.
Thinker K.F. Li <thinker@codemud.net>
parents:
120
diff
changeset
|
947 elif map_name == 'kDexTypeStringIdItem': |
7644cb633d4b
Synchronize value of fields of DEXFile.
Thinker K.F. Li <thinker@codemud.net>
parents:
120
diff
changeset
|
948 header.stringIdsSize = map_item.size |
7644cb633d4b
Synchronize value of fields of DEXFile.
Thinker K.F. Li <thinker@codemud.net>
parents:
120
diff
changeset
|
949 header.stringIdsOff = map_item.offset |
7644cb633d4b
Synchronize value of fields of DEXFile.
Thinker K.F. Li <thinker@codemud.net>
parents:
120
diff
changeset
|
950 pass |
7644cb633d4b
Synchronize value of fields of DEXFile.
Thinker K.F. Li <thinker@codemud.net>
parents:
120
diff
changeset
|
951 elif map_name == 'kDexTypeTypeIdItem': |
7644cb633d4b
Synchronize value of fields of DEXFile.
Thinker K.F. Li <thinker@codemud.net>
parents:
120
diff
changeset
|
952 header.typeIdsSize = map_item.size |
7644cb633d4b
Synchronize value of fields of DEXFile.
Thinker K.F. Li <thinker@codemud.net>
parents:
120
diff
changeset
|
953 header.typeIdsOff = map_item.offset |
7644cb633d4b
Synchronize value of fields of DEXFile.
Thinker K.F. Li <thinker@codemud.net>
parents:
120
diff
changeset
|
954 pass |
7644cb633d4b
Synchronize value of fields of DEXFile.
Thinker K.F. Li <thinker@codemud.net>
parents:
120
diff
changeset
|
955 elif map_name == 'kDexTypeProtoIdItem': |
7644cb633d4b
Synchronize value of fields of DEXFile.
Thinker K.F. Li <thinker@codemud.net>
parents:
120
diff
changeset
|
956 header.protoIdsSize = map_item.size |
7644cb633d4b
Synchronize value of fields of DEXFile.
Thinker K.F. Li <thinker@codemud.net>
parents:
120
diff
changeset
|
957 header.protoIdsOff = map_item.offset |
7644cb633d4b
Synchronize value of fields of DEXFile.
Thinker K.F. Li <thinker@codemud.net>
parents:
120
diff
changeset
|
958 pass |
7644cb633d4b
Synchronize value of fields of DEXFile.
Thinker K.F. Li <thinker@codemud.net>
parents:
120
diff
changeset
|
959 elif map_name == 'kDexTypeFieldIdItem': |
7644cb633d4b
Synchronize value of fields of DEXFile.
Thinker K.F. Li <thinker@codemud.net>
parents:
120
diff
changeset
|
960 header.fieldIdsSize = map_item.size |
7644cb633d4b
Synchronize value of fields of DEXFile.
Thinker K.F. Li <thinker@codemud.net>
parents:
120
diff
changeset
|
961 header.fieldIdsOff = map_item.offset |
7644cb633d4b
Synchronize value of fields of DEXFile.
Thinker K.F. Li <thinker@codemud.net>
parents:
120
diff
changeset
|
962 pass |
7644cb633d4b
Synchronize value of fields of DEXFile.
Thinker K.F. Li <thinker@codemud.net>
parents:
120
diff
changeset
|
963 elif map_name == 'kDexTypeMethodIdItem': |
7644cb633d4b
Synchronize value of fields of DEXFile.
Thinker K.F. Li <thinker@codemud.net>
parents:
120
diff
changeset
|
964 header.methodIdsSize = map_item.size |
7644cb633d4b
Synchronize value of fields of DEXFile.
Thinker K.F. Li <thinker@codemud.net>
parents:
120
diff
changeset
|
965 header.methodIdsOff = map_item.offset |
7644cb633d4b
Synchronize value of fields of DEXFile.
Thinker K.F. Li <thinker@codemud.net>
parents:
120
diff
changeset
|
966 pass |
7644cb633d4b
Synchronize value of fields of DEXFile.
Thinker K.F. Li <thinker@codemud.net>
parents:
120
diff
changeset
|
967 elif map_name == 'kDexTypeClassDefItem': |
7644cb633d4b
Synchronize value of fields of DEXFile.
Thinker K.F. Li <thinker@codemud.net>
parents:
120
diff
changeset
|
968 header.classDefsSize = map_item.size |
7644cb633d4b
Synchronize value of fields of DEXFile.
Thinker K.F. Li <thinker@codemud.net>
parents:
120
diff
changeset
|
969 header.classDefsOff = map_item.offset |
7644cb633d4b
Synchronize value of fields of DEXFile.
Thinker K.F. Li <thinker@codemud.net>
parents:
120
diff
changeset
|
970 pass |
7644cb633d4b
Synchronize value of fields of DEXFile.
Thinker K.F. Li <thinker@codemud.net>
parents:
120
diff
changeset
|
971 elif map_name == 'kDexTypeMapList': |
7644cb633d4b
Synchronize value of fields of DEXFile.
Thinker K.F. Li <thinker@codemud.net>
parents:
120
diff
changeset
|
972 header.mapOff = map_item.offset |
7644cb633d4b
Synchronize value of fields of DEXFile.
Thinker K.F. Li <thinker@codemud.net>
parents:
120
diff
changeset
|
973 pass |
7644cb633d4b
Synchronize value of fields of DEXFile.
Thinker K.F. Li <thinker@codemud.net>
parents:
120
diff
changeset
|
974 pass |
7644cb633d4b
Synchronize value of fields of DEXFile.
Thinker K.F. Li <thinker@codemud.net>
parents:
120
diff
changeset
|
975 |
7644cb633d4b
Synchronize value of fields of DEXFile.
Thinker K.F. Li <thinker@codemud.net>
parents:
120
diff
changeset
|
976 classdef_raw_size = dexfile.array.sizeof(dex.classDefs) |
7644cb633d4b
Synchronize value of fields of DEXFile.
Thinker K.F. Li <thinker@codemud.net>
parents:
120
diff
changeset
|
977 header.dataOff = header.classDefsOff + classdef_raw_size |
7644cb633d4b
Synchronize value of fields of DEXFile.
Thinker K.F. Li <thinker@codemud.net>
parents:
120
diff
changeset
|
978 header.dataSize = header.fileSize - header.dataOff |
7644cb633d4b
Synchronize value of fields of DEXFile.
Thinker K.F. Li <thinker@codemud.net>
parents:
120
diff
changeset
|
979 pass |
7644cb633d4b
Synchronize value of fields of DEXFile.
Thinker K.F. Li <thinker@codemud.net>
parents:
120
diff
changeset
|
980 |
7644cb633d4b
Synchronize value of fields of DEXFile.
Thinker K.F. Li <thinker@codemud.net>
parents:
120
diff
changeset
|
981 |
7644cb633d4b
Synchronize value of fields of DEXFile.
Thinker K.F. Li <thinker@codemud.net>
parents:
120
diff
changeset
|
982 def _sync_dex_maps(dex): |
7644cb633d4b
Synchronize value of fields of DEXFile.
Thinker K.F. Li <thinker@codemud.net>
parents:
120
diff
changeset
|
983 map_items = dex.maps.items.items |
7644cb633d4b
Synchronize value of fields of DEXFile.
Thinker K.F. Li <thinker@codemud.net>
parents:
120
diff
changeset
|
984 moff = dexfile.man_off(0) |
7644cb633d4b
Synchronize value of fields of DEXFile.
Thinker K.F. Li <thinker@codemud.net>
parents:
120
diff
changeset
|
985 |
7644cb633d4b
Synchronize value of fields of DEXFile.
Thinker K.F. Li <thinker@codemud.net>
parents:
120
diff
changeset
|
986 for map_item in map_items: |
7644cb633d4b
Synchronize value of fields of DEXFile.
Thinker K.F. Li <thinker@codemud.net>
parents:
120
diff
changeset
|
987 attr_name = dexfile.DEXFile.block_defs[map_item.type] |
7644cb633d4b
Synchronize value of fields of DEXFile.
Thinker K.F. Li <thinker@codemud.net>
parents:
120
diff
changeset
|
988 obj = getattr(dex, attr_name) |
7644cb633d4b
Synchronize value of fields of DEXFile.
Thinker K.F. Li <thinker@codemud.net>
parents:
120
diff
changeset
|
989 |
7644cb633d4b
Synchronize value of fields of DEXFile.
Thinker K.F. Li <thinker@codemud.net>
parents:
120
diff
changeset
|
990 data_sz = obj.sizeof(obj) |
7644cb633d4b
Synchronize value of fields of DEXFile.
Thinker K.F. Li <thinker@codemud.net>
parents:
120
diff
changeset
|
991 map_item.offset = moff(data_sz) |
123
78357afb4a9d
Test case for restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
121
diff
changeset
|
992 if attr_name == 'maps': |
78357afb4a9d
Test case for restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
121
diff
changeset
|
993 padding_sz = dexfile.auto_align.sizeof(dex.maps.padding) |
78357afb4a9d
Test case for restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
121
diff
changeset
|
994 map_item.offset = map_item.offset + padding_sz |
78357afb4a9d
Test case for restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
121
diff
changeset
|
995 pass |
78357afb4a9d
Test case for restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
121
diff
changeset
|
996 |
121
7644cb633d4b
Synchronize value of fields of DEXFile.
Thinker K.F. Li <thinker@codemud.net>
parents:
120
diff
changeset
|
997 if attr_name not in ('maps', 'header'): |
7644cb633d4b
Synchronize value of fields of DEXFile.
Thinker K.F. Li <thinker@codemud.net>
parents:
120
diff
changeset
|
998 map_item.size = len(obj.items) |
7644cb633d4b
Synchronize value of fields of DEXFile.
Thinker K.F. Li <thinker@codemud.net>
parents:
120
diff
changeset
|
999 else: |
123
78357afb4a9d
Test case for restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
121
diff
changeset
|
1000 map_item.size = 1 |
121
7644cb633d4b
Synchronize value of fields of DEXFile.
Thinker K.F. Li <thinker@codemud.net>
parents:
120
diff
changeset
|
1001 pass |
7644cb633d4b
Synchronize value of fields of DEXFile.
Thinker K.F. Li <thinker@codemud.net>
parents:
120
diff
changeset
|
1002 pass |
7644cb633d4b
Synchronize value of fields of DEXFile.
Thinker K.F. Li <thinker@codemud.net>
parents:
120
diff
changeset
|
1003 pass |
7644cb633d4b
Synchronize value of fields of DEXFile.
Thinker K.F. Li <thinker@codemud.net>
parents:
120
diff
changeset
|
1004 |
7644cb633d4b
Synchronize value of fields of DEXFile.
Thinker K.F. Li <thinker@codemud.net>
parents:
120
diff
changeset
|
1005 |
7644cb633d4b
Synchronize value of fields of DEXFile.
Thinker K.F. Li <thinker@codemud.net>
parents:
120
diff
changeset
|
1006 def _sync_DEXFile_fields(dex): |
7644cb633d4b
Synchronize value of fields of DEXFile.
Thinker K.F. Li <thinker@codemud.net>
parents:
120
diff
changeset
|
1007 dex.compute_size() |
7644cb633d4b
Synchronize value of fields of DEXFile.
Thinker K.F. Li <thinker@codemud.net>
parents:
120
diff
changeset
|
1008 dex.header.fileSize = dex.sizeof(dex) |
7644cb633d4b
Synchronize value of fields of DEXFile.
Thinker K.F. Li <thinker@codemud.net>
parents:
120
diff
changeset
|
1009 |
7644cb633d4b
Synchronize value of fields of DEXFile.
Thinker K.F. Li <thinker@codemud.net>
parents:
120
diff
changeset
|
1010 _sync_dex_maps(dex) |
7644cb633d4b
Synchronize value of fields of DEXFile.
Thinker K.F. Li <thinker@codemud.net>
parents:
120
diff
changeset
|
1011 _sync_dex_header(dex) |
126
ff6f869273b7
Fix wrong init value for computing checksum
Thinker K.F. Li <thinker@codemud.net>
parents:
125
diff
changeset
|
1012 |
ff6f869273b7
Fix wrong init value for computing checksum
Thinker K.F. Li <thinker@codemud.net>
parents:
125
diff
changeset
|
1013 dex.make_signature() |
ff6f869273b7
Fix wrong init value for computing checksum
Thinker K.F. Li <thinker@codemud.net>
parents:
125
diff
changeset
|
1014 dex.make_checksum() |
121
7644cb633d4b
Synchronize value of fields of DEXFile.
Thinker K.F. Li <thinker@codemud.net>
parents:
120
diff
changeset
|
1015 pass |
7644cb633d4b
Synchronize value of fields of DEXFile.
Thinker K.F. Li <thinker@codemud.net>
parents:
120
diff
changeset
|
1016 |
7644cb633d4b
Synchronize value of fields of DEXFile.
Thinker K.F. Li <thinker@codemud.net>
parents:
120
diff
changeset
|
1017 |
46
94e80f7a61b5
Add dex_deptracker.restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
43
diff
changeset
|
1018 ## \brief Restore to raw value before linking for dependencies. |
94e80f7a61b5
Add dex_deptracker.restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
43
diff
changeset
|
1019 # |
94e80f7a61b5
Add dex_deptracker.restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
43
diff
changeset
|
1020 def restore_dependencies(dexroot, all_dep_decls): |
123
78357afb4a9d
Test case for restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
121
diff
changeset
|
1021 update_offset(dexroot, all_dep_decls) |
132
75a31967ebee
Following the ref in resotre_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
129
diff
changeset
|
1022 |
75a31967ebee
Following the ref in resotre_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
129
diff
changeset
|
1023 def set_child(node, value): |
75a31967ebee
Following the ref in resotre_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
129
diff
changeset
|
1024 vtype, dummy = _resolve_name_path(node.origin_path) |
75a31967ebee
Following the ref in resotre_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
129
diff
changeset
|
1025 while isinstance(vtype, dexfile.null_relocatable): |
75a31967ebee
Following the ref in resotre_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
129
diff
changeset
|
1026 vtype = vtype.back_type |
75a31967ebee
Following the ref in resotre_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
129
diff
changeset
|
1027 pass |
75a31967ebee
Following the ref in resotre_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
129
diff
changeset
|
1028 |
75a31967ebee
Following the ref in resotre_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
129
diff
changeset
|
1029 if isinstance(vtype, dexfile.ref): |
75a31967ebee
Following the ref in resotre_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
129
diff
changeset
|
1030 name_path = vtype.target_path |
75a31967ebee
Following the ref in resotre_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
129
diff
changeset
|
1031 else: |
75a31967ebee
Following the ref in resotre_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
129
diff
changeset
|
1032 name_path = node.origin_path |
75a31967ebee
Following the ref in resotre_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
129
diff
changeset
|
1033 pass |
75a31967ebee
Following the ref in resotre_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
129
diff
changeset
|
1034 |
75a31967ebee
Following the ref in resotre_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
129
diff
changeset
|
1035 parent_clazzname, attr_name = _split_name_path_clazz_attr(name_path) |
75a31967ebee
Following the ref in resotre_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
129
diff
changeset
|
1036 parent_clazz, dummy = _resolve_name_path(parent_clazzname) |
75a31967ebee
Following the ref in resotre_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
129
diff
changeset
|
1037 parent_clazz = _skip_marker_clazz(parent_clazz) |
75a31967ebee
Following the ref in resotre_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
129
diff
changeset
|
1038 clazz_parent = _find_parent_of_clazz(parent_clazz, node.parents) |
75a31967ebee
Following the ref in resotre_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
129
diff
changeset
|
1039 |
75a31967ebee
Following the ref in resotre_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
129
diff
changeset
|
1040 _dex_tree_set_child(clazz_parent, attr_name, value) |
75a31967ebee
Following the ref in resotre_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
129
diff
changeset
|
1041 pass |
123
78357afb4a9d
Test case for restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
121
diff
changeset
|
1042 |
132
75a31967ebee
Following the ref in resotre_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
129
diff
changeset
|
1043 for node in _travel_dex_relocatable(dexroot): |
75a31967ebee
Following the ref in resotre_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
129
diff
changeset
|
1044 obj = node.obj |
75a31967ebee
Following the ref in resotre_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
129
diff
changeset
|
1045 parents = node.parents |
75a31967ebee
Following the ref in resotre_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
129
diff
changeset
|
1046 name_path = node.name_path |
75a31967ebee
Following the ref in resotre_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
129
diff
changeset
|
1047 |
46
94e80f7a61b5
Add dex_deptracker.restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
43
diff
changeset
|
1048 if name_path not in all_dep_decls: |
94e80f7a61b5
Add dex_deptracker.restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
43
diff
changeset
|
1049 continue |
94e80f7a61b5
Add dex_deptracker.restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
43
diff
changeset
|
1050 |
94e80f7a61b5
Add dex_deptracker.restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
43
diff
changeset
|
1051 imm_parent = parents[-1] |
94e80f7a61b5
Add dex_deptracker.restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
43
diff
changeset
|
1052 if isinstance(imm_parent, dexfile.cond) and not imm_parent.is_true: |
94e80f7a61b5
Add dex_deptracker.restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
43
diff
changeset
|
1053 continue |
94e80f7a61b5
Add dex_deptracker.restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
43
diff
changeset
|
1054 |
94e80f7a61b5
Add dex_deptracker.restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
43
diff
changeset
|
1055 dep = all_dep_decls[name_path] |
94e80f7a61b5
Add dex_deptracker.restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
43
diff
changeset
|
1056 dep_type = dep[0] |
94e80f7a61b5
Add dex_deptracker.restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
43
diff
changeset
|
1057 if dep_type == dexfile.depend_off_rel: |
61
3e34c7d33182
Fix and test restore_depedencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
58
diff
changeset
|
1058 relative_to = _rel_offset_marker.find_depon(dep[2], parents) |
3e34c7d33182
Fix and test restore_depedencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
58
diff
changeset
|
1059 depon = obj |
3e34c7d33182
Fix and test restore_depedencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
58
diff
changeset
|
1060 rel_off = depon.data_offset - relative_to.data_offset |
132
75a31967ebee
Following the ref in resotre_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
129
diff
changeset
|
1061 set_child(node, rel_off) |
46
94e80f7a61b5
Add dex_deptracker.restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
43
diff
changeset
|
1062 elif dep_type == dexfile.depend_off: |
61
3e34c7d33182
Fix and test restore_depedencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
58
diff
changeset
|
1063 depon = obj |
132
75a31967ebee
Following the ref in resotre_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
129
diff
changeset
|
1064 set_child(node, depon.data_offset) |
46
94e80f7a61b5
Add dex_deptracker.restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
43
diff
changeset
|
1065 elif dep_type == dexfile.depend_idx: |
61
3e34c7d33182
Fix and test restore_depedencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
58
diff
changeset
|
1066 depon = obj |
132
75a31967ebee
Following the ref in resotre_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
129
diff
changeset
|
1067 set_child(node, depon.data_idx) |
46
94e80f7a61b5
Add dex_deptracker.restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
43
diff
changeset
|
1068 else: |
94e80f7a61b5
Add dex_deptracker.restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
43
diff
changeset
|
1069 raise TypeError, 'invalid depend type %s' % (repr(dep_type)) |
94e80f7a61b5
Add dex_deptracker.restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
43
diff
changeset
|
1070 pass |
121
7644cb633d4b
Synchronize value of fields of DEXFile.
Thinker K.F. Li <thinker@codemud.net>
parents:
120
diff
changeset
|
1071 |
7644cb633d4b
Synchronize value of fields of DEXFile.
Thinker K.F. Li <thinker@codemud.net>
parents:
120
diff
changeset
|
1072 _sync_DEXFile_fields(dexroot) |
46
94e80f7a61b5
Add dex_deptracker.restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
43
diff
changeset
|
1073 pass |
94e80f7a61b5
Add dex_deptracker.restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
43
diff
changeset
|
1074 |
94e80f7a61b5
Add dex_deptracker.restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
43
diff
changeset
|
1075 |
89
7a059ab408f0
Refactoring procedure of initialize dependency declarations
Thinker K.F. Li <thinker@codemud.net>
parents:
88
diff
changeset
|
1076 ## \brief Prepare and return dependency declares. |
7a059ab408f0
Refactoring procedure of initialize dependency declarations
Thinker K.F. Li <thinker@codemud.net>
parents:
88
diff
changeset
|
1077 def prepare_dep_decls(): |
7a059ab408f0
Refactoring procedure of initialize dependency declarations
Thinker K.F. Li <thinker@codemud.net>
parents:
88
diff
changeset
|
1078 decls = collect_all_dep_decls() |
90
fe7b3f111d57
Testcase for code injection
Thinker K.F. Li <thinker@codemud.net>
parents:
89
diff
changeset
|
1079 _install_markers(decls) |
89
7a059ab408f0
Refactoring procedure of initialize dependency declarations
Thinker K.F. Li <thinker@codemud.net>
parents:
88
diff
changeset
|
1080 _patch_dex_type_markers(decls) |
7a059ab408f0
Refactoring procedure of initialize dependency declarations
Thinker K.F. Li <thinker@codemud.net>
parents:
88
diff
changeset
|
1081 return decls |
7a059ab408f0
Refactoring procedure of initialize dependency declarations
Thinker K.F. Li <thinker@codemud.net>
parents:
88
diff
changeset
|
1082 |
7a059ab408f0
Refactoring procedure of initialize dependency declarations
Thinker K.F. Li <thinker@codemud.net>
parents:
88
diff
changeset
|
1083 |
23
fff40aabefab
Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
1084 if __name__ == '__main__': |
25
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
1085 dex = dexfile.DEXFile.open('data/testdata1.dex') |
23
fff40aabefab
Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
1086 |
fff40aabefab
Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
1087 import pprint |
fff40aabefab
Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
1088 print |
fff40aabefab
Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
1089 print 'Dependencies' |
25
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
1090 pprint.pprint(collect_all_dep_decls()) |