annotate paraspace/dex_deptracker.py @ 56:7f23def22a95

Resolve problem of false of cond objects when build associations When a cond object is false, it should return an empty set for association. But, it was an error. It is fixed by checking status of cond objects.
author Thinker K.F. Li <thinker@codemud.net>
date Fri, 24 Jun 2011 10:56:33 +0800
parents 6e4cf6905729
children fa8fe7d714b9
rev   line source
23
fff40aabefab Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1 from paraspace import dexfile
fff40aabefab Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
2
fff40aabefab Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
3
fff40aabefab Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
4 _nest_types = (dexfile.array,
fff40aabefab Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
5 dexfile.cond,
fff40aabefab Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
6 dexfile.switch)
fff40aabefab Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
7
fff40aabefab Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
8
25
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
9 def _resolve_name_path(name_path):
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
10 obj = dexfile
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
11 parent = None
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
12 for name in name_path.split('.'):
53
705356005362 Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents: 52
diff changeset
13 while isinstance(obj, _marker):
705356005362 Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents: 52
diff changeset
14 obj = obj.back_type
705356005362 Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents: 52
diff changeset
15 pass
705356005362 Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents: 52
diff changeset
16
25
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
17 if isinstance(parent, dexfile.array) and obj == list:
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
18 # array.items.<num>
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
19 obj = parent.child_type
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
20 parent = list
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
21 continue
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
22
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
23 parent = obj
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
24 if isinstance(parent, dexfile.switch):
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
25 key = eval(name)
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
26 obj = parent.map[key]
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
27 continue
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
28
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
29 if isinstance(parent, dexfile.array) and name == 'items':
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
30 obj = list
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
31 continue
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
32
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
33 if isinstance(parent, dexfile.cond) and name == 'value':
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
34 obj = obj.child_type
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
35 continue
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
36
54
870312703ba1 Fix issuge of crossing dexfile.ref when updating offset
Thinker K.F. Li <thinker@codemud.net>
parents: 53
diff changeset
37 try:
870312703ba1 Fix issuge of crossing dexfile.ref when updating offset
Thinker K.F. Li <thinker@codemud.net>
parents: 53
diff changeset
38 obj = getattr(parent, name)
870312703ba1 Fix issuge of crossing dexfile.ref when updating offset
Thinker K.F. Li <thinker@codemud.net>
parents: 53
diff changeset
39 except:
870312703ba1 Fix issuge of crossing dexfile.ref when updating offset
Thinker K.F. Li <thinker@codemud.net>
parents: 53
diff changeset
40 print obj, parent, name_path
870312703ba1 Fix issuge of crossing dexfile.ref when updating offset
Thinker K.F. Li <thinker@codemud.net>
parents: 53
diff changeset
41 raise
25
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
42 pass
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
43 return obj, parent
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
44
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
45
26
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
46 def _travel_dex_type(clazz, name_path):
27
15cb829ac442 travel_dex_type() recoganizes _dex_type correctly
Thinker K.F. Li <thinker@codemud.net>
parents: 26
diff changeset
47 def travelable(attr, attr_name):
15cb829ac442 travel_dex_type() recoganizes _dex_type correctly
Thinker K.F. Li <thinker@codemud.net>
parents: 26
diff changeset
48 if attr_name.startswith('_'):
15cb829ac442 travel_dex_type() recoganizes _dex_type correctly
Thinker K.F. Li <thinker@codemud.net>
parents: 26
diff changeset
49 return False
15cb829ac442 travel_dex_type() recoganizes _dex_type correctly
Thinker K.F. Li <thinker@codemud.net>
parents: 26
diff changeset
50 if callable(attr) and ((not isinstance(attr, dexfile._dex_type)) and
15cb829ac442 travel_dex_type() recoganizes _dex_type correctly
Thinker K.F. Li <thinker@codemud.net>
parents: 26
diff changeset
51 (not (type(attr) == type and
15cb829ac442 travel_dex_type() recoganizes _dex_type correctly
Thinker K.F. Li <thinker@codemud.net>
parents: 26
diff changeset
52 issubclass(attr, dexfile._dex_type)))):
15cb829ac442 travel_dex_type() recoganizes _dex_type correctly
Thinker K.F. Li <thinker@codemud.net>
parents: 26
diff changeset
53 return False
15cb829ac442 travel_dex_type() recoganizes _dex_type correctly
Thinker K.F. Li <thinker@codemud.net>
parents: 26
diff changeset
54 return True
26
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
55
28
5ce7ca1187b3 Pass throught markers for dex types
Thinker K.F. Li <thinker@codemud.net>
parents: 27
diff changeset
56 #
5ce7ca1187b3 Pass throught markers for dex types
Thinker K.F. Li <thinker@codemud.net>
parents: 27
diff changeset
57 # pass throught markers
5ce7ca1187b3 Pass throught markers for dex types
Thinker K.F. Li <thinker@codemud.net>
parents: 27
diff changeset
58 #
5ce7ca1187b3 Pass throught markers for dex types
Thinker K.F. Li <thinker@codemud.net>
parents: 27
diff changeset
59 while isinstance(clazz, _marker):
5ce7ca1187b3 Pass throught markers for dex types
Thinker K.F. Li <thinker@codemud.net>
parents: 27
diff changeset
60 clazz = clazz.back_type
5ce7ca1187b3 Pass throught markers for dex types
Thinker K.F. Li <thinker@codemud.net>
parents: 27
diff changeset
61 pass
5ce7ca1187b3 Pass throught markers for dex types
Thinker K.F. Li <thinker@codemud.net>
parents: 27
diff changeset
62
26
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
63 travel_queue = [(getattr(clazz, attr_name), name_path + '.' + attr_name)
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
64 for attr_name in dir(clazz)
27
15cb829ac442 travel_dex_type() recoganizes _dex_type correctly
Thinker K.F. Li <thinker@codemud.net>
parents: 26
diff changeset
65 if travelable(getattr(clazz, attr_name), attr_name)]
26
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
66 while travel_queue:
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
67 attr, name_path = travel_queue.pop(0)
27
15cb829ac442 travel_dex_type() recoganizes _dex_type correctly
Thinker K.F. Li <thinker@codemud.net>
parents: 26
diff changeset
68 if isinstance(attr, _marker):
26
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
69 #
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
70 # transparent. Enqueue back_type with the same name again.
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
71 #
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
72 child = attr.back_type
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
73 travel_queue.append((child, name_path))
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
74 continue
28
5ce7ca1187b3 Pass throught markers for dex types
Thinker K.F. Li <thinker@codemud.net>
parents: 27
diff changeset
75
5ce7ca1187b3 Pass throught markers for dex types
Thinker K.F. Li <thinker@codemud.net>
parents: 27
diff changeset
76 yield attr, name_path
26
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
77
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
78 if isinstance(attr, _nest_types):
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
79 if isinstance(attr, dexfile.array):
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
80 child_name = name_path + '.items.*'
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
81 child = attr.child_type
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
82 travel_queue.append((child, child_name))
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
83 elif isinstance(attr, dexfile.cond):
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
84 child_name = name_path + '.value'
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
85 child = attr.child_type
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
86 travel_queue.append((child, child_name))
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
87 elif isinstance(attr, dexfile.switch):
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
88 for key in attr.map.keys():
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
89 child_name = name_path + '.' + repr(key)
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
90 child = attr.map[key]
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
91 travel_queue.append((child, child_name))
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
92 pass
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
93 pass
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
94 pass
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
95 pass
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
96 pass
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
97
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
98
25
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
99 def _find_dep_decls_from_clazz(name_path, clazz, dex_types):
26
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
100 # XXX: implements the loop with _travel_dex_type()
25
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
101 dep_decls = {}
23
fff40aabefab Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
102
fff40aabefab Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
103 for attr in dir(clazz):
fff40aabefab Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
104 namelist = [name_path, attr]
fff40aabefab Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
105
25
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
106 #
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
107 # Find dependency
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
108 #
23
fff40aabefab Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
109 digged_flag = False
fff40aabefab Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
110
fff40aabefab Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
111 value_type = getattr(clazz, attr)
fff40aabefab Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
112 while isinstance(value_type, _nest_types) or \
fff40aabefab Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
113 (type(value_type) == type and
fff40aabefab Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
114 issubclass(value_type, _nest_types)):
fff40aabefab Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
115 if isinstance(value_type, dexfile.array):
fff40aabefab Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
116 namelist.append('items')
25
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
117 namelist.append('*')
23
fff40aabefab Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
118 value_type = value_type.child_type
fff40aabefab Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
119 elif isinstance(value_type, dexfile.cond):
fff40aabefab Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
120 namelist.append('value')
fff40aabefab Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
121 value_type = value_type.child_type
fff40aabefab Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
122 elif isinstance(value_type, dexfile.switch):
fff40aabefab Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
123 for key, child_type in value_type.map.items():
fff40aabefab Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
124 if child_type in dex_types.values():
fff40aabefab Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
125 continue
fff40aabefab Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
126 child_name_path = '.'.join(namelist) + '.' + repr(key)
25
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
127 child_dep_decls = \
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
128 _find_dep_decls_from_clazz(child_name_path,
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
129 child_type,
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
130 dex_types)
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
131
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
132 if child_dep_decls:
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
133 raise ValueError, \
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
134 'can not depend on elements of a switch (%s)' \
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
135 % (child_name_path)
23
fff40aabefab Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
136 pass
fff40aabefab Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
137 digged_flag = True
fff40aabefab Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
138 break
fff40aabefab Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
139 pass
fff40aabefab Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
140
fff40aabefab Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
141 if digged_flag:
fff40aabefab Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
142 continue
25
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
143
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
144 #
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
145 # Record dependency
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
146 #
23
fff40aabefab Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
147 if isinstance(value_type, dexfile.depend):
fff40aabefab Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
148 from_name = '.'.join(namelist)
fff40aabefab Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
149 if isinstance(value_type, dexfile.depend_off):
fff40aabefab Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
150 depend_name = value_type.depend_on
25
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
151 dep_decls[from_name] = (dexfile.depend_off, depend_name)
23
fff40aabefab Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
152 elif isinstance(value_type, dexfile.depend_off_rel):
fff40aabefab Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
153 depend_name = value_type.depend_on
fff40aabefab Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
154 relative_to = value_type.relative_to
25
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
155 dep_decls[from_name] = (dexfile.depend_off_rel,
23
fff40aabefab Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
156 depend_name,
fff40aabefab Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
157 relative_to)
fff40aabefab Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
158 elif isinstance(value_type, dexfile.depend_idx):
fff40aabefab Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
159 depend_name = value_type.depend_on
25
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
160 dep_decls[from_name] = (dexfile.depend_idx, depend_name)
23
fff40aabefab Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
161 pass
fff40aabefab Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
162 pass
fff40aabefab Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
163 pass
25
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
164 return dep_decls
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
165
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
166
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
167 def _dex_tree_get_child(obj, child_name):
40
0c0a659187c2 Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents: 29
diff changeset
168 child_parts = child_name.split('.')
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)
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
234 if isinstance(child_obj, dexfile.composite):
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
235 child_path = child_obj.__class__.__name__
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
236 else:
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
237 child_path = obj_name + '.' + child_name
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
238 pass
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
239 return (child_obj, child_parents, child_path)
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
240
25
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
241 while stk:
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
242 obj, parents, obj_name = stk.pop(0)
47
cd4e3584ed7f Add update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents: 46
diff changeset
243 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
244 continue
25
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
245 yield (obj, parents, obj_name)
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
246
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
247 if isinstance(obj, list):
29
b0cc5da28141 pass parents to travel info
Thinker K.F. Li <thinker@codemud.net>
parents: 28
diff changeset
248 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
249 for idx in range(len(obj))]
25
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
250 stk.extend(children)
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
251 continue
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
252
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
253 if not isinstance(obj, dexfile.relocatable):
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
29
b0cc5da28141 pass parents to travel info
Thinker K.F. Li <thinker@codemud.net>
parents: 28
diff changeset
256 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
257 for child_name in obj.children()]
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
258 stk.extend(children)
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
259 pass
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
260 pass
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
261
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
262
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
263 def _all_dex_types():
23
fff40aabefab Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
264 dex_types = dict([(name, value)
fff40aabefab Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
265 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
266 if name.startswith('_DEX_')])
fff40aabefab Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
267 dex_types['DEXFile'] = dexfile.DEXFile
fff40aabefab Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
268 return dex_types
fff40aabefab Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
269
fff40aabefab Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
270
53
705356005362 Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents: 52
diff changeset
271 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
272 def check_marker(value, name):
705356005362 Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents: 52
diff changeset
273 while isinstance(value, _marker):
705356005362 Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents: 52
diff changeset
274 value = value.back_type
705356005362 Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents: 52
diff changeset
275 pass
705356005362 Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents: 52
diff changeset
276 return value, name
705356005362 Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents: 52
diff changeset
277
705356005362 Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents: 52
diff changeset
278 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
279 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
280 if name.startswith('_DEX_')])
705356005362 Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents: 52
diff changeset
281 dex_types[dexfile.DEXFile] = 'DEXFile'
705356005362 Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents: 52
diff changeset
282 return dex_types
705356005362 Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents: 52
diff changeset
283
705356005362 Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents: 52
diff changeset
284
25
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
285 def collect_all_dep_decls():
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
286 dex_types = _all_dex_types()
23
fff40aabefab Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
287
25
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
288 all_dep_decls = {}
23
fff40aabefab Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
289 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
290 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
291 all_dep_decls.update(dep_decls)
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
292 pass
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
293
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
294 return all_dep_decls
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
295
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
296
52
67aa8ca8fff3 untested dex_deptracker.update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents: 49
diff changeset
297 class _marker(dexfile.null_relocatable):
26
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
298 back_type = None
53
705356005362 Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents: 52
diff changeset
299
705356005362 Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents: 52
diff changeset
300 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
301 raise NotImplementedError, \
705356005362 Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents: 52
diff changeset
302 'The marker does not implement set_marker()'
26
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
303 pass
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
304
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
305 class _uid_marker(_marker):
25
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
306 uid_seq = 0
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
307
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
308 def __init__(self, back_type, name_path):
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
309 self.back_type = back_type
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
310 self.name_path = name_path
23
fff40aabefab Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
311 pass
fff40aabefab Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
312
25
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
313 def parse(self, parent, data, off):
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
314 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
315 try:
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
316 value.data_uid = _uid_marker.uid_seq
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
317 except AttributeError:
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
318 raise AttributeError, \
53
705356005362 Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents: 52
diff changeset
319 '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
320 (self.name_path, repr(value))
25
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
321 _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
322
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
323 return value
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
324
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
325 def sizeof(self, value):
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
326 sz = self.back_type.sizeof(value)
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
327 return sz
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 compute_size(self, back_obj):
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
330 self.back_type.compute_size(back_obj)
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
331 pass
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 to_str(self, back_obj):
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
334 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
335
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
336 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
337 try:
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
338 id_item_map = markers_info[name_path]
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
339 except KeyError:
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
340 id_item_map = {}
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
341 markers_info[name_path] = id_item_map
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
342 pass
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
343 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
344 id_item_map[obj.data_uid] = obj
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
345 pass
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
346
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
347 def __getattr__(self, name):
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
348 return getattr(self.back_type, name)
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
349
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
350 def __call__(self, *args, **kws):
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
351 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
352
705356005362 Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents: 52
diff changeset
353 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
354 pass
25
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
355 pass
23
fff40aabefab Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
356
fff40aabefab Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
357
25
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
358 class _offset_marker(_uid_marker):
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
359 def parse(self, parent, data, off):
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
360 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
361
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
362 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
363 value.data_offset = off
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
364 return value
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 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
367 try:
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
368 id_item_map = markers_info[name_path]
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
369 except KeyError:
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
370 id_item_map = {}
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
371 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
372 pass
25
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
373 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
374 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
375 pass
53
705356005362 Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents: 52
diff changeset
376
705356005362 Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents: 52
diff changeset
377 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
378 obj.data_offset = off
705356005362 Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents: 52
diff changeset
379 pass
24
a57ec6a76fe3 Describe steps to track dependencies
Thinker K.F. Li <thinker@codemud.net>
parents: 23
diff changeset
380 pass
23
fff40aabefab Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
381
24
a57ec6a76fe3 Describe steps to track dependencies
Thinker K.F. Li <thinker@codemud.net>
parents: 23
diff changeset
382
25
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
383 class _rel_offset_marker(_offset_marker):
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
384 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
385 rev_parents = list(parents)
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
386 rev_parents.reverse()
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
387
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
388 for parent in rev_parents:
29
b0cc5da28141 pass parents to travel info
Thinker K.F. Li <thinker@codemud.net>
parents: 28
diff changeset
389 try:
b0cc5da28141 pass parents to travel info
Thinker K.F. Li <thinker@codemud.net>
parents: 28
diff changeset
390 rel_marker_info = parent.rel_marker_info
b0cc5da28141 pass parents to travel info
Thinker K.F. Li <thinker@codemud.net>
parents: 28
diff changeset
391 except AttributeError:
b0cc5da28141 pass parents to travel info
Thinker K.F. Li <thinker@codemud.net>
parents: 28
diff changeset
392 try:
b0cc5da28141 pass parents to travel info
Thinker K.F. Li <thinker@codemud.net>
parents: 28
diff changeset
393 rel_marker_info = {}
b0cc5da28141 pass parents to travel info
Thinker K.F. Li <thinker@codemud.net>
parents: 28
diff changeset
394 parent.rel_marker_info = 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 continue
b0cc5da28141 pass parents to travel info
Thinker K.F. Li <thinker@codemud.net>
parents: 28
diff changeset
397 pass
b0cc5da28141 pass parents to travel info
Thinker K.F. Li <thinker@codemud.net>
parents: 28
diff changeset
398 depons = rel_marker_info.setdefault(name_path, [])
b0cc5da28141 pass parents to travel info
Thinker K.F. Li <thinker@codemud.net>
parents: 28
diff changeset
399 depons.append(obj)
25
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
400 pass
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
401 pass
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
402
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
403 @staticmethod
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
404 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
405 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
406 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
407 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
408 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
409
25
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
410 rev_parents = list(parents)
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
411 rev_parents.reverse()
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
412
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
413 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
414 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
415 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
416 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
417 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
418
25
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
419 try:
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
420 rel_marker_info = parent.rel_marker_info
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
421 except:
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
422 continue
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
423 if name_path in rel_marker_info:
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
424 depons = rel_marker_info[name_path]
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
425 assert len(depons) == 1
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
426 depon = depons[0]
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
427 return depon
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
428 pass
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
429
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
430 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
431
705356005362 Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents: 52
diff changeset
432 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
433 obj.data_offset = off
705356005362 Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents: 52
diff changeset
434 pass
25
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
435 pass
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
436
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
437
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
438 class _idx_marker(_uid_marker):
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
439 def parse(self, parent, data, off):
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
440 assert isinstance(self.back_type, dexfile.array)
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
441 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
442 for item in array.items:
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
443 item.data_uid = _uid_marker.uid_seq
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
444 _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
445 pass
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
446 return array
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
447
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
448 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
449 try:
0c0a659187c2 Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents: 29
diff changeset
450 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
451 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
452 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
453 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
454 pass
0c0a659187c2 Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents: 29
diff changeset
455 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
456 id_item_map[idx] = item
0c0a659187c2 Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents: 29
diff changeset
457 pass
25
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
458 pass
53
705356005362 Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents: 52
diff changeset
459
705356005362 Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents: 52
diff changeset
460 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
461 pass
25
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
462 pass
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
463
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
464
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
465 def _install_offset_marker(name_path):
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
466 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
467 while isinstance(obj, dexfile.ref):
705356005362 Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents: 52
diff changeset
468 name_path = obj.target_path
705356005362 Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents: 52
diff changeset
469 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
470 pass
25
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
471 marker = _offset_marker(obj, name_path)
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
472 name = name_path.split('.')[-1]
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
473 _dex_tree_set_child(parent, name, marker)
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
474 pass
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
475
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
476
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
477 def _install_rel_offset_marker(name_path):
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
478 obj, parent = _resolve_name_path(name_path)
53
705356005362 Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents: 52
diff changeset
479 while isinstance(obj, dexfile.ref):
705356005362 Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents: 52
diff changeset
480 name_path = obj.target_path
705356005362 Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents: 52
diff changeset
481 obj, parent = _resolve_name_path(name_path)
40
0c0a659187c2 Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents: 29
diff changeset
482 pass
25
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
483 marker = _rel_offset_marker(obj, name_path)
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
484 name = name_path.split('.')[-1]
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
485 _dex_tree_set_child(parent, name, marker)
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
486 pass
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
487
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
488
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
489 def _install_uid_marker(name_path):
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
490 obj, parent = _resolve_name_path(name_path)
53
705356005362 Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents: 52
diff changeset
491 while isinstance(obj, dexfile.ref):
705356005362 Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents: 52
diff changeset
492 name_path = obj.target_path
705356005362 Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents: 52
diff changeset
493 obj, parent = _resolve_name_path(name_path)
40
0c0a659187c2 Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents: 29
diff changeset
494 pass
25
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
495 marker = _uid_marker(obj, name_path)
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
496 name = name_path.split('.')[-1]
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
497 _dex_tree_set_child(parent, name, marker)
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
498 pass
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
499
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
500
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
501 def _install_idx_marker(name_path):
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
502 obj, parent = _resolve_name_path(name_path)
53
705356005362 Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents: 52
diff changeset
503 while isinstance(obj, dexfile.ref):
705356005362 Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents: 52
diff changeset
504 name_path = obj.target_path
705356005362 Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents: 52
diff changeset
505 obj, parent = _resolve_name_path(name_path)
40
0c0a659187c2 Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents: 29
diff changeset
506 pass
25
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
507 marker = _idx_marker(obj, name_path)
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
508 name = name_path.split('.')[-1]
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
509 _dex_tree_set_child(parent, name, marker)
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
510 pass
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
511
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
512
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
513 def _install_markers(all_dep_decls):
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
514 all_markers = set()
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
515
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
516 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
517 dep_type = dep[0]
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
518 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
519 name_path1 = dep[1]
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
520 if name_path1 not in all_markers:
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
521 all_markers.add(name_path1)
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
522 _install_rel_offset_marker(name_path1)
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
523 pass
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
524
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
525 name_path2 = dep[2]
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
526 if name_path2 not in all_markers:
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
527 all_markers.add(name_path2)
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
528 _install_rel_offset_marker(name_path2)
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
529 pass
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
530 pass
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
531 elif dep_type == dexfile.depend_off:
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
532 name_path = dep[1]
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
533 if name_path not in all_markers:
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
534 all_markers.add(name_path)
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
535 _install_offset_marker(name_path)
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
536 pass
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
537 pass
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
538 elif dep_type == dexfile.depend_idx:
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
539 name_path = dep[1]
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
540 if name_path not in all_markers:
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
541 all_markers.add(name_path)
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
542 _install_idx_marker(name_path)
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
543 pass
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
544 pass
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
545 else:
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
546 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
547 pass
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
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
550
26
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
551 def _patch_dex_type_markers(all_dep_decls):
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
552 import itertools
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
553 marked_types = dict([(marker.back_type, name)
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
554 for name, marker in _all_dex_types().items()
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
555 if isinstance(marker, _marker)])
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
556
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
557 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
558 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
559 marked_type_refs = [(name_path, marked_types[attr])
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
560 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
561 if type(attr) == type and
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
562 issubclass(attr, dexfile.composite) and
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
563 attr in marked_types]
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
564
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
565 def patch_ref(name_path, depon_path):
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
566 depon, depon_parent = _resolve_name_path(depon_path)
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
567
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
568 path_elms = name_path.split('.')
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
569 parent_path = '.'.join(path_elms[:-1])
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
570 parent, grand = _resolve_name_path(parent_path)
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
571
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
572 if isinstance(grand, _nest_types):
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
573 if isinstance(grand, (dexfile.array, dexfile.cond)):
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
574 grand.child_type = depon
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
575 elif isinstance(grand, dexfile.switch):
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
576 key = eval(path_elms[-1])
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
577 grand.map[key] = depon
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
578 else:
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
579 raise RuntimeError, 'should not be here'
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
580 pass
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
581 else:
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
582 name = path_elms[-1]
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
583 setattr(parent, name, depon)
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
584 pass
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
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
587 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
588 patch_ref(name_path, depon_path)
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
40
0c0a659187c2 Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents: 29
diff changeset
593 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
594 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
595 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
596 obj = parent
7f23def22a95 Resolve problem of false of cond objects when build associations
Thinker K.F. Li <thinker@codemud.net>
parents: 55
diff changeset
597 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
598 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
599 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
600 return ()
7f23def22a95 Resolve problem of false of cond objects when build associations
Thinker K.F. Li <thinker@codemud.net>
parents: 55
diff changeset
601 pass
7f23def22a95 Resolve problem of false of cond objects when build associations
Thinker K.F. Li <thinker@codemud.net>
parents: 55
diff changeset
602 return obj
7f23def22a95 Resolve problem of false of cond objects when build associations
Thinker K.F. Li <thinker@codemud.net>
parents: 55
diff changeset
603
40
0c0a659187c2 Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents: 29
diff changeset
604 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
605 _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
606 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
607 rev_parents = list(parents)
6e4cf6905729 Seeking parents in reversed order for _build_associations()
Thinker K.F. Li <thinker@codemud.net>
parents: 54
diff changeset
608 rev_parents.reverse()
6e4cf6905729 Seeking parents in reversed order for _build_associations()
Thinker K.F. Li <thinker@codemud.net>
parents: 54
diff changeset
609 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
610 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
611 break
0c0a659187c2 Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents: 29
diff changeset
612 pass
0c0a659187c2 Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents: 29
diff changeset
613
56
7f23def22a95 Resolve problem of false of cond objects when build associations
Thinker K.F. Li <thinker@codemud.net>
parents: 55
diff changeset
614 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
615 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
616 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
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 pass
0c0a659187c2 Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents: 29
diff changeset
619 pass
0c0a659187c2 Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents: 29
diff changeset
620
0c0a659187c2 Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents: 29
diff changeset
621
43
5cea19126a11 Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents: 42
diff changeset
622 ## \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
623 #
5cea19126a11 Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents: 42
diff changeset
624 def _find_parent_of_clazz(clazz, parents):
5cea19126a11 Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents: 42
diff changeset
625 rev_parents = list(parents)
5cea19126a11 Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents: 42
diff changeset
626 rev_parents.reverse()
5cea19126a11 Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents: 42
diff changeset
627 for parent in rev_parents:
5cea19126a11 Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents: 42
diff changeset
628 if isinstance(parent, clazz):
5cea19126a11 Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents: 42
diff changeset
629 return parent
5cea19126a11 Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents: 42
diff changeset
630 pass
5cea19126a11 Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents: 42
diff changeset
631 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
632
5cea19126a11 Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents: 42
diff changeset
633
5cea19126a11 Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents: 42
diff changeset
634 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
635 idx = name_path.index('.')
5cea19126a11 Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents: 42
diff changeset
636 if idx >= 0:
5cea19126a11 Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents: 42
diff changeset
637 clazz = name_path[:idx]
5cea19126a11 Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents: 42
diff changeset
638 attr = name_path[idx + 1:]
5cea19126a11 Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents: 42
diff changeset
639 else:
5cea19126a11 Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents: 42
diff changeset
640 clazz = name_path
5cea19126a11 Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents: 42
diff changeset
641 attr = None
5cea19126a11 Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents: 42
diff changeset
642 pass
5cea19126a11 Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents: 42
diff changeset
643 return clazz, attr
5cea19126a11 Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents: 42
diff changeset
644
5cea19126a11 Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents: 42
diff changeset
645
5cea19126a11 Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents: 42
diff changeset
646 ## \brief Setup value of refs.
5cea19126a11 Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents: 42
diff changeset
647 #
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
648 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
649 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
650 _travel_dex_relocatable(root_obj):
43
5cea19126a11 Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents: 42
diff changeset
651 if not parents:
5cea19126a11 Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents: 42
diff changeset
652 continue
5cea19126a11 Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents: 42
diff changeset
653
5cea19126a11 Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents: 42
diff changeset
654 imm_parent = parents[-1]
5cea19126a11 Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents: 42
diff changeset
655 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
656 continue
43
5cea19126a11 Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents: 42
diff changeset
657
5cea19126a11 Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents: 42
diff changeset
658 clazz, pclazz = _resolve_name_path(name_path)
5cea19126a11 Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents: 42
diff changeset
659 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
660 clazz = clazz.back_type
43
5cea19126a11 Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents: 42
diff changeset
661 pass
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 if isinstance(clazz, dexfile.ref):
5cea19126a11 Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents: 42
diff changeset
664 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
665 if not attr_name:
5cea19126a11 Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents: 42
diff changeset
666 raise ValueError, \
5cea19126a11 Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents: 42
diff changeset
667 '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
668
5cea19126a11 Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents: 42
diff changeset
669 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
670
5cea19126a11 Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents: 42
diff changeset
671 value = clazz.get_value(parents)
5cea19126a11 Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents: 42
diff changeset
672 _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
673 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
674 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
675 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
676
c5cfc796af8b Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents: 40
diff changeset
677
25
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
678 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
679 markers_info = {}
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
680 depon_src_map = {}
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
681 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
682 for tgt in depon[1:]:
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
683 markers_info[tgt] = {}
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
684 depon_src_map[depon] = dep_src
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
685 pass
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
686 pass
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
687
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
688 #
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
689 # Collect marked objects
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
690 #
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
691 for obj, parents, name_path in \
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
692 _travel_dex_relocatable(root_obj):
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
693 if name_path not in markers_info:
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
694 continue
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
695
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
696 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
697 while isinstance(marker, dexfile.ref):
705356005362 Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents: 52
diff changeset
698 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
699 pass
25
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
700 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
701 pass
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
702
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
703 #
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
704 # Link depend source to marked target
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
705 #
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
706 for obj, parents, name_path in \
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
707 _travel_dex_relocatable(root_obj):
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
708 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
709 continue
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
710
43
5cea19126a11 Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents: 42
diff changeset
711 imm_parent = parents[-1]
5cea19126a11 Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents: 42
diff changeset
712 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
713 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
714
25
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
715 dep = all_dep_decls[name_path]
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
716 dep_type = dep[0]
26
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
717 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
718 depon1 = _rel_offset_marker.find_depon(dep[1], parents)
b0cc5da28141 pass parents to travel info
Thinker K.F. Li <thinker@codemud.net>
parents: 28
diff changeset
719 depon2 = _rel_offset_marker.find_depon(dep[2], parents)
25
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
720
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
721 name = name_path.split('.')[-1]
43
5cea19126a11 Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents: 42
diff changeset
722 _dex_tree_set_child(imm_parent, name, (depon1, depon2))
26
b30a0d29a62f Debugging _travel_dex_type
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
723 elif dep_type == dexfile.depend_off:
25
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
724 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
725 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
726 name = name_path.split('.')[-1]
43
5cea19126a11 Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents: 42
diff changeset
727 _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
728 elif dep_type == dexfile.depend_idx:
25
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
729 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
730 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
731 name = name_path.split('.')[-1]
43
5cea19126a11 Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents: 42
diff changeset
732 _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
733 else:
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
734 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
735 pass
23
fff40aabefab Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
736 pass
fff40aabefab Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
737
24
a57ec6a76fe3 Describe steps to track dependencies
Thinker K.F. Li <thinker@codemud.net>
parents: 23
diff changeset
738
42
8ca4a6bc6b79 Extract to dex_deptracker.build_dependencies
Thinker K.F. Li <thinker@codemud.net>
parents: 41
diff changeset
739 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
740 _build_associations(dexroot)
8ca4a6bc6b79 Extract to dex_deptracker.build_dependencies
Thinker K.F. Li <thinker@codemud.net>
parents: 41
diff changeset
741 _build_refs(dexroot)
8ca4a6bc6b79 Extract to dex_deptracker.build_dependencies
Thinker K.F. Li <thinker@codemud.net>
parents: 41
diff changeset
742 _link_dependencies(dexroot, all_dep_decls)
8ca4a6bc6b79 Extract to dex_deptracker.build_dependencies
Thinker K.F. Li <thinker@codemud.net>
parents: 41
diff changeset
743 pass
8ca4a6bc6b79 Extract to dex_deptracker.build_dependencies
Thinker K.F. Li <thinker@codemud.net>
parents: 41
diff changeset
744
8ca4a6bc6b79 Extract to dex_deptracker.build_dependencies
Thinker K.F. Li <thinker@codemud.net>
parents: 41
diff changeset
745
47
cd4e3584ed7f Add update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents: 46
diff changeset
746 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
747 from itertools import chain
705356005362 Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents: 52
diff changeset
748
47
cd4e3584ed7f Add update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents: 46
diff changeset
749 def _build_sub_depon_dep(from_path, dep):
cd4e3584ed7f Add update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents: 46
diff changeset
750 depon1 = dep[1]
cd4e3584ed7f Add update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents: 46
diff changeset
751 sub = [(depon1, from_path)]
cd4e3584ed7f Add update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents: 46
diff changeset
752 dep_type = dep[0]
cd4e3584ed7f Add update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents: 46
diff changeset
753 if dep_type == dexfile.depend_off_rel:
cd4e3584ed7f Add update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents: 46
diff changeset
754 depon2 = dep[2]
cd4e3584ed7f Add update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents: 46
diff changeset
755 sub.append((depon2, from_path))
cd4e3584ed7f Add update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents: 46
diff changeset
756 pass
cd4e3584ed7f Add update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents: 46
diff changeset
757
cd4e3584ed7f Add update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents: 46
diff changeset
758 return sub
cd4e3584ed7f Add update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents: 46
diff changeset
759
cd4e3584ed7f Add update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents: 46
diff changeset
760 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
761 for from_path, dep in all_dep_decls.items()]
cd4e3584ed7f Add update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents: 46
diff changeset
762 depon_dep_lst = chain(*depon_dep_lsts)
cd4e3584ed7f Add update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents: 46
diff changeset
763 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
764 return depon_dep_map
47
cd4e3584ed7f Add update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents: 46
diff changeset
765
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 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
768 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
769
705356005362 Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents: 52
diff changeset
770 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
771 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
772
705356005362 Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents: 52
diff changeset
773 def make_path(obj, path_parts, obj_name):
705356005362 Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents: 52
diff changeset
774 if isinstance(obj, dexfile.composite):
705356005362 Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents: 52
diff changeset
775 type_name = dex_type_names[obj.__class__]
705356005362 Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents: 52
diff changeset
776 return [type_name]
705356005362 Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents: 52
diff changeset
777 return path_parts + [obj_name]
52
67aa8ca8fff3 untested dex_deptracker.update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents: 49
diff changeset
778
67aa8ca8fff3 untested dex_deptracker.update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents: 49
diff changeset
779 moff = man_off(0)
53
705356005362 Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents: 52
diff changeset
780 queue = [(dexroot, ['DEXFile'])]
47
cd4e3584ed7f Add update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents: 46
diff changeset
781
52
67aa8ca8fff3 untested dex_deptracker.update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents: 49
diff changeset
782 while queue:
53
705356005362 Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents: 52
diff changeset
783 obj, path_parts = queue.pop()
705356005362 Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents: 52
diff changeset
784 name_path = '.'.join(path_parts)
705356005362 Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents: 52
diff changeset
785
54
870312703ba1 Fix issuge of crossing dexfile.ref when updating offset
Thinker K.F. Li <thinker@codemud.net>
parents: 53
diff changeset
786 obj_clazz = _resolve_name_path(name_path)
870312703ba1 Fix issuge of crossing dexfile.ref when updating offset
Thinker K.F. Li <thinker@codemud.net>
parents: 53
diff changeset
787 if isinstance(obj_clazz, dexfile.depend):
870312703ba1 Fix issuge of crossing dexfile.ref when updating offset
Thinker K.F. Li <thinker@codemud.net>
parents: 53
diff changeset
788 continue
870312703ba1 Fix issuge of crossing dexfile.ref when updating offset
Thinker K.F. Li <thinker@codemud.net>
parents: 53
diff changeset
789
53
705356005362 Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents: 52
diff changeset
790 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
791 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
792 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
793 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
794 try:
870312703ba1 Fix issuge of crossing dexfile.ref when updating offset
Thinker K.F. Li <thinker@codemud.net>
parents: 53
diff changeset
795 obj = obj[0]
870312703ba1 Fix issuge of crossing dexfile.ref when updating offset
Thinker K.F. Li <thinker@codemud.net>
parents: 53
diff changeset
796 except:
870312703ba1 Fix issuge of crossing dexfile.ref when updating offset
Thinker K.F. Li <thinker@codemud.net>
parents: 53
diff changeset
797 print name_path
870312703ba1 Fix issuge of crossing dexfile.ref when updating offset
Thinker K.F. Li <thinker@codemud.net>
parents: 53
diff changeset
798 raise
870312703ba1 Fix issuge of crossing dexfile.ref when updating offset
Thinker K.F. Li <thinker@codemud.net>
parents: 53
diff changeset
799 pass
53
705356005362 Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents: 52
diff changeset
800 marker.set_marker(obj, moff())
52
67aa8ca8fff3 untested dex_deptracker.update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents: 49
diff changeset
801 pass
53
705356005362 Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents: 52
diff changeset
802
705356005362 Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents: 52
diff changeset
803 if isinstance(obj, (tuple, list)):
54
870312703ba1 Fix issuge of crossing dexfile.ref when updating offset
Thinker K.F. Li <thinker@codemud.net>
parents: 53
diff changeset
804 attrs = [(elt, make_path(elt, path_parts, str(idx)))
53
705356005362 Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents: 52
diff changeset
805 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
806 attrs.reverse()
705356005362 Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents: 52
diff changeset
807 queue = queue + attrs
705356005362 Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents: 52
diff changeset
808 continue
52
67aa8ca8fff3 untested dex_deptracker.update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents: 49
diff changeset
809
67aa8ca8fff3 untested dex_deptracker.update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents: 49
diff changeset
810 if isinstance(obj, dexfile.ref):
47
cd4e3584ed7f Add update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents: 46
diff changeset
811 continue
53
705356005362 Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents: 52
diff changeset
812
52
67aa8ca8fff3 untested dex_deptracker.update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents: 49
diff changeset
813 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
814 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
815 moff(clazz.sizeof(obj))
52
67aa8ca8fff3 untested dex_deptracker.update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents: 49
diff changeset
816 continue
67aa8ca8fff3 untested dex_deptracker.update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents: 49
diff changeset
817
53
705356005362 Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents: 52
diff changeset
818 moff(obj.sizeof(obj))
705356005362 Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents: 52
diff changeset
819
705356005362 Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents: 52
diff changeset
820 children = obj.children()
705356005362 Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents: 52
diff changeset
821 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
822 for child_name in children]
705356005362 Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents: 52
diff changeset
823 attrs = [(attr, make_path(attr, path_parts, attr_name))
705356005362 Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents: 52
diff changeset
824 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
825 attrs.reverse()
67aa8ca8fff3 untested dex_deptracker.update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents: 49
diff changeset
826 queue = queue + attrs
47
cd4e3584ed7f Add update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents: 46
diff changeset
827 pass
cd4e3584ed7f Add update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents: 46
diff changeset
828 pass
cd4e3584ed7f Add update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents: 46
diff changeset
829
cd4e3584ed7f Add update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents: 46
diff changeset
830
46
94e80f7a61b5 Add dex_deptracker.restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 43
diff changeset
831 ## \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
832 #
94e80f7a61b5 Add dex_deptracker.restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 43
diff changeset
833 def restore_dependencies(dexroot, all_dep_decls):
94e80f7a61b5 Add dex_deptracker.restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 43
diff changeset
834 for obj, parents, name_path in \
94e80f7a61b5 Add dex_deptracker.restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 43
diff changeset
835 _travel_dex_relocatable(dexroot):
94e80f7a61b5 Add dex_deptracker.restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 43
diff changeset
836 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
837 continue
94e80f7a61b5 Add dex_deptracker.restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 43
diff changeset
838
94e80f7a61b5 Add dex_deptracker.restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 43
diff changeset
839 imm_parent = parents[-1]
94e80f7a61b5 Add dex_deptracker.restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 43
diff changeset
840 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
841 continue
94e80f7a61b5 Add dex_deptracker.restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 43
diff changeset
842
94e80f7a61b5 Add dex_deptracker.restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 43
diff changeset
843 dep = all_dep_decls[name_path]
94e80f7a61b5 Add dex_deptracker.restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 43
diff changeset
844 dep_type = dep[0]
94e80f7a61b5 Add dex_deptracker.restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 43
diff changeset
845 if dep_type == dexfile.depend_off_rel:
94e80f7a61b5 Add dex_deptracker.restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 43
diff changeset
846 depon1 = _rel_offset_marker.find_depon(dep[1], parents)
94e80f7a61b5 Add dex_deptracker.restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 43
diff changeset
847 depon2 = _rel_offset_marker.find_depon(dep[2], parents)
94e80f7a61b5 Add dex_deptracker.restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 43
diff changeset
848
94e80f7a61b5 Add dex_deptracker.restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 43
diff changeset
849 name = name_path.split('.')[-1]
94e80f7a61b5 Add dex_deptracker.restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 43
diff changeset
850 off = depon2.data_offset - depon1.data_offset
94e80f7a61b5 Add dex_deptracker.restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 43
diff changeset
851 _dex_tree_set_child(imm_parent, name, off)
94e80f7a61b5 Add dex_deptracker.restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 43
diff changeset
852 elif dep_type == dexfile.depend_off:
94e80f7a61b5 Add dex_deptracker.restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 43
diff changeset
853 depon_name_path = dep[1]
94e80f7a61b5 Add dex_deptracker.restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 43
diff changeset
854 depon = markers_info[depon_name_path][obj]
94e80f7a61b5 Add dex_deptracker.restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 43
diff changeset
855 name = name_path.split('.')[-1]
94e80f7a61b5 Add dex_deptracker.restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 43
diff changeset
856 _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
857 elif dep_type == dexfile.depend_idx:
94e80f7a61b5 Add dex_deptracker.restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 43
diff changeset
858 depon_name_path = dep[1]
94e80f7a61b5 Add dex_deptracker.restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 43
diff changeset
859 depon = markers_info[depon_name_path][obj]
94e80f7a61b5 Add dex_deptracker.restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 43
diff changeset
860 name = name_path.split('.')[-1]
94e80f7a61b5 Add dex_deptracker.restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 43
diff changeset
861 _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
862 else:
94e80f7a61b5 Add dex_deptracker.restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 43
diff changeset
863 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
864 pass
94e80f7a61b5 Add dex_deptracker.restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 43
diff changeset
865 pass
94e80f7a61b5 Add dex_deptracker.restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 43
diff changeset
866
94e80f7a61b5 Add dex_deptracker.restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 43
diff changeset
867
24
a57ec6a76fe3 Describe steps to track dependencies
Thinker K.F. Li <thinker@codemud.net>
parents: 23
diff changeset
868 def _sync_dependencies():
a57ec6a76fe3 Describe steps to track dependencies
Thinker K.F. Li <thinker@codemud.net>
parents: 23
diff changeset
869 pass
a57ec6a76fe3 Describe steps to track dependencies
Thinker K.F. Li <thinker@codemud.net>
parents: 23
diff changeset
870
a57ec6a76fe3 Describe steps to track dependencies
Thinker K.F. Li <thinker@codemud.net>
parents: 23
diff changeset
871
23
fff40aabefab Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
872 if __name__ == '__main__':
25
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
873 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
874
fff40aabefab Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
875 import pprint
fff40aabefab Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
876 print
fff40aabefab Move collect_dependencies() to dex_deptracker.py
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
877 print 'Dependencies'
25
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
878 pprint.pprint(collect_all_dep_decls())