Mercurial > paraspace
annotate paraspace/dex_deptracker.py @ 129:52749d91cc22
update index of elements while calling update_offset()
author | Thinker K.F. Li <thinker@codemud.net> |
---|---|
date | Tue, 09 Aug 2011 00:06:58 +0800 |
parents | 650244dcdd82 |
children | 75a31967ebee |
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 |
25
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
99 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
|
100 # 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
|
101 dep_decls = {} |
23
fff40aabefab
Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
102 |
fff40aabefab
Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
103 for attr in dir(clazz): |
fff40aabefab
Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
104 namelist = [name_path, attr] |
fff40aabefab
Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
105 |
25
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
106 # |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
107 # Find dependency |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
108 # |
23
fff40aabefab
Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
109 digged_flag = False |
fff40aabefab
Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
110 |
fff40aabefab
Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
111 value_type = getattr(clazz, attr) |
fff40aabefab
Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
112 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
|
113 (type(value_type) == type and |
fff40aabefab
Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
114 issubclass(value_type, _nest_types)): |
fff40aabefab
Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
115 if isinstance(value_type, dexfile.array): |
fff40aabefab
Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
116 namelist.append('items') |
25
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
117 namelist.append('*') |
23
fff40aabefab
Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
118 value_type = value_type.child_type |
fff40aabefab
Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
119 elif isinstance(value_type, dexfile.cond): |
fff40aabefab
Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
120 namelist.append('value') |
fff40aabefab
Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
121 value_type = value_type.child_type |
fff40aabefab
Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
122 elif isinstance(value_type, dexfile.switch): |
fff40aabefab
Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
123 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
|
124 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
|
125 continue |
fff40aabefab
Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
126 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
|
127 child_dep_decls = \ |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
128 _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
|
129 child_type, |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
130 dex_types) |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
131 |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
132 if child_dep_decls: |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
133 raise ValueError, \ |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
134 '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
|
135 % (child_name_path) |
23
fff40aabefab
Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
136 pass |
fff40aabefab
Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
137 digged_flag = True |
fff40aabefab
Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
138 break |
fff40aabefab
Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
139 pass |
fff40aabefab
Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
140 |
fff40aabefab
Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
141 if digged_flag: |
fff40aabefab
Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
142 continue |
25
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
143 |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
144 # |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
145 # Record dependency |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
146 # |
23
fff40aabefab
Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
147 if isinstance(value_type, dexfile.depend): |
fff40aabefab
Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
148 from_name = '.'.join(namelist) |
fff40aabefab
Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
149 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
|
150 depend_name = value_type.depend_on |
25
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
151 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
|
152 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
|
153 depend_name = value_type.depend_on |
fff40aabefab
Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
154 relative_to = value_type.relative_to |
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_rel, |
23
fff40aabefab
Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
156 depend_name, |
fff40aabefab
Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
157 relative_to) |
fff40aabefab
Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
158 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
|
159 depend_name = value_type.depend_on |
25
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
160 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
|
161 pass |
fff40aabefab
Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
162 pass |
fff40aabefab
Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
163 pass |
25
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
164 return dep_decls |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
165 |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
166 |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
167 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
|
168 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
|
169 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
|
170 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
|
171 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
|
172 raise AttributeError, \ |
6e4cf6905729
Seeking parents in reversed order for _build_associations()
Thinker K.F. Li <thinker@codemud.net>
parents:
54
diff
changeset
|
173 '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
|
174 (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
|
175 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
|
176 |
40
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
29
diff
changeset
|
177 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
|
178 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
|
179 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
|
180 continue |
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
29
diff
changeset
|
181 |
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
29
diff
changeset
|
182 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
|
183 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
|
184 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
|
185 continue |
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
29
diff
changeset
|
186 |
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
29
diff
changeset
|
187 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
|
188 pass |
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
29
diff
changeset
|
189 return obj |
23
fff40aabefab
Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
190 |
fff40aabefab
Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
191 |
25
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
192 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
|
193 child_parts = child_name.split('.') |
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
194 for child_part in child_parts[:-1]: |
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
195 if isinstance(obj, list): |
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
196 idx = int(child_part) |
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
197 obj = obj[idx] |
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
198 continue |
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
199 |
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
200 if isinstance(obj, dexfile.switch): |
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
201 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
|
202 obj = obj.value |
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
203 continue |
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
204 |
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
205 obj = getattr(obj, child_part) |
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
206 pass |
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
207 |
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
208 last_part = child_parts[-1] |
25
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
209 if isinstance(obj, list): |
43
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
210 idx = int(last_part) |
25
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
211 obj[idx] = value |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
212 elif isinstance(obj, dexfile.switch): |
43
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
213 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
|
214 obj.value = value |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
215 else: |
43
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
216 setattr(obj, last_part, value) |
25
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
217 pass |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
218 pass |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
219 |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
220 |
47 | 221 ## \brief Travel the tree of relocatable objects and their attributes. |
222 # | |
223 # \param skip_func is a function that returns true for skip a subtree. | |
224 # | |
225 # \ref skip_func is called for every relocatable and their attributes | |
226 # to determines if visiting the object and subtree. | |
227 # | |
228 def _travel_dex_relocatable(root_obj, parents=[], skip_func=None): | |
25
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
229 stk = [(root_obj, parents, root_obj.__class__.__name__)] |
26
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
230 |
29
b0cc5da28141
pass parents to travel info
Thinker K.F. Li <thinker@codemud.net>
parents:
28
diff
changeset
|
231 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
|
232 child_parents = parents + [obj] |
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
233 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
|
234 child_path = obj_name + '.' + child_name |
3e34c7d33182
Fix and test restore_depedencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
58
diff
changeset
|
235 |
3e34c7d33182
Fix and test restore_depedencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
58
diff
changeset
|
236 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
|
237 if not isinstance(child_clazz, dexfile.depend): |
3e34c7d33182
Fix and test restore_depedencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
58
diff
changeset
|
238 if isinstance(child_obj, dexfile.composite): |
3e34c7d33182
Fix and test restore_depedencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
58
diff
changeset
|
239 child_path = child_obj.__class__.__name__ |
3e34c7d33182
Fix and test restore_depedencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
58
diff
changeset
|
240 pass |
26
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
241 pass |
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
242 return (child_obj, child_parents, child_path) |
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
243 |
25
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
244 while stk: |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
245 obj, parents, obj_name = stk.pop(0) |
47 | 246 if skip_func and skip_func(obj, parents, obj_name): |
247 continue | |
25
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
248 yield (obj, parents, obj_name) |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
249 |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
250 if isinstance(obj, list): |
29
b0cc5da28141
pass parents to travel info
Thinker K.F. Li <thinker@codemud.net>
parents:
28
diff
changeset
|
251 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
|
252 for idx in range(len(obj))] |
25
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
253 stk.extend(children) |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
254 continue |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
255 |
61
3e34c7d33182
Fix and test restore_depedencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
58
diff
changeset
|
256 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
|
257 if isinstance(obj_clazz, dexfile.depend): |
3e34c7d33182
Fix and test restore_depedencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
58
diff
changeset
|
258 continue |
25
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
259 if not isinstance(obj, dexfile.relocatable): |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
260 continue |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
261 |
29
b0cc5da28141
pass parents to travel info
Thinker K.F. Li <thinker@codemud.net>
parents:
28
diff
changeset
|
262 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
|
263 for child_name in obj.children()] |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
264 stk.extend(children) |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
265 pass |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
266 pass |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
267 |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
268 |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
269 def _all_dex_types(): |
23
fff40aabefab
Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
270 dex_types = dict([(name, value) |
fff40aabefab
Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
271 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
|
272 if name.startswith('_DEX_')]) |
fff40aabefab
Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
273 dex_types['DEXFile'] = dexfile.DEXFile |
fff40aabefab
Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
274 return dex_types |
fff40aabefab
Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
275 |
fff40aabefab
Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
276 |
53
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
52
diff
changeset
|
277 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
|
278 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
|
279 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
|
280 return value, name |
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
52
diff
changeset
|
281 |
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
52
diff
changeset
|
282 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
|
283 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
|
284 if name.startswith('_DEX_')]) |
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
52
diff
changeset
|
285 dex_types[dexfile.DEXFile] = 'DEXFile' |
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
52
diff
changeset
|
286 return dex_types |
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
52
diff
changeset
|
287 |
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
52
diff
changeset
|
288 |
25
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
289 def collect_all_dep_decls(): |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
290 dex_types = _all_dex_types() |
23
fff40aabefab
Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
291 |
25
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
292 all_dep_decls = {} |
23
fff40aabefab
Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
293 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
|
294 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
|
295 all_dep_decls.update(dep_decls) |
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 |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
298 return all_dep_decls |
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 |
124
8e42b2816893
Fixing compute_size() and sizeof() for DEX types.
Thinker K.F. Li <thinker@codemud.net>
parents:
123
diff
changeset
|
301 ## 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
|
302 # |
52
67aa8ca8fff3
untested dex_deptracker.update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents:
49
diff
changeset
|
303 class _marker(dexfile.null_relocatable): |
26
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
304 back_type = None |
53
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
52
diff
changeset
|
305 |
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
52
diff
changeset
|
306 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
|
307 raise NotImplementedError, \ |
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
52
diff
changeset
|
308 '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
|
309 |
8e42b2816893
Fixing compute_size() and sizeof() for DEX types.
Thinker K.F. Li <thinker@codemud.net>
parents:
123
diff
changeset
|
310 ## \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
|
311 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
|
312 raise NotImplementedError, \ |
8e42b2816893
Fixing compute_size() and sizeof() for DEX types.
Thinker K.F. Li <thinker@codemud.net>
parents:
123
diff
changeset
|
313 '_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
|
314 pass |
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
315 |
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
316 class _uid_marker(_marker): |
25
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
317 uid_seq = 0 |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
318 |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
319 def __init__(self, back_type, name_path): |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
320 self.back_type = back_type |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
321 self.name_path = name_path |
23
fff40aabefab
Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
322 pass |
fff40aabefab
Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
323 |
25
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
324 def parse(self, parent, data, off): |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
325 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
|
326 try: |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
327 value.data_uid = _uid_marker.uid_seq |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
328 except AttributeError: |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
329 raise AttributeError, \ |
53
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
52
diff
changeset
|
330 '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
|
331 (self.name_path, repr(value)) |
25
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
332 _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
|
333 |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
334 return value |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
335 |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
336 def sizeof(self, value): |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
337 sz = self.back_type.sizeof(value) |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
338 return sz |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
339 |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
340 def compute_size(self, back_obj): |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
341 self.back_type.compute_size(back_obj) |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
342 pass |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
343 |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
344 def to_str(self, back_obj): |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
345 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
|
346 |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
347 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
|
348 try: |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
349 id_item_map = markers_info[name_path] |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
350 except KeyError: |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
351 id_item_map = {} |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
352 markers_info[name_path] = id_item_map |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
353 pass |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
354 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
|
355 id_item_map[obj.data_uid] = obj |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
356 pass |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
357 |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
358 def __getattr__(self, name): |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
359 return getattr(self.back_type, name) |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
360 |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
361 def __call__(self, *args, **kws): |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
362 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
|
363 |
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
52
diff
changeset
|
364 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
|
365 pass |
25
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
366 pass |
23
fff40aabefab
Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
367 |
fff40aabefab
Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
368 |
25
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
369 class _offset_marker(_uid_marker): |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
370 def parse(self, parent, data, off): |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
371 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
|
372 |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
373 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
|
374 value.data_offset = off |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
375 return value |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
376 |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
377 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
|
378 try: |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
379 id_item_map = markers_info[name_path] |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
380 except KeyError: |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
381 id_item_map = {} |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
382 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
|
383 pass |
25
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
384 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
|
385 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
|
386 pass |
53
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
52
diff
changeset
|
387 |
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
52
diff
changeset
|
388 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
|
389 obj.data_offset = off |
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
52
diff
changeset
|
390 pass |
24
a57ec6a76fe3
Describe steps to track dependencies
Thinker K.F. Li <thinker@codemud.net>
parents:
23
diff
changeset
|
391 pass |
23
fff40aabefab
Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
392 |
24
a57ec6a76fe3
Describe steps to track dependencies
Thinker K.F. Li <thinker@codemud.net>
parents:
23
diff
changeset
|
393 |
25
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
394 class _rel_offset_marker(_offset_marker): |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
395 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
|
396 rev_parents = list(parents) |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
397 rev_parents.reverse() |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
398 |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
399 for parent in rev_parents: |
29
b0cc5da28141
pass parents to travel info
Thinker K.F. Li <thinker@codemud.net>
parents:
28
diff
changeset
|
400 try: |
b0cc5da28141
pass parents to travel info
Thinker K.F. Li <thinker@codemud.net>
parents:
28
diff
changeset
|
401 rel_marker_info = parent.rel_marker_info |
b0cc5da28141
pass parents to travel info
Thinker K.F. Li <thinker@codemud.net>
parents:
28
diff
changeset
|
402 except AttributeError: |
b0cc5da28141
pass parents to travel info
Thinker K.F. Li <thinker@codemud.net>
parents:
28
diff
changeset
|
403 try: |
b0cc5da28141
pass parents to travel info
Thinker K.F. Li <thinker@codemud.net>
parents:
28
diff
changeset
|
404 rel_marker_info = {} |
b0cc5da28141
pass parents to travel info
Thinker K.F. Li <thinker@codemud.net>
parents:
28
diff
changeset
|
405 parent.rel_marker_info = rel_marker_info |
b0cc5da28141
pass parents to travel info
Thinker K.F. Li <thinker@codemud.net>
parents:
28
diff
changeset
|
406 except AttributeError: |
b0cc5da28141
pass parents to travel info
Thinker K.F. Li <thinker@codemud.net>
parents:
28
diff
changeset
|
407 continue |
b0cc5da28141
pass parents to travel info
Thinker K.F. Li <thinker@codemud.net>
parents:
28
diff
changeset
|
408 pass |
b0cc5da28141
pass parents to travel info
Thinker K.F. Li <thinker@codemud.net>
parents:
28
diff
changeset
|
409 depons = rel_marker_info.setdefault(name_path, []) |
b0cc5da28141
pass parents to travel info
Thinker K.F. Li <thinker@codemud.net>
parents:
28
diff
changeset
|
410 depons.append(obj) |
25
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
411 pass |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
412 pass |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
413 |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
414 @staticmethod |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
415 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
|
416 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
|
417 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
|
418 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
|
419 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
|
420 |
25
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
421 rev_parents = list(parents) |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
422 rev_parents.reverse() |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
423 |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
424 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
|
425 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
|
426 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
|
427 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
|
428 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
|
429 |
25
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
430 try: |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
431 rel_marker_info = parent.rel_marker_info |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
432 except: |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
433 continue |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
434 if name_path in rel_marker_info: |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
435 depons = rel_marker_info[name_path] |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
436 assert len(depons) == 1 |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
437 depon = depons[0] |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
438 return depon |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
439 pass |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
440 |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
441 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
|
442 |
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
52
diff
changeset
|
443 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
|
444 obj.data_offset = off |
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
52
diff
changeset
|
445 pass |
25
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
446 pass |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
447 |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
448 |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
449 class _idx_marker(_uid_marker): |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
450 def parse(self, parent, data, off): |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
451 assert isinstance(self.back_type, dexfile.array) |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
452 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
|
453 for item in array.items: |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
454 item.data_uid = _uid_marker.uid_seq |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
455 _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
|
456 pass |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
457 return array |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
458 |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
459 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
|
460 try: |
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
29
diff
changeset
|
461 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
|
462 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
|
463 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
|
464 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
|
465 pass |
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
29
diff
changeset
|
466 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
|
467 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
|
468 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
|
469 pass |
25
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
470 pass |
53
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
52
diff
changeset
|
471 |
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
52
diff
changeset
|
472 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
|
473 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
|
474 elt.data_idx = idx |
52749d91cc22
update index of elements while calling update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents:
127
diff
changeset
|
475 pass |
53
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 def _install_offset_marker(name_path): |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
481 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
|
482 while isinstance(obj, dexfile.ref): |
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
52
diff
changeset
|
483 name_path = obj.target_path |
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
52
diff
changeset
|
484 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
|
485 pass |
25
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
486 marker = _offset_marker(obj, name_path) |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
487 name = name_path.split('.')[-1] |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
488 _dex_tree_set_child(parent, name, marker) |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
489 pass |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
490 |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
491 |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
492 def _install_rel_offset_marker(name_path): |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
493 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
|
494 while isinstance(obj, dexfile.ref): |
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
52
diff
changeset
|
495 name_path = obj.target_path |
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
52
diff
changeset
|
496 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
|
497 pass |
25
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
498 marker = _rel_offset_marker(obj, name_path) |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
499 name = name_path.split('.')[-1] |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
500 _dex_tree_set_child(parent, name, marker) |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
501 pass |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
502 |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
503 |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
504 def _install_uid_marker(name_path): |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
505 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
|
506 while isinstance(obj, dexfile.ref): |
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
52
diff
changeset
|
507 name_path = obj.target_path |
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
52
diff
changeset
|
508 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
|
509 pass |
25
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
510 marker = _uid_marker(obj, name_path) |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
511 name = name_path.split('.')[-1] |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
512 _dex_tree_set_child(parent, name, marker) |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
513 pass |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
514 |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
515 |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
516 def _install_idx_marker(name_path): |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
517 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
|
518 while isinstance(obj, dexfile.ref): |
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
52
diff
changeset
|
519 name_path = obj.target_path |
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
52
diff
changeset
|
520 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
|
521 pass |
25
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
522 marker = _idx_marker(obj, name_path) |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
523 name = name_path.split('.')[-1] |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
524 _dex_tree_set_child(parent, name, marker) |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
525 pass |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
526 |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
527 |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
528 def _install_markers(all_dep_decls): |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
529 all_markers = set() |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
530 |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
531 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
|
532 dep_type = dep[0] |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
533 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
|
534 name_path1 = dep[1] |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
535 if name_path1 not in all_markers: |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
536 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
|
537 _install_offset_marker(name_path1) |
25
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
538 pass |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
539 |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
540 name_path2 = dep[2] |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
541 if name_path2 not in all_markers: |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
542 all_markers.add(name_path2) |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
543 _install_rel_offset_marker(name_path2) |
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 pass |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
546 elif dep_type == dexfile.depend_off: |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
547 name_path = dep[1] |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
548 if name_path not in all_markers: |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
549 all_markers.add(name_path) |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
550 _install_offset_marker(name_path) |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
551 pass |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
552 pass |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
553 elif dep_type == dexfile.depend_idx: |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
554 name_path = dep[1] |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
555 if name_path not in all_markers: |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
556 all_markers.add(name_path) |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
557 _install_idx_marker(name_path) |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
558 pass |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
559 pass |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
560 else: |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
561 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
|
562 pass |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
563 pass |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
564 |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
565 |
89
7a059ab408f0
Refactoring procedure of initialize dependency declarations
Thinker K.F. Li <thinker@codemud.net>
parents:
88
diff
changeset
|
566 ## \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
|
567 # |
7a059ab408f0
Refactoring procedure of initialize dependency declarations
Thinker K.F. Li <thinker@codemud.net>
parents:
88
diff
changeset
|
568 # 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
|
569 # 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
|
570 # type. This function will fix it. |
7a059ab408f0
Refactoring procedure of initialize dependency declarations
Thinker K.F. Li <thinker@codemud.net>
parents:
88
diff
changeset
|
571 # |
26
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
572 def _patch_dex_type_markers(all_dep_decls): |
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
573 import itertools |
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
574 marked_types = dict([(marker.back_type, name) |
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
575 for name, marker in _all_dex_types().items() |
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
576 if isinstance(marker, _marker)]) |
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
577 |
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
578 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
|
579 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
|
580 marked_type_refs = [(name_path, marked_types[attr]) |
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
581 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
|
582 if type(attr) == type and |
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
583 issubclass(attr, dexfile.composite) and |
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
584 attr in marked_types] |
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
585 |
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
586 def patch_ref(name_path, depon_path): |
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
587 depon, depon_parent = _resolve_name_path(depon_path) |
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
588 |
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
589 path_elms = name_path.split('.') |
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
590 parent_path = '.'.join(path_elms[:-1]) |
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
591 parent, grand = _resolve_name_path(parent_path) |
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
592 |
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
593 if isinstance(grand, _nest_types): |
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
594 if isinstance(grand, (dexfile.array, dexfile.cond)): |
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
595 grand.child_type = depon |
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
596 elif isinstance(grand, dexfile.switch): |
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
597 key = eval(path_elms[-1]) |
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
598 grand.map[key] = depon |
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
599 else: |
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
600 raise RuntimeError, 'should not be here' |
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
601 pass |
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
602 else: |
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
603 name = path_elms[-1] |
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
604 setattr(parent, name, depon) |
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
605 pass |
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
606 pass |
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
607 |
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
608 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
|
609 patch_ref(name_path, depon_path) |
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
610 pass |
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
611 pass |
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
612 |
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
613 |
40
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
29
diff
changeset
|
614 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
|
615 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
|
616 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
|
617 obj = parent |
7f23def22a95
Resolve problem of false of cond objects when build associations
Thinker K.F. Li <thinker@codemud.net>
parents:
55
diff
changeset
|
618 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
|
619 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
|
620 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
|
621 return () |
7f23def22a95
Resolve problem of false of cond objects when build associations
Thinker K.F. Li <thinker@codemud.net>
parents:
55
diff
changeset
|
622 pass |
7f23def22a95
Resolve problem of false of cond objects when build associations
Thinker K.F. Li <thinker@codemud.net>
parents:
55
diff
changeset
|
623 return obj |
7f23def22a95
Resolve problem of false of cond objects when build associations
Thinker K.F. Li <thinker@codemud.net>
parents:
55
diff
changeset
|
624 |
40
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
29
diff
changeset
|
625 for obj, parents, name_path in \ |
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
29
diff
changeset
|
626 _travel_dex_relocatable(root_obj): |
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
29
diff
changeset
|
627 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
|
628 rev_parents = list(parents) |
6e4cf6905729
Seeking parents in reversed order for _build_associations()
Thinker K.F. Li <thinker@codemud.net>
parents:
54
diff
changeset
|
629 rev_parents.reverse() |
6e4cf6905729
Seeking parents in reversed order for _build_associations()
Thinker K.F. Li <thinker@codemud.net>
parents:
54
diff
changeset
|
630 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
|
631 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
|
632 break |
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
29
diff
changeset
|
633 pass |
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
29
diff
changeset
|
634 |
56
7f23def22a95
Resolve problem of false of cond objects when build associations
Thinker K.F. Li <thinker@codemud.net>
parents:
55
diff
changeset
|
635 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
|
636 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
|
637 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
|
638 pass |
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
29
diff
changeset
|
639 pass |
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
29
diff
changeset
|
640 pass |
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
29
diff
changeset
|
641 |
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
29
diff
changeset
|
642 |
43
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
643 ## \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
|
644 # |
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
645 def _find_parent_of_clazz(clazz, parents): |
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
646 rev_parents = list(parents) |
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
647 rev_parents.reverse() |
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
648 for parent in rev_parents: |
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
649 if isinstance(parent, clazz): |
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
650 return parent |
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
651 pass |
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
652 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
|
653 |
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
654 |
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
655 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
|
656 idx = name_path.index('.') |
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
657 if idx >= 0: |
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
658 clazz = name_path[:idx] |
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
659 attr = name_path[idx + 1:] |
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
660 else: |
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
661 clazz = name_path |
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
662 attr = None |
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
663 pass |
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
664 return clazz, attr |
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
665 |
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
666 |
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
667 ## \brief Setup value of refs. |
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
668 # |
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
|
669 def _build_refs(root_obj): |
c5cfc796af8b
Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents:
40
diff
changeset
|
670 for obj, parents, name_path in \ |
c5cfc796af8b
Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents:
40
diff
changeset
|
671 _travel_dex_relocatable(root_obj): |
43
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
672 if not parents: |
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
673 continue |
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
674 |
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
675 imm_parent = parents[-1] |
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
676 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
|
677 continue |
43
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
678 |
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
679 clazz, pclazz = _resolve_name_path(name_path) |
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
680 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
|
681 clazz = clazz.back_type |
43
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
682 pass |
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
683 |
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
684 if isinstance(clazz, dexfile.ref): |
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
685 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
|
686 if not attr_name: |
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
687 raise ValueError, \ |
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
688 '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
|
689 |
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
690 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
|
691 |
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
692 value = clazz.get_value(parents) |
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
693 _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
|
694 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
|
695 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
|
696 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
|
697 |
c5cfc796af8b
Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents:
40
diff
changeset
|
698 |
88
bbe8d5cbe368
Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents:
61
diff
changeset
|
699 ## \brief Link objects to their dependencies . |
25
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
700 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
|
701 markers_info = {} |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
702 depon_src_map = {} |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
703 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
|
704 for tgt in depon[1:]: |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
705 markers_info[tgt] = {} |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
706 depon_src_map[depon] = dep_src |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
707 pass |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
708 pass |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
709 |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
710 # |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
711 # Collect marked objects |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
712 # |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
713 for obj, parents, name_path in \ |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
714 _travel_dex_relocatable(root_obj): |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
715 if name_path not in markers_info: |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
716 continue |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
717 |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
718 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
|
719 while isinstance(marker, dexfile.ref): |
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
52
diff
changeset
|
720 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
|
721 pass |
25
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
722 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
|
723 pass |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
724 |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
725 # |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
726 # Link depend source to marked target |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
727 # |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
728 for obj, parents, name_path in \ |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
729 _travel_dex_relocatable(root_obj): |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
730 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
|
731 continue |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
732 |
43
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
733 imm_parent = parents[-1] |
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
734 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
|
735 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
|
736 |
25
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
737 dep = all_dep_decls[name_path] |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
738 dep_type = dep[0] |
26
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
739 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
|
740 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
|
741 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
|
742 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
|
743 dep_type._depon2_log[depon1] = depon2 |
25
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
744 |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
745 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
|
746 _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
|
747 elif dep_type == dexfile.depend_off: |
25
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
748 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
|
749 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
|
750 name = name_path.split('.')[-1] |
43
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
751 _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
|
752 elif dep_type == dexfile.depend_idx: |
25
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
753 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
|
754 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
|
755 name = name_path.split('.')[-1] |
43
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
756 _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
|
757 else: |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
758 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
|
759 pass |
23
fff40aabefab
Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
760 pass |
fff40aabefab
Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
761 |
24
a57ec6a76fe3
Describe steps to track dependencies
Thinker K.F. Li <thinker@codemud.net>
parents:
23
diff
changeset
|
762 |
42
8ca4a6bc6b79
Extract to dex_deptracker.build_dependencies
Thinker K.F. Li <thinker@codemud.net>
parents:
41
diff
changeset
|
763 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
|
764 _build_associations(dexroot) |
8ca4a6bc6b79
Extract to dex_deptracker.build_dependencies
Thinker K.F. Li <thinker@codemud.net>
parents:
41
diff
changeset
|
765 _build_refs(dexroot) |
8ca4a6bc6b79
Extract to dex_deptracker.build_dependencies
Thinker K.F. Li <thinker@codemud.net>
parents:
41
diff
changeset
|
766 _link_dependencies(dexroot, all_dep_decls) |
8ca4a6bc6b79
Extract to dex_deptracker.build_dependencies
Thinker K.F. Li <thinker@codemud.net>
parents:
41
diff
changeset
|
767 pass |
8ca4a6bc6b79
Extract to dex_deptracker.build_dependencies
Thinker K.F. Li <thinker@codemud.net>
parents:
41
diff
changeset
|
768 |
8ca4a6bc6b79
Extract to dex_deptracker.build_dependencies
Thinker K.F. Li <thinker@codemud.net>
parents:
41
diff
changeset
|
769 |
47 | 770 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
|
771 from itertools import chain |
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
52
diff
changeset
|
772 |
47 | 773 def _build_sub_depon_dep(from_path, dep): |
774 depon1 = dep[1] | |
775 sub = [(depon1, from_path)] | |
776 dep_type = dep[0] | |
777 if dep_type == dexfile.depend_off_rel: | |
778 depon2 = dep[2] | |
779 sub.append((depon2, from_path)) | |
780 pass | |
781 | |
782 return sub | |
783 | |
784 depon_dep_lsts = [_build_sub_depon_dep(from_path, dep) | |
785 for from_path, dep in all_dep_decls.items()] | |
786 depon_dep_lst = chain(*depon_dep_lsts) | |
787 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
|
788 return depon_dep_map |
47 | 789 |
790 | |
127
650244dcdd82
Sort arrays in rules requested by dalvik
Thinker K.F. Li <thinker@codemud.net>
parents:
126
diff
changeset
|
791 ## \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
|
792 # |
650244dcdd82
Sort arrays in rules requested by dalvik
Thinker K.F. Li <thinker@codemud.net>
parents:
126
diff
changeset
|
793 # 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
|
794 # 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
|
795 # 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
|
796 # rule. |
650244dcdd82
Sort arrays in rules requested by dalvik
Thinker K.F. Li <thinker@codemud.net>
parents:
126
diff
changeset
|
797 # |
650244dcdd82
Sort arrays in rules requested by dalvik
Thinker K.F. Li <thinker@codemud.net>
parents:
126
diff
changeset
|
798 # 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
|
799 # restore_dependencies(). |
650244dcdd82
Sort arrays in rules requested by dalvik
Thinker K.F. Li <thinker@codemud.net>
parents:
126
diff
changeset
|
800 # |
650244dcdd82
Sort arrays in rules requested by dalvik
Thinker K.F. Li <thinker@codemud.net>
parents:
126
diff
changeset
|
801 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
|
802 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
|
803 |
650244dcdd82
Sort arrays in rules requested by dalvik
Thinker K.F. Li <thinker@codemud.net>
parents:
126
diff
changeset
|
804 for obj, parents, name_path in _travel_dex_relocatable(dex): |
650244dcdd82
Sort arrays in rules requested by dalvik
Thinker K.F. Li <thinker@codemud.net>
parents:
126
diff
changeset
|
805 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
|
806 obj.items.sort() |
650244dcdd82
Sort arrays in rules requested by dalvik
Thinker K.F. Li <thinker@codemud.net>
parents:
126
diff
changeset
|
807 pass |
650244dcdd82
Sort arrays in rules requested by dalvik
Thinker K.F. Li <thinker@codemud.net>
parents:
126
diff
changeset
|
808 pass |
650244dcdd82
Sort arrays in rules requested by dalvik
Thinker K.F. Li <thinker@codemud.net>
parents:
126
diff
changeset
|
809 pass |
650244dcdd82
Sort arrays in rules requested by dalvik
Thinker K.F. Li <thinker@codemud.net>
parents:
126
diff
changeset
|
810 |
650244dcdd82
Sort arrays in rules requested by dalvik
Thinker K.F. Li <thinker@codemud.net>
parents:
126
diff
changeset
|
811 |
123
78357afb4a9d
Test case for restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
121
diff
changeset
|
812 ## \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
|
813 # |
78357afb4a9d
Test case for restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
121
diff
changeset
|
814 # 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
|
815 # |
78357afb4a9d
Test case for restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
121
diff
changeset
|
816 # \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
|
817 # \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
|
818 # |
47 | 819 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
|
820 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
|
821 |
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
52
diff
changeset
|
822 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
|
823 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
|
824 |
58
c2a4921ec83b
Fix issue misbehavior for dependency when update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents:
57
diff
changeset
|
825 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
|
826 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
|
827 |
53
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
52
diff
changeset
|
828 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
|
829 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
|
830 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
|
831 return type_name |
c2a4921ec83b
Fix issue misbehavior for dependency when update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents:
57
diff
changeset
|
832 pass |
c2a4921ec83b
Fix issue misbehavior for dependency when update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents:
57
diff
changeset
|
833 return name_path |
52
67aa8ca8fff3
untested dex_deptracker.update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents:
49
diff
changeset
|
834 |
67aa8ca8fff3
untested dex_deptracker.update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents:
49
diff
changeset
|
835 moff = man_off(0) |
123
78357afb4a9d
Test case for restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
121
diff
changeset
|
836 queue = [(dexroot, 'DEXFile', None)] |
47 | 837 |
52
67aa8ca8fff3
untested dex_deptracker.update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents:
49
diff
changeset
|
838 while queue: |
123
78357afb4a9d
Test case for restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
121
diff
changeset
|
839 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
|
840 |
58
c2a4921ec83b
Fix issue misbehavior for dependency when update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents:
57
diff
changeset
|
841 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
|
842 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
|
843 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
|
844 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
|
845 continue |
870312703ba1
Fix issuge of crossing dexfile.ref when updating offset
Thinker K.F. Li <thinker@codemud.net>
parents:
53
diff
changeset
|
846 |
53
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
52
diff
changeset
|
847 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
|
848 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
|
849 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
|
850 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
|
851 try: |
870312703ba1
Fix issuge of crossing dexfile.ref when updating offset
Thinker K.F. Li <thinker@codemud.net>
parents:
53
diff
changeset
|
852 obj = obj[0] |
870312703ba1
Fix issuge of crossing dexfile.ref when updating offset
Thinker K.F. Li <thinker@codemud.net>
parents:
53
diff
changeset
|
853 except: |
870312703ba1
Fix issuge of crossing dexfile.ref when updating offset
Thinker K.F. Li <thinker@codemud.net>
parents:
53
diff
changeset
|
854 print name_path |
870312703ba1
Fix issuge of crossing dexfile.ref when updating offset
Thinker K.F. Li <thinker@codemud.net>
parents:
53
diff
changeset
|
855 raise |
870312703ba1
Fix issuge of crossing dexfile.ref when updating offset
Thinker K.F. Li <thinker@codemud.net>
parents:
53
diff
changeset
|
856 pass |
53
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
52
diff
changeset
|
857 marker.set_marker(obj, moff()) |
52
67aa8ca8fff3
untested dex_deptracker.update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents:
49
diff
changeset
|
858 pass |
53
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
52
diff
changeset
|
859 |
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
52
diff
changeset
|
860 if isinstance(obj, (tuple, list)): |
123
78357afb4a9d
Test case for restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
121
diff
changeset
|
861 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
|
862 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
|
863 attrs.reverse() |
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
52
diff
changeset
|
864 queue = queue + attrs |
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
52
diff
changeset
|
865 continue |
52
67aa8ca8fff3
untested dex_deptracker.update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents:
49
diff
changeset
|
866 |
67aa8ca8fff3
untested dex_deptracker.update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents:
49
diff
changeset
|
867 if isinstance(obj, dexfile.ref): |
47 | 868 continue |
53
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
52
diff
changeset
|
869 |
52
67aa8ca8fff3
untested dex_deptracker.update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents:
49
diff
changeset
|
870 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
|
871 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
|
872 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
|
873 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
|
874 _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
|
875 pass |
125
b9688a3badaa
Add compute_size() for DEX types that missed it
Thinker K.F. Li <thinker@codemud.net>
parents:
124
diff
changeset
|
876 obj_clazz.compute_size(obj) |
123
78357afb4a9d
Test case for restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
121
diff
changeset
|
877 moff(obj_clazz.sizeof(obj)) |
52
67aa8ca8fff3
untested dex_deptracker.update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents:
49
diff
changeset
|
878 continue |
67aa8ca8fff3
untested dex_deptracker.update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents:
49
diff
changeset
|
879 |
53
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
52
diff
changeset
|
880 children = obj.children() |
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
52
diff
changeset
|
881 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
|
882 for child_name in children] |
123
78357afb4a9d
Test case for restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
121
diff
changeset
|
883 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
|
884 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
|
885 attrs.reverse() |
67aa8ca8fff3
untested dex_deptracker.update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents:
49
diff
changeset
|
886 queue = queue + attrs |
47 | 887 pass |
888 pass | |
889 | |
890 | |
121
7644cb633d4b
Synchronize value of fields of DEXFile.
Thinker K.F. Li <thinker@codemud.net>
parents:
120
diff
changeset
|
891 def _sync_dex_header(dex): |
123
78357afb4a9d
Test case for restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
121
diff
changeset
|
892 from paraspace.dexfile import auto_align |
78357afb4a9d
Test case for restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
121
diff
changeset
|
893 |
121
7644cb633d4b
Synchronize value of fields of DEXFile.
Thinker K.F. Li <thinker@codemud.net>
parents:
120
diff
changeset
|
894 header = dex.header |
7644cb633d4b
Synchronize value of fields of DEXFile.
Thinker K.F. Li <thinker@codemud.net>
parents:
120
diff
changeset
|
895 map_items = dex.maps.items.items |
7644cb633d4b
Synchronize value of fields of DEXFile.
Thinker K.F. Li <thinker@codemud.net>
parents:
120
diff
changeset
|
896 for map_item in map_items: |
7644cb633d4b
Synchronize value of fields of DEXFile.
Thinker K.F. Li <thinker@codemud.net>
parents:
120
diff
changeset
|
897 itype = map_item.type |
7644cb633d4b
Synchronize value of fields of DEXFile.
Thinker K.F. Li <thinker@codemud.net>
parents:
120
diff
changeset
|
898 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
|
899 if map_name == 'kDexTypeHeaderItem': |
7644cb633d4b
Synchronize value of fields of DEXFile.
Thinker K.F. Li <thinker@codemud.net>
parents:
120
diff
changeset
|
900 pass |
7644cb633d4b
Synchronize value of fields of DEXFile.
Thinker K.F. Li <thinker@codemud.net>
parents:
120
diff
changeset
|
901 elif map_name == 'kDexTypeStringIdItem': |
7644cb633d4b
Synchronize value of fields of DEXFile.
Thinker K.F. Li <thinker@codemud.net>
parents:
120
diff
changeset
|
902 header.stringIdsSize = map_item.size |
7644cb633d4b
Synchronize value of fields of DEXFile.
Thinker K.F. Li <thinker@codemud.net>
parents:
120
diff
changeset
|
903 header.stringIdsOff = map_item.offset |
7644cb633d4b
Synchronize value of fields of DEXFile.
Thinker K.F. Li <thinker@codemud.net>
parents:
120
diff
changeset
|
904 pass |
7644cb633d4b
Synchronize value of fields of DEXFile.
Thinker K.F. Li <thinker@codemud.net>
parents:
120
diff
changeset
|
905 elif map_name == 'kDexTypeTypeIdItem': |
7644cb633d4b
Synchronize value of fields of DEXFile.
Thinker K.F. Li <thinker@codemud.net>
parents:
120
diff
changeset
|
906 header.typeIdsSize = map_item.size |
7644cb633d4b
Synchronize value of fields of DEXFile.
Thinker K.F. Li <thinker@codemud.net>
parents:
120
diff
changeset
|
907 header.typeIdsOff = map_item.offset |
7644cb633d4b
Synchronize value of fields of DEXFile.
Thinker K.F. Li <thinker@codemud.net>
parents:
120
diff
changeset
|
908 pass |
7644cb633d4b
Synchronize value of fields of DEXFile.
Thinker K.F. Li <thinker@codemud.net>
parents:
120
diff
changeset
|
909 elif map_name == 'kDexTypeProtoIdItem': |
7644cb633d4b
Synchronize value of fields of DEXFile.
Thinker K.F. Li <thinker@codemud.net>
parents:
120
diff
changeset
|
910 header.protoIdsSize = map_item.size |
7644cb633d4b
Synchronize value of fields of DEXFile.
Thinker K.F. Li <thinker@codemud.net>
parents:
120
diff
changeset
|
911 header.protoIdsOff = map_item.offset |
7644cb633d4b
Synchronize value of fields of DEXFile.
Thinker K.F. Li <thinker@codemud.net>
parents:
120
diff
changeset
|
912 pass |
7644cb633d4b
Synchronize value of fields of DEXFile.
Thinker K.F. Li <thinker@codemud.net>
parents:
120
diff
changeset
|
913 elif map_name == 'kDexTypeFieldIdItem': |
7644cb633d4b
Synchronize value of fields of DEXFile.
Thinker K.F. Li <thinker@codemud.net>
parents:
120
diff
changeset
|
914 header.fieldIdsSize = map_item.size |
7644cb633d4b
Synchronize value of fields of DEXFile.
Thinker K.F. Li <thinker@codemud.net>
parents:
120
diff
changeset
|
915 header.fieldIdsOff = map_item.offset |
7644cb633d4b
Synchronize value of fields of DEXFile.
Thinker K.F. Li <thinker@codemud.net>
parents:
120
diff
changeset
|
916 pass |
7644cb633d4b
Synchronize value of fields of DEXFile.
Thinker K.F. Li <thinker@codemud.net>
parents:
120
diff
changeset
|
917 elif map_name == 'kDexTypeMethodIdItem': |
7644cb633d4b
Synchronize value of fields of DEXFile.
Thinker K.F. Li <thinker@codemud.net>
parents:
120
diff
changeset
|
918 header.methodIdsSize = map_item.size |
7644cb633d4b
Synchronize value of fields of DEXFile.
Thinker K.F. Li <thinker@codemud.net>
parents:
120
diff
changeset
|
919 header.methodIdsOff = map_item.offset |
7644cb633d4b
Synchronize value of fields of DEXFile.
Thinker K.F. Li <thinker@codemud.net>
parents:
120
diff
changeset
|
920 pass |
7644cb633d4b
Synchronize value of fields of DEXFile.
Thinker K.F. Li <thinker@codemud.net>
parents:
120
diff
changeset
|
921 elif map_name == 'kDexTypeClassDefItem': |
7644cb633d4b
Synchronize value of fields of DEXFile.
Thinker K.F. Li <thinker@codemud.net>
parents:
120
diff
changeset
|
922 header.classDefsSize = map_item.size |
7644cb633d4b
Synchronize value of fields of DEXFile.
Thinker K.F. Li <thinker@codemud.net>
parents:
120
diff
changeset
|
923 header.classDefsOff = map_item.offset |
7644cb633d4b
Synchronize value of fields of DEXFile.
Thinker K.F. Li <thinker@codemud.net>
parents:
120
diff
changeset
|
924 pass |
7644cb633d4b
Synchronize value of fields of DEXFile.
Thinker K.F. Li <thinker@codemud.net>
parents:
120
diff
changeset
|
925 elif map_name == 'kDexTypeMapList': |
7644cb633d4b
Synchronize value of fields of DEXFile.
Thinker K.F. Li <thinker@codemud.net>
parents:
120
diff
changeset
|
926 header.mapOff = map_item.offset |
7644cb633d4b
Synchronize value of fields of DEXFile.
Thinker K.F. Li <thinker@codemud.net>
parents:
120
diff
changeset
|
927 pass |
7644cb633d4b
Synchronize value of fields of DEXFile.
Thinker K.F. Li <thinker@codemud.net>
parents:
120
diff
changeset
|
928 pass |
7644cb633d4b
Synchronize value of fields of DEXFile.
Thinker K.F. Li <thinker@codemud.net>
parents:
120
diff
changeset
|
929 |
7644cb633d4b
Synchronize value of fields of DEXFile.
Thinker K.F. Li <thinker@codemud.net>
parents:
120
diff
changeset
|
930 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
|
931 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
|
932 header.dataSize = header.fileSize - header.dataOff |
7644cb633d4b
Synchronize value of fields of DEXFile.
Thinker K.F. Li <thinker@codemud.net>
parents:
120
diff
changeset
|
933 pass |
7644cb633d4b
Synchronize value of fields of DEXFile.
Thinker K.F. Li <thinker@codemud.net>
parents:
120
diff
changeset
|
934 |
7644cb633d4b
Synchronize value of fields of DEXFile.
Thinker K.F. Li <thinker@codemud.net>
parents:
120
diff
changeset
|
935 |
7644cb633d4b
Synchronize value of fields of DEXFile.
Thinker K.F. Li <thinker@codemud.net>
parents:
120
diff
changeset
|
936 def _sync_dex_maps(dex): |
7644cb633d4b
Synchronize value of fields of DEXFile.
Thinker K.F. Li <thinker@codemud.net>
parents:
120
diff
changeset
|
937 map_items = dex.maps.items.items |
7644cb633d4b
Synchronize value of fields of DEXFile.
Thinker K.F. Li <thinker@codemud.net>
parents:
120
diff
changeset
|
938 moff = dexfile.man_off(0) |
7644cb633d4b
Synchronize value of fields of DEXFile.
Thinker K.F. Li <thinker@codemud.net>
parents:
120
diff
changeset
|
939 |
7644cb633d4b
Synchronize value of fields of DEXFile.
Thinker K.F. Li <thinker@codemud.net>
parents:
120
diff
changeset
|
940 for map_item in map_items: |
7644cb633d4b
Synchronize value of fields of DEXFile.
Thinker K.F. Li <thinker@codemud.net>
parents:
120
diff
changeset
|
941 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
|
942 obj = getattr(dex, attr_name) |
7644cb633d4b
Synchronize value of fields of DEXFile.
Thinker K.F. Li <thinker@codemud.net>
parents:
120
diff
changeset
|
943 |
7644cb633d4b
Synchronize value of fields of DEXFile.
Thinker K.F. Li <thinker@codemud.net>
parents:
120
diff
changeset
|
944 data_sz = obj.sizeof(obj) |
7644cb633d4b
Synchronize value of fields of DEXFile.
Thinker K.F. Li <thinker@codemud.net>
parents:
120
diff
changeset
|
945 map_item.offset = moff(data_sz) |
123
78357afb4a9d
Test case for restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
121
diff
changeset
|
946 if attr_name == 'maps': |
78357afb4a9d
Test case for restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
121
diff
changeset
|
947 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
|
948 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
|
949 pass |
78357afb4a9d
Test case for restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
121
diff
changeset
|
950 |
121
7644cb633d4b
Synchronize value of fields of DEXFile.
Thinker K.F. Li <thinker@codemud.net>
parents:
120
diff
changeset
|
951 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
|
952 map_item.size = len(obj.items) |
7644cb633d4b
Synchronize value of fields of DEXFile.
Thinker K.F. Li <thinker@codemud.net>
parents:
120
diff
changeset
|
953 else: |
123
78357afb4a9d
Test case for restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
121
diff
changeset
|
954 map_item.size = 1 |
121
7644cb633d4b
Synchronize value of fields of DEXFile.
Thinker K.F. Li <thinker@codemud.net>
parents:
120
diff
changeset
|
955 pass |
7644cb633d4b
Synchronize value of fields of DEXFile.
Thinker K.F. Li <thinker@codemud.net>
parents:
120
diff
changeset
|
956 pass |
7644cb633d4b
Synchronize value of fields of DEXFile.
Thinker K.F. Li <thinker@codemud.net>
parents:
120
diff
changeset
|
957 pass |
7644cb633d4b
Synchronize value of fields of DEXFile.
Thinker K.F. Li <thinker@codemud.net>
parents:
120
diff
changeset
|
958 |
7644cb633d4b
Synchronize value of fields of DEXFile.
Thinker K.F. Li <thinker@codemud.net>
parents:
120
diff
changeset
|
959 |
7644cb633d4b
Synchronize value of fields of DEXFile.
Thinker K.F. Li <thinker@codemud.net>
parents:
120
diff
changeset
|
960 def _sync_DEXFile_fields(dex): |
7644cb633d4b
Synchronize value of fields of DEXFile.
Thinker K.F. Li <thinker@codemud.net>
parents:
120
diff
changeset
|
961 dex.compute_size() |
7644cb633d4b
Synchronize value of fields of DEXFile.
Thinker K.F. Li <thinker@codemud.net>
parents:
120
diff
changeset
|
962 dex.header.fileSize = dex.sizeof(dex) |
7644cb633d4b
Synchronize value of fields of DEXFile.
Thinker K.F. Li <thinker@codemud.net>
parents:
120
diff
changeset
|
963 |
7644cb633d4b
Synchronize value of fields of DEXFile.
Thinker K.F. Li <thinker@codemud.net>
parents:
120
diff
changeset
|
964 _sync_dex_maps(dex) |
7644cb633d4b
Synchronize value of fields of DEXFile.
Thinker K.F. Li <thinker@codemud.net>
parents:
120
diff
changeset
|
965 _sync_dex_header(dex) |
126
ff6f869273b7
Fix wrong init value for computing checksum
Thinker K.F. Li <thinker@codemud.net>
parents:
125
diff
changeset
|
966 |
ff6f869273b7
Fix wrong init value for computing checksum
Thinker K.F. Li <thinker@codemud.net>
parents:
125
diff
changeset
|
967 dex.make_signature() |
ff6f869273b7
Fix wrong init value for computing checksum
Thinker K.F. Li <thinker@codemud.net>
parents:
125
diff
changeset
|
968 dex.make_checksum() |
121
7644cb633d4b
Synchronize value of fields of DEXFile.
Thinker K.F. Li <thinker@codemud.net>
parents:
120
diff
changeset
|
969 pass |
7644cb633d4b
Synchronize value of fields of DEXFile.
Thinker K.F. Li <thinker@codemud.net>
parents:
120
diff
changeset
|
970 |
7644cb633d4b
Synchronize value of fields of DEXFile.
Thinker K.F. Li <thinker@codemud.net>
parents:
120
diff
changeset
|
971 |
46
94e80f7a61b5
Add dex_deptracker.restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
43
diff
changeset
|
972 ## \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
|
973 # |
94e80f7a61b5
Add dex_deptracker.restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
43
diff
changeset
|
974 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
|
975 update_offset(dexroot, all_dep_decls) |
78357afb4a9d
Test case for restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
121
diff
changeset
|
976 |
46
94e80f7a61b5
Add dex_deptracker.restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
43
diff
changeset
|
977 for obj, parents, name_path in \ |
94e80f7a61b5
Add dex_deptracker.restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
43
diff
changeset
|
978 _travel_dex_relocatable(dexroot): |
94e80f7a61b5
Add dex_deptracker.restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
43
diff
changeset
|
979 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
|
980 continue |
94e80f7a61b5
Add dex_deptracker.restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
43
diff
changeset
|
981 |
94e80f7a61b5
Add dex_deptracker.restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
43
diff
changeset
|
982 imm_parent = parents[-1] |
94e80f7a61b5
Add dex_deptracker.restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
43
diff
changeset
|
983 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
|
984 continue |
94e80f7a61b5
Add dex_deptracker.restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
43
diff
changeset
|
985 |
94e80f7a61b5
Add dex_deptracker.restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
43
diff
changeset
|
986 dep = all_dep_decls[name_path] |
94e80f7a61b5
Add dex_deptracker.restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
43
diff
changeset
|
987 dep_type = dep[0] |
94e80f7a61b5
Add dex_deptracker.restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
43
diff
changeset
|
988 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
|
989 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
|
990 depon = obj |
3e34c7d33182
Fix and test restore_depedencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
58
diff
changeset
|
991 rel_off = depon.data_offset - relative_to.data_offset |
46
94e80f7a61b5
Add dex_deptracker.restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
43
diff
changeset
|
992 |
94e80f7a61b5
Add dex_deptracker.restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
43
diff
changeset
|
993 name = name_path.split('.')[-1] |
61
3e34c7d33182
Fix and test restore_depedencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
58
diff
changeset
|
994 _dex_tree_set_child(imm_parent, name, rel_off) |
46
94e80f7a61b5
Add dex_deptracker.restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
43
diff
changeset
|
995 elif dep_type == dexfile.depend_off: |
61
3e34c7d33182
Fix and test restore_depedencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
58
diff
changeset
|
996 depon = obj |
46
94e80f7a61b5
Add dex_deptracker.restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
43
diff
changeset
|
997 name = name_path.split('.')[-1] |
94e80f7a61b5
Add dex_deptracker.restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
43
diff
changeset
|
998 _dex_tree_set_child(imm_parent, name, depon.data_offset) |
94e80f7a61b5
Add dex_deptracker.restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
43
diff
changeset
|
999 elif dep_type == dexfile.depend_idx: |
61
3e34c7d33182
Fix and test restore_depedencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
58
diff
changeset
|
1000 depon = obj |
46
94e80f7a61b5
Add dex_deptracker.restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
43
diff
changeset
|
1001 name = name_path.split('.')[-1] |
94e80f7a61b5
Add dex_deptracker.restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
43
diff
changeset
|
1002 _dex_tree_set_child(imm_parent, name, depon.data_idx) |
94e80f7a61b5
Add dex_deptracker.restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
43
diff
changeset
|
1003 else: |
94e80f7a61b5
Add dex_deptracker.restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
43
diff
changeset
|
1004 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
|
1005 pass |
121
7644cb633d4b
Synchronize value of fields of DEXFile.
Thinker K.F. Li <thinker@codemud.net>
parents:
120
diff
changeset
|
1006 |
7644cb633d4b
Synchronize value of fields of DEXFile.
Thinker K.F. Li <thinker@codemud.net>
parents:
120
diff
changeset
|
1007 _sync_DEXFile_fields(dexroot) |
46
94e80f7a61b5
Add dex_deptracker.restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
43
diff
changeset
|
1008 pass |
94e80f7a61b5
Add dex_deptracker.restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
43
diff
changeset
|
1009 |
94e80f7a61b5
Add dex_deptracker.restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
43
diff
changeset
|
1010 |
89
7a059ab408f0
Refactoring procedure of initialize dependency declarations
Thinker K.F. Li <thinker@codemud.net>
parents:
88
diff
changeset
|
1011 ## \brief Prepare and return dependency declares. |
7a059ab408f0
Refactoring procedure of initialize dependency declarations
Thinker K.F. Li <thinker@codemud.net>
parents:
88
diff
changeset
|
1012 def prepare_dep_decls(): |
7a059ab408f0
Refactoring procedure of initialize dependency declarations
Thinker K.F. Li <thinker@codemud.net>
parents:
88
diff
changeset
|
1013 decls = collect_all_dep_decls() |
90
fe7b3f111d57
Testcase for code injection
Thinker K.F. Li <thinker@codemud.net>
parents:
89
diff
changeset
|
1014 _install_markers(decls) |
89
7a059ab408f0
Refactoring procedure of initialize dependency declarations
Thinker K.F. Li <thinker@codemud.net>
parents:
88
diff
changeset
|
1015 _patch_dex_type_markers(decls) |
7a059ab408f0
Refactoring procedure of initialize dependency declarations
Thinker K.F. Li <thinker@codemud.net>
parents:
88
diff
changeset
|
1016 return decls |
7a059ab408f0
Refactoring procedure of initialize dependency declarations
Thinker K.F. Li <thinker@codemud.net>
parents:
88
diff
changeset
|
1017 |
7a059ab408f0
Refactoring procedure of initialize dependency declarations
Thinker K.F. Li <thinker@codemud.net>
parents:
88
diff
changeset
|
1018 |
23
fff40aabefab
Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
1019 if __name__ == '__main__': |
25
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
1020 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
|
1021 |
fff40aabefab
Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
1022 import pprint |
fff40aabefab
Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
1023 print |
fff40aabefab
Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
1024 print 'Dependencies' |
25
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
1025 pprint.pprint(collect_all_dep_decls()) |