annotate paraspace/dex_deptracker.py @ 141:90690a001172

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