annotate paraspace/dex_deptracker.py @ 88:bbe8d5cbe368

Clone objects with meta info
author Thinker K.F. Li <thinker@codemud.net>
date Sun, 24 Jul 2011 19:15:04 +0800
parents 3e34c7d33182
children 7a059ab408f0
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
52
67aa8ca8fff3 untested dex_deptracker.update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents: 49
diff changeset
301 class _marker(dexfile.null_relocatable):
26
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
302 back_type = None
53
705356005362 Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents: 52
diff changeset
303
705356005362 Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents: 52
diff changeset
304 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
305 raise NotImplementedError, \
705356005362 Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents: 52
diff changeset
306 'The marker does not implement set_marker()'
26
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
307 pass
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
308
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
309 class _uid_marker(_marker):
25
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
310 uid_seq = 0
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
311
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
312 def __init__(self, back_type, name_path):
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
313 self.back_type = back_type
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
314 self.name_path = name_path
23
fff40aabefab Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
315 pass
fff40aabefab Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
316
25
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
317 def parse(self, parent, data, off):
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
318 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
319 try:
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
320 value.data_uid = _uid_marker.uid_seq
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
321 except AttributeError:
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
322 raise AttributeError, \
53
705356005362 Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents: 52
diff changeset
323 '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
324 (self.name_path, repr(value))
25
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
325 _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
326
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
327 return value
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
328
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
329 def sizeof(self, value):
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
330 sz = self.back_type.sizeof(value)
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
331 return sz
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
332
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
333 def compute_size(self, back_obj):
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
334 self.back_type.compute_size(back_obj)
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
335 pass
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
336
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
337 def to_str(self, back_obj):
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
338 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
339
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
340 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
341 try:
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
342 id_item_map = markers_info[name_path]
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
343 except KeyError:
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
344 id_item_map = {}
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
345 markers_info[name_path] = id_item_map
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
346 pass
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
347 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
348 id_item_map[obj.data_uid] = obj
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
349 pass
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
350
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
351 def __getattr__(self, name):
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
352 return getattr(self.back_type, name)
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
353
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
354 def __call__(self, *args, **kws):
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
355 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
356
705356005362 Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents: 52
diff changeset
357 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
358 pass
25
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
359 pass
23
fff40aabefab Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
360
fff40aabefab Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
361
25
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
362 class _offset_marker(_uid_marker):
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
363 def parse(self, parent, data, off):
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
364 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
365
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
366 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
367 value.data_offset = off
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
368 return value
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
369
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
370 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
371 try:
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
372 id_item_map = markers_info[name_path]
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
373 except KeyError:
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
374 id_item_map = {}
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
375 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
376 pass
25
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
377 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
378 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
379 pass
53
705356005362 Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents: 52
diff changeset
380
705356005362 Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents: 52
diff changeset
381 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
382 obj.data_offset = off
705356005362 Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents: 52
diff changeset
383 pass
24
a57ec6a76fe3 Describe steps to track dependencies
Thinker K.F. Li <thinker@codemud.net>
parents: 23
diff changeset
384 pass
23
fff40aabefab Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
385
24
a57ec6a76fe3 Describe steps to track dependencies
Thinker K.F. Li <thinker@codemud.net>
parents: 23
diff changeset
386
25
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
387 class _rel_offset_marker(_offset_marker):
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
388 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
389 rev_parents = list(parents)
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
390 rev_parents.reverse()
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
391
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
392 for parent in rev_parents:
29
b0cc5da28141 pass parents to travel info
Thinker K.F. Li <thinker@codemud.net>
parents: 28
diff changeset
393 try:
b0cc5da28141 pass parents to travel info
Thinker K.F. Li <thinker@codemud.net>
parents: 28
diff changeset
394 rel_marker_info = parent.rel_marker_info
b0cc5da28141 pass parents to travel info
Thinker K.F. Li <thinker@codemud.net>
parents: 28
diff changeset
395 except AttributeError:
b0cc5da28141 pass parents to travel info
Thinker K.F. Li <thinker@codemud.net>
parents: 28
diff changeset
396 try:
b0cc5da28141 pass parents to travel info
Thinker K.F. Li <thinker@codemud.net>
parents: 28
diff changeset
397 rel_marker_info = {}
b0cc5da28141 pass parents to travel info
Thinker K.F. Li <thinker@codemud.net>
parents: 28
diff changeset
398 parent.rel_marker_info = rel_marker_info
b0cc5da28141 pass parents to travel info
Thinker K.F. Li <thinker@codemud.net>
parents: 28
diff changeset
399 except AttributeError:
b0cc5da28141 pass parents to travel info
Thinker K.F. Li <thinker@codemud.net>
parents: 28
diff changeset
400 continue
b0cc5da28141 pass parents to travel info
Thinker K.F. Li <thinker@codemud.net>
parents: 28
diff changeset
401 pass
b0cc5da28141 pass parents to travel info
Thinker K.F. Li <thinker@codemud.net>
parents: 28
diff changeset
402 depons = rel_marker_info.setdefault(name_path, [])
b0cc5da28141 pass parents to travel info
Thinker K.F. Li <thinker@codemud.net>
parents: 28
diff changeset
403 depons.append(obj)
25
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
404 pass
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
405 pass
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
406
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
407 @staticmethod
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
408 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
409 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
410 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
411 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
412 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
413
25
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
414 rev_parents = list(parents)
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
415 rev_parents.reverse()
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
416
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
417 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
418 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
419 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
420 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
421 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
422
25
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
423 try:
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
424 rel_marker_info = parent.rel_marker_info
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
425 except:
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
426 continue
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
427 if name_path in rel_marker_info:
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
428 depons = rel_marker_info[name_path]
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
429 assert len(depons) == 1
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
430 depon = depons[0]
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
431 return depon
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
432 pass
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
433
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
434 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
435
705356005362 Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents: 52
diff changeset
436 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
437 obj.data_offset = off
705356005362 Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents: 52
diff changeset
438 pass
25
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
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
442 class _idx_marker(_uid_marker):
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
443 def parse(self, parent, data, off):
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
444 assert isinstance(self.back_type, dexfile.array)
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
445 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
446 for item in array.items:
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
447 item.data_uid = _uid_marker.uid_seq
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
448 _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
449 pass
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
450 return array
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
451
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
452 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
453 try:
0c0a659187c2 Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents: 29
diff changeset
454 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
455 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
456 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
457 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
458 pass
0c0a659187c2 Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents: 29
diff changeset
459 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
460 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
461 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
462 pass
25
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
463 pass
53
705356005362 Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents: 52
diff changeset
464
705356005362 Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents: 52
diff changeset
465 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
466 pass
25
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
467 pass
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
468
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
469
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
470 def _install_offset_marker(name_path):
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
471 obj, parent = _resolve_name_path(name_path)
53
705356005362 Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents: 52
diff changeset
472 while isinstance(obj, dexfile.ref):
705356005362 Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents: 52
diff changeset
473 name_path = obj.target_path
705356005362 Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents: 52
diff changeset
474 obj, parent = _resolve_name_path(name_path)
40
0c0a659187c2 Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents: 29
diff changeset
475 pass
25
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
476 marker = _offset_marker(obj, name_path)
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
477 name = name_path.split('.')[-1]
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
478 _dex_tree_set_child(parent, name, marker)
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
479 pass
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
480
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
481
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
482 def _install_rel_offset_marker(name_path):
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
483 obj, parent = _resolve_name_path(name_path)
53
705356005362 Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents: 52
diff changeset
484 while isinstance(obj, dexfile.ref):
705356005362 Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents: 52
diff changeset
485 name_path = obj.target_path
705356005362 Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents: 52
diff changeset
486 obj, parent = _resolve_name_path(name_path)
40
0c0a659187c2 Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents: 29
diff changeset
487 pass
25
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
488 marker = _rel_offset_marker(obj, name_path)
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
489 name = name_path.split('.')[-1]
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
490 _dex_tree_set_child(parent, name, marker)
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
491 pass
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
492
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
493
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
494 def _install_uid_marker(name_path):
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
495 obj, parent = _resolve_name_path(name_path)
53
705356005362 Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents: 52
diff changeset
496 while isinstance(obj, dexfile.ref):
705356005362 Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents: 52
diff changeset
497 name_path = obj.target_path
705356005362 Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents: 52
diff changeset
498 obj, parent = _resolve_name_path(name_path)
40
0c0a659187c2 Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents: 29
diff changeset
499 pass
25
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
500 marker = _uid_marker(obj, name_path)
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
501 name = name_path.split('.')[-1]
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
502 _dex_tree_set_child(parent, name, marker)
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
503 pass
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
504
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
505
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
506 def _install_idx_marker(name_path):
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
507 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
508 while isinstance(obj, dexfile.ref):
705356005362 Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents: 52
diff changeset
509 name_path = obj.target_path
705356005362 Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents: 52
diff changeset
510 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
511 pass
25
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
512 marker = _idx_marker(obj, name_path)
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
513 name = name_path.split('.')[-1]
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
514 _dex_tree_set_child(parent, name, marker)
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
515 pass
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
516
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
517
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
518 def _install_markers(all_dep_decls):
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
519 all_markers = set()
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
520
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
521 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
522 dep_type = dep[0]
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
523 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
524 name_path1 = dep[1]
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
525 if name_path1 not in all_markers:
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
526 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
527 _install_offset_marker(name_path1)
25
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
528 pass
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
529
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
530 name_path2 = dep[2]
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
531 if name_path2 not in all_markers:
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
532 all_markers.add(name_path2)
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
533 _install_rel_offset_marker(name_path2)
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
534 pass
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
535 pass
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
536 elif dep_type == dexfile.depend_off:
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
537 name_path = dep[1]
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
538 if name_path not in all_markers:
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
539 all_markers.add(name_path)
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
540 _install_offset_marker(name_path)
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
541 pass
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
542 pass
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
543 elif dep_type == dexfile.depend_idx:
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
544 name_path = dep[1]
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
545 if name_path not in all_markers:
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
546 all_markers.add(name_path)
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
547 _install_idx_marker(name_path)
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
548 pass
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
549 pass
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
550 else:
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
551 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
552 pass
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
553 pass
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
554
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
555
26
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
556 def _patch_dex_type_markers(all_dep_decls):
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
557 import itertools
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
558 marked_types = dict([(marker.back_type, name)
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
559 for name, marker in _all_dex_types().items()
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
560 if isinstance(marker, _marker)])
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
561
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
562 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
563 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
564 marked_type_refs = [(name_path, marked_types[attr])
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
565 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
566 if type(attr) == type and
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
567 issubclass(attr, dexfile.composite) and
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
568 attr in marked_types]
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
569
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
570 def patch_ref(name_path, depon_path):
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
571 depon, depon_parent = _resolve_name_path(depon_path)
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
572
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
573 path_elms = name_path.split('.')
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
574 parent_path = '.'.join(path_elms[:-1])
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
575 parent, grand = _resolve_name_path(parent_path)
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
576
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
577 if isinstance(grand, _nest_types):
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
578 if isinstance(grand, (dexfile.array, dexfile.cond)):
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
579 grand.child_type = depon
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
580 elif isinstance(grand, dexfile.switch):
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
581 key = eval(path_elms[-1])
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
582 grand.map[key] = depon
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
583 else:
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
584 raise RuntimeError, 'should not be here'
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
585 pass
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
586 else:
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
587 name = path_elms[-1]
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
588 setattr(parent, name, depon)
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
589 pass
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
590 pass
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
591
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
592 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
593 patch_ref(name_path, depon_path)
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
594 pass
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
595 pass
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
596
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
597
40
0c0a659187c2 Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents: 29
diff changeset
598 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
599 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
600 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
601 obj = parent
7f23def22a95 Resolve problem of false of cond objects when build associations
Thinker K.F. Li <thinker@codemud.net>
parents: 55
diff changeset
602 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
603 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
604 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
605 return ()
7f23def22a95 Resolve problem of false of cond objects when build associations
Thinker K.F. Li <thinker@codemud.net>
parents: 55
diff changeset
606 pass
7f23def22a95 Resolve problem of false of cond objects when build associations
Thinker K.F. Li <thinker@codemud.net>
parents: 55
diff changeset
607 return obj
7f23def22a95 Resolve problem of false of cond objects when build associations
Thinker K.F. Li <thinker@codemud.net>
parents: 55
diff changeset
608
40
0c0a659187c2 Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents: 29
diff changeset
609 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
610 _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
611 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
612 rev_parents = list(parents)
6e4cf6905729 Seeking parents in reversed order for _build_associations()
Thinker K.F. Li <thinker@codemud.net>
parents: 54
diff changeset
613 rev_parents.reverse()
6e4cf6905729 Seeking parents in reversed order for _build_associations()
Thinker K.F. Li <thinker@codemud.net>
parents: 54
diff changeset
614 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
615 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
616 break
0c0a659187c2 Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents: 29
diff changeset
617 pass
0c0a659187c2 Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents: 29
diff changeset
618
56
7f23def22a95 Resolve problem of false of cond objects when build associations
Thinker K.F. Li <thinker@codemud.net>
parents: 55
diff changeset
619 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
620 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
621 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
622 pass
0c0a659187c2 Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents: 29
diff changeset
623 pass
0c0a659187c2 Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents: 29
diff changeset
624 pass
0c0a659187c2 Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents: 29
diff changeset
625
0c0a659187c2 Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents: 29
diff changeset
626
43
5cea19126a11 Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents: 42
diff changeset
627 ## \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
628 #
5cea19126a11 Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents: 42
diff changeset
629 def _find_parent_of_clazz(clazz, parents):
5cea19126a11 Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents: 42
diff changeset
630 rev_parents = list(parents)
5cea19126a11 Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents: 42
diff changeset
631 rev_parents.reverse()
5cea19126a11 Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents: 42
diff changeset
632 for parent in rev_parents:
5cea19126a11 Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents: 42
diff changeset
633 if isinstance(parent, clazz):
5cea19126a11 Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents: 42
diff changeset
634 return parent
5cea19126a11 Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents: 42
diff changeset
635 pass
5cea19126a11 Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents: 42
diff changeset
636 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
637
5cea19126a11 Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents: 42
diff changeset
638
5cea19126a11 Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents: 42
diff changeset
639 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
640 idx = name_path.index('.')
5cea19126a11 Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents: 42
diff changeset
641 if idx >= 0:
5cea19126a11 Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents: 42
diff changeset
642 clazz = name_path[:idx]
5cea19126a11 Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents: 42
diff changeset
643 attr = name_path[idx + 1:]
5cea19126a11 Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents: 42
diff changeset
644 else:
5cea19126a11 Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents: 42
diff changeset
645 clazz = name_path
5cea19126a11 Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents: 42
diff changeset
646 attr = None
5cea19126a11 Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents: 42
diff changeset
647 pass
5cea19126a11 Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents: 42
diff changeset
648 return clazz, attr
5cea19126a11 Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents: 42
diff changeset
649
5cea19126a11 Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents: 42
diff changeset
650
5cea19126a11 Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents: 42
diff changeset
651 ## \brief Setup value of refs.
5cea19126a11 Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents: 42
diff changeset
652 #
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
653 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
654 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
655 _travel_dex_relocatable(root_obj):
43
5cea19126a11 Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents: 42
diff changeset
656 if not parents:
5cea19126a11 Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents: 42
diff changeset
657 continue
5cea19126a11 Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents: 42
diff changeset
658
5cea19126a11 Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents: 42
diff changeset
659 imm_parent = parents[-1]
5cea19126a11 Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents: 42
diff changeset
660 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
661 continue
43
5cea19126a11 Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents: 42
diff changeset
662
5cea19126a11 Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents: 42
diff changeset
663 clazz, pclazz = _resolve_name_path(name_path)
5cea19126a11 Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents: 42
diff changeset
664 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
665 clazz = clazz.back_type
43
5cea19126a11 Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents: 42
diff changeset
666 pass
5cea19126a11 Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents: 42
diff changeset
667
5cea19126a11 Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents: 42
diff changeset
668 if isinstance(clazz, dexfile.ref):
5cea19126a11 Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents: 42
diff changeset
669 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
670 if not attr_name:
5cea19126a11 Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents: 42
diff changeset
671 raise ValueError, \
5cea19126a11 Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents: 42
diff changeset
672 '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
673
5cea19126a11 Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents: 42
diff changeset
674 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
675
5cea19126a11 Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents: 42
diff changeset
676 value = clazz.get_value(parents)
5cea19126a11 Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents: 42
diff changeset
677 _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
678 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
679 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
680 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
681
c5cfc796af8b Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents: 40
diff changeset
682
88
bbe8d5cbe368 Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents: 61
diff changeset
683 ## \brief Link objects to their dependencies .
25
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
684 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
685 markers_info = {}
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
686 depon_src_map = {}
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
687 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
688 for tgt in depon[1:]:
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
689 markers_info[tgt] = {}
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
690 depon_src_map[depon] = dep_src
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
691 pass
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
692 pass
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
693
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
694 #
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
695 # Collect marked objects
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
696 #
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
697 for obj, parents, name_path in \
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
698 _travel_dex_relocatable(root_obj):
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
699 if name_path not in markers_info:
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
700 continue
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
701
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
702 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
703 while isinstance(marker, dexfile.ref):
705356005362 Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents: 52
diff changeset
704 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
705 pass
25
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
706 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
707 pass
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
708
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 # Link depend source to marked target
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
711 #
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
712 for obj, parents, name_path in \
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
713 _travel_dex_relocatable(root_obj):
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
714 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
715 continue
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
716
43
5cea19126a11 Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents: 42
diff changeset
717 imm_parent = parents[-1]
5cea19126a11 Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents: 42
diff changeset
718 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
719 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
720
25
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
721 dep = all_dep_decls[name_path]
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
722 dep_type = dep[0]
26
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
723 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
724 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
725 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
726 depon1 = markers_info[dep[1]][offset]
25
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 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
729 _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
730 elif dep_type == dexfile.depend_off:
25
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
731 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
732 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
733 name = name_path.split('.')[-1]
43
5cea19126a11 Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents: 42
diff changeset
734 _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
735 elif dep_type == dexfile.depend_idx:
25
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
736 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
737 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
738 name = name_path.split('.')[-1]
43
5cea19126a11 Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents: 42
diff changeset
739 _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
740 else:
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
741 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
742 pass
23
fff40aabefab Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
743 pass
fff40aabefab Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
744
24
a57ec6a76fe3 Describe steps to track dependencies
Thinker K.F. Li <thinker@codemud.net>
parents: 23
diff changeset
745
42
8ca4a6bc6b79 Extract to dex_deptracker.build_dependencies
Thinker K.F. Li <thinker@codemud.net>
parents: 41
diff changeset
746 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
747 _build_associations(dexroot)
8ca4a6bc6b79 Extract to dex_deptracker.build_dependencies
Thinker K.F. Li <thinker@codemud.net>
parents: 41
diff changeset
748 _build_refs(dexroot)
8ca4a6bc6b79 Extract to dex_deptracker.build_dependencies
Thinker K.F. Li <thinker@codemud.net>
parents: 41
diff changeset
749 _link_dependencies(dexroot, all_dep_decls)
8ca4a6bc6b79 Extract to dex_deptracker.build_dependencies
Thinker K.F. Li <thinker@codemud.net>
parents: 41
diff changeset
750 pass
8ca4a6bc6b79 Extract to dex_deptracker.build_dependencies
Thinker K.F. Li <thinker@codemud.net>
parents: 41
diff changeset
751
8ca4a6bc6b79 Extract to dex_deptracker.build_dependencies
Thinker K.F. Li <thinker@codemud.net>
parents: 41
diff changeset
752
47
cd4e3584ed7f Add update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents: 46
diff changeset
753 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
754 from itertools import chain
705356005362 Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents: 52
diff changeset
755
47
cd4e3584ed7f Add update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents: 46
diff changeset
756 def _build_sub_depon_dep(from_path, dep):
cd4e3584ed7f Add update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents: 46
diff changeset
757 depon1 = dep[1]
cd4e3584ed7f Add update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents: 46
diff changeset
758 sub = [(depon1, from_path)]
cd4e3584ed7f Add update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents: 46
diff changeset
759 dep_type = dep[0]
cd4e3584ed7f Add update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents: 46
diff changeset
760 if dep_type == dexfile.depend_off_rel:
cd4e3584ed7f Add update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents: 46
diff changeset
761 depon2 = dep[2]
cd4e3584ed7f Add update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents: 46
diff changeset
762 sub.append((depon2, from_path))
cd4e3584ed7f Add update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents: 46
diff changeset
763 pass
cd4e3584ed7f Add update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents: 46
diff changeset
764
cd4e3584ed7f Add update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents: 46
diff changeset
765 return sub
cd4e3584ed7f Add update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents: 46
diff changeset
766
cd4e3584ed7f Add update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents: 46
diff changeset
767 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
768 for from_path, dep in all_dep_decls.items()]
cd4e3584ed7f Add update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents: 46
diff changeset
769 depon_dep_lst = chain(*depon_dep_lsts)
cd4e3584ed7f Add update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents: 46
diff changeset
770 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
771 return depon_dep_map
47
cd4e3584ed7f Add update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents: 46
diff changeset
772
cd4e3584ed7f Add update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents: 46
diff changeset
773
cd4e3584ed7f Add update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents: 46
diff changeset
774 def update_offset(dexroot, all_dep_decls):
52
67aa8ca8fff3 untested dex_deptracker.update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents: 49
diff changeset
775 from dexfile import man_off
53
705356005362 Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents: 52
diff changeset
776
705356005362 Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents: 52
diff changeset
777 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
778 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
779
58
c2a4921ec83b Fix issue misbehavior for dependency when update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents: 57
diff changeset
780 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
781 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
782
53
705356005362 Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents: 52
diff changeset
783 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
784 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
785 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
786 return type_name
c2a4921ec83b Fix issue misbehavior for dependency when update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents: 57
diff changeset
787 pass
c2a4921ec83b Fix issue misbehavior for dependency when update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents: 57
diff changeset
788 return name_path
52
67aa8ca8fff3 untested dex_deptracker.update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents: 49
diff changeset
789
67aa8ca8fff3 untested dex_deptracker.update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents: 49
diff changeset
790 moff = man_off(0)
58
c2a4921ec83b Fix issue misbehavior for dependency when update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents: 57
diff changeset
791 queue = [(dexroot, 'DEXFile')]
47
cd4e3584ed7f Add update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents: 46
diff changeset
792
52
67aa8ca8fff3 untested dex_deptracker.update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents: 49
diff changeset
793 while queue:
58
c2a4921ec83b Fix issue misbehavior for dependency when update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents: 57
diff changeset
794 obj, name_path = queue.pop()
53
705356005362 Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents: 52
diff changeset
795
58
c2a4921ec83b Fix issue misbehavior for dependency when update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents: 57
diff changeset
796 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
797 if isinstance(obj_clazz, dexfile.depend):
58
c2a4921ec83b Fix issue misbehavior for dependency when update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents: 57
diff changeset
798 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
799 continue
870312703ba1 Fix issuge of crossing dexfile.ref when updating offset
Thinker K.F. Li <thinker@codemud.net>
parents: 53
diff changeset
800
53
705356005362 Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents: 52
diff changeset
801 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
802 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
803 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
804 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
805 try:
870312703ba1 Fix issuge of crossing dexfile.ref when updating offset
Thinker K.F. Li <thinker@codemud.net>
parents: 53
diff changeset
806 obj = obj[0]
870312703ba1 Fix issuge of crossing dexfile.ref when updating offset
Thinker K.F. Li <thinker@codemud.net>
parents: 53
diff changeset
807 except:
870312703ba1 Fix issuge of crossing dexfile.ref when updating offset
Thinker K.F. Li <thinker@codemud.net>
parents: 53
diff changeset
808 print name_path
870312703ba1 Fix issuge of crossing dexfile.ref when updating offset
Thinker K.F. Li <thinker@codemud.net>
parents: 53
diff changeset
809 raise
870312703ba1 Fix issuge of crossing dexfile.ref when updating offset
Thinker K.F. Li <thinker@codemud.net>
parents: 53
diff changeset
810 pass
53
705356005362 Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents: 52
diff changeset
811 marker.set_marker(obj, moff())
52
67aa8ca8fff3 untested dex_deptracker.update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents: 49
diff changeset
812 pass
53
705356005362 Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents: 52
diff changeset
813
705356005362 Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents: 52
diff changeset
814 if isinstance(obj, (tuple, list)):
58
c2a4921ec83b Fix issue misbehavior for dependency when update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents: 57
diff changeset
815 attrs = [(elt, make_path(elt, name_path, str(idx)))
53
705356005362 Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents: 52
diff changeset
816 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
817 attrs.reverse()
705356005362 Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents: 52
diff changeset
818 queue = queue + attrs
705356005362 Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents: 52
diff changeset
819 continue
52
67aa8ca8fff3 untested dex_deptracker.update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents: 49
diff changeset
820
67aa8ca8fff3 untested dex_deptracker.update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents: 49
diff changeset
821 if isinstance(obj, dexfile.ref):
47
cd4e3584ed7f Add update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents: 46
diff changeset
822 continue
53
705356005362 Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents: 52
diff changeset
823
52
67aa8ca8fff3 untested dex_deptracker.update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents: 49
diff changeset
824 if not isinstance(obj, dexfile.relocatable):
53
705356005362 Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents: 52
diff changeset
825 clazz, parent = _resolve_name_path(name_path)
705356005362 Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents: 52
diff changeset
826 moff(clazz.sizeof(obj))
52
67aa8ca8fff3 untested dex_deptracker.update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents: 49
diff changeset
827 continue
67aa8ca8fff3 untested dex_deptracker.update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents: 49
diff changeset
828
53
705356005362 Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents: 52
diff changeset
829 children = obj.children()
705356005362 Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents: 52
diff changeset
830 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
831 for child_name in children]
58
c2a4921ec83b Fix issue misbehavior for dependency when update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents: 57
diff changeset
832 attrs = [(attr, make_path(attr, name_path, attr_name))
53
705356005362 Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents: 52
diff changeset
833 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
834 attrs.reverse()
67aa8ca8fff3 untested dex_deptracker.update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents: 49
diff changeset
835 queue = queue + attrs
47
cd4e3584ed7f Add update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents: 46
diff changeset
836 pass
cd4e3584ed7f Add update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents: 46
diff changeset
837 pass
cd4e3584ed7f Add update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents: 46
diff changeset
838
cd4e3584ed7f Add update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents: 46
diff changeset
839
46
94e80f7a61b5 Add dex_deptracker.restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 43
diff changeset
840 ## \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
841 #
94e80f7a61b5 Add dex_deptracker.restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 43
diff changeset
842 def restore_dependencies(dexroot, all_dep_decls):
94e80f7a61b5 Add dex_deptracker.restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 43
diff changeset
843 for obj, parents, name_path in \
94e80f7a61b5 Add dex_deptracker.restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 43
diff changeset
844 _travel_dex_relocatable(dexroot):
94e80f7a61b5 Add dex_deptracker.restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 43
diff changeset
845 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
846 continue
94e80f7a61b5 Add dex_deptracker.restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 43
diff changeset
847
94e80f7a61b5 Add dex_deptracker.restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 43
diff changeset
848 imm_parent = parents[-1]
94e80f7a61b5 Add dex_deptracker.restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 43
diff changeset
849 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
850 continue
94e80f7a61b5 Add dex_deptracker.restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 43
diff changeset
851
94e80f7a61b5 Add dex_deptracker.restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 43
diff changeset
852 dep = all_dep_decls[name_path]
94e80f7a61b5 Add dex_deptracker.restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 43
diff changeset
853 dep_type = dep[0]
94e80f7a61b5 Add dex_deptracker.restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 43
diff changeset
854 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
855 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
856 depon = obj
3e34c7d33182 Fix and test restore_depedencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 58
diff changeset
857 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
858
94e80f7a61b5 Add dex_deptracker.restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 43
diff changeset
859 name = name_path.split('.')[-1]
61
3e34c7d33182 Fix and test restore_depedencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 58
diff changeset
860 _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
861 elif dep_type == dexfile.depend_off:
61
3e34c7d33182 Fix and test restore_depedencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 58
diff changeset
862 depon = obj
46
94e80f7a61b5 Add dex_deptracker.restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 43
diff changeset
863 name = name_path.split('.')[-1]
94e80f7a61b5 Add dex_deptracker.restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 43
diff changeset
864 _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
865 elif dep_type == dexfile.depend_idx:
61
3e34c7d33182 Fix and test restore_depedencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 58
diff changeset
866 depon = obj
46
94e80f7a61b5 Add dex_deptracker.restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 43
diff changeset
867 name = name_path.split('.')[-1]
94e80f7a61b5 Add dex_deptracker.restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 43
diff changeset
868 _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
869 else:
94e80f7a61b5 Add dex_deptracker.restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 43
diff changeset
870 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
871 pass
94e80f7a61b5 Add dex_deptracker.restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 43
diff changeset
872 pass
94e80f7a61b5 Add dex_deptracker.restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 43
diff changeset
873
94e80f7a61b5 Add dex_deptracker.restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 43
diff changeset
874
24
a57ec6a76fe3 Describe steps to track dependencies
Thinker K.F. Li <thinker@codemud.net>
parents: 23
diff changeset
875 def _sync_dependencies():
a57ec6a76fe3 Describe steps to track dependencies
Thinker K.F. Li <thinker@codemud.net>
parents: 23
diff changeset
876 pass
a57ec6a76fe3 Describe steps to track dependencies
Thinker K.F. Li <thinker@codemud.net>
parents: 23
diff changeset
877
a57ec6a76fe3 Describe steps to track dependencies
Thinker K.F. Li <thinker@codemud.net>
parents: 23
diff changeset
878
23
fff40aabefab Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
879 if __name__ == '__main__':
25
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
880 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
881
fff40aabefab Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
882 import pprint
fff40aabefab Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
883 print
fff40aabefab Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
884 print 'Dependencies'
25
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
885 pprint.pprint(collect_all_dep_decls())