Mercurial > paraspace
annotate paraspace/dex_deptracker.py @ 54:870312703ba1
Fix issuge of crossing dexfile.ref when updating offset
author | Thinker K.F. Li <thinker@codemud.net> |
---|---|
date | Thu, 23 Jun 2011 09:32:51 +0800 |
parents | 705356005362 |
children | 6e4cf6905729 |
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 |
25
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
9 def _resolve_name_path(name_path): |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
10 obj = dexfile |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
11 parent = None |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
12 for name in name_path.split('.'): |
53
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
52
diff
changeset
|
13 while isinstance(obj, _marker): |
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
52
diff
changeset
|
14 obj = obj.back_type |
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
52
diff
changeset
|
15 pass |
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
52
diff
changeset
|
16 |
25
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
17 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
|
18 # array.items.<num> |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
19 obj = parent.child_type |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
20 parent = list |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
21 continue |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
22 |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
23 parent = obj |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
24 if isinstance(parent, dexfile.switch): |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
25 key = eval(name) |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
26 obj = parent.map[key] |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
27 continue |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
28 |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
29 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
|
30 obj = list |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
31 continue |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
32 |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
33 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
|
34 obj = obj.child_type |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
35 continue |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
36 |
54
870312703ba1
Fix issuge of crossing dexfile.ref when updating offset
Thinker K.F. Li <thinker@codemud.net>
parents:
53
diff
changeset
|
37 try: |
870312703ba1
Fix issuge of crossing dexfile.ref when updating offset
Thinker K.F. Li <thinker@codemud.net>
parents:
53
diff
changeset
|
38 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
|
39 except: |
870312703ba1
Fix issuge of crossing dexfile.ref when updating offset
Thinker K.F. Li <thinker@codemud.net>
parents:
53
diff
changeset
|
40 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
|
41 raise |
25
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
42 pass |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
43 return obj, parent |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
44 |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
45 |
26
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
46 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
|
47 def travelable(attr, attr_name): |
15cb829ac442
travel_dex_type() recoganizes _dex_type correctly
Thinker K.F. Li <thinker@codemud.net>
parents:
26
diff
changeset
|
48 if attr_name.startswith('_'): |
15cb829ac442
travel_dex_type() recoganizes _dex_type correctly
Thinker K.F. Li <thinker@codemud.net>
parents:
26
diff
changeset
|
49 return False |
15cb829ac442
travel_dex_type() recoganizes _dex_type correctly
Thinker K.F. Li <thinker@codemud.net>
parents:
26
diff
changeset
|
50 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
|
51 (not (type(attr) == type and |
15cb829ac442
travel_dex_type() recoganizes _dex_type correctly
Thinker K.F. Li <thinker@codemud.net>
parents:
26
diff
changeset
|
52 issubclass(attr, dexfile._dex_type)))): |
15cb829ac442
travel_dex_type() recoganizes _dex_type correctly
Thinker K.F. Li <thinker@codemud.net>
parents:
26
diff
changeset
|
53 return False |
15cb829ac442
travel_dex_type() recoganizes _dex_type correctly
Thinker K.F. Li <thinker@codemud.net>
parents:
26
diff
changeset
|
54 return True |
26
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
55 |
28
5ce7ca1187b3
Pass throught markers for dex types
Thinker K.F. Li <thinker@codemud.net>
parents:
27
diff
changeset
|
56 # |
5ce7ca1187b3
Pass throught markers for dex types
Thinker K.F. Li <thinker@codemud.net>
parents:
27
diff
changeset
|
57 # pass throught markers |
5ce7ca1187b3
Pass throught markers for dex types
Thinker K.F. Li <thinker@codemud.net>
parents:
27
diff
changeset
|
58 # |
5ce7ca1187b3
Pass throught markers for dex types
Thinker K.F. Li <thinker@codemud.net>
parents:
27
diff
changeset
|
59 while isinstance(clazz, _marker): |
5ce7ca1187b3
Pass throught markers for dex types
Thinker K.F. Li <thinker@codemud.net>
parents:
27
diff
changeset
|
60 clazz = clazz.back_type |
5ce7ca1187b3
Pass throught markers for dex types
Thinker K.F. Li <thinker@codemud.net>
parents:
27
diff
changeset
|
61 pass |
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('.') |
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
29
diff
changeset
|
169 for child_part in child_parts: |
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
29
diff
changeset
|
170 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
|
171 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
|
172 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
|
173 continue |
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
29
diff
changeset
|
174 |
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
29
diff
changeset
|
175 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
|
176 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
|
177 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
|
178 continue |
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
29
diff
changeset
|
179 |
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
29
diff
changeset
|
180 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
|
181 pass |
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
29
diff
changeset
|
182 return obj |
23
fff40aabefab
Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
183 |
fff40aabefab
Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
184 |
25
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
185 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
|
186 child_parts = child_name.split('.') |
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
187 for child_part in child_parts[:-1]: |
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
188 if isinstance(obj, list): |
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
189 idx = int(child_part) |
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
190 obj = obj[idx] |
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
191 continue |
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
192 |
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
193 if isinstance(obj, dexfile.switch): |
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
194 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
|
195 obj = obj.value |
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
196 continue |
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
197 |
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
198 obj = getattr(obj, child_part) |
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
199 pass |
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
200 |
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
201 last_part = child_parts[-1] |
25
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
202 if isinstance(obj, list): |
43
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
203 idx = int(last_part) |
25
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
204 obj[idx] = value |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
205 elif isinstance(obj, dexfile.switch): |
43
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
206 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
|
207 obj.value = value |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
208 else: |
43
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
209 setattr(obj, last_part, value) |
25
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
210 pass |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
211 pass |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
212 |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
213 |
47 | 214 ## \brief Travel the tree of relocatable objects and their attributes. |
215 # | |
216 # \param skip_func is a function that returns true for skip a subtree. | |
217 # | |
218 # \ref skip_func is called for every relocatable and their attributes | |
219 # to determines if visiting the object and subtree. | |
220 # | |
221 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
|
222 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
|
223 |
29
b0cc5da28141
pass parents to travel info
Thinker K.F. Li <thinker@codemud.net>
parents:
28
diff
changeset
|
224 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
|
225 child_parents = parents + [obj] |
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
226 child_obj = _dex_tree_get_child(obj, child_name) |
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
227 if isinstance(child_obj, dexfile.composite): |
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
228 child_path = child_obj.__class__.__name__ |
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
229 else: |
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
230 child_path = obj_name + '.' + child_name |
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
231 pass |
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
232 return (child_obj, child_parents, child_path) |
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
233 |
25
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
234 while stk: |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
235 obj, parents, obj_name = stk.pop(0) |
47 | 236 if skip_func and skip_func(obj, parents, obj_name): |
237 continue | |
25
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
238 yield (obj, parents, obj_name) |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
239 |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
240 if isinstance(obj, list): |
29
b0cc5da28141
pass parents to travel info
Thinker K.F. Li <thinker@codemud.net>
parents:
28
diff
changeset
|
241 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
|
242 for idx in range(len(obj))] |
25
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
243 stk.extend(children) |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
244 continue |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
245 |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
246 if not isinstance(obj, dexfile.relocatable): |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
247 continue |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
248 |
29
b0cc5da28141
pass parents to travel info
Thinker K.F. Li <thinker@codemud.net>
parents:
28
diff
changeset
|
249 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
|
250 for child_name in obj.children()] |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
251 stk.extend(children) |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
252 pass |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
253 pass |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
254 |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
255 |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
256 def _all_dex_types(): |
23
fff40aabefab
Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
257 dex_types = dict([(name, value) |
fff40aabefab
Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
258 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
|
259 if name.startswith('_DEX_')]) |
fff40aabefab
Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
260 dex_types['DEXFile'] = dexfile.DEXFile |
fff40aabefab
Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
261 return dex_types |
fff40aabefab
Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
262 |
fff40aabefab
Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
263 |
53
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
52
diff
changeset
|
264 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
|
265 def check_marker(value, name): |
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
52
diff
changeset
|
266 while isinstance(value, _marker): |
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
52
diff
changeset
|
267 value = value.back_type |
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
52
diff
changeset
|
268 pass |
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
52
diff
changeset
|
269 return value, name |
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
52
diff
changeset
|
270 |
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
52
diff
changeset
|
271 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
|
272 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
|
273 if name.startswith('_DEX_')]) |
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
52
diff
changeset
|
274 dex_types[dexfile.DEXFile] = 'DEXFile' |
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
52
diff
changeset
|
275 return dex_types |
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
52
diff
changeset
|
276 |
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
52
diff
changeset
|
277 |
25
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
278 def collect_all_dep_decls(): |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
279 dex_types = _all_dex_types() |
23
fff40aabefab
Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
280 |
25
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
281 all_dep_decls = {} |
23
fff40aabefab
Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
282 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
|
283 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
|
284 all_dep_decls.update(dep_decls) |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
285 pass |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
286 |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
287 return all_dep_decls |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
288 |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
289 |
52
67aa8ca8fff3
untested dex_deptracker.update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents:
49
diff
changeset
|
290 class _marker(dexfile.null_relocatable): |
26
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
291 back_type = None |
53
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
52
diff
changeset
|
292 |
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
52
diff
changeset
|
293 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
|
294 raise NotImplementedError, \ |
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
52
diff
changeset
|
295 'The marker does not implement set_marker()' |
26
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
296 pass |
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
297 |
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
298 class _uid_marker(_marker): |
25
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
299 uid_seq = 0 |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
300 |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
301 def __init__(self, back_type, name_path): |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
302 self.back_type = back_type |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
303 self.name_path = name_path |
23
fff40aabefab
Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
304 pass |
fff40aabefab
Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
305 |
25
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
306 def parse(self, parent, data, off): |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
307 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
|
308 try: |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
309 value.data_uid = _uid_marker.uid_seq |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
310 except AttributeError: |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
311 raise AttributeError, \ |
53
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
52
diff
changeset
|
312 '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
|
313 (self.name_path, repr(value)) |
25
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
314 _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
|
315 |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
316 return value |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
317 |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
318 def sizeof(self, value): |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
319 sz = self.back_type.sizeof(value) |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
320 return sz |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
321 |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
322 def compute_size(self, back_obj): |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
323 self.back_type.compute_size(back_obj) |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
324 pass |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
325 |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
326 def to_str(self, back_obj): |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
327 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
|
328 |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
329 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
|
330 try: |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
331 id_item_map = markers_info[name_path] |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
332 except KeyError: |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
333 id_item_map = {} |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
334 markers_info[name_path] = id_item_map |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
335 pass |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
336 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
|
337 id_item_map[obj.data_uid] = obj |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
338 pass |
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 __getattr__(self, name): |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
341 return getattr(self.back_type, name) |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
342 |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
343 def __call__(self, *args, **kws): |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
344 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
|
345 |
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
52
diff
changeset
|
346 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
|
347 pass |
25
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
348 pass |
23
fff40aabefab
Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
349 |
fff40aabefab
Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
350 |
25
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
351 class _offset_marker(_uid_marker): |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
352 def parse(self, parent, data, off): |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
353 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
|
354 |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
355 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
|
356 value.data_offset = off |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
357 return value |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
358 |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
359 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
|
360 try: |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
361 id_item_map = markers_info[name_path] |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
362 except KeyError: |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
363 id_item_map = {} |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
364 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
|
365 pass |
25
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
366 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
|
367 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
|
368 pass |
53
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
52
diff
changeset
|
369 |
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
52
diff
changeset
|
370 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
|
371 obj.data_offset = off |
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
52
diff
changeset
|
372 pass |
24
a57ec6a76fe3
Describe steps to track dependencies
Thinker K.F. Li <thinker@codemud.net>
parents:
23
diff
changeset
|
373 pass |
23
fff40aabefab
Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
374 |
24
a57ec6a76fe3
Describe steps to track dependencies
Thinker K.F. Li <thinker@codemud.net>
parents:
23
diff
changeset
|
375 |
25
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
376 class _rel_offset_marker(_offset_marker): |
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 rev_parents = list(parents) |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
379 rev_parents.reverse() |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
380 |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
381 for parent in rev_parents: |
29
b0cc5da28141
pass parents to travel info
Thinker K.F. Li <thinker@codemud.net>
parents:
28
diff
changeset
|
382 try: |
b0cc5da28141
pass parents to travel info
Thinker K.F. Li <thinker@codemud.net>
parents:
28
diff
changeset
|
383 rel_marker_info = parent.rel_marker_info |
b0cc5da28141
pass parents to travel info
Thinker K.F. Li <thinker@codemud.net>
parents:
28
diff
changeset
|
384 except AttributeError: |
b0cc5da28141
pass parents to travel info
Thinker K.F. Li <thinker@codemud.net>
parents:
28
diff
changeset
|
385 try: |
b0cc5da28141
pass parents to travel info
Thinker K.F. Li <thinker@codemud.net>
parents:
28
diff
changeset
|
386 rel_marker_info = {} |
b0cc5da28141
pass parents to travel info
Thinker K.F. Li <thinker@codemud.net>
parents:
28
diff
changeset
|
387 parent.rel_marker_info = rel_marker_info |
b0cc5da28141
pass parents to travel info
Thinker K.F. Li <thinker@codemud.net>
parents:
28
diff
changeset
|
388 except AttributeError: |
b0cc5da28141
pass parents to travel info
Thinker K.F. Li <thinker@codemud.net>
parents:
28
diff
changeset
|
389 continue |
b0cc5da28141
pass parents to travel info
Thinker K.F. Li <thinker@codemud.net>
parents:
28
diff
changeset
|
390 pass |
b0cc5da28141
pass parents to travel info
Thinker K.F. Li <thinker@codemud.net>
parents:
28
diff
changeset
|
391 depons = rel_marker_info.setdefault(name_path, []) |
b0cc5da28141
pass parents to travel info
Thinker K.F. Li <thinker@codemud.net>
parents:
28
diff
changeset
|
392 depons.append(obj) |
25
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
393 pass |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
394 pass |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
395 |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
396 @staticmethod |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
397 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
|
398 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
|
399 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
|
400 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
|
401 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
|
402 |
25
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
403 rev_parents = list(parents) |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
404 rev_parents.reverse() |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
405 |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
406 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
|
407 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
|
408 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
|
409 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
|
410 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
|
411 |
25
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
412 try: |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
413 rel_marker_info = parent.rel_marker_info |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
414 except: |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
415 continue |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
416 if name_path in rel_marker_info: |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
417 depons = rel_marker_info[name_path] |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
418 assert len(depons) == 1 |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
419 depon = depons[0] |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
420 return depon |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
421 pass |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
422 |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
423 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
|
424 |
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
52
diff
changeset
|
425 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
|
426 obj.data_offset = off |
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
52
diff
changeset
|
427 pass |
25
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
428 pass |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
429 |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
430 |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
431 class _idx_marker(_uid_marker): |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
432 def parse(self, parent, data, off): |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
433 assert isinstance(self.back_type, dexfile.array) |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
434 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
|
435 for item in array.items: |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
436 item.data_uid = _uid_marker.uid_seq |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
437 _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
|
438 pass |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
439 return array |
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 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
|
442 try: |
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
29
diff
changeset
|
443 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
|
444 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
|
445 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
|
446 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
|
447 pass |
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
29
diff
changeset
|
448 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
|
449 id_item_map[idx] = item |
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
29
diff
changeset
|
450 pass |
25
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
451 pass |
53
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
52
diff
changeset
|
452 |
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
52
diff
changeset
|
453 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
|
454 pass |
25
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
455 pass |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
456 |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
457 |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
458 def _install_offset_marker(name_path): |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
459 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
|
460 while isinstance(obj, dexfile.ref): |
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
52
diff
changeset
|
461 name_path = obj.target_path |
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
52
diff
changeset
|
462 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
|
463 pass |
25
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
464 marker = _offset_marker(obj, name_path) |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
465 name = name_path.split('.')[-1] |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
466 _dex_tree_set_child(parent, name, marker) |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
467 pass |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
468 |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
469 |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
470 def _install_rel_offset_marker(name_path): |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
471 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
|
472 while isinstance(obj, dexfile.ref): |
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
52
diff
changeset
|
473 name_path = obj.target_path |
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
52
diff
changeset
|
474 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
|
475 pass |
25
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
476 marker = _rel_offset_marker(obj, name_path) |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
477 name = name_path.split('.')[-1] |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
478 _dex_tree_set_child(parent, name, marker) |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
479 pass |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
480 |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
481 |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
482 def _install_uid_marker(name_path): |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
483 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
|
484 while isinstance(obj, dexfile.ref): |
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
52
diff
changeset
|
485 name_path = obj.target_path |
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
52
diff
changeset
|
486 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
|
487 pass |
25
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
488 marker = _uid_marker(obj, name_path) |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
489 name = name_path.split('.')[-1] |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
490 _dex_tree_set_child(parent, name, marker) |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
491 pass |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
492 |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
493 |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
494 def _install_idx_marker(name_path): |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
495 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
|
496 while isinstance(obj, dexfile.ref): |
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
52
diff
changeset
|
497 name_path = obj.target_path |
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
52
diff
changeset
|
498 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
|
499 pass |
25
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
500 marker = _idx_marker(obj, name_path) |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
501 name = name_path.split('.')[-1] |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
502 _dex_tree_set_child(parent, name, marker) |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
503 pass |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
504 |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
505 |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
506 def _install_markers(all_dep_decls): |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
507 all_markers = set() |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
508 |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
509 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
|
510 dep_type = dep[0] |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
511 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
|
512 name_path1 = dep[1] |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
513 if name_path1 not in all_markers: |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
514 all_markers.add(name_path1) |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
515 _install_rel_offset_marker(name_path1) |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
516 pass |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
517 |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
518 name_path2 = dep[2] |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
519 if name_path2 not in all_markers: |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
520 all_markers.add(name_path2) |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
521 _install_rel_offset_marker(name_path2) |
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 pass |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
524 elif dep_type == dexfile.depend_off: |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
525 name_path = dep[1] |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
526 if name_path not in all_markers: |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
527 all_markers.add(name_path) |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
528 _install_offset_marker(name_path) |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
529 pass |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
530 pass |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
531 elif dep_type == dexfile.depend_idx: |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
532 name_path = dep[1] |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
533 if name_path not in all_markers: |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
534 all_markers.add(name_path) |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
535 _install_idx_marker(name_path) |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
536 pass |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
537 pass |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
538 else: |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
539 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
|
540 pass |
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 |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
543 |
26
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
544 def _patch_dex_type_markers(all_dep_decls): |
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
545 import itertools |
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
546 marked_types = dict([(marker.back_type, name) |
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
547 for name, marker in _all_dex_types().items() |
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
548 if isinstance(marker, _marker)]) |
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
549 |
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
550 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
|
551 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
|
552 marked_type_refs = [(name_path, marked_types[attr]) |
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
553 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
|
554 if type(attr) == type and |
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
555 issubclass(attr, dexfile.composite) and |
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
556 attr in marked_types] |
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
557 |
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
558 def patch_ref(name_path, depon_path): |
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
559 depon, depon_parent = _resolve_name_path(depon_path) |
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
560 |
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
561 path_elms = name_path.split('.') |
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
562 parent_path = '.'.join(path_elms[:-1]) |
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
563 parent, grand = _resolve_name_path(parent_path) |
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
564 |
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
565 if isinstance(grand, _nest_types): |
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
566 if isinstance(grand, (dexfile.array, dexfile.cond)): |
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
567 grand.child_type = depon |
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
568 elif isinstance(grand, dexfile.switch): |
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
569 key = eval(path_elms[-1]) |
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
570 grand.map[key] = depon |
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
571 else: |
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
572 raise RuntimeError, 'should not be here' |
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
573 pass |
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
574 else: |
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
575 name = path_elms[-1] |
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
576 setattr(parent, name, depon) |
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
577 pass |
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
578 pass |
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
579 |
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
580 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
|
581 patch_ref(name_path, depon_path) |
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
582 pass |
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
583 pass |
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
584 |
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
585 |
40
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
29
diff
changeset
|
586 def _build_associations(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
|
587 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
|
588 _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
|
589 if isinstance(obj, dexfile._objs_asso): |
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
29
diff
changeset
|
590 for parent in parents: |
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
29
diff
changeset
|
591 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
|
592 break |
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
29
diff
changeset
|
593 pass |
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
29
diff
changeset
|
594 |
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
29
diff
changeset
|
595 left_elts = _dex_tree_get_child(parent, obj.left) |
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
29
diff
changeset
|
596 right_elts = _dex_tree_get_child(parent, obj.right) |
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
29
diff
changeset
|
597 obj.build_associations() |
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
29
diff
changeset
|
598 pass |
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
29
diff
changeset
|
599 pass |
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
29
diff
changeset
|
600 pass |
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
29
diff
changeset
|
601 |
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
29
diff
changeset
|
602 |
43
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
603 ## \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
|
604 # |
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
605 def _find_parent_of_clazz(clazz, parents): |
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
606 rev_parents = list(parents) |
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
607 rev_parents.reverse() |
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
608 for parent in rev_parents: |
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
609 if isinstance(parent, clazz): |
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
610 return parent |
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
611 pass |
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
612 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
|
613 |
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
614 |
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
615 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
|
616 idx = name_path.index('.') |
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
617 if idx >= 0: |
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
618 clazz = name_path[:idx] |
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
619 attr = name_path[idx + 1:] |
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
620 else: |
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
621 clazz = name_path |
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
622 attr = None |
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
623 pass |
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
624 return clazz, attr |
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
625 |
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
626 |
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
627 ## \brief Setup value of refs. |
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
628 # |
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
|
629 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
|
630 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
|
631 _travel_dex_relocatable(root_obj): |
43
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
632 if not parents: |
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
633 continue |
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
634 |
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
635 imm_parent = parents[-1] |
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
636 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
|
637 continue |
43
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
638 |
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
639 clazz, pclazz = _resolve_name_path(name_path) |
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
640 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
|
641 clazz = clazz.back_type |
43
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
642 pass |
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
643 |
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
644 if isinstance(clazz, dexfile.ref): |
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
645 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
|
646 if not attr_name: |
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
647 raise ValueError, \ |
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
648 '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
|
649 |
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
650 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
|
651 |
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
652 value = clazz.get_value(parents) |
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
653 _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
|
654 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
|
655 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
|
656 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
|
657 |
c5cfc796af8b
Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents:
40
diff
changeset
|
658 |
25
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
659 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
|
660 markers_info = {} |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
661 depon_src_map = {} |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
662 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
|
663 for tgt in depon[1:]: |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
664 markers_info[tgt] = {} |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
665 depon_src_map[depon] = dep_src |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
666 pass |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
667 pass |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
668 |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
669 # |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
670 # Collect marked objects |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
671 # |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
672 for obj, parents, name_path in \ |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
673 _travel_dex_relocatable(root_obj): |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
674 if name_path not in markers_info: |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
675 continue |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
676 |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
677 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
|
678 while isinstance(marker, dexfile.ref): |
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
52
diff
changeset
|
679 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
|
680 pass |
25
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
681 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
|
682 pass |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
683 |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
684 # |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
685 # Link depend source to marked target |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
686 # |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
687 for obj, parents, name_path in \ |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
688 _travel_dex_relocatable(root_obj): |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
689 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
|
690 continue |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
691 |
43
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
692 imm_parent = parents[-1] |
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
693 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
|
694 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
|
695 |
25
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
696 dep = all_dep_decls[name_path] |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
697 dep_type = dep[0] |
26
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
698 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
|
699 depon1 = _rel_offset_marker.find_depon(dep[1], parents) |
b0cc5da28141
pass parents to travel info
Thinker K.F. Li <thinker@codemud.net>
parents:
28
diff
changeset
|
700 depon2 = _rel_offset_marker.find_depon(dep[2], parents) |
25
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
701 |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
702 name = name_path.split('.')[-1] |
43
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
703 _dex_tree_set_child(imm_parent, name, (depon1, depon2)) |
26
b30a0d29a62f
Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
704 elif dep_type == dexfile.depend_off: |
25
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
705 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
|
706 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
|
707 name = name_path.split('.')[-1] |
43
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
708 _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
|
709 elif dep_type == dexfile.depend_idx: |
25
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
710 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
|
711 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
|
712 name = name_path.split('.')[-1] |
43
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
42
diff
changeset
|
713 _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
|
714 else: |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
715 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
|
716 pass |
23
fff40aabefab
Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
717 pass |
fff40aabefab
Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
718 |
24
a57ec6a76fe3
Describe steps to track dependencies
Thinker K.F. Li <thinker@codemud.net>
parents:
23
diff
changeset
|
719 |
42
8ca4a6bc6b79
Extract to dex_deptracker.build_dependencies
Thinker K.F. Li <thinker@codemud.net>
parents:
41
diff
changeset
|
720 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
|
721 _build_associations(dexroot) |
8ca4a6bc6b79
Extract to dex_deptracker.build_dependencies
Thinker K.F. Li <thinker@codemud.net>
parents:
41
diff
changeset
|
722 _build_refs(dexroot) |
8ca4a6bc6b79
Extract to dex_deptracker.build_dependencies
Thinker K.F. Li <thinker@codemud.net>
parents:
41
diff
changeset
|
723 _link_dependencies(dexroot, all_dep_decls) |
8ca4a6bc6b79
Extract to dex_deptracker.build_dependencies
Thinker K.F. Li <thinker@codemud.net>
parents:
41
diff
changeset
|
724 pass |
8ca4a6bc6b79
Extract to dex_deptracker.build_dependencies
Thinker K.F. Li <thinker@codemud.net>
parents:
41
diff
changeset
|
725 |
8ca4a6bc6b79
Extract to dex_deptracker.build_dependencies
Thinker K.F. Li <thinker@codemud.net>
parents:
41
diff
changeset
|
726 |
47 | 727 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
|
728 from itertools import chain |
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
52
diff
changeset
|
729 |
47 | 730 def _build_sub_depon_dep(from_path, dep): |
731 depon1 = dep[1] | |
732 sub = [(depon1, from_path)] | |
733 dep_type = dep[0] | |
734 if dep_type == dexfile.depend_off_rel: | |
735 depon2 = dep[2] | |
736 sub.append((depon2, from_path)) | |
737 pass | |
738 | |
739 return sub | |
740 | |
741 depon_dep_lsts = [_build_sub_depon_dep(from_path, dep) | |
742 for from_path, dep in all_dep_decls.items()] | |
743 depon_dep_lst = chain(*depon_dep_lsts) | |
744 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
|
745 return depon_dep_map |
47 | 746 |
747 | |
748 def update_offset(dexroot, all_dep_decls): | |
52
67aa8ca8fff3
untested dex_deptracker.update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents:
49
diff
changeset
|
749 from dexfile import man_off |
53
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
52
diff
changeset
|
750 |
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
52
diff
changeset
|
751 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
|
752 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
|
753 |
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
52
diff
changeset
|
754 def make_path(obj, path_parts, obj_name): |
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
52
diff
changeset
|
755 if isinstance(obj, dexfile.composite): |
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
52
diff
changeset
|
756 type_name = dex_type_names[obj.__class__] |
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
52
diff
changeset
|
757 return [type_name] |
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
52
diff
changeset
|
758 return path_parts + [obj_name] |
52
67aa8ca8fff3
untested dex_deptracker.update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents:
49
diff
changeset
|
759 |
67aa8ca8fff3
untested dex_deptracker.update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents:
49
diff
changeset
|
760 moff = man_off(0) |
53
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
52
diff
changeset
|
761 queue = [(dexroot, ['DEXFile'])] |
47 | 762 |
52
67aa8ca8fff3
untested dex_deptracker.update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents:
49
diff
changeset
|
763 while queue: |
53
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
52
diff
changeset
|
764 obj, path_parts = queue.pop() |
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
52
diff
changeset
|
765 name_path = '.'.join(path_parts) |
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
52
diff
changeset
|
766 |
54
870312703ba1
Fix issuge of crossing dexfile.ref when updating offset
Thinker K.F. Li <thinker@codemud.net>
parents:
53
diff
changeset
|
767 obj_clazz = _resolve_name_path(name_path) |
870312703ba1
Fix issuge of crossing dexfile.ref when updating offset
Thinker K.F. Li <thinker@codemud.net>
parents:
53
diff
changeset
|
768 if isinstance(obj_clazz, dexfile.depend): |
870312703ba1
Fix issuge of crossing dexfile.ref when updating offset
Thinker K.F. Li <thinker@codemud.net>
parents:
53
diff
changeset
|
769 continue |
870312703ba1
Fix issuge of crossing dexfile.ref when updating offset
Thinker K.F. Li <thinker@codemud.net>
parents:
53
diff
changeset
|
770 |
53
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
52
diff
changeset
|
771 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
|
772 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
|
773 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
|
774 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
|
775 try: |
870312703ba1
Fix issuge of crossing dexfile.ref when updating offset
Thinker K.F. Li <thinker@codemud.net>
parents:
53
diff
changeset
|
776 obj = obj[0] |
870312703ba1
Fix issuge of crossing dexfile.ref when updating offset
Thinker K.F. Li <thinker@codemud.net>
parents:
53
diff
changeset
|
777 except: |
870312703ba1
Fix issuge of crossing dexfile.ref when updating offset
Thinker K.F. Li <thinker@codemud.net>
parents:
53
diff
changeset
|
778 print name_path |
870312703ba1
Fix issuge of crossing dexfile.ref when updating offset
Thinker K.F. Li <thinker@codemud.net>
parents:
53
diff
changeset
|
779 raise |
870312703ba1
Fix issuge of crossing dexfile.ref when updating offset
Thinker K.F. Li <thinker@codemud.net>
parents:
53
diff
changeset
|
780 pass |
53
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
52
diff
changeset
|
781 marker.set_marker(obj, moff()) |
52
67aa8ca8fff3
untested dex_deptracker.update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents:
49
diff
changeset
|
782 pass |
53
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
52
diff
changeset
|
783 |
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
52
diff
changeset
|
784 if isinstance(obj, (tuple, list)): |
54
870312703ba1
Fix issuge of crossing dexfile.ref when updating offset
Thinker K.F. Li <thinker@codemud.net>
parents:
53
diff
changeset
|
785 attrs = [(elt, make_path(elt, path_parts, str(idx))) |
53
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
52
diff
changeset
|
786 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
|
787 attrs.reverse() |
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
52
diff
changeset
|
788 queue = queue + attrs |
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
52
diff
changeset
|
789 continue |
52
67aa8ca8fff3
untested dex_deptracker.update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents:
49
diff
changeset
|
790 |
67aa8ca8fff3
untested dex_deptracker.update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents:
49
diff
changeset
|
791 if isinstance(obj, dexfile.ref): |
47 | 792 continue |
53
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
52
diff
changeset
|
793 |
52
67aa8ca8fff3
untested dex_deptracker.update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents:
49
diff
changeset
|
794 if not isinstance(obj, dexfile.relocatable): |
53
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
52
diff
changeset
|
795 clazz, parent = _resolve_name_path(name_path) |
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
52
diff
changeset
|
796 moff(clazz.sizeof(obj)) |
52
67aa8ca8fff3
untested dex_deptracker.update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents:
49
diff
changeset
|
797 continue |
67aa8ca8fff3
untested dex_deptracker.update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents:
49
diff
changeset
|
798 |
53
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
52
diff
changeset
|
799 moff(obj.sizeof(obj)) |
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
52
diff
changeset
|
800 |
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
52
diff
changeset
|
801 children = obj.children() |
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
52
diff
changeset
|
802 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
|
803 for child_name in children] |
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
52
diff
changeset
|
804 attrs = [(attr, make_path(attr, path_parts, attr_name)) |
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
52
diff
changeset
|
805 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
|
806 attrs.reverse() |
67aa8ca8fff3
untested dex_deptracker.update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents:
49
diff
changeset
|
807 queue = queue + attrs |
47 | 808 pass |
809 pass | |
810 | |
811 | |
46
94e80f7a61b5
Add dex_deptracker.restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
43
diff
changeset
|
812 ## \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
|
813 # |
94e80f7a61b5
Add dex_deptracker.restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
43
diff
changeset
|
814 def restore_dependencies(dexroot, all_dep_decls): |
94e80f7a61b5
Add dex_deptracker.restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
43
diff
changeset
|
815 for obj, parents, name_path in \ |
94e80f7a61b5
Add dex_deptracker.restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
43
diff
changeset
|
816 _travel_dex_relocatable(dexroot): |
94e80f7a61b5
Add dex_deptracker.restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
43
diff
changeset
|
817 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
|
818 continue |
94e80f7a61b5
Add dex_deptracker.restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
43
diff
changeset
|
819 |
94e80f7a61b5
Add dex_deptracker.restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
43
diff
changeset
|
820 imm_parent = parents[-1] |
94e80f7a61b5
Add dex_deptracker.restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
43
diff
changeset
|
821 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
|
822 continue |
94e80f7a61b5
Add dex_deptracker.restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
43
diff
changeset
|
823 |
94e80f7a61b5
Add dex_deptracker.restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
43
diff
changeset
|
824 dep = all_dep_decls[name_path] |
94e80f7a61b5
Add dex_deptracker.restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
43
diff
changeset
|
825 dep_type = dep[0] |
94e80f7a61b5
Add dex_deptracker.restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
43
diff
changeset
|
826 if dep_type == dexfile.depend_off_rel: |
94e80f7a61b5
Add dex_deptracker.restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
43
diff
changeset
|
827 depon1 = _rel_offset_marker.find_depon(dep[1], parents) |
94e80f7a61b5
Add dex_deptracker.restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
43
diff
changeset
|
828 depon2 = _rel_offset_marker.find_depon(dep[2], parents) |
94e80f7a61b5
Add dex_deptracker.restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
43
diff
changeset
|
829 |
94e80f7a61b5
Add dex_deptracker.restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
43
diff
changeset
|
830 name = name_path.split('.')[-1] |
94e80f7a61b5
Add dex_deptracker.restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
43
diff
changeset
|
831 off = depon2.data_offset - depon1.data_offset |
94e80f7a61b5
Add dex_deptracker.restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
43
diff
changeset
|
832 _dex_tree_set_child(imm_parent, name, off) |
94e80f7a61b5
Add dex_deptracker.restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
43
diff
changeset
|
833 elif dep_type == dexfile.depend_off: |
94e80f7a61b5
Add dex_deptracker.restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
43
diff
changeset
|
834 depon_name_path = dep[1] |
94e80f7a61b5
Add dex_deptracker.restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
43
diff
changeset
|
835 depon = markers_info[depon_name_path][obj] |
94e80f7a61b5
Add dex_deptracker.restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
43
diff
changeset
|
836 name = name_path.split('.')[-1] |
94e80f7a61b5
Add dex_deptracker.restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
43
diff
changeset
|
837 _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
|
838 elif dep_type == dexfile.depend_idx: |
94e80f7a61b5
Add dex_deptracker.restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
43
diff
changeset
|
839 depon_name_path = dep[1] |
94e80f7a61b5
Add dex_deptracker.restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
43
diff
changeset
|
840 depon = markers_info[depon_name_path][obj] |
94e80f7a61b5
Add dex_deptracker.restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
43
diff
changeset
|
841 name = name_path.split('.')[-1] |
94e80f7a61b5
Add dex_deptracker.restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
43
diff
changeset
|
842 _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
|
843 else: |
94e80f7a61b5
Add dex_deptracker.restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
43
diff
changeset
|
844 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
|
845 pass |
94e80f7a61b5
Add dex_deptracker.restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
43
diff
changeset
|
846 pass |
94e80f7a61b5
Add dex_deptracker.restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
43
diff
changeset
|
847 |
94e80f7a61b5
Add dex_deptracker.restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
43
diff
changeset
|
848 |
24
a57ec6a76fe3
Describe steps to track dependencies
Thinker K.F. Li <thinker@codemud.net>
parents:
23
diff
changeset
|
849 def _sync_dependencies(): |
a57ec6a76fe3
Describe steps to track dependencies
Thinker K.F. Li <thinker@codemud.net>
parents:
23
diff
changeset
|
850 pass |
a57ec6a76fe3
Describe steps to track dependencies
Thinker K.F. Li <thinker@codemud.net>
parents:
23
diff
changeset
|
851 |
a57ec6a76fe3
Describe steps to track dependencies
Thinker K.F. Li <thinker@codemud.net>
parents:
23
diff
changeset
|
852 |
23
fff40aabefab
Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
853 if __name__ == '__main__': |
25
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
854 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
|
855 |
fff40aabefab
Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
856 import pprint |
fff40aabefab
Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
857 print |
fff40aabefab
Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
858 print 'Dependencies' |
25
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
859 pprint.pprint(collect_all_dep_decls()) |