annotate paraspace/dex_deptracker.py @ 52:67aa8ca8fff3

untested dex_deptracker.update_offset()
author Thinker K.F. Li <thinker@codemud.net>
date Tue, 21 Jun 2011 18:36:45 +0800
parents 38fdd422f611
children 705356005362
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('.'):
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
13 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
14 # array.items.<num>
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
15 obj = parent.child_type
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
16 parent = list
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
17 continue
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
18
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
19 parent = obj
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
20 if isinstance(parent, dexfile.switch):
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
21 key = eval(name)
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
22 obj = parent.map[key]
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
23 continue
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
24
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
25 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
26 obj = list
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.cond) and name == 'value':
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
30 obj = obj.child_type
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 obj = getattr(parent, name)
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
34 pass
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
35 return obj, parent
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
36
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
37
26
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
38 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
39 def travelable(attr, attr_name):
15cb829ac442 travel_dex_type() recoganizes _dex_type correctly
Thinker K.F. Li <thinker@codemud.net>
parents: 26
diff changeset
40 if attr_name.startswith('_'):
15cb829ac442 travel_dex_type() recoganizes _dex_type correctly
Thinker K.F. Li <thinker@codemud.net>
parents: 26
diff changeset
41 return False
15cb829ac442 travel_dex_type() recoganizes _dex_type correctly
Thinker K.F. Li <thinker@codemud.net>
parents: 26
diff changeset
42 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
43 (not (type(attr) == type and
15cb829ac442 travel_dex_type() recoganizes _dex_type correctly
Thinker K.F. Li <thinker@codemud.net>
parents: 26
diff changeset
44 issubclass(attr, dexfile._dex_type)))):
15cb829ac442 travel_dex_type() recoganizes _dex_type correctly
Thinker K.F. Li <thinker@codemud.net>
parents: 26
diff changeset
45 return False
15cb829ac442 travel_dex_type() recoganizes _dex_type correctly
Thinker K.F. Li <thinker@codemud.net>
parents: 26
diff changeset
46 return True
26
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
47
28
5ce7ca1187b3 Pass throught markers for dex types
Thinker K.F. Li <thinker@codemud.net>
parents: 27
diff changeset
48 #
5ce7ca1187b3 Pass throught markers for dex types
Thinker K.F. Li <thinker@codemud.net>
parents: 27
diff changeset
49 # pass throught markers
5ce7ca1187b3 Pass throught markers for dex types
Thinker K.F. Li <thinker@codemud.net>
parents: 27
diff changeset
50 #
5ce7ca1187b3 Pass throught markers for dex types
Thinker K.F. Li <thinker@codemud.net>
parents: 27
diff changeset
51 while isinstance(clazz, _marker):
5ce7ca1187b3 Pass throught markers for dex types
Thinker K.F. Li <thinker@codemud.net>
parents: 27
diff changeset
52 clazz = clazz.back_type
5ce7ca1187b3 Pass throught markers for dex types
Thinker K.F. Li <thinker@codemud.net>
parents: 27
diff changeset
53 pass
5ce7ca1187b3 Pass throught markers for dex types
Thinker K.F. Li <thinker@codemud.net>
parents: 27
diff changeset
54
26
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
55 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
56 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
57 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
58 while travel_queue:
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
59 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
60 if isinstance(attr, _marker):
26
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
61 #
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
62 # 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
63 #
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
64 child = attr.back_type
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
65 travel_queue.append((child, name_path))
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
66 continue
28
5ce7ca1187b3 Pass throught markers for dex types
Thinker K.F. Li <thinker@codemud.net>
parents: 27
diff changeset
67
5ce7ca1187b3 Pass throught markers for dex types
Thinker K.F. Li <thinker@codemud.net>
parents: 27
diff changeset
68 yield attr, name_path
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 if isinstance(attr, _nest_types):
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
71 if isinstance(attr, dexfile.array):
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
72 child_name = name_path + '.items.*'
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
73 child = attr.child_type
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
74 travel_queue.append((child, child_name))
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
75 elif isinstance(attr, dexfile.cond):
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
76 child_name = name_path + '.value'
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
77 child = attr.child_type
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
78 travel_queue.append((child, child_name))
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
79 elif isinstance(attr, dexfile.switch):
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
80 for key in attr.map.keys():
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
81 child_name = name_path + '.' + repr(key)
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
82 child = attr.map[key]
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
83 travel_queue.append((child, child_name))
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
84 pass
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
85 pass
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
86 pass
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
87 pass
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
88 pass
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
89
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
90
25
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
91 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
92 # 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
93 dep_decls = {}
23
fff40aabefab Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
94
fff40aabefab Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
95 for attr in dir(clazz):
fff40aabefab Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
96 namelist = [name_path, attr]
fff40aabefab Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
97
25
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
98 #
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
99 # Find dependency
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
100 #
23
fff40aabefab Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
101 digged_flag = False
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 value_type = getattr(clazz, attr)
fff40aabefab Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
104 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
105 (type(value_type) == type and
fff40aabefab Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
106 issubclass(value_type, _nest_types)):
fff40aabefab Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
107 if isinstance(value_type, dexfile.array):
fff40aabefab Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
108 namelist.append('items')
25
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
109 namelist.append('*')
23
fff40aabefab Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
110 value_type = value_type.child_type
fff40aabefab Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
111 elif isinstance(value_type, dexfile.cond):
fff40aabefab Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
112 namelist.append('value')
fff40aabefab Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
113 value_type = value_type.child_type
fff40aabefab Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
114 elif isinstance(value_type, dexfile.switch):
fff40aabefab Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
115 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
116 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
117 continue
fff40aabefab Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
118 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
119 child_dep_decls = \
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
120 _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
121 child_type,
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
122 dex_types)
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
123
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
124 if child_dep_decls:
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
125 raise ValueError, \
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
126 '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
127 % (child_name_path)
23
fff40aabefab Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
128 pass
fff40aabefab Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
129 digged_flag = True
fff40aabefab Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
130 break
fff40aabefab Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
131 pass
fff40aabefab Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
132
fff40aabefab Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
133 if digged_flag:
fff40aabefab Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
134 continue
25
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
135
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
136 #
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
137 # Record dependency
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
138 #
23
fff40aabefab Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
139 if isinstance(value_type, dexfile.depend):
fff40aabefab Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
140 from_name = '.'.join(namelist)
fff40aabefab Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
141 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
142 depend_name = value_type.depend_on
25
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
143 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
144 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
145 depend_name = value_type.depend_on
fff40aabefab Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
146 relative_to = value_type.relative_to
25
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
147 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
148 depend_name,
fff40aabefab Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
149 relative_to)
fff40aabefab Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
150 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
151 depend_name = value_type.depend_on
25
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
152 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
153 pass
fff40aabefab Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
154 pass
fff40aabefab Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
155 pass
25
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
156 return dep_decls
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
157
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
158
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
159 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
160 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
161 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
162 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
163 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
164 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
165 continue
0c0a659187c2 Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents: 29
diff changeset
166
0c0a659187c2 Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents: 29
diff changeset
167 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
168 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
169 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
170 continue
0c0a659187c2 Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents: 29
diff changeset
171
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 = 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
173 pass
0c0a659187c2 Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents: 29
diff changeset
174 return obj
23
fff40aabefab Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
175
fff40aabefab Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
176
25
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
177 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
178 child_parts = child_name.split('.')
5cea19126a11 Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents: 42
diff changeset
179 for child_part in child_parts[:-1]:
5cea19126a11 Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents: 42
diff changeset
180 if isinstance(obj, list):
5cea19126a11 Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents: 42
diff changeset
181 idx = int(child_part)
5cea19126a11 Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents: 42
diff changeset
182 obj = obj[idx]
5cea19126a11 Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents: 42
diff changeset
183 continue
5cea19126a11 Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents: 42
diff changeset
184
5cea19126a11 Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents: 42
diff changeset
185 if isinstance(obj, dexfile.switch):
5cea19126a11 Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents: 42
diff changeset
186 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
187 obj = obj.value
5cea19126a11 Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents: 42
diff changeset
188 continue
5cea19126a11 Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents: 42
diff changeset
189
5cea19126a11 Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents: 42
diff changeset
190 obj = getattr(obj, child_part)
5cea19126a11 Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents: 42
diff changeset
191 pass
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 last_part = child_parts[-1]
25
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
194 if isinstance(obj, list):
43
5cea19126a11 Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents: 42
diff changeset
195 idx = int(last_part)
25
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
196 obj[idx] = value
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
197 elif isinstance(obj, dexfile.switch):
43
5cea19126a11 Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents: 42
diff changeset
198 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
199 obj.value = value
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
200 else:
43
5cea19126a11 Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents: 42
diff changeset
201 setattr(obj, last_part, value)
25
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
202 pass
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
203 pass
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
204
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
205
47
cd4e3584ed7f Add update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents: 46
diff changeset
206 ## \brief Travel the tree of relocatable objects and their attributes.
cd4e3584ed7f Add update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents: 46
diff changeset
207 #
cd4e3584ed7f Add update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents: 46
diff changeset
208 # \param skip_func is a function that returns true for skip a subtree.
cd4e3584ed7f Add update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents: 46
diff changeset
209 #
cd4e3584ed7f Add update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents: 46
diff changeset
210 # \ref skip_func is called for every relocatable and their attributes
cd4e3584ed7f Add update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents: 46
diff changeset
211 # to determines if visiting the object and subtree.
cd4e3584ed7f Add update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents: 46
diff changeset
212 #
cd4e3584ed7f Add update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents: 46
diff changeset
213 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
214 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
215
29
b0cc5da28141 pass parents to travel info
Thinker K.F. Li <thinker@codemud.net>
parents: 28
diff changeset
216 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
217 child_parents = parents + [obj]
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
218 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
219 if isinstance(child_obj, dexfile.composite):
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
220 child_path = child_obj.__class__.__name__
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
221 else:
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
222 child_path = obj_name + '.' + child_name
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
223 pass
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
224 return (child_obj, child_parents, child_path)
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
225
25
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
226 while stk:
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
227 obj, parents, obj_name = stk.pop(0)
47
cd4e3584ed7f Add update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents: 46
diff changeset
228 if skip_func and skip_func(obj, parents, obj_name):
cd4e3584ed7f Add update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents: 46
diff changeset
229 continue
25
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
230 yield (obj, parents, obj_name)
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
231
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
232 if isinstance(obj, list):
29
b0cc5da28141 pass parents to travel info
Thinker K.F. Li <thinker@codemud.net>
parents: 28
diff changeset
233 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
234 for idx in range(len(obj))]
25
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
235 stk.extend(children)
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
236 continue
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
237
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
238 if not isinstance(obj, dexfile.relocatable):
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
239 continue
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
240
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, child_name, parents)
25
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
242 for child_name in obj.children()]
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 pass
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
245 pass
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
246
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
247
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
248 def _all_dex_types():
23
fff40aabefab Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
249 dex_types = dict([(name, value)
fff40aabefab Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
250 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
251 if name.startswith('_DEX_')])
fff40aabefab Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
252 dex_types['DEXFile'] = dexfile.DEXFile
fff40aabefab Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
253 return dex_types
fff40aabefab Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
254
fff40aabefab Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
255
25
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
256 def collect_all_dep_decls():
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
257 dex_types = _all_dex_types()
23
fff40aabefab Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
258
25
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
259 all_dep_decls = {}
23
fff40aabefab Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
260 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
261 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
262 all_dep_decls.update(dep_decls)
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
263 pass
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
264
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
265 return all_dep_decls
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
266
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
267
52
67aa8ca8fff3 untested dex_deptracker.update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents: 49
diff changeset
268 class _marker(dexfile.null_relocatable):
26
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
269 back_type = None
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
270 pass
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
271
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
272 class _uid_marker(_marker):
25
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
273 uid_seq = 0
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
274
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
275 def __init__(self, back_type, name_path):
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
276 self.back_type = back_type
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
277 self.name_path = name_path
23
fff40aabefab Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
278 pass
fff40aabefab Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
279
25
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
280 def parse(self, parent, data, off):
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
281 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
282 try:
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
283 value.data_uid = _uid_marker.uid_seq
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
284 except AttributeError:
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
285 raise AttributeError, \
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
286 'can not depend on non-instance (%s)' % (self.name_path)
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
287 _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
288
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
289 return value
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
290
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
291 def sizeof(self, value):
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
292 sz = self.back_type.sizeof(value)
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
293 return sz
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
294
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
295 def compute_size(self, back_obj):
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
296 self.back_type.compute_size(back_obj)
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
297 pass
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
298
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
299 def to_str(self, back_obj):
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
300 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
301
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
302 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
303 try:
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
304 id_item_map = markers_info[name_path]
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
305 except KeyError:
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
306 id_item_map = {}
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
307 markers_info[name_path] = id_item_map
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
308 pass
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
309 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
310 id_item_map[obj.data_uid] = obj
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
311 pass
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
312
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
313 def __getattr__(self, name):
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
314 return getattr(self.back_type, name)
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 def __call__(self, *args, **kws):
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
317 return self.back_type(*args, **kws)
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
318 pass
23
fff40aabefab Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
319
fff40aabefab Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
320
25
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
321 class _offset_marker(_uid_marker):
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
322 def parse(self, parent, data, off):
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
323 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
324
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
325 value = self.back_type.parse(parent, data, off)
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
326 value.data_offset = off
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
327 return value
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
24
a57ec6a76fe3 Describe steps to track dependencies
Thinker K.F. Li <thinker@codemud.net>
parents: 23
diff changeset
335 pass
25
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
336 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
337 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
338 pass
a57ec6a76fe3 Describe steps to track dependencies
Thinker K.F. Li <thinker@codemud.net>
parents: 23
diff changeset
339 pass
23
fff40aabefab Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
340
24
a57ec6a76fe3 Describe steps to track dependencies
Thinker K.F. Li <thinker@codemud.net>
parents: 23
diff changeset
341
25
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
342 class _rel_offset_marker(_offset_marker):
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
343 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
344 rev_parents = list(parents)
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
345 rev_parents.reverse()
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
346
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
347 for parent in rev_parents:
29
b0cc5da28141 pass parents to travel info
Thinker K.F. Li <thinker@codemud.net>
parents: 28
diff changeset
348 try:
b0cc5da28141 pass parents to travel info
Thinker K.F. Li <thinker@codemud.net>
parents: 28
diff changeset
349 rel_marker_info = parent.rel_marker_info
b0cc5da28141 pass parents to travel info
Thinker K.F. Li <thinker@codemud.net>
parents: 28
diff changeset
350 except AttributeError:
b0cc5da28141 pass parents to travel info
Thinker K.F. Li <thinker@codemud.net>
parents: 28
diff changeset
351 try:
b0cc5da28141 pass parents to travel info
Thinker K.F. Li <thinker@codemud.net>
parents: 28
diff changeset
352 rel_marker_info = {}
b0cc5da28141 pass parents to travel info
Thinker K.F. Li <thinker@codemud.net>
parents: 28
diff changeset
353 parent.rel_marker_info = rel_marker_info
b0cc5da28141 pass parents to travel info
Thinker K.F. Li <thinker@codemud.net>
parents: 28
diff changeset
354 except AttributeError:
b0cc5da28141 pass parents to travel info
Thinker K.F. Li <thinker@codemud.net>
parents: 28
diff changeset
355 continue
b0cc5da28141 pass parents to travel info
Thinker K.F. Li <thinker@codemud.net>
parents: 28
diff changeset
356 pass
b0cc5da28141 pass parents to travel info
Thinker K.F. Li <thinker@codemud.net>
parents: 28
diff changeset
357 depons = rel_marker_info.setdefault(name_path, [])
b0cc5da28141 pass parents to travel info
Thinker K.F. Li <thinker@codemud.net>
parents: 28
diff changeset
358 depons.append(obj)
25
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
359 pass
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
360 pass
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
361
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
362 @staticmethod
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
363 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
364 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
365 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
366 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
367 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
368
25
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
369 rev_parents = list(parents)
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
370 rev_parents.reverse()
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
371
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
372 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
373 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
374 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
375 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
376 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
377
25
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
378 try:
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
379 rel_marker_info = parent.rel_marker_info
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
380 except:
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
381 continue
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
382 if name_path in rel_marker_info:
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
383 depons = rel_marker_info[name_path]
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
384 assert len(depons) == 1
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
385 depon = depons[0]
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
386 return depon
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
387 pass
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
388
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
389 raise RuntimeError, 'can not find relative offset depend'
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
390 pass
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
391
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
392
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
393 class _idx_marker(_uid_marker):
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
394 def parse(self, parent, data, off):
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
395 assert isinstance(self.back_type, dexfile.array)
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
396 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
397 for item in array.items:
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
398 item.data_uid = _uid_marker.uid_seq
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
399 _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
400 pass
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
401 return array
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
402
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
403 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
404 try:
0c0a659187c2 Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents: 29
diff changeset
405 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
406 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
407 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
408 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
409 pass
0c0a659187c2 Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents: 29
diff changeset
410 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
411 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
412 pass
25
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
413 pass
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
414 pass
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
415
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
416
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
417 def _install_offset_marker(name_path):
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
418 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
419 while isinstance(parent, dexfile.ref):
0c0a659187c2 Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents: 29
diff changeset
420 obj, parent = _resolve_name_path(parent.target_path)
0c0a659187c2 Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents: 29
diff changeset
421 pass
25
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
422 marker = _offset_marker(obj, name_path)
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
423 name = name_path.split('.')[-1]
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
424 _dex_tree_set_child(parent, name, marker)
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
425 pass
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
426
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
427
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
428 def _install_rel_offset_marker(name_path):
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
429 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
430 while isinstance(parent, dexfile.ref):
0c0a659187c2 Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents: 29
diff changeset
431 obj, parent = _resolve_name_path(parent.target_path)
0c0a659187c2 Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents: 29
diff changeset
432 pass
25
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
433 marker = _rel_offset_marker(obj, name_path)
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
434 name = name_path.split('.')[-1]
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
435 _dex_tree_set_child(parent, name, marker)
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
436 pass
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
437
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
438
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
439 def _install_uid_marker(name_path):
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
440 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
441 while isinstance(parent, dexfile.ref):
0c0a659187c2 Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents: 29
diff changeset
442 obj, parent = _resolve_name_path(parent.target_path)
0c0a659187c2 Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents: 29
diff changeset
443 pass
25
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
444 marker = _uid_marker(obj, name_path)
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
445 name = name_path.split('.')[-1]
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
446 _dex_tree_set_child(parent, name, marker)
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
447 pass
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
448
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
449
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
450 def _install_idx_marker(name_path):
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
451 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
452 while isinstance(parent, dexfile.ref):
0c0a659187c2 Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents: 29
diff changeset
453 obj, parent = _resolve_name_path(parent.target_path)
0c0a659187c2 Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents: 29
diff changeset
454 pass
25
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
455 marker = _idx_marker(obj, name_path)
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
456 name = name_path.split('.')[-1]
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
457 _dex_tree_set_child(parent, name, marker)
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
458 pass
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
459
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
460
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
461 def _install_markers(all_dep_decls):
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
462 all_markers = set()
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
463
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
464 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
465 dep_type = dep[0]
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
466 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
467 name_path1 = dep[1]
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
468 if name_path1 not in all_markers:
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
469 all_markers.add(name_path1)
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
470 _install_rel_offset_marker(name_path1)
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
471 pass
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
472
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
473 name_path2 = dep[2]
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
474 if name_path2 not in all_markers:
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
475 all_markers.add(name_path2)
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
476 _install_rel_offset_marker(name_path2)
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
477 pass
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
478 pass
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
479 elif dep_type == dexfile.depend_off:
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
480 name_path = dep[1]
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
481 if name_path not in all_markers:
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
482 all_markers.add(name_path)
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
483 _install_offset_marker(name_path)
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
484 pass
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
485 pass
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
486 elif dep_type == dexfile.depend_idx:
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
487 name_path = dep[1]
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
488 if name_path not in all_markers:
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
489 all_markers.add(name_path)
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
490 _install_idx_marker(name_path)
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 pass
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
493 else:
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
494 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
495 pass
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
496 pass
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
497
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
498
26
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
499 def _patch_dex_type_markers(all_dep_decls):
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
500 import itertools
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
501 marked_types = dict([(marker.back_type, name)
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
502 for name, marker in _all_dex_types().items()
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
503 if isinstance(marker, _marker)])
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
504
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
505 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
506 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
507 marked_type_refs = [(name_path, marked_types[attr])
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
508 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
509 if type(attr) == type and
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
510 issubclass(attr, dexfile.composite) and
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
511 attr in marked_types]
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
512
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
513 def patch_ref(name_path, depon_path):
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
514 depon, depon_parent = _resolve_name_path(depon_path)
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
515
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
516 path_elms = name_path.split('.')
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
517 parent_path = '.'.join(path_elms[:-1])
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
518 parent, grand = _resolve_name_path(parent_path)
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
519
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
520 if isinstance(grand, _nest_types):
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
521 if isinstance(grand, (dexfile.array, dexfile.cond)):
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
522 grand.child_type = depon
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
523 elif isinstance(grand, dexfile.switch):
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
524 key = eval(path_elms[-1])
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
525 grand.map[key] = depon
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
526 else:
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
527 raise RuntimeError, 'should not be here'
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
528 pass
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
529 else:
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
530 name = path_elms[-1]
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
531 setattr(parent, name, depon)
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
532 pass
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
533 pass
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
534
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
535 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
536 patch_ref(name_path, depon_path)
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
537 pass
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
538 pass
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
539
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
540
40
0c0a659187c2 Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents: 29
diff changeset
541 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
542 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
543 _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
544 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
545 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
546 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
547 break
0c0a659187c2 Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents: 29
diff changeset
548 pass
0c0a659187c2 Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents: 29
diff changeset
549
0c0a659187c2 Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents: 29
diff changeset
550 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
551 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
552 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
553 pass
0c0a659187c2 Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents: 29
diff changeset
554 pass
0c0a659187c2 Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents: 29
diff changeset
555 pass
0c0a659187c2 Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents: 29
diff changeset
556
0c0a659187c2 Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents: 29
diff changeset
557
43
5cea19126a11 Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents: 42
diff changeset
558 ## \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
559 #
5cea19126a11 Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents: 42
diff changeset
560 def _find_parent_of_clazz(clazz, parents):
5cea19126a11 Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents: 42
diff changeset
561 rev_parents = list(parents)
5cea19126a11 Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents: 42
diff changeset
562 rev_parents.reverse()
5cea19126a11 Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents: 42
diff changeset
563 for parent in rev_parents:
5cea19126a11 Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents: 42
diff changeset
564 if isinstance(parent, clazz):
5cea19126a11 Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents: 42
diff changeset
565 return parent
5cea19126a11 Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents: 42
diff changeset
566 pass
5cea19126a11 Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents: 42
diff changeset
567 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
568
5cea19126a11 Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents: 42
diff changeset
569
5cea19126a11 Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents: 42
diff changeset
570 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
571 idx = name_path.index('.')
5cea19126a11 Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents: 42
diff changeset
572 if idx >= 0:
5cea19126a11 Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents: 42
diff changeset
573 clazz = name_path[:idx]
5cea19126a11 Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents: 42
diff changeset
574 attr = name_path[idx + 1:]
5cea19126a11 Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents: 42
diff changeset
575 else:
5cea19126a11 Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents: 42
diff changeset
576 clazz = name_path
5cea19126a11 Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents: 42
diff changeset
577 attr = None
5cea19126a11 Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents: 42
diff changeset
578 pass
5cea19126a11 Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents: 42
diff changeset
579 return clazz, attr
5cea19126a11 Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents: 42
diff changeset
580
5cea19126a11 Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents: 42
diff changeset
581
5cea19126a11 Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents: 42
diff changeset
582 ## \brief Setup value of refs.
5cea19126a11 Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents: 42
diff changeset
583 #
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
584 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
585 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
586 _travel_dex_relocatable(root_obj):
43
5cea19126a11 Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents: 42
diff changeset
587 if not parents:
5cea19126a11 Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents: 42
diff changeset
588 continue
5cea19126a11 Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents: 42
diff changeset
589
5cea19126a11 Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents: 42
diff changeset
590 imm_parent = parents[-1]
5cea19126a11 Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents: 42
diff changeset
591 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
592 continue
43
5cea19126a11 Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents: 42
diff changeset
593
5cea19126a11 Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents: 42
diff changeset
594 clazz, pclazz = _resolve_name_path(name_path)
5cea19126a11 Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents: 42
diff changeset
595 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
596 clazz = clazz.back_type
43
5cea19126a11 Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents: 42
diff changeset
597 pass
5cea19126a11 Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents: 42
diff changeset
598
5cea19126a11 Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents: 42
diff changeset
599 if isinstance(clazz, dexfile.ref):
5cea19126a11 Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents: 42
diff changeset
600 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
601 if not attr_name:
5cea19126a11 Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents: 42
diff changeset
602 raise ValueError, \
5cea19126a11 Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents: 42
diff changeset
603 '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
604
5cea19126a11 Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents: 42
diff changeset
605 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
606
5cea19126a11 Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents: 42
diff changeset
607 value = clazz.get_value(parents)
5cea19126a11 Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents: 42
diff changeset
608 _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
609 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
610 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
611 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
612
c5cfc796af8b Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents: 40
diff changeset
613
25
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
614 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
615 markers_info = {}
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
616 depon_src_map = {}
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
617 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
618 for tgt in depon[1:]:
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
619 markers_info[tgt] = {}
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
620 depon_src_map[depon] = dep_src
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
621 pass
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
622 pass
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
623
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
624 #
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
625 # Collect marked objects
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
626 #
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
627 for obj, parents, name_path in \
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
628 _travel_dex_relocatable(root_obj):
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
629 if name_path not in markers_info:
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
630 continue
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
631
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
632 marker, dummy_parent = _resolve_name_path(name_path)
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
633 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
634 pass
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
635
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
636 #
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
637 # Link depend source to marked target
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
638 #
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
639 for obj, parents, name_path in \
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
640 _travel_dex_relocatable(root_obj):
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
641 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
642 continue
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
643
43
5cea19126a11 Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents: 42
diff changeset
644 imm_parent = parents[-1]
5cea19126a11 Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents: 42
diff changeset
645 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
646 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
647
25
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
648 dep = all_dep_decls[name_path]
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
649 dep_type = dep[0]
26
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
650 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
651 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
652 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
653
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
654 name = name_path.split('.')[-1]
43
5cea19126a11 Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents: 42
diff changeset
655 _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
656 elif dep_type == dexfile.depend_off:
25
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
657 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
658 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
659 name = name_path.split('.')[-1]
43
5cea19126a11 Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents: 42
diff changeset
660 _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
661 elif dep_type == dexfile.depend_idx:
25
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
662 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
663 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
664 name = name_path.split('.')[-1]
43
5cea19126a11 Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents: 42
diff changeset
665 _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
666 else:
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
667 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
668 pass
23
fff40aabefab Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
669 pass
fff40aabefab Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
670
24
a57ec6a76fe3 Describe steps to track dependencies
Thinker K.F. Li <thinker@codemud.net>
parents: 23
diff changeset
671
42
8ca4a6bc6b79 Extract to dex_deptracker.build_dependencies
Thinker K.F. Li <thinker@codemud.net>
parents: 41
diff changeset
672 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
673 _build_associations(dexroot)
8ca4a6bc6b79 Extract to dex_deptracker.build_dependencies
Thinker K.F. Li <thinker@codemud.net>
parents: 41
diff changeset
674 _build_refs(dexroot)
8ca4a6bc6b79 Extract to dex_deptracker.build_dependencies
Thinker K.F. Li <thinker@codemud.net>
parents: 41
diff changeset
675 _link_dependencies(dexroot, all_dep_decls)
8ca4a6bc6b79 Extract to dex_deptracker.build_dependencies
Thinker K.F. Li <thinker@codemud.net>
parents: 41
diff changeset
676 pass
8ca4a6bc6b79 Extract to dex_deptracker.build_dependencies
Thinker K.F. Li <thinker@codemud.net>
parents: 41
diff changeset
677
8ca4a6bc6b79 Extract to dex_deptracker.build_dependencies
Thinker K.F. Li <thinker@codemud.net>
parents: 41
diff changeset
678
47
cd4e3584ed7f Add update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents: 46
diff changeset
679 def _build_depon_dep_map(all_dep_decls):
cd4e3584ed7f Add update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents: 46
diff changeset
680 def _build_sub_depon_dep(from_path, dep):
cd4e3584ed7f Add update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents: 46
diff changeset
681 depon1 = dep[1]
cd4e3584ed7f Add update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents: 46
diff changeset
682 sub = [(depon1, from_path)]
cd4e3584ed7f Add update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents: 46
diff changeset
683 dep_type = dep[0]
cd4e3584ed7f Add update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents: 46
diff changeset
684 if dep_type == dexfile.depend_off_rel:
cd4e3584ed7f Add update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents: 46
diff changeset
685 depon2 = dep[2]
cd4e3584ed7f Add update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents: 46
diff changeset
686 sub.append((depon2, from_path))
cd4e3584ed7f Add update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents: 46
diff changeset
687 pass
cd4e3584ed7f Add update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents: 46
diff changeset
688
cd4e3584ed7f Add update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents: 46
diff changeset
689 return sub
cd4e3584ed7f Add update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents: 46
diff changeset
690
cd4e3584ed7f Add update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents: 46
diff changeset
691 depon_dep_lsts = [_build_sub_depon_dep(from_path, dep)
cd4e3584ed7f Add update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents: 46
diff changeset
692 for from_path, dep in all_dep_decls.items()]
cd4e3584ed7f Add update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents: 46
diff changeset
693 depon_dep_lst = chain(*depon_dep_lsts)
cd4e3584ed7f Add update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents: 46
diff changeset
694 depon_dep_map = dict(depon_dep_lst)
cd4e3584ed7f Add update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents: 46
diff changeset
695 pass
cd4e3584ed7f Add update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents: 46
diff changeset
696
cd4e3584ed7f Add update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents: 46
diff changeset
697
cd4e3584ed7f Add update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents: 46
diff changeset
698 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
699 from dexfile import man_off
67aa8ca8fff3 untested dex_deptracker.update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents: 49
diff changeset
700
67aa8ca8fff3 untested dex_deptracker.update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents: 49
diff changeset
701 moff = man_off(0)
67aa8ca8fff3 untested dex_deptracker.update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents: 49
diff changeset
702 queue = [dexroot]
47
cd4e3584ed7f Add update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents: 46
diff changeset
703
52
67aa8ca8fff3 untested dex_deptracker.update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents: 49
diff changeset
704 while queue:
67aa8ca8fff3 untested dex_deptracker.update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents: 49
diff changeset
705 obj = queue.pop()
67aa8ca8fff3 untested dex_deptracker.update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents: 49
diff changeset
706 if isinstance(obj, _marker):
67aa8ca8fff3 untested dex_deptracker.update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents: 49
diff changeset
707 obj.set_marker(moff())
67aa8ca8fff3 untested dex_deptracker.update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents: 49
diff changeset
708 pass
67aa8ca8fff3 untested dex_deptracker.update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents: 49
diff changeset
709 if isinstance(obj, dexfile.relocatable):
67aa8ca8fff3 untested dex_deptracker.update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents: 49
diff changeset
710 moff(obj.sizeof())
67aa8ca8fff3 untested dex_deptracker.update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents: 49
diff changeset
711 pass
67aa8ca8fff3 untested dex_deptracker.update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents: 49
diff changeset
712
67aa8ca8fff3 untested dex_deptracker.update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents: 49
diff changeset
713 if isinstance(obj, dexfile.ref):
47
cd4e3584ed7f Add update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents: 46
diff changeset
714 continue
52
67aa8ca8fff3 untested dex_deptracker.update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents: 49
diff changeset
715 if not isinstance(obj, dexfile.relocatable):
67aa8ca8fff3 untested dex_deptracker.update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents: 49
diff changeset
716 continue
67aa8ca8fff3 untested dex_deptracker.update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents: 49
diff changeset
717
67aa8ca8fff3 untested dex_deptracker.update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents: 49
diff changeset
718 children = list(obj.children())
67aa8ca8fff3 untested dex_deptracker.update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents: 49
diff changeset
719 attrs = [_dex_tree_get_child(obj, child)
67aa8ca8fff3 untested dex_deptracker.update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents: 49
diff changeset
720 for child in children]
67aa8ca8fff3 untested dex_deptracker.update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents: 49
diff changeset
721 attrs.reverse()
67aa8ca8fff3 untested dex_deptracker.update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents: 49
diff changeset
722 queue = queue + attrs
47
cd4e3584ed7f Add update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents: 46
diff changeset
723 pass
cd4e3584ed7f Add update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents: 46
diff changeset
724 pass
cd4e3584ed7f Add update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents: 46
diff changeset
725
cd4e3584ed7f Add update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents: 46
diff changeset
726
46
94e80f7a61b5 Add dex_deptracker.restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 43
diff changeset
727 ## \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
728 #
94e80f7a61b5 Add dex_deptracker.restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 43
diff changeset
729 def restore_dependencies(dexroot, all_dep_decls):
94e80f7a61b5 Add dex_deptracker.restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 43
diff changeset
730 for obj, parents, name_path in \
94e80f7a61b5 Add dex_deptracker.restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 43
diff changeset
731 _travel_dex_relocatable(dexroot):
94e80f7a61b5 Add dex_deptracker.restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 43
diff changeset
732 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
733 continue
94e80f7a61b5 Add dex_deptracker.restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 43
diff changeset
734
94e80f7a61b5 Add dex_deptracker.restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 43
diff changeset
735 imm_parent = parents[-1]
94e80f7a61b5 Add dex_deptracker.restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 43
diff changeset
736 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
737 continue
94e80f7a61b5 Add dex_deptracker.restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 43
diff changeset
738
94e80f7a61b5 Add dex_deptracker.restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 43
diff changeset
739 dep = all_dep_decls[name_path]
94e80f7a61b5 Add dex_deptracker.restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 43
diff changeset
740 dep_type = dep[0]
94e80f7a61b5 Add dex_deptracker.restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 43
diff changeset
741 if dep_type == dexfile.depend_off_rel:
94e80f7a61b5 Add dex_deptracker.restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 43
diff changeset
742 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
743 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
744
94e80f7a61b5 Add dex_deptracker.restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 43
diff changeset
745 name = name_path.split('.')[-1]
94e80f7a61b5 Add dex_deptracker.restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 43
diff changeset
746 off = depon2.data_offset - depon1.data_offset
94e80f7a61b5 Add dex_deptracker.restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 43
diff changeset
747 _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
748 elif dep_type == dexfile.depend_off:
94e80f7a61b5 Add dex_deptracker.restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 43
diff changeset
749 depon_name_path = dep[1]
94e80f7a61b5 Add dex_deptracker.restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 43
diff changeset
750 depon = markers_info[depon_name_path][obj]
94e80f7a61b5 Add dex_deptracker.restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 43
diff changeset
751 name = name_path.split('.')[-1]
94e80f7a61b5 Add dex_deptracker.restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 43
diff changeset
752 _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
753 elif dep_type == dexfile.depend_idx:
94e80f7a61b5 Add dex_deptracker.restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 43
diff changeset
754 depon_name_path = dep[1]
94e80f7a61b5 Add dex_deptracker.restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 43
diff changeset
755 depon = markers_info[depon_name_path][obj]
94e80f7a61b5 Add dex_deptracker.restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 43
diff changeset
756 name = name_path.split('.')[-1]
94e80f7a61b5 Add dex_deptracker.restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 43
diff changeset
757 _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
758 else:
94e80f7a61b5 Add dex_deptracker.restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 43
diff changeset
759 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
760 pass
94e80f7a61b5 Add dex_deptracker.restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 43
diff changeset
761 pass
94e80f7a61b5 Add dex_deptracker.restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 43
diff changeset
762
94e80f7a61b5 Add dex_deptracker.restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 43
diff changeset
763
24
a57ec6a76fe3 Describe steps to track dependencies
Thinker K.F. Li <thinker@codemud.net>
parents: 23
diff changeset
764 def _sync_dependencies():
a57ec6a76fe3 Describe steps to track dependencies
Thinker K.F. Li <thinker@codemud.net>
parents: 23
diff changeset
765 pass
a57ec6a76fe3 Describe steps to track dependencies
Thinker K.F. Li <thinker@codemud.net>
parents: 23
diff changeset
766
a57ec6a76fe3 Describe steps to track dependencies
Thinker K.F. Li <thinker@codemud.net>
parents: 23
diff changeset
767
23
fff40aabefab Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
768 if __name__ == '__main__':
25
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
769 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
770
fff40aabefab Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
771 import pprint
fff40aabefab Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
772 print
fff40aabefab Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
773 print 'Dependencies'
25
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
774 pprint.pprint(collect_all_dep_decls())