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