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