annotate paraspace/dex_deptracker.py @ 129:52749d91cc22

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