Mercurial > paraspace
annotate paraspace/dexfile.py @ 132:75a31967ebee
Following the ref in resotre_dependencies()
author | Thinker K.F. Li <thinker@codemud.net> |
---|---|
date | Tue, 09 Aug 2011 15:30:45 +0800 |
parents | 044bfc415577 |
children | f31bfe55d9c2 |
rev | line source |
---|---|
79 | 1 ## \file |
2 # Define, and parse, struct/format of DEX files. | |
3 # | |
4 | |
12
8101024c942b
Document class man_off
Thinker K.F. Li <thinker@codemud.net>
parents:
11
diff
changeset
|
5 ## \brief Manage offset |
8101024c942b
Document class man_off
Thinker K.F. Li <thinker@codemud.net>
parents:
11
diff
changeset
|
6 # |
8101024c942b
Document class man_off
Thinker K.F. Li <thinker@codemud.net>
parents:
11
diff
changeset
|
7 # The instances are initialized with a offset. Every time an instance |
8101024c942b
Document class man_off
Thinker K.F. Li <thinker@codemud.net>
parents:
11
diff
changeset
|
8 # is called, it return the offset before advancing offset with specify |
8101024c942b
Document class man_off
Thinker K.F. Li <thinker@codemud.net>
parents:
11
diff
changeset
|
9 # size. |
8101024c942b
Document class man_off
Thinker K.F. Li <thinker@codemud.net>
parents:
11
diff
changeset
|
10 # |
8101024c942b
Document class man_off
Thinker K.F. Li <thinker@codemud.net>
parents:
11
diff
changeset
|
11 # moff = man_off(init_off) |
8101024c942b
Document class man_off
Thinker K.F. Li <thinker@codemud.net>
parents:
11
diff
changeset
|
12 # assert moff(5) == init_off |
8101024c942b
Document class man_off
Thinker K.F. Li <thinker@codemud.net>
parents:
11
diff
changeset
|
13 # assert moff() == (init_off + 5) |
8101024c942b
Document class man_off
Thinker K.F. Li <thinker@codemud.net>
parents:
11
diff
changeset
|
14 # assert moff() == (init_off + 5) |
8101024c942b
Document class man_off
Thinker K.F. Li <thinker@codemud.net>
parents:
11
diff
changeset
|
15 # |
3
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
16 class man_off(object): |
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
17 off = None |
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
18 |
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
19 def __init__(self, off): |
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
20 self.off = off |
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
21 pass |
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
22 |
4
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
23 def __call__(self, sz=0): |
3
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
24 off = self.off |
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
25 self.off = off + sz |
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
26 return off |
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
27 pass |
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
28 |
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
29 |
0 | 30 def _to_uint(data): |
31 v = 0 | |
1
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
32 sh = 0 |
0 | 33 for c in data: |
1
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
34 v = v + (ord(c) << sh) |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
35 sh = sh + 8 |
0 | 36 pass |
37 return v | |
38 | |
39 | |
8 | 40 def _to_int(data): |
41 v = _to_uint(data) | |
42 sz = len(data) | |
43 if sz and ((1 << (sz * 8 - 1)) & v): | |
44 v = -((1 << (sz * 8)) - v) | |
45 pass | |
46 return v | |
47 | |
48 | |
1
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
49 def _uleb128(data): |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
50 sh = 0 |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
51 v = 0 |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
52 for c in data: |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
53 cv = ord(c) |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
54 v = v + ((cv & 0x7f) << sh) |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
55 sh = sh + 7 |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
56 |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
57 if cv <= 0x7f: |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
58 break |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
59 pass |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
60 |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
61 nbytes = sh / 7 |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
62 return v, nbytes |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
63 |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
64 |
13
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
65 def _to_uleb128(v): |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
66 assert v >= 0 |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
67 |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
68 data = '' |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
69 while True: |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
70 if v > 0x7f: |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
71 data = data + chr((v & 0x7f) | 0x80) |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
72 else: |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
73 data = data + chr(v & 0x7f) |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
74 break |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
75 v = v >> 7 |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
76 pass |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
77 |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
78 return data |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
79 |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
80 |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
81 def _uleb128_sz(v): |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
82 return len(_to_uleb128(v)) |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
83 |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
84 |
2 | 85 def _leb128(data): |
86 v, sh = _uleb128(data) | |
87 if v & (1 << (sh * 7 - 1)): | |
88 v = -((1 << (sh * 7)) - v) | |
89 pass | |
90 return v, sh | |
91 | |
92 | |
13
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
93 def _to_leb128(v): |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
94 data = '' |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
95 while True: |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
96 if v > 0x3f or v < ~0x3f: |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
97 data = data + chr((v & 0x7f) | 0x80) |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
98 else: |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
99 data = data + chr(v & 0x7f) |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
100 break |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
101 v = v >> 7 |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
102 pass |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
103 return data |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
104 |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
105 |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
106 def _leb128_sz(v): |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
107 return len(_to_leb128(v)) |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
108 |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
109 |
120
c7a5de2d2334
Fix issue of compute_size of various types
Thinker K.F. Li <thinker@codemud.net>
parents:
119
diff
changeset
|
110 def _compute_sz(o, _type): |
13
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
111 if hasattr(o, 'compute_size'): |
124
8e42b2816893
Fixing compute_size() and sizeof() for DEX types.
Thinker K.F. Li <thinker@codemud.net>
parents:
123
diff
changeset
|
112 _type.compute_size(o) |
8e42b2816893
Fixing compute_size() and sizeof() for DEX types.
Thinker K.F. Li <thinker@codemud.net>
parents:
123
diff
changeset
|
113 pass |
120
c7a5de2d2334
Fix issue of compute_size of various types
Thinker K.F. Li <thinker@codemud.net>
parents:
119
diff
changeset
|
114 return _type.sizeof(o) |
13
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
115 |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
116 |
27
15cb829ac442
travel_dex_type() recoganizes _dex_type correctly
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
117 class _dex_type(object): |
15cb829ac442
travel_dex_type() recoganizes _dex_type correctly
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
118 pass |
15cb829ac442
travel_dex_type() recoganizes _dex_type correctly
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
119 |
15cb829ac442
travel_dex_type() recoganizes _dex_type correctly
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
120 |
15cb829ac442
travel_dex_type() recoganizes _dex_type correctly
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
121 class _rawstr(_dex_type): |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
122 size = None |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
123 factor = None |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
124 data = None |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
125 data_size = None |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
126 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
127 ## |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
128 # \param size_name is dot separated attribute names from the parent. |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
129 # |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
130 def __init__(self, size=None, size_name=None, factor=1): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
131 self.size = size |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
132 self.size_name = size_name |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
133 self.factor = factor |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
134 pass |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
135 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
136 def parse(self, parent, data, off): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
137 obj = _rawstr(self.size, self.size_name, self.factor) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
138 if self.size is not None: |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
139 size = self.size |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
140 else: |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
141 size = parent |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
142 for name in self.size_name.split('.'): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
143 size = getattr(size, name) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
144 pass |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
145 pass |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
146 obj.data_size = size * self.factor |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
147 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
148 obj.data = data[off:off + obj.data_size] |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
149 return obj |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
150 |
125
b9688a3badaa
Add compute_size() for DEX types that missed it
Thinker K.F. Li <thinker@codemud.net>
parents:
124
diff
changeset
|
151 def compute_size(self, v): |
b9688a3badaa
Add compute_size() for DEX types that missed it
Thinker K.F. Li <thinker@codemud.net>
parents:
124
diff
changeset
|
152 v.data_size = len(v.data) |
b9688a3badaa
Add compute_size() for DEX types that missed it
Thinker K.F. Li <thinker@codemud.net>
parents:
124
diff
changeset
|
153 pass |
b9688a3badaa
Add compute_size() for DEX types that missed it
Thinker K.F. Li <thinker@codemud.net>
parents:
124
diff
changeset
|
154 |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
155 def sizeof(self, v): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
156 return v.data_size |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
157 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
158 def to_str(self, v): |
63
21d9b6773242
Fix _rawstr.to_str() in dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
58
diff
changeset
|
159 return v.data |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
160 pass |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
161 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
162 class rawstr(_rawstr): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
163 def __init__(self, size, factor=1): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
164 super(rawstr, self).__init__(size=size, factor=factor) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
165 pass |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
166 pass |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
167 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
168 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
169 class rawstr_size_name(_rawstr): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
170 def __init__(self, size_name, factor=1): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
171 super(rawstr_size_name, self).__init__(size_name=size_name, |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
172 factor=factor) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
173 pass |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
174 pass |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
175 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
176 |
27
15cb829ac442
travel_dex_type() recoganizes _dex_type correctly
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
177 class tap(_dex_type): |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
178 @staticmethod |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
179 def parse(parent, data, off): |
40
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
33
diff
changeset
|
180 return tap() |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
181 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
182 @staticmethod |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
183 def sizeof(v): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
184 return 0 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
185 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
186 @staticmethod |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
187 def to_str(v): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
188 return '' |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
189 pass |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
190 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
191 |
27
15cb829ac442
travel_dex_type() recoganizes _dex_type correctly
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
192 class uint32(_dex_type): |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
193 @staticmethod |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
194 def parse(parent, data, off): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
195 v = _to_uint(data[off:off + 4]) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
196 return v |
124
8e42b2816893
Fixing compute_size() and sizeof() for DEX types.
Thinker K.F. Li <thinker@codemud.net>
parents:
123
diff
changeset
|
197 |
8e42b2816893
Fixing compute_size() and sizeof() for DEX types.
Thinker K.F. Li <thinker@codemud.net>
parents:
123
diff
changeset
|
198 @staticmethod |
8e42b2816893
Fixing compute_size() and sizeof() for DEX types.
Thinker K.F. Li <thinker@codemud.net>
parents:
123
diff
changeset
|
199 def compute_size(v): |
8e42b2816893
Fixing compute_size() and sizeof() for DEX types.
Thinker K.F. Li <thinker@codemud.net>
parents:
123
diff
changeset
|
200 pass |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
201 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
202 @staticmethod |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
203 def sizeof(v): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
204 return 4 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
205 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
206 @staticmethod |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
207 def to_str(v): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
208 return chr(v & 0xff) + chr((v >> 8) & 0xff) + chr((v >> 16) & 0xff) + \ |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
209 chr((v >> 24) & 0xff) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
210 pass |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
211 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
212 |
27
15cb829ac442
travel_dex_type() recoganizes _dex_type correctly
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
213 class uint16(_dex_type): |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
214 @staticmethod |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
215 def parse(parent, data, off): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
216 v = _to_uint(data[off:off + 2]) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
217 return v |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
218 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
219 @staticmethod |
124
8e42b2816893
Fixing compute_size() and sizeof() for DEX types.
Thinker K.F. Li <thinker@codemud.net>
parents:
123
diff
changeset
|
220 def compute_size(v): |
8e42b2816893
Fixing compute_size() and sizeof() for DEX types.
Thinker K.F. Li <thinker@codemud.net>
parents:
123
diff
changeset
|
221 pass |
8e42b2816893
Fixing compute_size() and sizeof() for DEX types.
Thinker K.F. Li <thinker@codemud.net>
parents:
123
diff
changeset
|
222 |
8e42b2816893
Fixing compute_size() and sizeof() for DEX types.
Thinker K.F. Li <thinker@codemud.net>
parents:
123
diff
changeset
|
223 @staticmethod |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
224 def sizeof(v): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
225 return 2 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
226 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
227 @staticmethod |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
228 def to_str(v): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
229 return chr(v & 0xff) + chr((v >> 8) & 0xff) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
230 pass |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
231 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
232 |
27
15cb829ac442
travel_dex_type() recoganizes _dex_type correctly
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
233 class uint8(_dex_type): |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
234 @staticmethod |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
235 def parse(parent, data, off): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
236 v = _to_uint(data[off:off + 1]) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
237 return v |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
238 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
239 @staticmethod |
124
8e42b2816893
Fixing compute_size() and sizeof() for DEX types.
Thinker K.F. Li <thinker@codemud.net>
parents:
123
diff
changeset
|
240 def compute_size(v): |
8e42b2816893
Fixing compute_size() and sizeof() for DEX types.
Thinker K.F. Li <thinker@codemud.net>
parents:
123
diff
changeset
|
241 pass |
8e42b2816893
Fixing compute_size() and sizeof() for DEX types.
Thinker K.F. Li <thinker@codemud.net>
parents:
123
diff
changeset
|
242 |
8e42b2816893
Fixing compute_size() and sizeof() for DEX types.
Thinker K.F. Li <thinker@codemud.net>
parents:
123
diff
changeset
|
243 @staticmethod |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
244 def sizeof(v): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
245 return 1 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
246 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
247 @staticmethod |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
248 def to_str(v): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
249 return chr(v & 0xff) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
250 pass |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
251 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
252 |
27
15cb829ac442
travel_dex_type() recoganizes _dex_type correctly
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
253 class int32(_dex_type): |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
254 @staticmethod |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
255 def parse(parent, data, off): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
256 v = _to_int(data[off:off + 4]) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
257 return v |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
258 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
259 @staticmethod |
124
8e42b2816893
Fixing compute_size() and sizeof() for DEX types.
Thinker K.F. Li <thinker@codemud.net>
parents:
123
diff
changeset
|
260 def compute_size(v): |
8e42b2816893
Fixing compute_size() and sizeof() for DEX types.
Thinker K.F. Li <thinker@codemud.net>
parents:
123
diff
changeset
|
261 pass |
8e42b2816893
Fixing compute_size() and sizeof() for DEX types.
Thinker K.F. Li <thinker@codemud.net>
parents:
123
diff
changeset
|
262 |
8e42b2816893
Fixing compute_size() and sizeof() for DEX types.
Thinker K.F. Li <thinker@codemud.net>
parents:
123
diff
changeset
|
263 @staticmethod |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
264 def sizeof(v): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
265 return 4 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
266 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
267 @staticmethod |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
268 def to_str(v): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
269 return chr(v & 0xff) + chr((v >> 8) & 0xff) + chr((v >> 16) & 0xff) + \ |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
270 chr((v >> 24) & 0xff) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
271 pass |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
272 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
273 |
27
15cb829ac442
travel_dex_type() recoganizes _dex_type correctly
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
274 class int16(_dex_type): |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
275 @staticmethod |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
276 def parse(parent, data, off): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
277 v = _to_int(data[off:off + 2]) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
278 return v |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
279 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
280 @staticmethod |
124
8e42b2816893
Fixing compute_size() and sizeof() for DEX types.
Thinker K.F. Li <thinker@codemud.net>
parents:
123
diff
changeset
|
281 def compute_size(v): |
8e42b2816893
Fixing compute_size() and sizeof() for DEX types.
Thinker K.F. Li <thinker@codemud.net>
parents:
123
diff
changeset
|
282 pass |
8e42b2816893
Fixing compute_size() and sizeof() for DEX types.
Thinker K.F. Li <thinker@codemud.net>
parents:
123
diff
changeset
|
283 |
8e42b2816893
Fixing compute_size() and sizeof() for DEX types.
Thinker K.F. Li <thinker@codemud.net>
parents:
123
diff
changeset
|
284 @staticmethod |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
285 def sizeof(v): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
286 return 2 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
287 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
288 @staticmethod |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
289 def to_str(v): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
290 return chr(v & 0xff) + chr((v >> 8) & 0xff) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
291 pass |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
292 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
293 |
27
15cb829ac442
travel_dex_type() recoganizes _dex_type correctly
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
294 class uleb128(_dex_type): |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
295 @staticmethod |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
296 def parse(parent, data, off): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
297 v, sh = _uleb128(data[off:off + 5]) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
298 return v |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
299 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
300 @staticmethod |
124
8e42b2816893
Fixing compute_size() and sizeof() for DEX types.
Thinker K.F. Li <thinker@codemud.net>
parents:
123
diff
changeset
|
301 def compute_size(v): |
8e42b2816893
Fixing compute_size() and sizeof() for DEX types.
Thinker K.F. Li <thinker@codemud.net>
parents:
123
diff
changeset
|
302 pass |
8e42b2816893
Fixing compute_size() and sizeof() for DEX types.
Thinker K.F. Li <thinker@codemud.net>
parents:
123
diff
changeset
|
303 |
8e42b2816893
Fixing compute_size() and sizeof() for DEX types.
Thinker K.F. Li <thinker@codemud.net>
parents:
123
diff
changeset
|
304 @staticmethod |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
305 def sizeof(v): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
306 return _uleb128_sz(v) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
307 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
308 @staticmethod |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
309 def to_str(v): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
310 return _to_uleb128(v) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
311 pass |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
312 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
313 |
27
15cb829ac442
travel_dex_type() recoganizes _dex_type correctly
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
314 class leb128(_dex_type): |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
315 @staticmethod |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
316 def parse(parent, data, off): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
317 v, sh = _leb128(data[off:off + 5]) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
318 return v |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
319 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
320 @staticmethod |
124
8e42b2816893
Fixing compute_size() and sizeof() for DEX types.
Thinker K.F. Li <thinker@codemud.net>
parents:
123
diff
changeset
|
321 def compute_size(v): |
8e42b2816893
Fixing compute_size() and sizeof() for DEX types.
Thinker K.F. Li <thinker@codemud.net>
parents:
123
diff
changeset
|
322 pass |
8e42b2816893
Fixing compute_size() and sizeof() for DEX types.
Thinker K.F. Li <thinker@codemud.net>
parents:
123
diff
changeset
|
323 |
8e42b2816893
Fixing compute_size() and sizeof() for DEX types.
Thinker K.F. Li <thinker@codemud.net>
parents:
123
diff
changeset
|
324 @staticmethod |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
325 def sizeof(v): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
326 return _leb128_sz(v) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
327 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
328 @staticmethod |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
329 def to_str(v): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
330 return _to_leb128(v) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
331 pass |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
332 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
333 |
27
15cb829ac442
travel_dex_type() recoganizes _dex_type correctly
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
334 class auto_align(_dex_type): |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
335 bits = None |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
336 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
337 def __init__(self, bits): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
338 self.bits = bits |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
339 pass |
123
78357afb4a9d
Test case for restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
121
diff
changeset
|
340 |
78357afb4a9d
Test case for restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
121
diff
changeset
|
341 def recompute_align(self, off): |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
342 mask = (1 << self.bits) - 1 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
343 padding_sz = ((off + mask) & ~mask) - off |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
344 return padding_sz |
123
78357afb4a9d
Test case for restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
121
diff
changeset
|
345 |
78357afb4a9d
Test case for restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
121
diff
changeset
|
346 def parse(self, parent, data, off): |
78357afb4a9d
Test case for restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
121
diff
changeset
|
347 return self.recompute_align(off) |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
348 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
349 @staticmethod |
124
8e42b2816893
Fixing compute_size() and sizeof() for DEX types.
Thinker K.F. Li <thinker@codemud.net>
parents:
123
diff
changeset
|
350 def compute_size(v): |
8e42b2816893
Fixing compute_size() and sizeof() for DEX types.
Thinker K.F. Li <thinker@codemud.net>
parents:
123
diff
changeset
|
351 pass |
8e42b2816893
Fixing compute_size() and sizeof() for DEX types.
Thinker K.F. Li <thinker@codemud.net>
parents:
123
diff
changeset
|
352 |
8e42b2816893
Fixing compute_size() and sizeof() for DEX types.
Thinker K.F. Li <thinker@codemud.net>
parents:
123
diff
changeset
|
353 @staticmethod |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
354 def sizeof(v): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
355 return v |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
356 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
357 @staticmethod |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
358 def to_str(v): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
359 return '\x00' * v |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
360 pass |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
361 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
362 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
363 def _get_sz(o): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
364 if isinstance(o, relocatable): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
365 return o.data_size |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
366 return o.__class__.sizeof(o) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
367 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
368 |
40
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
33
diff
changeset
|
369 ## \biref Associate objects from two set of objects. |
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
33
diff
changeset
|
370 # |
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
33
diff
changeset
|
371 class _objs_asso(_dex_type): |
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
33
diff
changeset
|
372 left = None |
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
33
diff
changeset
|
373 left_ref = None |
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
33
diff
changeset
|
374 right = None |
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
33
diff
changeset
|
375 right_ref = None |
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
33
diff
changeset
|
376 |
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
33
diff
changeset
|
377 ## \brief Update references for a element pair from left and right. |
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
33
diff
changeset
|
378 # |
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
33
diff
changeset
|
379 # This method must be called by derivation to associate a pair of |
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
33
diff
changeset
|
380 # elements. |
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
33
diff
changeset
|
381 # |
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
33
diff
changeset
|
382 def _update_refs(self, left_elt, right_elt): |
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
33
diff
changeset
|
383 lref = getattr(left_elt, self.left_ref) |
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
33
diff
changeset
|
384 if not isinstance(right_elt, lref.target_path): |
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
33
diff
changeset
|
385 raise TypeError, 'invalid target_path in left %s' % (repr(le)) |
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
33
diff
changeset
|
386 |
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
33
diff
changeset
|
387 rref = getattr(right_elt, self.right_ref) |
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
33
diff
changeset
|
388 if not isinstance(left_elt, rref.target_path): |
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
33
diff
changeset
|
389 raise TypeError, 'invalid target_path in right %s' % (repr(re)) |
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
33
diff
changeset
|
390 |
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
33
diff
changeset
|
391 new_lref = ref(lref.target_path) |
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
33
diff
changeset
|
392 new_lref.target = right_elt |
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
33
diff
changeset
|
393 setattr(left_elt, self.left_ref, new_lref) |
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
33
diff
changeset
|
394 |
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
33
diff
changeset
|
395 new_rref = ref(rref.target_path) |
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
33
diff
changeset
|
396 new_rref.target = left_elt |
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
33
diff
changeset
|
397 setattr(right_elt, self.right_ref, new_rref) |
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
33
diff
changeset
|
398 pass |
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
33
diff
changeset
|
399 |
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
33
diff
changeset
|
400 ## \brief Assocate elements from left list to a respective right element. |
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
33
diff
changeset
|
401 # |
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
33
diff
changeset
|
402 # This method must be called before linking dependencies. |
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
33
diff
changeset
|
403 # |
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
33
diff
changeset
|
404 def build_associations(self, left, right): |
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
33
diff
changeset
|
405 raise NotImplementedError, 'build_associations is not implemented' |
55
6e4cf6905729
Seeking parents in reversed order for _build_associations()
Thinker K.F. Li <thinker@codemud.net>
parents:
54
diff
changeset
|
406 |
6e4cf6905729
Seeking parents in reversed order for _build_associations()
Thinker K.F. Li <thinker@codemud.net>
parents:
54
diff
changeset
|
407 def parse(self, parent, data, off): |
6e4cf6905729
Seeking parents in reversed order for _build_associations()
Thinker K.F. Li <thinker@codemud.net>
parents:
54
diff
changeset
|
408 return self |
6e4cf6905729
Seeking parents in reversed order for _build_associations()
Thinker K.F. Li <thinker@codemud.net>
parents:
54
diff
changeset
|
409 |
6e4cf6905729
Seeking parents in reversed order for _build_associations()
Thinker K.F. Li <thinker@codemud.net>
parents:
54
diff
changeset
|
410 def sizeof(self, obj): |
6e4cf6905729
Seeking parents in reversed order for _build_associations()
Thinker K.F. Li <thinker@codemud.net>
parents:
54
diff
changeset
|
411 return 0 |
6e4cf6905729
Seeking parents in reversed order for _build_associations()
Thinker K.F. Li <thinker@codemud.net>
parents:
54
diff
changeset
|
412 |
6e4cf6905729
Seeking parents in reversed order for _build_associations()
Thinker K.F. Li <thinker@codemud.net>
parents:
54
diff
changeset
|
413 def to_str(self): |
6e4cf6905729
Seeking parents in reversed order for _build_associations()
Thinker K.F. Li <thinker@codemud.net>
parents:
54
diff
changeset
|
414 return '' |
6e4cf6905729
Seeking parents in reversed order for _build_associations()
Thinker K.F. Li <thinker@codemud.net>
parents:
54
diff
changeset
|
415 |
124
8e42b2816893
Fixing compute_size() and sizeof() for DEX types.
Thinker K.F. Li <thinker@codemud.net>
parents:
123
diff
changeset
|
416 @staticmethod |
55
6e4cf6905729
Seeking parents in reversed order for _build_associations()
Thinker K.F. Li <thinker@codemud.net>
parents:
54
diff
changeset
|
417 def compute_size(self): |
6e4cf6905729
Seeking parents in reversed order for _build_associations()
Thinker K.F. Li <thinker@codemud.net>
parents:
54
diff
changeset
|
418 pass |
6e4cf6905729
Seeking parents in reversed order for _build_associations()
Thinker K.F. Li <thinker@codemud.net>
parents:
54
diff
changeset
|
419 |
6e4cf6905729
Seeking parents in reversed order for _build_associations()
Thinker K.F. Li <thinker@codemud.net>
parents:
54
diff
changeset
|
420 def children(self): |
6e4cf6905729
Seeking parents in reversed order for _build_associations()
Thinker K.F. Li <thinker@codemud.net>
parents:
54
diff
changeset
|
421 return [] |
40
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
33
diff
changeset
|
422 pass |
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
33
diff
changeset
|
423 |
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
33
diff
changeset
|
424 |
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
33
diff
changeset
|
425 ## \brief One to one association. |
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
33
diff
changeset
|
426 # |
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
33
diff
changeset
|
427 # Associate nth element from left sequence to nth element in right |
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
33
diff
changeset
|
428 # sequence. |
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
33
diff
changeset
|
429 # |
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
33
diff
changeset
|
430 class one2one(_objs_asso): |
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
33
diff
changeset
|
431 def __init__(self, left, left_ref, right, right_ref): |
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
33
diff
changeset
|
432 self.left = left |
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
33
diff
changeset
|
433 self.left_ref = left_ref |
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
33
diff
changeset
|
434 self.right = right |
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
33
diff
changeset
|
435 self.right_ref = right_ref |
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
33
diff
changeset
|
436 pass |
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
33
diff
changeset
|
437 |
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
33
diff
changeset
|
438 ## \brief Associate elements from left list to elements from right list |
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
33
diff
changeset
|
439 # |
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
33
diff
changeset
|
440 def build_associations(self, left, right): |
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
33
diff
changeset
|
441 assert len(left) == len(right) |
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
33
diff
changeset
|
442 for le, re in map(None, left, right): |
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
33
diff
changeset
|
443 self._update_refs(le, re) |
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
33
diff
changeset
|
444 pass |
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
33
diff
changeset
|
445 pass |
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
33
diff
changeset
|
446 pass |
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
33
diff
changeset
|
447 |
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
33
diff
changeset
|
448 |
48
3936d223989a
Introduce null_relocatable for any relocatable without real instance
Thinker K.F. Li <thinker@codemud.net>
parents:
45
diff
changeset
|
449 class relocatable(_dex_type): |
3936d223989a
Introduce null_relocatable for any relocatable without real instance
Thinker K.F. Li <thinker@codemud.net>
parents:
45
diff
changeset
|
450 data_size = None |
3936d223989a
Introduce null_relocatable for any relocatable without real instance
Thinker K.F. Li <thinker@codemud.net>
parents:
45
diff
changeset
|
451 |
3936d223989a
Introduce null_relocatable for any relocatable without real instance
Thinker K.F. Li <thinker@codemud.net>
parents:
45
diff
changeset
|
452 @staticmethod |
3936d223989a
Introduce null_relocatable for any relocatable without real instance
Thinker K.F. Li <thinker@codemud.net>
parents:
45
diff
changeset
|
453 def parse(parent, data, off): |
3936d223989a
Introduce null_relocatable for any relocatable without real instance
Thinker K.F. Li <thinker@codemud.net>
parents:
45
diff
changeset
|
454 pass |
3936d223989a
Introduce null_relocatable for any relocatable without real instance
Thinker K.F. Li <thinker@codemud.net>
parents:
45
diff
changeset
|
455 |
3936d223989a
Introduce null_relocatable for any relocatable without real instance
Thinker K.F. Li <thinker@codemud.net>
parents:
45
diff
changeset
|
456 @staticmethod |
3936d223989a
Introduce null_relocatable for any relocatable without real instance
Thinker K.F. Li <thinker@codemud.net>
parents:
45
diff
changeset
|
457 def sizeof(v): |
3936d223989a
Introduce null_relocatable for any relocatable without real instance
Thinker K.F. Li <thinker@codemud.net>
parents:
45
diff
changeset
|
458 return v.data_size |
3936d223989a
Introduce null_relocatable for any relocatable without real instance
Thinker K.F. Li <thinker@codemud.net>
parents:
45
diff
changeset
|
459 |
3936d223989a
Introduce null_relocatable for any relocatable without real instance
Thinker K.F. Li <thinker@codemud.net>
parents:
45
diff
changeset
|
460 def to_str(self): |
3936d223989a
Introduce null_relocatable for any relocatable without real instance
Thinker K.F. Li <thinker@codemud.net>
parents:
45
diff
changeset
|
461 pass |
3936d223989a
Introduce null_relocatable for any relocatable without real instance
Thinker K.F. Li <thinker@codemud.net>
parents:
45
diff
changeset
|
462 |
3936d223989a
Introduce null_relocatable for any relocatable without real instance
Thinker K.F. Li <thinker@codemud.net>
parents:
45
diff
changeset
|
463 def compute_size(self): |
3936d223989a
Introduce null_relocatable for any relocatable without real instance
Thinker K.F. Li <thinker@codemud.net>
parents:
45
diff
changeset
|
464 pass |
3936d223989a
Introduce null_relocatable for any relocatable without real instance
Thinker K.F. Li <thinker@codemud.net>
parents:
45
diff
changeset
|
465 |
3936d223989a
Introduce null_relocatable for any relocatable without real instance
Thinker K.F. Li <thinker@codemud.net>
parents:
45
diff
changeset
|
466 def children(self): |
3936d223989a
Introduce null_relocatable for any relocatable without real instance
Thinker K.F. Li <thinker@codemud.net>
parents:
45
diff
changeset
|
467 raise NotImplementedError, \ |
3936d223989a
Introduce null_relocatable for any relocatable without real instance
Thinker K.F. Li <thinker@codemud.net>
parents:
45
diff
changeset
|
468 '%s: does not implement children' % (self.__class__.__name__) |
3936d223989a
Introduce null_relocatable for any relocatable without real instance
Thinker K.F. Li <thinker@codemud.net>
parents:
45
diff
changeset
|
469 pass |
3936d223989a
Introduce null_relocatable for any relocatable without real instance
Thinker K.F. Li <thinker@codemud.net>
parents:
45
diff
changeset
|
470 |
3936d223989a
Introduce null_relocatable for any relocatable without real instance
Thinker K.F. Li <thinker@codemud.net>
parents:
45
diff
changeset
|
471 |
3936d223989a
Introduce null_relocatable for any relocatable without real instance
Thinker K.F. Li <thinker@codemud.net>
parents:
45
diff
changeset
|
472 class null_relocatable(relocatable): |
49
38fdd422f611
depend.child_type is replaced by null_relocatable.back_type
Thinker K.F. Li <thinker@codemud.net>
parents:
48
diff
changeset
|
473 back_type = None |
48
3936d223989a
Introduce null_relocatable for any relocatable without real instance
Thinker K.F. Li <thinker@codemud.net>
parents:
45
diff
changeset
|
474 pass |
3936d223989a
Introduce null_relocatable for any relocatable without real instance
Thinker K.F. Li <thinker@codemud.net>
parents:
45
diff
changeset
|
475 |
3936d223989a
Introduce null_relocatable for any relocatable without real instance
Thinker K.F. Li <thinker@codemud.net>
parents:
45
diff
changeset
|
476 |
40
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
33
diff
changeset
|
477 ## \brief Implicit reference to a target. |
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
33
diff
changeset
|
478 # |
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
33
diff
changeset
|
479 # It is a placeholder for storing relationship defined by an association. |
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
33
diff
changeset
|
480 # |
49
38fdd422f611
depend.child_type is replaced by null_relocatable.back_type
Thinker K.F. Li <thinker@codemud.net>
parents:
48
diff
changeset
|
481 class ref(_dex_type): |
40
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
33
diff
changeset
|
482 target_path = None |
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
33
diff
changeset
|
483 |
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
33
diff
changeset
|
484 def __init__(self, target_path=None): |
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
33
diff
changeset
|
485 self.target_path = target_path |
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
33
diff
changeset
|
486 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
|
487 |
c5cfc796af8b
Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents:
40
diff
changeset
|
488 @staticmethod |
c5cfc796af8b
Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents:
40
diff
changeset
|
489 def parse(parent, data, off): |
c5cfc796af8b
Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents:
40
diff
changeset
|
490 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
|
491 |
c5cfc796af8b
Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents:
40
diff
changeset
|
492 @staticmethod |
c5cfc796af8b
Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents:
40
diff
changeset
|
493 def sizeof(v): |
c5cfc796af8b
Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents:
40
diff
changeset
|
494 return 0 |
c5cfc796af8b
Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents:
40
diff
changeset
|
495 |
c5cfc796af8b
Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents:
40
diff
changeset
|
496 @staticmethod |
124
8e42b2816893
Fixing compute_size() and sizeof() for DEX types.
Thinker K.F. Li <thinker@codemud.net>
parents:
123
diff
changeset
|
497 def compute_size(self): |
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
|
498 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
|
499 |
c5cfc796af8b
Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents:
40
diff
changeset
|
500 @staticmethod |
119
4f508f84c8a1
Add inject_redir.py example
Thinker K.F. Li <thinker@codemud.net>
parents:
116
diff
changeset
|
501 def to_str(child): |
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
|
502 return '' |
c5cfc796af8b
Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents:
40
diff
changeset
|
503 |
43
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
41
diff
changeset
|
504 def get_value(self, parents): |
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
|
505 pass |
51
00d106f6c427
Define children() for ref
Thinker K.F. Li <thinker@codemud.net>
parents:
50
diff
changeset
|
506 |
00d106f6c427
Define children() for ref
Thinker K.F. Li <thinker@codemud.net>
parents:
50
diff
changeset
|
507 def children(self): |
00d106f6c427
Define children() for ref
Thinker K.F. Li <thinker@codemud.net>
parents:
50
diff
changeset
|
508 return [] |
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
|
509 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
|
510 |
c5cfc796af8b
Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents:
40
diff
changeset
|
511 |
c5cfc796af8b
Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents:
40
diff
changeset
|
512 ## \brief Reference to a value from a given path. |
c5cfc796af8b
Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents:
40
diff
changeset
|
513 # |
c5cfc796af8b
Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents:
40
diff
changeset
|
514 class value_ref(ref): |
43
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
41
diff
changeset
|
515 def get_value(self, parents): |
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
41
diff
changeset
|
516 from paraspace.dex_deptracker import _resolve_name_path |
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
41
diff
changeset
|
517 from paraspace.dex_deptracker import _dex_tree_get_child |
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
41
diff
changeset
|
518 |
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
|
519 pparts = self.target_path.split('.') |
43
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
41
diff
changeset
|
520 clazz_name = pparts[0] |
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
41
diff
changeset
|
521 clazz, dummy = _resolve_name_path(clazz_name) |
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
|
522 |
c5cfc796af8b
Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents:
40
diff
changeset
|
523 rev_parents = list(parents) |
c5cfc796af8b
Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents:
40
diff
changeset
|
524 rev_parents.reverse() |
c5cfc796af8b
Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents:
40
diff
changeset
|
525 |
c5cfc796af8b
Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents:
40
diff
changeset
|
526 for parent in rev_parents: |
43
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
41
diff
changeset
|
527 if isinstance(parent, clazz): |
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
|
528 break |
c5cfc796af8b
Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents:
40
diff
changeset
|
529 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
|
530 else: |
c5cfc796af8b
Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents:
40
diff
changeset
|
531 raise ValueError, 'can not find %s' % (self.target_path) |
c5cfc796af8b
Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents:
40
diff
changeset
|
532 |
c5cfc796af8b
Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents:
40
diff
changeset
|
533 attr_path = '.'.join(pparts[1:]) |
c5cfc796af8b
Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents:
40
diff
changeset
|
534 value = _dex_tree_get_child(parent, attr_path) |
43
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
41
diff
changeset
|
535 return value |
132
75a31967ebee
Following the ref in resotre_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
131
diff
changeset
|
536 |
75a31967ebee
Following the ref in resotre_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
131
diff
changeset
|
537 def set_value(self, value, parents): |
75a31967ebee
Following the ref in resotre_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
131
diff
changeset
|
538 from paraspace.dex_deptracker import _resolve_name_path |
75a31967ebee
Following the ref in resotre_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
131
diff
changeset
|
539 from paraspace.dex_deptracker import _dex_tree_get_child |
75a31967ebee
Following the ref in resotre_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
131
diff
changeset
|
540 |
75a31967ebee
Following the ref in resotre_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
131
diff
changeset
|
541 pparts = self.target_path.split('.') |
75a31967ebee
Following the ref in resotre_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
131
diff
changeset
|
542 clazz_name = pparts[0] |
75a31967ebee
Following the ref in resotre_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
131
diff
changeset
|
543 clazz, dummy = _resolve_name_path(clazz_name) |
75a31967ebee
Following the ref in resotre_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
131
diff
changeset
|
544 |
75a31967ebee
Following the ref in resotre_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
131
diff
changeset
|
545 rev_parents = list(parents) |
75a31967ebee
Following the ref in resotre_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
131
diff
changeset
|
546 rev_parents.reverse() |
75a31967ebee
Following the ref in resotre_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
131
diff
changeset
|
547 |
75a31967ebee
Following the ref in resotre_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
131
diff
changeset
|
548 for parent in rev_parents: |
75a31967ebee
Following the ref in resotre_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
131
diff
changeset
|
549 if isinstance(parent, clazz): |
75a31967ebee
Following the ref in resotre_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
131
diff
changeset
|
550 break |
75a31967ebee
Following the ref in resotre_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
131
diff
changeset
|
551 pass |
75a31967ebee
Following the ref in resotre_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
131
diff
changeset
|
552 else: |
75a31967ebee
Following the ref in resotre_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
131
diff
changeset
|
553 raise ValueError, 'can not find %s' % (self.target_path) |
75a31967ebee
Following the ref in resotre_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
131
diff
changeset
|
554 |
75a31967ebee
Following the ref in resotre_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
131
diff
changeset
|
555 attr_path = '.'.join(pparts[1:]) |
75a31967ebee
Following the ref in resotre_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
131
diff
changeset
|
556 _dex_tree_set_child(parent, attr_path, value) |
75a31967ebee
Following the ref in resotre_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
131
diff
changeset
|
557 pass |
40
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
33
diff
changeset
|
558 pass |
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
33
diff
changeset
|
559 |
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
33
diff
changeset
|
560 |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
561 class array(relocatable): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
562 count_name = None |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
563 child_type = None |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
564 items = None |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
565 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
566 def __init__(self, count_name, child_type): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
567 super(array, self).__init__() |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
568 self.count_name = count_name |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
569 self.child_type = child_type |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
570 pass |
0 | 571 |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
572 def parse(self, parent, data, off): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
573 nitem = parent |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
574 for name in self.count_name.split('.'): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
575 nitem = getattr(nitem, name) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
576 pass |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
577 obj = self.parse_nitem(parent, data, off, nitem) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
578 return obj |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
579 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
580 def parse_nitem(self, parent, data, off, nitem): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
581 moff = man_off(off) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
582 |
127
650244dcdd82
Sort arrays in rules requested by dalvik
Thinker K.F. Li <thinker@codemud.net>
parents:
126
diff
changeset
|
583 obj = self.__class__(self.count_name, self.child_type) |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
584 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
585 def parse(): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
586 item = obj.child_type.parse(parent, data, moff()) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
587 item_sz = obj.child_type.sizeof(item) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
588 moff(item_sz) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
589 return item |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
590 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
591 items = [parse() for i in range(nitem)] |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
592 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
593 obj.items = items |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
594 obj.data_size = moff() - off |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
595 return obj |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
596 |
124
8e42b2816893
Fixing compute_size() and sizeof() for DEX types.
Thinker K.F. Li <thinker@codemud.net>
parents:
123
diff
changeset
|
597 @staticmethod |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
598 def compute_size(self): |
120
c7a5de2d2334
Fix issue of compute_size of various types
Thinker K.F. Li <thinker@codemud.net>
parents:
119
diff
changeset
|
599 sizes = [_compute_sz(item, self.child_type) |
c7a5de2d2334
Fix issue of compute_size of various types
Thinker K.F. Li <thinker@codemud.net>
parents:
119
diff
changeset
|
600 for item in self.items] |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
601 size = sum(sizes) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
602 self.data_size = size |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
603 pass |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
604 |
65
ce1d5a058d5a
Fix argument issue of to_str() of dex types
Thinker K.F. Li <thinker@codemud.net>
parents:
64
diff
changeset
|
605 @staticmethod |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
606 def to_str(self): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
607 to_str = self.child_type.to_str |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
608 strs = [to_str(item) for item in self.items] |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
609 return ''.join(strs) |
25
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
610 |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
611 def children(self): |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
612 return ('items',) |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
613 pass |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
614 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
615 |
127
650244dcdd82
Sort arrays in rules requested by dalvik
Thinker K.F. Li <thinker@codemud.net>
parents:
126
diff
changeset
|
616 class array_sorted(array): |
650244dcdd82
Sort arrays in rules requested by dalvik
Thinker K.F. Li <thinker@codemud.net>
parents:
126
diff
changeset
|
617 pass |
650244dcdd82
Sort arrays in rules requested by dalvik
Thinker K.F. Li <thinker@codemud.net>
parents:
126
diff
changeset
|
618 |
650244dcdd82
Sort arrays in rules requested by dalvik
Thinker K.F. Li <thinker@codemud.net>
parents:
126
diff
changeset
|
619 |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
620 class composite(relocatable): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
621 child_names = None |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
622 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
623 def __init__(self): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
624 for child_name in self.child_names: |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
625 setattr(self, child_name, None) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
626 pass |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
627 pass |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
628 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
629 def parse_child(self, child_name, data, off): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
630 child_clazz = getattr(self.__class__, child_name) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
631 child = child_clazz.parse(self, data, off) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
632 setattr(self, child_name, child) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
633 pass |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
634 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
635 @classmethod |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
636 def parse(clazz, parent, data, off): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
637 moff = man_off(off) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
638 obj = clazz() |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
639 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
640 for child_name in clazz.child_names: |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
641 obj.parse_child(child_name, data, moff()) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
642 child = getattr(obj, child_name) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
643 child_clazz = getattr(obj.__class__, child_name) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
644 child_sz = child_clazz.sizeof(child) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
645 moff(child_sz) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
646 pass |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
647 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
648 obj.data_size = moff() - off |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
649 return obj |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
650 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
651 def compute_size(self): |
120
c7a5de2d2334
Fix issue of compute_size of various types
Thinker K.F. Li <thinker@codemud.net>
parents:
119
diff
changeset
|
652 children = [(getattr(self, child_name), |
c7a5de2d2334
Fix issue of compute_size of various types
Thinker K.F. Li <thinker@codemud.net>
parents:
119
diff
changeset
|
653 getattr(self.__class__, child_name)) |
64
d644c13b8cb2
composite run to_str() with children return by children()
Thinker K.F. Li <thinker@codemud.net>
parents:
63
diff
changeset
|
654 for child_name in self.children()] |
120
c7a5de2d2334
Fix issue of compute_size of various types
Thinker K.F. Li <thinker@codemud.net>
parents:
119
diff
changeset
|
655 child_sizes = [_compute_sz(child, child_type) |
c7a5de2d2334
Fix issue of compute_size of various types
Thinker K.F. Li <thinker@codemud.net>
parents:
119
diff
changeset
|
656 for child, child_type in children] |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
657 self.data_size = sum(child_sizes) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
658 pass |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
659 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
660 def to_str(self): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
661 child_clazzs = [getattr(self.__class__, child_name) |
64
d644c13b8cb2
composite run to_str() with children return by children()
Thinker K.F. Li <thinker@codemud.net>
parents:
63
diff
changeset
|
662 for child_name in self.children()] |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
663 children = [getattr(self, child_name) |
65
ce1d5a058d5a
Fix argument issue of to_str() of dex types
Thinker K.F. Li <thinker@codemud.net>
parents:
64
diff
changeset
|
664 for child_name in self.children()] |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
665 child_strs = map(lambda child_clazz, child: \ |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
666 child_clazz.to_str(child), |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
667 child_clazzs, children) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
668 return ''.join(child_strs) |
25
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
669 |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
670 def children(self): |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
671 return self.child_names |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
672 pass |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
673 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
674 |
17
d0806672da04
Declare dependencies for dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
15
diff
changeset
|
675 class cond(relocatable): |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
676 condition = None |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
677 child_type = None |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
678 value = None |
43
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
41
diff
changeset
|
679 is_true = None |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
680 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
681 def __init__(self, cond, child_type): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
682 self.condition = cond |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
683 self.child_type = child_type |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
684 pass |
25
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
685 |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
686 def parse(self, parent, data, off): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
687 if self.condition(parent, data, off): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
688 value = self.child_type.parse(parent, data, off) |
43
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
41
diff
changeset
|
689 is_true = True |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
690 else: |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
691 value = None |
43
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
41
diff
changeset
|
692 is_true = False |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
693 pass |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
694 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
695 obj = cond(self.condition, self.child_type) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
696 obj.value = value |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
697 obj.data_size = self.sizeof(obj) |
43
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
41
diff
changeset
|
698 obj.is_true = is_true |
5cea19126a11
Fix issue of _build_refs()
Thinker K.F. Li <thinker@codemud.net>
parents:
41
diff
changeset
|
699 |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
700 return obj |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
701 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
702 def sizeof(self, v): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
703 if v.value is None: |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
704 return 0 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
705 return self.child_type.sizeof(v.value) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
706 |
124
8e42b2816893
Fixing compute_size() and sizeof() for DEX types.
Thinker K.F. Li <thinker@codemud.net>
parents:
123
diff
changeset
|
707 @staticmethod |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
708 def compute_size(self): |
120
c7a5de2d2334
Fix issue of compute_size of various types
Thinker K.F. Li <thinker@codemud.net>
parents:
119
diff
changeset
|
709 if self.is_true: |
c7a5de2d2334
Fix issue of compute_size of various types
Thinker K.F. Li <thinker@codemud.net>
parents:
119
diff
changeset
|
710 self.data_size = _compute_sz(self.value, self.child_type) |
c7a5de2d2334
Fix issue of compute_size of various types
Thinker K.F. Li <thinker@codemud.net>
parents:
119
diff
changeset
|
711 else: |
c7a5de2d2334
Fix issue of compute_size of various types
Thinker K.F. Li <thinker@codemud.net>
parents:
119
diff
changeset
|
712 self.data_size = 0 |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
713 pass |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
714 pass |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
715 |
65
ce1d5a058d5a
Fix argument issue of to_str() of dex types
Thinker K.F. Li <thinker@codemud.net>
parents:
64
diff
changeset
|
716 @staticmethod |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
717 def to_str(self): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
718 if self.value is None: |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
719 return '' |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
720 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
721 data = self.child_type.to_str(self.value) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
722 return data |
25
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
723 |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
724 def children(self): |
53
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
51
diff
changeset
|
725 if self.is_true: |
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
51
diff
changeset
|
726 return ('value',) |
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
51
diff
changeset
|
727 return () |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
728 pass |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
729 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
730 |
17
d0806672da04
Declare dependencies for dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
15
diff
changeset
|
731 class switch(relocatable): |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
732 selector = None |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
733 map = None |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
734 child_type = None |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
735 value = None |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
736 |
25
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
737 _parent = None |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
738 |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
739 def __init__(self, selector, map): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
740 self.selector = selector |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
741 self.map = map |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
742 pass |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
743 |
25
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
744 def switch_key(self, parent): |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
745 selector = self.selector |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
746 sel_value = parent |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
747 for name in selector.split('.'): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
748 sel_value = getattr(sel_value, name) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
749 pass |
25
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
750 return sel_value |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
751 |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
752 def _get_child_type(self, parent): |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
753 sel_value = self.switch_key(parent) |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
754 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
755 child_type = self.map[sel_value] |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
756 return child_type |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
757 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
758 def parse(self, parent, data, off): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
759 child_type = self._get_child_type(parent) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
760 value = child_type.parse(parent, data, off) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
761 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
762 obj = switch(self.selector, self.map) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
763 obj.value = value |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
764 obj.child_type = child_type |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
765 obj.data_size = self.sizeof(obj) |
25
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
766 obj._parent = parent |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
767 return obj |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
768 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
769 @staticmethod |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
770 def sizeof(v): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
771 return v.child_type.sizeof(v.value) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
772 |
124
8e42b2816893
Fixing compute_size() and sizeof() for DEX types.
Thinker K.F. Li <thinker@codemud.net>
parents:
123
diff
changeset
|
773 @staticmethod |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
774 def compute_size(self): |
120
c7a5de2d2334
Fix issue of compute_size of various types
Thinker K.F. Li <thinker@codemud.net>
parents:
119
diff
changeset
|
775 self.data_size = _compute_sz(self.value, self.child_type) |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
776 pass |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
777 |
65
ce1d5a058d5a
Fix argument issue of to_str() of dex types
Thinker K.F. Li <thinker@codemud.net>
parents:
64
diff
changeset
|
778 @staticmethod |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
779 def to_str(self): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
780 data = self.child_type.to_str(self.value) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
781 return data |
25
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
782 |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
783 def children(self): |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
784 key = self.switch_key(self._parent) |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
785 return (repr(key),) |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
786 pass |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
787 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
788 |
53
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
51
diff
changeset
|
789 class abs_value(_dex_type): |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
790 value = None |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
791 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
792 def __init__(self, value): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
793 self.value = value |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
794 pass |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
795 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
796 def parse(self, parse, data, off): |
53
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
51
diff
changeset
|
797 return self.value |
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
51
diff
changeset
|
798 |
125
b9688a3badaa
Add compute_size() for DEX types that missed it
Thinker K.F. Li <thinker@codemud.net>
parents:
124
diff
changeset
|
799 @staticmethod |
b9688a3badaa
Add compute_size() for DEX types that missed it
Thinker K.F. Li <thinker@codemud.net>
parents:
124
diff
changeset
|
800 def compute_size(v): |
b9688a3badaa
Add compute_size() for DEX types that missed it
Thinker K.F. Li <thinker@codemud.net>
parents:
124
diff
changeset
|
801 pass |
b9688a3badaa
Add compute_size() for DEX types that missed it
Thinker K.F. Li <thinker@codemud.net>
parents:
124
diff
changeset
|
802 |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
803 def sizeof(self, v): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
804 return 0 |
125
b9688a3badaa
Add compute_size() for DEX types that missed it
Thinker K.F. Li <thinker@codemud.net>
parents:
124
diff
changeset
|
805 |
65
ce1d5a058d5a
Fix argument issue of to_str() of dex types
Thinker K.F. Li <thinker@codemud.net>
parents:
64
diff
changeset
|
806 @staticmethod |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
807 def to_str(self): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
808 return '' |
25
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
809 |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
810 def children(self): |
53
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
51
diff
changeset
|
811 return () |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
812 pass |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
813 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
814 |
124
8e42b2816893
Fixing compute_size() and sizeof() for DEX types.
Thinker K.F. Li <thinker@codemud.net>
parents:
123
diff
changeset
|
815 ## \brief Make a dependency to a depend-on for back type. |
8e42b2816893
Fixing compute_size() and sizeof() for DEX types.
Thinker K.F. Li <thinker@codemud.net>
parents:
123
diff
changeset
|
816 # |
8e42b2816893
Fixing compute_size() and sizeof() for DEX types.
Thinker K.F. Li <thinker@codemud.net>
parents:
123
diff
changeset
|
817 # Depend-on is the object that the back type is supposed to point to. |
8e42b2816893
Fixing compute_size() and sizeof() for DEX types.
Thinker K.F. Li <thinker@codemud.net>
parents:
123
diff
changeset
|
818 # Back type of a depend must be not a composite type while depend-on |
8e42b2816893
Fixing compute_size() and sizeof() for DEX types.
Thinker K.F. Li <thinker@codemud.net>
parents:
123
diff
changeset
|
819 # must be. |
8e42b2816893
Fixing compute_size() and sizeof() for DEX types.
Thinker K.F. Li <thinker@codemud.net>
parents:
123
diff
changeset
|
820 # |
48
3936d223989a
Introduce null_relocatable for any relocatable without real instance
Thinker K.F. Li <thinker@codemud.net>
parents:
45
diff
changeset
|
821 class depend(null_relocatable): |
17
d0806672da04
Declare dependencies for dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
15
diff
changeset
|
822 depend_on = None |
d0806672da04
Declare dependencies for dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
15
diff
changeset
|
823 |
d0806672da04
Declare dependencies for dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
15
diff
changeset
|
824 def __init__(self, depend_on): |
d0806672da04
Declare dependencies for dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
15
diff
changeset
|
825 self.depend_on = depend_on |
d0806672da04
Declare dependencies for dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
15
diff
changeset
|
826 pass |
d0806672da04
Declare dependencies for dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
15
diff
changeset
|
827 |
49
38fdd422f611
depend.child_type is replaced by null_relocatable.back_type
Thinker K.F. Li <thinker@codemud.net>
parents:
48
diff
changeset
|
828 def __call__(self, back_type): |
124
8e42b2816893
Fixing compute_size() and sizeof() for DEX types.
Thinker K.F. Li <thinker@codemud.net>
parents:
123
diff
changeset
|
829 assert type(back_type) != type or not issubclass(back_type, composite) |
49
38fdd422f611
depend.child_type is replaced by null_relocatable.back_type
Thinker K.F. Li <thinker@codemud.net>
parents:
48
diff
changeset
|
830 self.back_type = back_type |
17
d0806672da04
Declare dependencies for dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
15
diff
changeset
|
831 return self |
d0806672da04
Declare dependencies for dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
15
diff
changeset
|
832 |
d0806672da04
Declare dependencies for dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
15
diff
changeset
|
833 def parse(self, parent, data, off): |
49
38fdd422f611
depend.child_type is replaced by null_relocatable.back_type
Thinker K.F. Li <thinker@codemud.net>
parents:
48
diff
changeset
|
834 v = self.back_type.parse(parent, data, off) |
17
d0806672da04
Declare dependencies for dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
15
diff
changeset
|
835 return v |
d0806672da04
Declare dependencies for dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
15
diff
changeset
|
836 |
d0806672da04
Declare dependencies for dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
15
diff
changeset
|
837 def sizeof(self, v): |
58
c2a4921ec83b
Fix issue misbehavior for dependency when update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents:
57
diff
changeset
|
838 from paraspace.dex_deptracker import _resolve_name_path |
c2a4921ec83b
Fix issue misbehavior for dependency when update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents:
57
diff
changeset
|
839 from paraspace.dex_deptracker import _skip_marker_clazz |
c2a4921ec83b
Fix issue misbehavior for dependency when update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents:
57
diff
changeset
|
840 |
c2a4921ec83b
Fix issue misbehavior for dependency when update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents:
57
diff
changeset
|
841 depon_clazz, dummy = _resolve_name_path(self.depend_on) |
c2a4921ec83b
Fix issue misbehavior for dependency when update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents:
57
diff
changeset
|
842 depon_clazz = _skip_marker_clazz(depon_clazz) |
c2a4921ec83b
Fix issue misbehavior for dependency when update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents:
57
diff
changeset
|
843 if type(depon_clazz) == type and \ |
c2a4921ec83b
Fix issue misbehavior for dependency when update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents:
57
diff
changeset
|
844 isinstance(v, depon_clazz): |
c2a4921ec83b
Fix issue misbehavior for dependency when update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents:
57
diff
changeset
|
845 v = v.data_offset |
c2a4921ec83b
Fix issue misbehavior for dependency when update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents:
57
diff
changeset
|
846 elif type(depon_clazz) != type and \ |
c2a4921ec83b
Fix issue misbehavior for dependency when update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents:
57
diff
changeset
|
847 isinstance(v, depon_clazz.__class__): |
c2a4921ec83b
Fix issue misbehavior for dependency when update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents:
57
diff
changeset
|
848 v = v.data_offset |
c2a4921ec83b
Fix issue misbehavior for dependency when update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents:
57
diff
changeset
|
849 pass |
49
38fdd422f611
depend.child_type is replaced by null_relocatable.back_type
Thinker K.F. Li <thinker@codemud.net>
parents:
48
diff
changeset
|
850 v = self.back_type.sizeof(v) |
17
d0806672da04
Declare dependencies for dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
15
diff
changeset
|
851 return v |
d0806672da04
Declare dependencies for dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
15
diff
changeset
|
852 |
d0806672da04
Declare dependencies for dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
15
diff
changeset
|
853 def compute_size(self, child): |
120
c7a5de2d2334
Fix issue of compute_size of various types
Thinker K.F. Li <thinker@codemud.net>
parents:
119
diff
changeset
|
854 _compute_sz(child, self.back_type) |
17
d0806672da04
Declare dependencies for dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
15
diff
changeset
|
855 pass |
d0806672da04
Declare dependencies for dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
15
diff
changeset
|
856 |
d0806672da04
Declare dependencies for dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
15
diff
changeset
|
857 def to_str(self, child): |
49
38fdd422f611
depend.child_type is replaced by null_relocatable.back_type
Thinker K.F. Li <thinker@codemud.net>
parents:
48
diff
changeset
|
858 return self.back_type.to_str(child) |
25
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
859 pass |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
860 |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
861 |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
862 def _set_name_path_name(parent, name, obj): |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
863 if isinstance(parent, (list, dict)): |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
864 key = eval(name) |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
865 parent[key] = obj |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
866 return |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
867 setattr(parent, name, obj) |
17
d0806672da04
Declare dependencies for dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
15
diff
changeset
|
868 pass |
d0806672da04
Declare dependencies for dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
15
diff
changeset
|
869 |
d0806672da04
Declare dependencies for dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
15
diff
changeset
|
870 |
d0806672da04
Declare dependencies for dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
15
diff
changeset
|
871 class depend_off(depend): |
124
8e42b2816893
Fixing compute_size() and sizeof() for DEX types.
Thinker K.F. Li <thinker@codemud.net>
parents:
123
diff
changeset
|
872 def compute_size(self, child): |
8e42b2816893
Fixing compute_size() and sizeof() for DEX types.
Thinker K.F. Li <thinker@codemud.net>
parents:
123
diff
changeset
|
873 pass |
8e42b2816893
Fixing compute_size() and sizeof() for DEX types.
Thinker K.F. Li <thinker@codemud.net>
parents:
123
diff
changeset
|
874 |
8e42b2816893
Fixing compute_size() and sizeof() for DEX types.
Thinker K.F. Li <thinker@codemud.net>
parents:
123
diff
changeset
|
875 def sizeof(self, child): |
8e42b2816893
Fixing compute_size() and sizeof() for DEX types.
Thinker K.F. Li <thinker@codemud.net>
parents:
123
diff
changeset
|
876 if isinstance(child, composite): |
8e42b2816893
Fixing compute_size() and sizeof() for DEX types.
Thinker K.F. Li <thinker@codemud.net>
parents:
123
diff
changeset
|
877 return self.back_type.sizeof(child.data_offset) |
8e42b2816893
Fixing compute_size() and sizeof() for DEX types.
Thinker K.F. Li <thinker@codemud.net>
parents:
123
diff
changeset
|
878 return self.back_type.sizeof(child) |
17
d0806672da04
Declare dependencies for dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
15
diff
changeset
|
879 pass |
d0806672da04
Declare dependencies for dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
15
diff
changeset
|
880 |
d0806672da04
Declare dependencies for dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
15
diff
changeset
|
881 |
d0806672da04
Declare dependencies for dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
15
diff
changeset
|
882 class depend_off_rel(depend): |
d0806672da04
Declare dependencies for dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
15
diff
changeset
|
883 relative_to = None |
124
8e42b2816893
Fixing compute_size() and sizeof() for DEX types.
Thinker K.F. Li <thinker@codemud.net>
parents:
123
diff
changeset
|
884 _depon2_log = {} |
17
d0806672da04
Declare dependencies for dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
15
diff
changeset
|
885 |
d0806672da04
Declare dependencies for dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
15
diff
changeset
|
886 def __init__(self, relative_to, depend_on): |
d0806672da04
Declare dependencies for dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
15
diff
changeset
|
887 super(depend_off_rel, self).__init__(depend_on) |
25
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
888 self.relative_to = relative_to |
17
d0806672da04
Declare dependencies for dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
15
diff
changeset
|
889 pass |
124
8e42b2816893
Fixing compute_size() and sizeof() for DEX types.
Thinker K.F. Li <thinker@codemud.net>
parents:
123
diff
changeset
|
890 |
8e42b2816893
Fixing compute_size() and sizeof() for DEX types.
Thinker K.F. Li <thinker@codemud.net>
parents:
123
diff
changeset
|
891 def parse(self, parent, data, off): |
8e42b2816893
Fixing compute_size() and sizeof() for DEX types.
Thinker K.F. Li <thinker@codemud.net>
parents:
123
diff
changeset
|
892 v = super(depend_off_rel, self).parse(parent, data, off) |
8e42b2816893
Fixing compute_size() and sizeof() for DEX types.
Thinker K.F. Li <thinker@codemud.net>
parents:
123
diff
changeset
|
893 return v |
8e42b2816893
Fixing compute_size() and sizeof() for DEX types.
Thinker K.F. Li <thinker@codemud.net>
parents:
123
diff
changeset
|
894 |
8e42b2816893
Fixing compute_size() and sizeof() for DEX types.
Thinker K.F. Li <thinker@codemud.net>
parents:
123
diff
changeset
|
895 def compute_size(self, child): |
8e42b2816893
Fixing compute_size() and sizeof() for DEX types.
Thinker K.F. Li <thinker@codemud.net>
parents:
123
diff
changeset
|
896 pass |
8e42b2816893
Fixing compute_size() and sizeof() for DEX types.
Thinker K.F. Li <thinker@codemud.net>
parents:
123
diff
changeset
|
897 |
8e42b2816893
Fixing compute_size() and sizeof() for DEX types.
Thinker K.F. Li <thinker@codemud.net>
parents:
123
diff
changeset
|
898 def sizeof(self, child): |
8e42b2816893
Fixing compute_size() and sizeof() for DEX types.
Thinker K.F. Li <thinker@codemud.net>
parents:
123
diff
changeset
|
899 if isinstance(child, composite): |
8e42b2816893
Fixing compute_size() and sizeof() for DEX types.
Thinker K.F. Li <thinker@codemud.net>
parents:
123
diff
changeset
|
900 pivot = self._depon2_log[child] # depon2 |
8e42b2816893
Fixing compute_size() and sizeof() for DEX types.
Thinker K.F. Li <thinker@codemud.net>
parents:
123
diff
changeset
|
901 off_diff = child.data_offset - pivot.data_offset |
8e42b2816893
Fixing compute_size() and sizeof() for DEX types.
Thinker K.F. Li <thinker@codemud.net>
parents:
123
diff
changeset
|
902 return self.back_type.sizeof(off_diff) |
8e42b2816893
Fixing compute_size() and sizeof() for DEX types.
Thinker K.F. Li <thinker@codemud.net>
parents:
123
diff
changeset
|
903 return self.back_type.sizeof(child) |
17
d0806672da04
Declare dependencies for dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
15
diff
changeset
|
904 pass |
d0806672da04
Declare dependencies for dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
15
diff
changeset
|
905 |
d0806672da04
Declare dependencies for dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
15
diff
changeset
|
906 |
19
6008b9a9d33e
Declare dependencies for indics for classes in dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
18
diff
changeset
|
907 class depend_idx(depend): |
58
c2a4921ec83b
Fix issue misbehavior for dependency when update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents:
57
diff
changeset
|
908 def sizeof(self, v): |
c2a4921ec83b
Fix issue misbehavior for dependency when update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents:
57
diff
changeset
|
909 from paraspace.dex_deptracker import _resolve_name_path |
c2a4921ec83b
Fix issue misbehavior for dependency when update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents:
57
diff
changeset
|
910 from paraspace.dex_deptracker import _skip_marker_clazz |
c2a4921ec83b
Fix issue misbehavior for dependency when update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents:
57
diff
changeset
|
911 |
c2a4921ec83b
Fix issue misbehavior for dependency when update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents:
57
diff
changeset
|
912 depon_clazz, dummy = _resolve_name_path(self.depend_on) |
c2a4921ec83b
Fix issue misbehavior for dependency when update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents:
57
diff
changeset
|
913 depon_clazz = _skip_marker_clazz(depon_clazz) |
c2a4921ec83b
Fix issue misbehavior for dependency when update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents:
57
diff
changeset
|
914 do_child_clazz = depon_clazz.child_type # depon_clazz must be an array |
c2a4921ec83b
Fix issue misbehavior for dependency when update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents:
57
diff
changeset
|
915 |
c2a4921ec83b
Fix issue misbehavior for dependency when update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents:
57
diff
changeset
|
916 if type(do_child_clazz) == type and \ |
c2a4921ec83b
Fix issue misbehavior for dependency when update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents:
57
diff
changeset
|
917 isinstance(v, do_child_clazz): |
c2a4921ec83b
Fix issue misbehavior for dependency when update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents:
57
diff
changeset
|
918 v = v.data_idx |
c2a4921ec83b
Fix issue misbehavior for dependency when update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents:
57
diff
changeset
|
919 elif type(do_child_clazz) != type and \ |
c2a4921ec83b
Fix issue misbehavior for dependency when update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents:
57
diff
changeset
|
920 isinstance(v, do_child_clazz.__class__): |
c2a4921ec83b
Fix issue misbehavior for dependency when update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents:
57
diff
changeset
|
921 v = v.data_idx |
c2a4921ec83b
Fix issue misbehavior for dependency when update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents:
57
diff
changeset
|
922 pass |
c2a4921ec83b
Fix issue misbehavior for dependency when update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents:
57
diff
changeset
|
923 v = self.back_type.sizeof(v) |
c2a4921ec83b
Fix issue misbehavior for dependency when update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents:
57
diff
changeset
|
924 return v |
124
8e42b2816893
Fixing compute_size() and sizeof() for DEX types.
Thinker K.F. Li <thinker@codemud.net>
parents:
123
diff
changeset
|
925 |
8e42b2816893
Fixing compute_size() and sizeof() for DEX types.
Thinker K.F. Li <thinker@codemud.net>
parents:
123
diff
changeset
|
926 def compute_size(self, child): |
58
c2a4921ec83b
Fix issue misbehavior for dependency when update_offset()
Thinker K.F. Li <thinker@codemud.net>
parents:
57
diff
changeset
|
927 pass |
124
8e42b2816893
Fixing compute_size() and sizeof() for DEX types.
Thinker K.F. Li <thinker@codemud.net>
parents:
123
diff
changeset
|
928 |
8e42b2816893
Fixing compute_size() and sizeof() for DEX types.
Thinker K.F. Li <thinker@codemud.net>
parents:
123
diff
changeset
|
929 def sizeof(self, child): |
8e42b2816893
Fixing compute_size() and sizeof() for DEX types.
Thinker K.F. Li <thinker@codemud.net>
parents:
123
diff
changeset
|
930 if isinstance(child, composite): |
8e42b2816893
Fixing compute_size() and sizeof() for DEX types.
Thinker K.F. Li <thinker@codemud.net>
parents:
123
diff
changeset
|
931 return self.back_type.sizeof(child.data_idx) |
8e42b2816893
Fixing compute_size() and sizeof() for DEX types.
Thinker K.F. Li <thinker@codemud.net>
parents:
123
diff
changeset
|
932 return self.back_type.sizeof(child) |
19
6008b9a9d33e
Declare dependencies for indics for classes in dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
18
diff
changeset
|
933 pass |
6008b9a9d33e
Declare dependencies for indics for classes in dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
18
diff
changeset
|
934 |
6008b9a9d33e
Declare dependencies for indics for classes in dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
18
diff
changeset
|
935 |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
936 class _DEX_header(composite): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
937 magic = rawstr(8) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
938 checksum = uint32 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
939 signature = rawstr(20) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
940 fileSize = uint32 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
941 headerSize = uint32 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
942 endianTag = uint32 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
943 linkSize = uint32 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
944 linkOff = uint32 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
945 mapOff = uint32 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
946 stringIdsSize = uint32 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
947 stringIdsOff = uint32 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
948 typeIdsSize = uint32 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
949 typeIdsOff = uint32 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
950 protoIdsSize = uint32 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
951 protoIdsOff = uint32 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
952 fieldIdsSize = uint32 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
953 fieldIdsOff = uint32 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
954 methodIdsSize = uint32 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
955 methodIdsOff = uint32 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
956 classDefsSize = uint32 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
957 classDefsOff = uint32 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
958 dataSize = uint32 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
959 dataOff = uint32 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
960 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
961 child_names = \ |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
962 'magic checksum signature fileSize headerSize endianTag ' \ |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
963 'linkSize linkOff mapOff stringIdsSize stringIdsOff typeIdsSize ' \ |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
964 'typeIdsOff protoIdsSize protoIdsOff fieldIdsSize fieldIdsOff ' \ |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
965 'methodIdsSize methodIdsOff classDefsSize classDefsOff ' \ |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
966 'dataSize dataOff'.split() |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
967 pass |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
968 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
969 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
970 class _DEX_MapItem(composite): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
971 type = uint16 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
972 unused = uint16 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
973 size = uint32 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
974 offset = uint32 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
975 |
2 | 976 types = { |
977 0x0000: 'kDexTypeHeaderItem', | |
978 0x0001: 'kDexTypeStringIdItem', | |
979 0x0002: 'kDexTypeTypeIdItem', | |
980 0x0003: 'kDexTypeProtoIdItem', | |
981 0x0004: 'kDexTypeFieldIdItem', | |
982 0x0005: 'kDexTypeMethodIdItem', | |
983 0x0006: 'kDexTypeClassDefItem', | |
984 0x1000: 'kDexTypeMapList', | |
985 0x1001: 'kDexTypeTypeList', | |
986 0x1002: 'kDexTypeAnnotationSetRefList', | |
987 0x1003: 'kDexTypeAnnotationSetItem', | |
988 0x2000: 'kDexTypeClassDataItem', | |
989 0x2001: 'kDexTypeCodeItem', | |
990 0x2002: 'kDexTypeStringDataItem', | |
991 0x2003: 'kDexTypeDebugInfoItem', | |
992 0x2004: 'kDexTypeAnnotationItem', | |
993 0x2005: 'kDexTypeEncodedArrayItem', | |
994 0x2006: 'kDexTypeAnnotationsDirectoryItem' | |
995 } | |
131
044bfc415577
Fix issue of data map verification.
Thinker K.F. Li <thinker@codemud.net>
parents:
127
diff
changeset
|
996 |
044bfc415577
Fix issue of data map verification.
Thinker K.F. Li <thinker@codemud.net>
parents:
127
diff
changeset
|
997 name_to_types = dict([(_name, _typenum) |
044bfc415577
Fix issue of data map verification.
Thinker K.F. Li <thinker@codemud.net>
parents:
127
diff
changeset
|
998 for _typenum, _name in types.items()]) |
0 | 999 |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1000 child_names = \ |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1001 'type unused size offset'.split() |
0 | 1002 pass |
1003 | |
1004 | |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1005 class _DEX_MapItemBlock(composite): |
123
78357afb4a9d
Test case for restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
121
diff
changeset
|
1006 padding = auto_align(2) |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1007 num = uint32 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1008 items = array('num', _DEX_MapItem) |
0 | 1009 |
123
78357afb4a9d
Test case for restore_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
121
diff
changeset
|
1010 child_names = 'padding num items'.split() |
0 | 1011 pass |
1012 | |
1013 | |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1014 class _DEX_StringId(composite): |
17
d0806672da04
Declare dependencies for dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
15
diff
changeset
|
1015 stringDataOff = depend_off('_DEX_StringDataItem')(uint32) |
0 | 1016 |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1017 child_names = ('stringDataOff',) |
127
650244dcdd82
Sort arrays in rules requested by dalvik
Thinker K.F. Li <thinker@codemud.net>
parents:
126
diff
changeset
|
1018 |
650244dcdd82
Sort arrays in rules requested by dalvik
Thinker K.F. Li <thinker@codemud.net>
parents:
126
diff
changeset
|
1019 def __cmp__(self, other): |
650244dcdd82
Sort arrays in rules requested by dalvik
Thinker K.F. Li <thinker@codemud.net>
parents:
126
diff
changeset
|
1020 assert isinstance(other, _DEX_StringId) |
650244dcdd82
Sort arrays in rules requested by dalvik
Thinker K.F. Li <thinker@codemud.net>
parents:
126
diff
changeset
|
1021 assert isinstance(self.stringDataOff, _DEX_StringDataItem) |
650244dcdd82
Sort arrays in rules requested by dalvik
Thinker K.F. Li <thinker@codemud.net>
parents:
126
diff
changeset
|
1022 assert isinstance(other.stringDataOff, _DEX_StringDataItem) |
650244dcdd82
Sort arrays in rules requested by dalvik
Thinker K.F. Li <thinker@codemud.net>
parents:
126
diff
changeset
|
1023 |
650244dcdd82
Sort arrays in rules requested by dalvik
Thinker K.F. Li <thinker@codemud.net>
parents:
126
diff
changeset
|
1024 return cmp(self.stringDataOff.data.data, other.stringDataOff.data.data) |
0 | 1025 pass |
1026 | |
1027 | |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1028 class _DEX_TypeId(composite): |
19
6008b9a9d33e
Declare dependencies for indics for classes in dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
18
diff
changeset
|
1029 descriptorIdx = depend_idx('DEXFile.stringIds')(uint32) |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1030 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1031 child_names = ('descriptorIdx',) |
127
650244dcdd82
Sort arrays in rules requested by dalvik
Thinker K.F. Li <thinker@codemud.net>
parents:
126
diff
changeset
|
1032 |
650244dcdd82
Sort arrays in rules requested by dalvik
Thinker K.F. Li <thinker@codemud.net>
parents:
126
diff
changeset
|
1033 def __cmp__(self, other): |
650244dcdd82
Sort arrays in rules requested by dalvik
Thinker K.F. Li <thinker@codemud.net>
parents:
126
diff
changeset
|
1034 assert isinstance(other, _DEX_TypeId) |
650244dcdd82
Sort arrays in rules requested by dalvik
Thinker K.F. Li <thinker@codemud.net>
parents:
126
diff
changeset
|
1035 assert isinstance(self.descriptorIdx, _DEX_StringId) |
650244dcdd82
Sort arrays in rules requested by dalvik
Thinker K.F. Li <thinker@codemud.net>
parents:
126
diff
changeset
|
1036 assert isinstance(other.descriptorIdx, _DEX_StringId) |
650244dcdd82
Sort arrays in rules requested by dalvik
Thinker K.F. Li <thinker@codemud.net>
parents:
126
diff
changeset
|
1037 |
650244dcdd82
Sort arrays in rules requested by dalvik
Thinker K.F. Li <thinker@codemud.net>
parents:
126
diff
changeset
|
1038 return cmp(self.descriptorIdx, other.descriptorIdx) |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1039 pass |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1040 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1041 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1042 class _DEX_ProtoId(composite): |
19
6008b9a9d33e
Declare dependencies for indics for classes in dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
18
diff
changeset
|
1043 shortyIdx = depend_idx('DEXFile.stringIds')(uint32) |
6008b9a9d33e
Declare dependencies for indics for classes in dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
18
diff
changeset
|
1044 returnTypeIdx = depend_idx('DEXFile.typeIds')(uint32) |
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
|
1045 parametersOff = uint32 |
c5cfc796af8b
Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents:
40
diff
changeset
|
1046 parametersOffRef = cond((lambda parent, data, off: parent.parametersOff), |
c5cfc796af8b
Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents:
40
diff
changeset
|
1047 depend_off('_DEX_TypeList') |
c5cfc796af8b
Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents:
40
diff
changeset
|
1048 (value_ref('_DEX_ProtoId.parametersOff'))) |
0 | 1049 |
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
|
1050 child_names = 'shortyIdx returnTypeIdx parametersOff ' \ |
c5cfc796af8b
Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents:
40
diff
changeset
|
1051 'parametersOffRef'.split() |
127
650244dcdd82
Sort arrays in rules requested by dalvik
Thinker K.F. Li <thinker@codemud.net>
parents:
126
diff
changeset
|
1052 |
650244dcdd82
Sort arrays in rules requested by dalvik
Thinker K.F. Li <thinker@codemud.net>
parents:
126
diff
changeset
|
1053 ## \brief Compare two linked _DEX_ProtoId instances. |
650244dcdd82
Sort arrays in rules requested by dalvik
Thinker K.F. Li <thinker@codemud.net>
parents:
126
diff
changeset
|
1054 def __cmp__(self, other): |
650244dcdd82
Sort arrays in rules requested by dalvik
Thinker K.F. Li <thinker@codemud.net>
parents:
126
diff
changeset
|
1055 assert isinstance(other, _DEX_ProtoId) |
650244dcdd82
Sort arrays in rules requested by dalvik
Thinker K.F. Li <thinker@codemud.net>
parents:
126
diff
changeset
|
1056 assert isinstance(self.returnTypeIdx, _DEX_TypeId) |
650244dcdd82
Sort arrays in rules requested by dalvik
Thinker K.F. Li <thinker@codemud.net>
parents:
126
diff
changeset
|
1057 assert isinstance(other.returnTypeIdx, _DEX_TypeId) |
650244dcdd82
Sort arrays in rules requested by dalvik
Thinker K.F. Li <thinker@codemud.net>
parents:
126
diff
changeset
|
1058 |
650244dcdd82
Sort arrays in rules requested by dalvik
Thinker K.F. Li <thinker@codemud.net>
parents:
126
diff
changeset
|
1059 r = cmp(self.returnTypeIdx, other.returnTypeIdx) |
650244dcdd82
Sort arrays in rules requested by dalvik
Thinker K.F. Li <thinker@codemud.net>
parents:
126
diff
changeset
|
1060 if r != 0: |
650244dcdd82
Sort arrays in rules requested by dalvik
Thinker K.F. Li <thinker@codemud.net>
parents:
126
diff
changeset
|
1061 return r |
650244dcdd82
Sort arrays in rules requested by dalvik
Thinker K.F. Li <thinker@codemud.net>
parents:
126
diff
changeset
|
1062 if not self.parametersOffRef.is_true: |
650244dcdd82
Sort arrays in rules requested by dalvik
Thinker K.F. Li <thinker@codemud.net>
parents:
126
diff
changeset
|
1063 return -1 |
650244dcdd82
Sort arrays in rules requested by dalvik
Thinker K.F. Li <thinker@codemud.net>
parents:
126
diff
changeset
|
1064 if not other.parametersOffRef.is_true: |
650244dcdd82
Sort arrays in rules requested by dalvik
Thinker K.F. Li <thinker@codemud.net>
parents:
126
diff
changeset
|
1065 return 1 |
650244dcdd82
Sort arrays in rules requested by dalvik
Thinker K.F. Li <thinker@codemud.net>
parents:
126
diff
changeset
|
1066 |
650244dcdd82
Sort arrays in rules requested by dalvik
Thinker K.F. Li <thinker@codemud.net>
parents:
126
diff
changeset
|
1067 tlist0 = self.parametersOffRef.value.typeItems.items |
650244dcdd82
Sort arrays in rules requested by dalvik
Thinker K.F. Li <thinker@codemud.net>
parents:
126
diff
changeset
|
1068 tlist1 = other.parametersOffRef.value.typeItems.items |
650244dcdd82
Sort arrays in rules requested by dalvik
Thinker K.F. Li <thinker@codemud.net>
parents:
126
diff
changeset
|
1069 for param0, param1 in map(None, tlist0, tlist1): |
650244dcdd82
Sort arrays in rules requested by dalvik
Thinker K.F. Li <thinker@codemud.net>
parents:
126
diff
changeset
|
1070 if not (param0 and param1): |
650244dcdd82
Sort arrays in rules requested by dalvik
Thinker K.F. Li <thinker@codemud.net>
parents:
126
diff
changeset
|
1071 break |
650244dcdd82
Sort arrays in rules requested by dalvik
Thinker K.F. Li <thinker@codemud.net>
parents:
126
diff
changeset
|
1072 |
650244dcdd82
Sort arrays in rules requested by dalvik
Thinker K.F. Li <thinker@codemud.net>
parents:
126
diff
changeset
|
1073 r = cmp(param0.typeIdx, param1.typeIdx) |
650244dcdd82
Sort arrays in rules requested by dalvik
Thinker K.F. Li <thinker@codemud.net>
parents:
126
diff
changeset
|
1074 if r != 0: |
650244dcdd82
Sort arrays in rules requested by dalvik
Thinker K.F. Li <thinker@codemud.net>
parents:
126
diff
changeset
|
1075 return r |
650244dcdd82
Sort arrays in rules requested by dalvik
Thinker K.F. Li <thinker@codemud.net>
parents:
126
diff
changeset
|
1076 pass |
650244dcdd82
Sort arrays in rules requested by dalvik
Thinker K.F. Li <thinker@codemud.net>
parents:
126
diff
changeset
|
1077 |
650244dcdd82
Sort arrays in rules requested by dalvik
Thinker K.F. Li <thinker@codemud.net>
parents:
126
diff
changeset
|
1078 return cmp(len(tlist0), len(tlist1)) |
0 | 1079 pass |
1080 | |
1
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1081 |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1082 class _DEX_FieldId(composite): |
19
6008b9a9d33e
Declare dependencies for indics for classes in dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
18
diff
changeset
|
1083 classIdx = depend_idx('DEXFile.typeIds')(uint16) |
6008b9a9d33e
Declare dependencies for indics for classes in dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
18
diff
changeset
|
1084 typeIdx = depend_idx('DEXFile.typeIds')(uint16) |
6008b9a9d33e
Declare dependencies for indics for classes in dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
18
diff
changeset
|
1085 nameIdx = depend_idx('DEXFile.stringIds')(uint32) |
0 | 1086 |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1087 child_names = 'classIdx typeIdx nameIdx'.split() |
127
650244dcdd82
Sort arrays in rules requested by dalvik
Thinker K.F. Li <thinker@codemud.net>
parents:
126
diff
changeset
|
1088 |
650244dcdd82
Sort arrays in rules requested by dalvik
Thinker K.F. Li <thinker@codemud.net>
parents:
126
diff
changeset
|
1089 def __cmp__(self, other): |
650244dcdd82
Sort arrays in rules requested by dalvik
Thinker K.F. Li <thinker@codemud.net>
parents:
126
diff
changeset
|
1090 assert isinstance(other, _DEX_FieldId) |
650244dcdd82
Sort arrays in rules requested by dalvik
Thinker K.F. Li <thinker@codemud.net>
parents:
126
diff
changeset
|
1091 assert isinstance(self.classIdx, _DEX_TypeId) |
650244dcdd82
Sort arrays in rules requested by dalvik
Thinker K.F. Li <thinker@codemud.net>
parents:
126
diff
changeset
|
1092 assert isinstance(other.classIdx, _DEX_TypeId) |
650244dcdd82
Sort arrays in rules requested by dalvik
Thinker K.F. Li <thinker@codemud.net>
parents:
126
diff
changeset
|
1093 |
650244dcdd82
Sort arrays in rules requested by dalvik
Thinker K.F. Li <thinker@codemud.net>
parents:
126
diff
changeset
|
1094 r = cmp(self.classIdx, other.classIdx) |
650244dcdd82
Sort arrays in rules requested by dalvik
Thinker K.F. Li <thinker@codemud.net>
parents:
126
diff
changeset
|
1095 if r != 0: |
650244dcdd82
Sort arrays in rules requested by dalvik
Thinker K.F. Li <thinker@codemud.net>
parents:
126
diff
changeset
|
1096 return r |
650244dcdd82
Sort arrays in rules requested by dalvik
Thinker K.F. Li <thinker@codemud.net>
parents:
126
diff
changeset
|
1097 r = cmp(self.nameIdx, other.nameIdx) |
650244dcdd82
Sort arrays in rules requested by dalvik
Thinker K.F. Li <thinker@codemud.net>
parents:
126
diff
changeset
|
1098 if r != 0: |
650244dcdd82
Sort arrays in rules requested by dalvik
Thinker K.F. Li <thinker@codemud.net>
parents:
126
diff
changeset
|
1099 return r |
650244dcdd82
Sort arrays in rules requested by dalvik
Thinker K.F. Li <thinker@codemud.net>
parents:
126
diff
changeset
|
1100 r = cmp(self.typeIdx, other.typeIdx) |
650244dcdd82
Sort arrays in rules requested by dalvik
Thinker K.F. Li <thinker@codemud.net>
parents:
126
diff
changeset
|
1101 return r |
0 | 1102 pass |
1103 | |
1104 | |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1105 class _DEX_MethodId(composite): |
19
6008b9a9d33e
Declare dependencies for indics for classes in dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
18
diff
changeset
|
1106 classIdx = depend_idx('DEXFile.typeIds')(uint16) |
6008b9a9d33e
Declare dependencies for indics for classes in dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
18
diff
changeset
|
1107 protoIdx = depend_idx('DEXFile.protoIds')(uint16) |
6008b9a9d33e
Declare dependencies for indics for classes in dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
18
diff
changeset
|
1108 nameIdx = depend_idx('DEXFile.stringIds')(uint32) |
2 | 1109 |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1110 child_names = 'classIdx protoIdx nameIdx'.split() |
127
650244dcdd82
Sort arrays in rules requested by dalvik
Thinker K.F. Li <thinker@codemud.net>
parents:
126
diff
changeset
|
1111 |
650244dcdd82
Sort arrays in rules requested by dalvik
Thinker K.F. Li <thinker@codemud.net>
parents:
126
diff
changeset
|
1112 def __cmp__(self, other): |
650244dcdd82
Sort arrays in rules requested by dalvik
Thinker K.F. Li <thinker@codemud.net>
parents:
126
diff
changeset
|
1113 assert isinstance(other, _DEX_MethodId) |
650244dcdd82
Sort arrays in rules requested by dalvik
Thinker K.F. Li <thinker@codemud.net>
parents:
126
diff
changeset
|
1114 assert isinstance(self.classIdx, _DEX_TypeId) |
650244dcdd82
Sort arrays in rules requested by dalvik
Thinker K.F. Li <thinker@codemud.net>
parents:
126
diff
changeset
|
1115 assert isinstance(other.classIdx, _DEX_TypeId) |
650244dcdd82
Sort arrays in rules requested by dalvik
Thinker K.F. Li <thinker@codemud.net>
parents:
126
diff
changeset
|
1116 |
650244dcdd82
Sort arrays in rules requested by dalvik
Thinker K.F. Li <thinker@codemud.net>
parents:
126
diff
changeset
|
1117 r = cmp(self.classIdx, other.classIdx) |
650244dcdd82
Sort arrays in rules requested by dalvik
Thinker K.F. Li <thinker@codemud.net>
parents:
126
diff
changeset
|
1118 if r != 0: |
650244dcdd82
Sort arrays in rules requested by dalvik
Thinker K.F. Li <thinker@codemud.net>
parents:
126
diff
changeset
|
1119 return r |
650244dcdd82
Sort arrays in rules requested by dalvik
Thinker K.F. Li <thinker@codemud.net>
parents:
126
diff
changeset
|
1120 r = cmp(self.nameIdx, other.nameIdx) |
650244dcdd82
Sort arrays in rules requested by dalvik
Thinker K.F. Li <thinker@codemud.net>
parents:
126
diff
changeset
|
1121 if r != 0: |
650244dcdd82
Sort arrays in rules requested by dalvik
Thinker K.F. Li <thinker@codemud.net>
parents:
126
diff
changeset
|
1122 return r |
650244dcdd82
Sort arrays in rules requested by dalvik
Thinker K.F. Li <thinker@codemud.net>
parents:
126
diff
changeset
|
1123 r = cmp(self.typeIdx, other.protoIdx) |
650244dcdd82
Sort arrays in rules requested by dalvik
Thinker K.F. Li <thinker@codemud.net>
parents:
126
diff
changeset
|
1124 return r |
2 | 1125 pass |
1126 | |
1127 | |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1128 class _DEX_ClassDef(composite): |
19
6008b9a9d33e
Declare dependencies for indics for classes in dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
18
diff
changeset
|
1129 classIdx = depend_idx('DEXFile.typeIds')(uint32) |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1130 accessFlags = uint32 |
19
6008b9a9d33e
Declare dependencies for indics for classes in dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
18
diff
changeset
|
1131 superclassIdx = depend_idx('DEXFile.typeIds')(uint32) |
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
|
1132 interfacesOff = uint32 |
c5cfc796af8b
Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents:
40
diff
changeset
|
1133 interfacesOffRef = cond((lambda parent, data, off: parent.interfacesOff), |
c5cfc796af8b
Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents:
40
diff
changeset
|
1134 depend_off('_DEX_TypeList') |
c5cfc796af8b
Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents:
40
diff
changeset
|
1135 (value_ref('_DEX_ClassDef.interfacesOff'))) |
19
6008b9a9d33e
Declare dependencies for indics for classes in dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
18
diff
changeset
|
1136 sourceFileIdx = depend_idx('DEXFile.stringIds')(uint32) |
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
|
1137 annotationsOff = uint32 |
c5cfc796af8b
Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents:
40
diff
changeset
|
1138 annotationsOffRef = cond((lambda parent, data, off: parent.annotationsOff), |
c5cfc796af8b
Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents:
40
diff
changeset
|
1139 depend_off('_DEX_AnnotationsDirectoryItem') |
c5cfc796af8b
Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents:
40
diff
changeset
|
1140 (value_ref('_DEX_ClassDef.annotationsOff'))) |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1141 classDataOff = uint32 |
81
7adb8c3b3c44
Add classDataOffRef for _DEX_ClassDef
Thinker K.F. Li <thinker@codemud.net>
parents:
79
diff
changeset
|
1142 classDataOffRef = cond((lambda parent, data, off: parent.classDataOff), |
7adb8c3b3c44
Add classDataOffRef for _DEX_ClassDef
Thinker K.F. Li <thinker@codemud.net>
parents:
79
diff
changeset
|
1143 depend_off('_DEX_ClassData') |
7adb8c3b3c44
Add classDataOffRef for _DEX_ClassDef
Thinker K.F. Li <thinker@codemud.net>
parents:
79
diff
changeset
|
1144 (value_ref('_DEX_ClassDef.classDataOff'))) |
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
|
1145 staticValuesOff = uint32 |
c5cfc796af8b
Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents:
40
diff
changeset
|
1146 staticValuesOffRef = cond((lambda parent, data, off: |
c5cfc796af8b
Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents:
40
diff
changeset
|
1147 parent.staticValuesOff), |
c5cfc796af8b
Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents:
40
diff
changeset
|
1148 depend_off('_DEX_EncodedArrayItem') |
c5cfc796af8b
Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents:
40
diff
changeset
|
1149 (value_ref('_DEX_ClassDef.staticValuesOff'))) |
2 | 1150 |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1151 child_names = \ |
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
|
1152 'classIdx accessFlags superclassIdx interfacesOff interfacesOffRef ' \ |
c5cfc796af8b
Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents:
40
diff
changeset
|
1153 'sourceFileIdx annotationsOff annotationsOffRef ' \ |
98
c0c127c7b37e
Check and fix issues of map sizes
Thinker K.F. Li <thinker@codemud.net>
parents:
97
diff
changeset
|
1154 'classDataOff classDataOffRef staticValuesOff ' \ |
c0c127c7b37e
Check and fix issues of map sizes
Thinker K.F. Li <thinker@codemud.net>
parents:
97
diff
changeset
|
1155 'staticValuesOffRef'.split() |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1156 pass |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1157 |
2 | 1158 |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1159 class _DEX_ClassDataHeader(composite): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1160 staticFieldsSize = uleb128 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1161 instanceFieldsSize = uleb128 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1162 directMethodsSize = uleb128 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1163 virtualMethodsSize = uleb128 |
13
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1164 |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1165 child_names = \ |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1166 'staticFieldsSize instanceFieldsSize directMethodsSize ' \ |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1167 'virtualMethodsSize'.split() |
2 | 1168 pass |
1169 | |
1170 | |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1171 class _DEX_Field(composite): |
19
6008b9a9d33e
Declare dependencies for indics for classes in dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
18
diff
changeset
|
1172 fieldIdx = depend_idx('DEXFile.fieldIds')(uleb128) |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1173 accessFlags = uleb128 |
2 | 1174 |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1175 child_names = 'fieldIdx accessFlags'.split() |
2 | 1176 pass |
1177 | |
1178 | |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1179 class _DEX_Method(composite): |
19
6008b9a9d33e
Declare dependencies for indics for classes in dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
18
diff
changeset
|
1180 methodIdx = depend_idx('DEXFile.methodIds')(uleb128) |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1181 accessFlags = uleb128 |
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
|
1182 codeOff = uleb128 |
c5cfc796af8b
Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents:
40
diff
changeset
|
1183 codeOffRef = cond((lambda parent, data, off: parent.codeOff), |
c5cfc796af8b
Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents:
40
diff
changeset
|
1184 depend_off('_DEX_Code') |
c5cfc796af8b
Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents:
40
diff
changeset
|
1185 (value_ref('_DEX_Method.codeOff'))) |
2 | 1186 |
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
|
1187 child_names = 'methodIdx accessFlags codeOff codeOffRef'.split() |
2 | 1188 pass |
1189 | |
1190 | |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1191 class _DEX_ClassData(composite): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1192 header = _DEX_ClassDataHeader |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1193 staticFields = array('header.staticFieldsSize', _DEX_Field) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1194 instanceFields = array('header.instanceFieldsSize', _DEX_Field) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1195 directMethods = array('header.directMethodsSize', _DEX_Method) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1196 virtualMethods = array('header.virtualMethodsSize', _DEX_Method) |
6
917f0a9b9d06
Refactor _DEX_TypeItem from _DEX_TypeList for layout info tracking
Thinker K.F. Li <thinker@codemud.net>
parents:
5
diff
changeset
|
1197 |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1198 child_names = \ |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1199 'header ' \ |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1200 'staticFields instanceFields directMethods virtualMethods'.split() |
6
917f0a9b9d06
Refactor _DEX_TypeItem from _DEX_TypeList for layout info tracking
Thinker K.F. Li <thinker@codemud.net>
parents:
5
diff
changeset
|
1201 pass |
917f0a9b9d06
Refactor _DEX_TypeItem from _DEX_TypeList for layout info tracking
Thinker K.F. Li <thinker@codemud.net>
parents:
5
diff
changeset
|
1202 |
917f0a9b9d06
Refactor _DEX_TypeItem from _DEX_TypeList for layout info tracking
Thinker K.F. Li <thinker@codemud.net>
parents:
5
diff
changeset
|
1203 |
106
7821c6e89622
dexfile_redirect_types() is almost ready.
Thinker K.F. Li <thinker@codemud.net>
parents:
104
diff
changeset
|
1204 class _DEX_TypeList_typeid(composite): |
7821c6e89622
dexfile_redirect_types() is almost ready.
Thinker K.F. Li <thinker@codemud.net>
parents:
104
diff
changeset
|
1205 typeIdx = depend_idx('DEXFile.typeIds')(uint16) |
7821c6e89622
dexfile_redirect_types() is almost ready.
Thinker K.F. Li <thinker@codemud.net>
parents:
104
diff
changeset
|
1206 |
7821c6e89622
dexfile_redirect_types() is almost ready.
Thinker K.F. Li <thinker@codemud.net>
parents:
104
diff
changeset
|
1207 child_names = ('typeIdx',) |
7821c6e89622
dexfile_redirect_types() is almost ready.
Thinker K.F. Li <thinker@codemud.net>
parents:
104
diff
changeset
|
1208 pass |
7821c6e89622
dexfile_redirect_types() is almost ready.
Thinker K.F. Li <thinker@codemud.net>
parents:
104
diff
changeset
|
1209 |
7821c6e89622
dexfile_redirect_types() is almost ready.
Thinker K.F. Li <thinker@codemud.net>
parents:
104
diff
changeset
|
1210 |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1211 class _DEX_TypeList(composite): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1212 num = uint32 |
106
7821c6e89622
dexfile_redirect_types() is almost ready.
Thinker K.F. Li <thinker@codemud.net>
parents:
104
diff
changeset
|
1213 typeItems = array('num', _DEX_TypeList_typeid) |
6
917f0a9b9d06
Refactor _DEX_TypeItem from _DEX_TypeList for layout info tracking
Thinker K.F. Li <thinker@codemud.net>
parents:
5
diff
changeset
|
1214 |
40
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
33
diff
changeset
|
1215 child_names = 'num typeItems'.split() |
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
33
diff
changeset
|
1216 pass |
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
33
diff
changeset
|
1217 |
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
33
diff
changeset
|
1218 |
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
33
diff
changeset
|
1219 class _DEX_TypeList_align(composite): |
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
33
diff
changeset
|
1220 padding = auto_align(2) # 2 bits alignment |
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
33
diff
changeset
|
1221 value = _DEX_TypeList |
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
33
diff
changeset
|
1222 |
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
33
diff
changeset
|
1223 child_names = 'padding value'.split() |
2 | 1224 pass |
1225 | |
1226 | |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1227 class _DEX_Try(composite): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1228 startAddr = uint32 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1229 insnCount = uint16 |
17
d0806672da04
Declare dependencies for dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
15
diff
changeset
|
1230 handlerOff = depend_off_rel('_DEX_Code.handlers_size', |
57
fa8fe7d714b9
Fix semantic bug of dexfile.depend_off_rel by searching relative offset.
Thinker K.F. Li <thinker@codemud.net>
parents:
55
diff
changeset
|
1231 '_DEX_Catch')(uint16) |
2 | 1232 |
57
fa8fe7d714b9
Fix semantic bug of dexfile.depend_off_rel by searching relative offset.
Thinker K.F. Li <thinker@codemud.net>
parents:
55
diff
changeset
|
1233 child_names = 'startAddr insnCount handlerOff'.split() |
2 | 1234 pass |
1235 | |
1236 | |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1237 class _DEX_CatchHandler(composite): |
19
6008b9a9d33e
Declare dependencies for indics for classes in dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
18
diff
changeset
|
1238 typeIdx = depend_idx('DEXFile.typeIds')(uleb128) |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1239 address = uleb128 |
2 | 1240 |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1241 child_names = 'typeIdx address'.split() |
2 | 1242 pass |
1243 | |
1244 | |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1245 class _DEX_CatchAllHandler(composite): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1246 address = uleb128 |
2 | 1247 |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1248 child_names = 'address'.split() |
2 | 1249 pass |
1250 | |
1251 | |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1252 class _DEX_Catch(composite): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1253 size = leb128 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1254 handlers = array('count', _DEX_CatchHandler) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1255 catchAllHandler = cond((lambda parent, data, off: parent.catchesAll), |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1256 _DEX_CatchAllHandler) |
2 | 1257 |
57
fa8fe7d714b9
Fix semantic bug of dexfile.depend_off_rel by searching relative offset.
Thinker K.F. Li <thinker@codemud.net>
parents:
55
diff
changeset
|
1258 child_names = 'size handlers catchAllHandler'.split() |
2 | 1259 |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1260 @property |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1261 def catchesAll(self): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1262 return self.size <= 0 |
2 | 1263 |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1264 @property |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1265 def count(self): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1266 if self.size < 0: |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1267 return -self.size |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1268 return self.size |
2 | 1269 pass |
1270 | |
1271 | |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1272 class _DEX_Code(composite): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1273 registersSize = uint16 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1274 insSize = uint16 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1275 outsSize = uint16 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1276 triesSize = uint16 |
17
d0806672da04
Declare dependencies for dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
15
diff
changeset
|
1277 debugInfoOff = depend_off('_DEX_DebugInfoItem')(uint32) |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1278 insnsSize = uint32 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1279 insns = rawstr_size_name('insnsSize', 2) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1280 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1281 _has_tries = lambda parent, data, off: parent.triesSize > 0 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1282 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1283 padding = cond(_has_tries, auto_align(2)) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1284 try_items = cond(_has_tries, |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1285 array('triesSize', _DEX_Try)) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1286 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1287 handlers_size = cond(_has_tries, uleb128) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1288 catch_handler_items = cond(_has_tries, |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1289 array('handlers_size.value', _DEX_Catch)) |
2 | 1290 |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1291 padding2 = auto_align(2) |
2 | 1292 |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1293 child_names = \ |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1294 'registersSize insSize outsSize triesSize debugInfoOff ' \ |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1295 'insnsSize insns padding try_items handlers_size ' \ |
57
fa8fe7d714b9
Fix semantic bug of dexfile.depend_off_rel by searching relative offset.
Thinker K.F. Li <thinker@codemud.net>
parents:
55
diff
changeset
|
1296 'catch_handler_items padding2'.split() |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1297 pass |
13
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1298 |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1299 |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1300 class _DEX_AnnotationSetItem(composite): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1301 size = uint32 |
17
d0806672da04
Declare dependencies for dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
15
diff
changeset
|
1302 annotationOffs = array('size', depend_off('_DEX_AnnotationItem')(uint32)) |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1303 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1304 child_names = 'size annotationOffs'.split() |
2 | 1305 pass |
1306 | |
1307 | |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1308 class _DEX_FieldAnnotationsItem(composite): |
19
6008b9a9d33e
Declare dependencies for indics for classes in dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
18
diff
changeset
|
1309 fieldIdx = depend_idx('DEXFile.fieldIds')(uint32) |
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
|
1310 annotationsOff = uint32 |
c5cfc796af8b
Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents:
40
diff
changeset
|
1311 annotationsOffRef = cond((lambda parent, data, off: parent.annotationsOff), |
c5cfc796af8b
Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents:
40
diff
changeset
|
1312 depend_off('_DEX_AnnotationSetItem') |
c5cfc796af8b
Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents:
40
diff
changeset
|
1313 (value_ref('_DEX_FieldAnnotationsItem.' |
c5cfc796af8b
Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents:
40
diff
changeset
|
1314 'annotationsOff'))) |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1315 |
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
|
1316 child_names = 'fieldIdx annotationsOff annotationsOffRef'.split() |
127
650244dcdd82
Sort arrays in rules requested by dalvik
Thinker K.F. Li <thinker@codemud.net>
parents:
126
diff
changeset
|
1317 |
650244dcdd82
Sort arrays in rules requested by dalvik
Thinker K.F. Li <thinker@codemud.net>
parents:
126
diff
changeset
|
1318 def __cmp__(self, other): |
650244dcdd82
Sort arrays in rules requested by dalvik
Thinker K.F. Li <thinker@codemud.net>
parents:
126
diff
changeset
|
1319 assert isinstance(other, _DEX_FieldAnnotationsItem) |
650244dcdd82
Sort arrays in rules requested by dalvik
Thinker K.F. Li <thinker@codemud.net>
parents:
126
diff
changeset
|
1320 assert isinstance(self.fieldIdx, _DEX_FieldId) |
650244dcdd82
Sort arrays in rules requested by dalvik
Thinker K.F. Li <thinker@codemud.net>
parents:
126
diff
changeset
|
1321 assert isinstance(other.fieldIdx, _DEX_FieldId) |
650244dcdd82
Sort arrays in rules requested by dalvik
Thinker K.F. Li <thinker@codemud.net>
parents:
126
diff
changeset
|
1322 |
650244dcdd82
Sort arrays in rules requested by dalvik
Thinker K.F. Li <thinker@codemud.net>
parents:
126
diff
changeset
|
1323 return cmp(self.fieldIdx, other.fieldIdx) |
4
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
1324 pass |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
1325 |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
1326 |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1327 class _DEX_MethodAnnotationsItem(composite): |
19
6008b9a9d33e
Declare dependencies for indics for classes in dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
18
diff
changeset
|
1328 methodIdx = depend_idx('DEXFile.methodIds')(uint32) |
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
|
1329 annotationsOff = uint32 |
c5cfc796af8b
Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents:
40
diff
changeset
|
1330 annotationsOffRef = cond((lambda parent, data, off: parent.annotationsOff), |
c5cfc796af8b
Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents:
40
diff
changeset
|
1331 depend_off('_DEX_AnnotationSetItem') |
c5cfc796af8b
Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents:
40
diff
changeset
|
1332 (value_ref('_DEX_MethodAnnotationsItem.' |
c5cfc796af8b
Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents:
40
diff
changeset
|
1333 'annotationsOff'))) |
4
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
1334 |
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
|
1335 child_names = 'methodIdx annotationsOff annotationsOffRef'.split() |
127
650244dcdd82
Sort arrays in rules requested by dalvik
Thinker K.F. Li <thinker@codemud.net>
parents:
126
diff
changeset
|
1336 |
650244dcdd82
Sort arrays in rules requested by dalvik
Thinker K.F. Li <thinker@codemud.net>
parents:
126
diff
changeset
|
1337 def __cmp__(self, other): |
650244dcdd82
Sort arrays in rules requested by dalvik
Thinker K.F. Li <thinker@codemud.net>
parents:
126
diff
changeset
|
1338 assert isinstance(other, _DEX_MethodAnnotationsItem) |
650244dcdd82
Sort arrays in rules requested by dalvik
Thinker K.F. Li <thinker@codemud.net>
parents:
126
diff
changeset
|
1339 assert isinstance(self.methodIdx, _DEX_MethodId) |
650244dcdd82
Sort arrays in rules requested by dalvik
Thinker K.F. Li <thinker@codemud.net>
parents:
126
diff
changeset
|
1340 assert isinstance(other.methodIdx, _DEX_MethodId) |
650244dcdd82
Sort arrays in rules requested by dalvik
Thinker K.F. Li <thinker@codemud.net>
parents:
126
diff
changeset
|
1341 |
650244dcdd82
Sort arrays in rules requested by dalvik
Thinker K.F. Li <thinker@codemud.net>
parents:
126
diff
changeset
|
1342 return cmp(self.methodIdx, other.methodIdx) |
4
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
1343 pass |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
1344 |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
1345 |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1346 class _DEX_ParameterAnnotationsItem(composite): |
19
6008b9a9d33e
Declare dependencies for indics for classes in dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
18
diff
changeset
|
1347 methodIdx = depend_idx('DEXFile.methodIds')(uint32) |
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
|
1348 annotationsOff = uint32 |
c5cfc796af8b
Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents:
40
diff
changeset
|
1349 annotationsOffRef = cond((lambda parent, data, off: parent.annotationsOff), |
c5cfc796af8b
Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents:
40
diff
changeset
|
1350 depend_off('_DEX_AnnotationSetItem') |
c5cfc796af8b
Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents:
40
diff
changeset
|
1351 (value_ref('_DEX_ParameterAnnotationsItem.' |
c5cfc796af8b
Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents:
40
diff
changeset
|
1352 'annotationsOff'))) |
4
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
1353 |
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
|
1354 child_names = 'methodIdx annotationsOff annotationsOffRef'.split() |
127
650244dcdd82
Sort arrays in rules requested by dalvik
Thinker K.F. Li <thinker@codemud.net>
parents:
126
diff
changeset
|
1355 |
650244dcdd82
Sort arrays in rules requested by dalvik
Thinker K.F. Li <thinker@codemud.net>
parents:
126
diff
changeset
|
1356 def __cmp__(self, other): |
650244dcdd82
Sort arrays in rules requested by dalvik
Thinker K.F. Li <thinker@codemud.net>
parents:
126
diff
changeset
|
1357 assert isinstance(other, _DEX_ParameterAnnotationsItem) |
650244dcdd82
Sort arrays in rules requested by dalvik
Thinker K.F. Li <thinker@codemud.net>
parents:
126
diff
changeset
|
1358 assert isinstance(self.methodIdx, _DEX_MethodId) |
650244dcdd82
Sort arrays in rules requested by dalvik
Thinker K.F. Li <thinker@codemud.net>
parents:
126
diff
changeset
|
1359 assert isinstance(other.methodIdx, _DEX_MethodId) |
650244dcdd82
Sort arrays in rules requested by dalvik
Thinker K.F. Li <thinker@codemud.net>
parents:
126
diff
changeset
|
1360 |
650244dcdd82
Sort arrays in rules requested by dalvik
Thinker K.F. Li <thinker@codemud.net>
parents:
126
diff
changeset
|
1361 return cmp(self.methodIdx, other.methodIdx) |
4
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
1362 pass |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
1363 |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
1364 |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1365 class _DEX_AnnotationsDirectoryItem(composite): |
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
|
1366 classAnnotationsOff = uint32 |
c5cfc796af8b
Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents:
40
diff
changeset
|
1367 classAnnotationsOffRef = cond((lambda parent, data, off: |
c5cfc796af8b
Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents:
40
diff
changeset
|
1368 parent.classAnnotationsOff), |
c5cfc796af8b
Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents:
40
diff
changeset
|
1369 depend_off('_DEX_AnnotationSetItem') |
c5cfc796af8b
Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents:
40
diff
changeset
|
1370 (value_ref('_DEX_AnnotationsDirectoryItem.' |
c5cfc796af8b
Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents:
40
diff
changeset
|
1371 'classAnnotationsOff'))) |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1372 fieldsSize = uint32 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1373 methodsSize = uint32 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1374 parametersSize = uint32 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1375 |
127
650244dcdd82
Sort arrays in rules requested by dalvik
Thinker K.F. Li <thinker@codemud.net>
parents:
126
diff
changeset
|
1376 fieldAnnotationsItems = array_sorted('fieldsSize', |
650244dcdd82
Sort arrays in rules requested by dalvik
Thinker K.F. Li <thinker@codemud.net>
parents:
126
diff
changeset
|
1377 _DEX_FieldAnnotationsItem) |
650244dcdd82
Sort arrays in rules requested by dalvik
Thinker K.F. Li <thinker@codemud.net>
parents:
126
diff
changeset
|
1378 methodAnnotationsItems = array_sorted('methodsSize', |
650244dcdd82
Sort arrays in rules requested by dalvik
Thinker K.F. Li <thinker@codemud.net>
parents:
126
diff
changeset
|
1379 _DEX_MethodAnnotationsItem) |
650244dcdd82
Sort arrays in rules requested by dalvik
Thinker K.F. Li <thinker@codemud.net>
parents:
126
diff
changeset
|
1380 parameterAnnotationsItems = array_sorted('parametersSize', |
650244dcdd82
Sort arrays in rules requested by dalvik
Thinker K.F. Li <thinker@codemud.net>
parents:
126
diff
changeset
|
1381 _DEX_ParameterAnnotationsItem) |
4
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
1382 |
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
|
1383 child_names = 'classAnnotationsOff classAnnotationsOffRef ' \ |
c5cfc796af8b
Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents:
40
diff
changeset
|
1384 'fieldsSize methodsSize ' \ |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1385 'parametersSize fieldAnnotationsItems methodAnnotationsItems ' \ |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1386 'parameterAnnotationsItems'.split() |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1387 pass |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1388 |
13
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1389 |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1390 class _DEX_AnnotationArray(composite): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1391 size = uleb128 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1392 # annotations = array('size', _DEX_AnnotationMember_noname) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1393 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1394 child_names = 'size annotations'.split() |
3
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
1395 pass |
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
1396 |
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
1397 |
8 | 1398 ## |
1399 # | |
1400 # \see createAnnotationMember() in dalvik/vm/reflect/Annotation.c | |
1401 # | |
19
6008b9a9d33e
Declare dependencies for indics for classes in dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
18
diff
changeset
|
1402 class _DEX_AnnotationMember_noname(composite): |
8 | 1403 # |
1404 # Constants from DexFile.h | |
1405 # | |
1406 kDexAnnotationByte = 0x00 | |
1407 kDexAnnotationShort = 0x02 | |
1408 kDexAnnotationChar = 0x03 | |
1409 kDexAnnotationInt = 0x04 | |
1410 kDexAnnotationLong = 0x06 | |
1411 kDexAnnotationFloat = 0x10 | |
1412 kDexAnnotationDouble = 0x11 | |
1413 kDexAnnotationString = 0x17 | |
1414 kDexAnnotationType = 0x18 | |
1415 kDexAnnotationField = 0x19 | |
1416 kDexAnnotationMethod = 0x1a | |
1417 kDexAnnotationEnum = 0x1b | |
1418 kDexAnnotationArray = 0x1c | |
1419 kDexAnnotationAnnotation = 0x1d | |
1420 kDexAnnotationNull = 0x1e | |
1421 kDexAnnotationBoolean = 0x1f | |
1422 | |
1423 kDexAnnotationValueTypeMask = 0x1f | |
1424 kDexAnnotationValueArgShift = 5 | |
1425 | |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1426 valueType = uint8 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1427 value_map = { |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1428 kDexAnnotationByte: rawstr_size_name('value_width'), |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1429 kDexAnnotationShort: rawstr_size_name('value_width'), |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1430 kDexAnnotationChar: rawstr_size_name('value_width'), |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1431 kDexAnnotationInt: rawstr_size_name('value_width'), |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1432 kDexAnnotationLong: rawstr_size_name('value_width'), |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1433 kDexAnnotationFloat: rawstr_size_name('value_width'), |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1434 kDexAnnotationDouble: rawstr_size_name('value_width'), |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1435 kDexAnnotationString: rawstr_size_name('value_width'), |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1436 kDexAnnotationType: rawstr_size_name('value_width'), |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1437 kDexAnnotationMethod: rawstr_size_name('value_width'), |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1438 kDexAnnotationField: rawstr_size_name('value_width'), |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1439 kDexAnnotationEnum: rawstr_size_name('value_width'), |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1440 kDexAnnotationNull: abs_value(0), |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1441 kDexAnnotationBoolean: abs_value(0), # width != 0 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1442 kDexAnnotationArray: _DEX_AnnotationArray, |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1443 # kDexAnnotationAnnotation: _DEX_AnnotationItem_novisibility |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1444 } |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1445 value = switch('vtype', value_map) |
8 | 1446 |
19
6008b9a9d33e
Declare dependencies for indics for classes in dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
18
diff
changeset
|
1447 child_names = 'valueType value'.split() |
8 | 1448 |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1449 @property |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1450 def vtype(self): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1451 vtype = self.valueType & self.kDexAnnotationValueTypeMask |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1452 return vtype |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1453 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1454 @property |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1455 def width(self): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1456 width = self.valueType >> self.kDexAnnotationValueArgShift |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1457 return width |
13
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1458 |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1459 @property |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1460 def value_width(self): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1461 width = self.valueType >> self.kDexAnnotationValueArgShift |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1462 return width + 1 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1463 pass |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1464 |
13
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1465 |
19
6008b9a9d33e
Declare dependencies for indics for classes in dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
18
diff
changeset
|
1466 class _DEX_AnnotationMember(_DEX_AnnotationMember_noname): |
6008b9a9d33e
Declare dependencies for indics for classes in dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
18
diff
changeset
|
1467 nameIdx = depend_idx('DEXFile.stringIds')(uleb128) |
6008b9a9d33e
Declare dependencies for indics for classes in dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
18
diff
changeset
|
1468 |
6008b9a9d33e
Declare dependencies for indics for classes in dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
18
diff
changeset
|
1469 child_names = 'nameIdx valueType value'.split() |
127
650244dcdd82
Sort arrays in rules requested by dalvik
Thinker K.F. Li <thinker@codemud.net>
parents:
126
diff
changeset
|
1470 |
650244dcdd82
Sort arrays in rules requested by dalvik
Thinker K.F. Li <thinker@codemud.net>
parents:
126
diff
changeset
|
1471 def __cmp__(self, other): |
650244dcdd82
Sort arrays in rules requested by dalvik
Thinker K.F. Li <thinker@codemud.net>
parents:
126
diff
changeset
|
1472 assert isinstance(other, _DEX_AnnotationMember) |
650244dcdd82
Sort arrays in rules requested by dalvik
Thinker K.F. Li <thinker@codemud.net>
parents:
126
diff
changeset
|
1473 assert isinstance(self.nameIdx, _DEX_StringId) |
650244dcdd82
Sort arrays in rules requested by dalvik
Thinker K.F. Li <thinker@codemud.net>
parents:
126
diff
changeset
|
1474 assert isinstance(other.nameIdx, _DEX_StringId) |
650244dcdd82
Sort arrays in rules requested by dalvik
Thinker K.F. Li <thinker@codemud.net>
parents:
126
diff
changeset
|
1475 |
650244dcdd82
Sort arrays in rules requested by dalvik
Thinker K.F. Li <thinker@codemud.net>
parents:
126
diff
changeset
|
1476 return cmp(self.nameIdx, other.nameIdx) |
8 | 1477 pass |
1478 | |
1479 | |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1480 _DEX_AnnotationArray.annotations = array('size', _DEX_AnnotationMember_noname) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1481 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1482 |
8 | 1483 ## \brief Annotation item |
1484 # | |
1485 # \see processEncodedAnnotation() in dalvik/vm/reflect/Annotation.c | |
1486 # | |
19
6008b9a9d33e
Declare dependencies for indics for classes in dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
18
diff
changeset
|
1487 class _DEX_AnnotationItem_novisibility(composite): |
6008b9a9d33e
Declare dependencies for indics for classes in dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
18
diff
changeset
|
1488 typeIdx = depend_idx('DEXFile.typeIds')(uleb128) |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1489 size = uleb128 |
127
650244dcdd82
Sort arrays in rules requested by dalvik
Thinker K.F. Li <thinker@codemud.net>
parents:
126
diff
changeset
|
1490 members = array_sorted('size', _DEX_AnnotationMember) |
8 | 1491 |
19
6008b9a9d33e
Declare dependencies for indics for classes in dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
18
diff
changeset
|
1492 child_names = 'typeIdx size members'.split() |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1493 |
8 | 1494 kDexVisibilityBuild = 0x00 |
1495 kDexVisibilityRuntime = 0x01 | |
1496 kDexVisibilitySystem = 0x02 | |
127
650244dcdd82
Sort arrays in rules requested by dalvik
Thinker K.F. Li <thinker@codemud.net>
parents:
126
diff
changeset
|
1497 |
650244dcdd82
Sort arrays in rules requested by dalvik
Thinker K.F. Li <thinker@codemud.net>
parents:
126
diff
changeset
|
1498 def __cmp__(self, other): |
650244dcdd82
Sort arrays in rules requested by dalvik
Thinker K.F. Li <thinker@codemud.net>
parents:
126
diff
changeset
|
1499 assert isinstance(other, _DEX_AnnotationItem_novisibility) |
650244dcdd82
Sort arrays in rules requested by dalvik
Thinker K.F. Li <thinker@codemud.net>
parents:
126
diff
changeset
|
1500 assert isinstance(self.typeIdx, _DEX_TypeId) |
650244dcdd82
Sort arrays in rules requested by dalvik
Thinker K.F. Li <thinker@codemud.net>
parents:
126
diff
changeset
|
1501 assert isinstance(other.typeIdx, _DEX_TypeId) |
650244dcdd82
Sort arrays in rules requested by dalvik
Thinker K.F. Li <thinker@codemud.net>
parents:
126
diff
changeset
|
1502 |
650244dcdd82
Sort arrays in rules requested by dalvik
Thinker K.F. Li <thinker@codemud.net>
parents:
126
diff
changeset
|
1503 return cmp(self.typeIdx, other.typeIdx) |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1504 pass |
8 | 1505 |
1506 | |
19
6008b9a9d33e
Declare dependencies for indics for classes in dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
18
diff
changeset
|
1507 class _DEX_AnnotationItem(_DEX_AnnotationItem_novisibility): |
6008b9a9d33e
Declare dependencies for indics for classes in dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
18
diff
changeset
|
1508 visibility = uint8 |
6008b9a9d33e
Declare dependencies for indics for classes in dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
18
diff
changeset
|
1509 |
6008b9a9d33e
Declare dependencies for indics for classes in dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
18
diff
changeset
|
1510 child_names = 'visibility typeIdx size members'.split() |
8 | 1511 pass |
1512 | |
1513 | |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1514 _DEX_AnnotationMember. \ |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1515 value_map[_DEX_AnnotationMember.kDexAnnotationAnnotation] = \ |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1516 _DEX_AnnotationItem_novisibility |
10
123c7a8bbf4c
Parse EncodedArrayItems
Thinker K.F. Li <thinker@codemud.net>
parents:
9
diff
changeset
|
1517 |
123c7a8bbf4c
Parse EncodedArrayItems
Thinker K.F. Li <thinker@codemud.net>
parents:
9
diff
changeset
|
1518 |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1519 class _DEX_EncodedArrayItem(composite): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1520 size = uleb128 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1521 elements = array('size', _DEX_AnnotationMember_noname) |
10
123c7a8bbf4c
Parse EncodedArrayItems
Thinker K.F. Li <thinker@codemud.net>
parents:
9
diff
changeset
|
1522 |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1523 child_names = 'size elements'.split() |
10
123c7a8bbf4c
Parse EncodedArrayItems
Thinker K.F. Li <thinker@codemud.net>
parents:
9
diff
changeset
|
1524 pass |
123c7a8bbf4c
Parse EncodedArrayItems
Thinker K.F. Li <thinker@codemud.net>
parents:
9
diff
changeset
|
1525 |
123c7a8bbf4c
Parse EncodedArrayItems
Thinker K.F. Li <thinker@codemud.net>
parents:
9
diff
changeset
|
1526 |
124
8e42b2816893
Fixing compute_size() and sizeof() for DEX types.
Thinker K.F. Li <thinker@codemud.net>
parents:
123
diff
changeset
|
1527 class _DEX_DebugCodeBlock(_dex_type): |
11 | 1528 DBG_END_SEQUENCE = 0x00 |
1529 DBG_ADVANCE_PC = 0x01 | |
1530 DBG_ADVANCE_LINE = 0x02 | |
1531 DBG_START_LOCAL = 0x03 | |
1532 DBG_START_LOCAL_EXTENDED = 0x04 | |
1533 DBG_END_LOCAL = 0x05 | |
1534 DBG_RESTART_LOCAL = 0x06 | |
1535 DBG_SET_PROLOGUE_END = 0x07 | |
1536 DBG_SET_EPILOGUE_BEGIN = 0x08 | |
1537 DBG_SET_FILE = 0x09 | |
1538 DBG_FIRST_SPECIAL = 0x0a | |
1539 DBG_LINE_BASE = -4 | |
1540 DBG_LINE_RANGE = 15 | |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1541 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1542 opcodes = None |
11 | 1543 data_size = None |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1544 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1545 @staticmethod |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1546 def parse(parent, data, off): |
11 | 1547 moff = man_off(off) |
1548 | |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1549 self = _DEX_DebugCodeBlock() |
11 | 1550 |
1551 # | |
1552 # Parse debug opcodes | |
1553 # | |
1554 opcodes = [] | |
1555 while True: | |
1556 opcode = _to_uint(data[moff(1):moff()]) | |
1557 | |
1558 if opcode == self.DBG_END_SEQUENCE: | |
1559 opcodes.append((opcode,)) | |
1560 break | |
1561 elif opcode == self.DBG_ADVANCE_PC: | |
1562 adv, sh = _uleb128(data[moff():moff() + 5]) | |
1563 moff(sh) | |
1564 opcodes.append((opcode, adv)) | |
1565 pass | |
1566 elif opcode == self.DBG_ADVANCE_LINE: | |
13
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1567 adv, sh = _leb128(data[moff():moff() + 5]) |
11 | 1568 moff(sh) |
1569 opcodes.append((opcode, adv)) | |
1570 pass | |
1571 elif opcode in (self.DBG_START_LOCAL, | |
1572 self.DBG_START_LOCAL_EXTENDED): | |
1573 reg, sh = _uleb128(data[moff():moff() + 5]) | |
1574 moff(sh) | |
1575 name, sh = _uleb128(data[moff():moff() + 5]) | |
1576 moff(sh) | |
1577 descriptor, sh = _uleb128(data[moff():moff() + 5]) | |
1578 moff(sh) | |
1579 if opcode == self.DBG_START_LOCAL_EXTENDED: | |
1580 signature, sh = _uleb128(data[moff():moff() + 5]) | |
1581 moff(sh) | |
1582 opcodes.append((opcode, reg, name, descriptor, signature)) | |
1583 else: | |
1584 opcodes.append((opcode, reg, name, descriptor)) | |
1585 pass | |
1586 pass | |
1587 elif opcode == self.DBG_END_LOCAL: | |
1588 reg, sh = _uleb128(data[moff():moff() + 5]) | |
1589 moff(sh) | |
1590 opcodes.append((opcode, reg)) | |
1591 pass | |
1592 elif opcode == self.DBG_RESTART_LOCAL: | |
1593 reg, sh = _uleb128(data[moff():moff() + 5]) | |
1594 moff(sh) | |
1595 opcodes.append((opcode, reg)) | |
1596 pass | |
1597 elif opcode in (self.DBG_SET_PROLOGUE_END, | |
1598 self.DBG_SET_EPILOGUE_BEGIN, | |
1599 self.DBG_SET_FILE): | |
1600 opcodes.append((opcode,)) | |
1601 pass | |
1602 else: | |
1603 opcodes.append((opcode,)) | |
1604 pass | |
1605 pass | |
25
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
1606 self.opcodes = tuple(opcodes) |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1607 |
11 | 1608 self.data_size = moff() - off |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1609 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1610 return self |
13
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1611 |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1612 def compute_size(self): |
120
c7a5de2d2334
Fix issue of compute_size of various types
Thinker K.F. Li <thinker@codemud.net>
parents:
119
diff
changeset
|
1613 import itertools |
c7a5de2d2334
Fix issue of compute_size of various types
Thinker K.F. Li <thinker@codemud.net>
parents:
119
diff
changeset
|
1614 |
13
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1615 def compute_opcode_size(code): |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1616 opcode = code[0] |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1617 |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1618 if opcode == self.DBG_END_SEQUENCE: |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1619 size = 1 |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1620 elif opcode == self.DBG_ADVANCE_PC: |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1621 size = 1 + _uleb128_sz(code[1]) |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1622 elif opcode == self.DBG_ADVANCE_LINE: |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1623 size = 1 + _leb128_sz(code[1]) |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1624 elif opcode in (self.DBG_START_LOCAL, |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1625 self.DBG_START_LOCAL_EXTENDED): |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1626 size = 1 + _uleb128_sz(code[1]) + _uleb128_sz(code[2]) + \ |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1627 _uleb128_sz(code[3]) |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1628 if len(code) == 5: |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1629 size = size + _uleb128_sz(code[4]) |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1630 pass |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1631 pass |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1632 elif opcode == self.DBG_END_LOCAL: |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1633 size = 1 + _uleb128_sz(code[1]) |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1634 elif opcode == self.DBG_RESTART_LOCAL: |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1635 size = 1 + _uleb128_sz(code[1]) |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1636 elif opcode in (self.DBG_SET_PROLOGUE_END, |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1637 self.DBG_SET_EPILOGUE_BEGIN, |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1638 self.DBG_SET_FILE): |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1639 size = 1 |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1640 else: |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1641 size = 1 |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1642 pass |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1643 |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1644 return size |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1645 |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1646 opcode_sizes = itertools.imap(compute_opcode_size, self.opcodes) |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1647 opcode_sizes = [i for i in opcode_sizes] |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1648 opcodes_size = sum(opcode_sizes) |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1649 |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1650 self.data_size = opcodes_size |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1651 pass |
124
8e42b2816893
Fixing compute_size() and sizeof() for DEX types.
Thinker K.F. Li <thinker@codemud.net>
parents:
123
diff
changeset
|
1652 |
8e42b2816893
Fixing compute_size() and sizeof() for DEX types.
Thinker K.F. Li <thinker@codemud.net>
parents:
123
diff
changeset
|
1653 @staticmethod |
8e42b2816893
Fixing compute_size() and sizeof() for DEX types.
Thinker K.F. Li <thinker@codemud.net>
parents:
123
diff
changeset
|
1654 def sizeof(obj): |
8e42b2816893
Fixing compute_size() and sizeof() for DEX types.
Thinker K.F. Li <thinker@codemud.net>
parents:
123
diff
changeset
|
1655 return obj.data_size |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1656 |
65
ce1d5a058d5a
Fix argument issue of to_str() of dex types
Thinker K.F. Li <thinker@codemud.net>
parents:
64
diff
changeset
|
1657 @staticmethod |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1658 def to_str(self): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1659 # |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1660 # Parse debug opcodes |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1661 # |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1662 opcodes = self.opcodes |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1663 opcodebins = [] |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1664 for code in opcodes: |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1665 opcode = code[0] |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1666 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1667 if opcode == self.DBG_END_SEQUENCE: |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1668 opcodebins.append(chr(opcode)) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1669 break |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1670 elif opcode == self.DBG_ADVANCE_PC: |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1671 codebin = chr(opcode) + _to_uleb128(code[1]) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1672 opcodebins.append(codebin) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1673 pass |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1674 elif opcode == self.DBG_ADVANCE_LINE: |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1675 codebin = chr(opcode) + _to_leb128(code[1]) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1676 opcodebins.append(codebin) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1677 pass |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1678 elif opcode == self.DBG_START_LOCAL: |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1679 codebin = chr(opcode) + _to_uleb128(code[1]) + \ |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1680 _to_uleb128(code[2]) + _to_uleb128(code[3]) |
65
ce1d5a058d5a
Fix argument issue of to_str() of dex types
Thinker K.F. Li <thinker@codemud.net>
parents:
64
diff
changeset
|
1681 opcodebins.append(codebin) |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1682 pass |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1683 elif opcode == self.DBG_START_LOCAL_EXTENDED: |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1684 codebin = chr(opcode) + _to_uleb128(code[1]) + \ |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1685 _to_uleb128(code[2]) + _to_uleb128(code[3]) + \ |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1686 _to_uleb128(code[4]) |
65
ce1d5a058d5a
Fix argument issue of to_str() of dex types
Thinker K.F. Li <thinker@codemud.net>
parents:
64
diff
changeset
|
1687 opcodebins.append(codebin) |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1688 pass |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1689 elif opcode == self.DBG_END_LOCAL: |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1690 codebin = chr(opcode) + _to_uleb128(code[1]) |
65
ce1d5a058d5a
Fix argument issue of to_str() of dex types
Thinker K.F. Li <thinker@codemud.net>
parents:
64
diff
changeset
|
1691 opcodebins.append(codebin) |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1692 pass |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1693 elif opcode == self.DBG_RESTART_LOCAL: |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1694 codebin = chr(opcode) + _to_uleb128(code[1]) |
65
ce1d5a058d5a
Fix argument issue of to_str() of dex types
Thinker K.F. Li <thinker@codemud.net>
parents:
64
diff
changeset
|
1695 opcodebins.append(codebin) |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1696 pass |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1697 elif opcode in (self.DBG_SET_PROLOGUE_END, |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1698 self.DBG_SET_EPILOGUE_BEGIN, |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1699 self.DBG_SET_FILE): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1700 opcodebins.append(chr(opcode)) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1701 pass |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1702 else: |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1703 opcodebins.append(chr(opcode)) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1704 pass |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1705 pass |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1706 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1707 return ''.join(opcodebins) |
25
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
1708 |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
1709 def children(self): |
53
705356005362
Fix bug of install marker through ref
Thinker K.F. Li <thinker@codemud.net>
parents:
51
diff
changeset
|
1710 return () |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1711 pass |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1712 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1713 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1714 class _DEX_DebugInfoItem(composite): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1715 start_line = uleb128 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1716 parameters_size = uleb128 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1717 parameters = array('parameters_size', uleb128) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1718 opcodes = _DEX_DebugCodeBlock |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1719 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1720 child_names = 'start_line parameters_size parameters opcodes'.split() |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1721 pass |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1722 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1723 |
25
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
1724 class _DEX_StringDataItem(composite): |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
1725 size = uleb128 |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
1726 data = rawstr_size_name('size') |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
1727 padding = rawstr(1) |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
1728 |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
1729 child_names = 'size data padding'.split() |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
1730 pass |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1731 |
25
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
1732 |
27
15cb829ac442
travel_dex_type() recoganizes _dex_type correctly
Thinker K.F. Li <thinker@codemud.net>
parents:
25
diff
changeset
|
1733 class dummy(_dex_type): |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1734 data_size = None |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1735 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1736 @staticmethod |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1737 def parse(parent, data, off): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1738 size, sh = _uleb128(data[off:off + 5]) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1739 data = data[off + sh: off + sh + size] |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1740 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1741 self = _DEX_StringDataItem() |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1742 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1743 self.size = size |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1744 self.data = data |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1745 self.data_size = sh + size + 1 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1746 return self |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1747 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1748 def compute_size(self): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1749 size = len(self.data) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1750 self.size = size |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1751 size_sz = _uleb128_sz(size) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1752 self.data_size = size_sz + size + 1 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1753 pass |
13
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1754 |
65
ce1d5a058d5a
Fix argument issue of to_str() of dex types
Thinker K.F. Li <thinker@codemud.net>
parents:
64
diff
changeset
|
1755 @staticmethod |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1756 def to_str(self): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1757 size = len(self.data) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1758 self.size = size |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1759 data = _uleb128(size) + self.data + '\x00' |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1760 return data |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1761 pass |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1762 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1763 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1764 class DEXFile(composite): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1765 fname = None |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1766 data = None |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1767 header = _DEX_header |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1768 maps = _DEX_MapItemBlock |
127
650244dcdd82
Sort arrays in rules requested by dalvik
Thinker K.F. Li <thinker@codemud.net>
parents:
126
diff
changeset
|
1769 stringIds = array_sorted(None, _DEX_StringId) |
650244dcdd82
Sort arrays in rules requested by dalvik
Thinker K.F. Li <thinker@codemud.net>
parents:
126
diff
changeset
|
1770 typeIds = array_sorted(None, _DEX_TypeId) |
650244dcdd82
Sort arrays in rules requested by dalvik
Thinker K.F. Li <thinker@codemud.net>
parents:
126
diff
changeset
|
1771 protoIds = array_sorted(None, _DEX_ProtoId) |
650244dcdd82
Sort arrays in rules requested by dalvik
Thinker K.F. Li <thinker@codemud.net>
parents:
126
diff
changeset
|
1772 fieldIds = array_sorted(None, _DEX_FieldId) |
650244dcdd82
Sort arrays in rules requested by dalvik
Thinker K.F. Li <thinker@codemud.net>
parents:
126
diff
changeset
|
1773 methodIds = array_sorted(None, _DEX_MethodId) |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1774 classDefs = array(None, _DEX_ClassDef) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1775 classDatas = array(None, _DEX_ClassData) |
40
0c0a659187c2
Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents:
33
diff
changeset
|
1776 typeLists = array(None, _DEX_TypeList_align) |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1777 codeItems = array(None, _DEX_Code) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1778 annotationSetItems = array(None, _DEX_AnnotationSetItem) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1779 annotationsDirectoryItems = array(None, _DEX_AnnotationsDirectoryItem) |
127
650244dcdd82
Sort arrays in rules requested by dalvik
Thinker K.F. Li <thinker@codemud.net>
parents:
126
diff
changeset
|
1780 annotationItems = array_sorted(None, _DEX_AnnotationItem) |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1781 encodedArrayItems = array(None, _DEX_EncodedArrayItem) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1782 debugInfoItems = array(None, _DEX_DebugInfoItem) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1783 stringDataItems = array(None, _DEX_StringDataItem) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1784 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1785 child_names = 'header'.split() |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1786 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1787 block_defs = { |
50
312dcf38226f
construct children of DEXFile from map items
Thinker K.F. Li <thinker@codemud.net>
parents:
49
diff
changeset
|
1788 0x0000: 'header', |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1789 0x0001: 'stringIds', |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1790 0x0002: 'typeIds', |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1791 0x0003: 'protoIds', |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1792 0x0004: 'fieldIds', |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1793 0x0005: 'methodIds', |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1794 0x0006: 'classDefs', |
50
312dcf38226f
construct children of DEXFile from map items
Thinker K.F. Li <thinker@codemud.net>
parents:
49
diff
changeset
|
1795 0x1000: 'maps', |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1796 0x1001: 'typeLists', |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1797 # 0x1002: 'kDexTypeAnnotationSetRefList', |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1798 0x1003: 'annotationSetItems', |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1799 0x2000: 'classDatas', |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1800 0x2001: 'codeItems', |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1801 0x2002: 'stringDataItems', |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1802 0x2003: 'debugInfoItems', |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1803 0x2004: 'annotationItems', |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1804 0x2005: 'encodedArrayItems', |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1805 0x2006: 'annotationsDirectoryItems' |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1806 } |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1807 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1808 @staticmethod |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1809 def open(fname): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1810 fo = file(fname, 'r') |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1811 data = fo.read() |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1812 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1813 dex = DEXFile.parse(data) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1814 dex.fname = fname |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1815 return dex |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1816 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1817 @classmethod |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1818 def parse(clazz, data): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1819 obj = super(DEXFile, clazz).parse(None, data, 0) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1820 obj.data = data |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1821 obj._parse(data) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1822 return obj |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1823 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1824 def _parse_maps(self): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1825 data = self.data |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1826 header = self.header |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1827 off = header.mapOff |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1828 self.parse_child('maps', data, off) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1829 pass |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1830 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1831 def _parse_block(self, block_map): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1832 if block_map.type not in self.block_defs: |
86
793af8437efe
Warning for unknown map type
Thinker K.F. Li <thinker@codemud.net>
parents:
81
diff
changeset
|
1833 import sys |
793af8437efe
Warning for unknown map type
Thinker K.F. Li <thinker@codemud.net>
parents:
81
diff
changeset
|
1834 print >> sys.stderr, \ |
793af8437efe
Warning for unknown map type
Thinker K.F. Li <thinker@codemud.net>
parents:
81
diff
changeset
|
1835 'Warning: unknown map type 0x%x' % (block_map.type) |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1836 return |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1837 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1838 data = self.data |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1839 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1840 child_name = self.block_defs[block_map.type] |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1841 off = block_map.offset |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1842 num = block_map.size |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1843 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1844 child_clazz = getattr(self.__class__, child_name) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1845 blk = child_clazz.parse_nitem(self, data, off, num) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1846 setattr(self, child_name, blk) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1847 pass |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1848 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1849 def _parse_blocks(self): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1850 data = self.data |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1851 maps = self.maps.items.items |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1852 for map in maps: |
50
312dcf38226f
construct children of DEXFile from map items
Thinker K.F. Li <thinker@codemud.net>
parents:
49
diff
changeset
|
1853 if map.type in (0x0000, 0x1000): # header and maps |
312dcf38226f
construct children of DEXFile from map items
Thinker K.F. Li <thinker@codemud.net>
parents:
49
diff
changeset
|
1854 continue |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1855 if map.type in self.block_defs: |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1856 self._parse_block(map) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1857 pass |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1858 pass |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1859 pass |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1860 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1861 def _parse(self, data): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1862 self._parse_maps() |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1863 self._parse_blocks() |
13
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1864 pass |
25
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
1865 |
670167ed06bb
test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents:
24
diff
changeset
|
1866 def children(self): |
50
312dcf38226f
construct children of DEXFile from map items
Thinker K.F. Li <thinker@codemud.net>
parents:
49
diff
changeset
|
1867 map_items = [self.block_defs[map_item.type] |
312dcf38226f
construct children of DEXFile from map items
Thinker K.F. Li <thinker@codemud.net>
parents:
49
diff
changeset
|
1868 for map_item in self.maps.items.items] |
66
fa44a8acba6a
Remove redundants in children list of DEXFile
Thinker K.F. Li <thinker@codemud.net>
parents:
65
diff
changeset
|
1869 children = map_items |
50
312dcf38226f
construct children of DEXFile from map items
Thinker K.F. Li <thinker@codemud.net>
parents:
49
diff
changeset
|
1870 return children |
67
9504ad530dbf
Add DEXFile.make_checksum()
Thinker K.F. Li <thinker@codemud.net>
parents:
66
diff
changeset
|
1871 |
126
ff6f869273b7
Fix wrong init value for computing checksum
Thinker K.F. Li <thinker@codemud.net>
parents:
125
diff
changeset
|
1872 ## \biref Make SHA1 signature for DEX. |
ff6f869273b7
Fix wrong init value for computing checksum
Thinker K.F. Li <thinker@codemud.net>
parents:
125
diff
changeset
|
1873 # |
ff6f869273b7
Fix wrong init value for computing checksum
Thinker K.F. Li <thinker@codemud.net>
parents:
125
diff
changeset
|
1874 # This method must be called before make_checksum(). |
ff6f869273b7
Fix wrong init value for computing checksum
Thinker K.F. Li <thinker@codemud.net>
parents:
125
diff
changeset
|
1875 # |
ff6f869273b7
Fix wrong init value for computing checksum
Thinker K.F. Li <thinker@codemud.net>
parents:
125
diff
changeset
|
1876 def make_signature(self): |
ff6f869273b7
Fix wrong init value for computing checksum
Thinker K.F. Li <thinker@codemud.net>
parents:
125
diff
changeset
|
1877 from hashlib import sha1 |
ff6f869273b7
Fix wrong init value for computing checksum
Thinker K.F. Li <thinker@codemud.net>
parents:
125
diff
changeset
|
1878 |
ff6f869273b7
Fix wrong init value for computing checksum
Thinker K.F. Li <thinker@codemud.net>
parents:
125
diff
changeset
|
1879 raw = self.to_str() |
ff6f869273b7
Fix wrong init value for computing checksum
Thinker K.F. Li <thinker@codemud.net>
parents:
125
diff
changeset
|
1880 sz = self.header.fileSize |
ff6f869273b7
Fix wrong init value for computing checksum
Thinker K.F. Li <thinker@codemud.net>
parents:
125
diff
changeset
|
1881 nosum = _DEX_header.magic.sizeof(self.header.magic) + \ |
ff6f869273b7
Fix wrong init value for computing checksum
Thinker K.F. Li <thinker@codemud.net>
parents:
125
diff
changeset
|
1882 _DEX_header.checksum.sizeof(self.header.checksum) + \ |
ff6f869273b7
Fix wrong init value for computing checksum
Thinker K.F. Li <thinker@codemud.net>
parents:
125
diff
changeset
|
1883 _DEX_header.signature.sizeof(self.header.signature) |
ff6f869273b7
Fix wrong init value for computing checksum
Thinker K.F. Li <thinker@codemud.net>
parents:
125
diff
changeset
|
1884 sha = sha1() |
ff6f869273b7
Fix wrong init value for computing checksum
Thinker K.F. Li <thinker@codemud.net>
parents:
125
diff
changeset
|
1885 sha.update(raw[nosum:]) |
ff6f869273b7
Fix wrong init value for computing checksum
Thinker K.F. Li <thinker@codemud.net>
parents:
125
diff
changeset
|
1886 signature = sha.digest() |
ff6f869273b7
Fix wrong init value for computing checksum
Thinker K.F. Li <thinker@codemud.net>
parents:
125
diff
changeset
|
1887 self.header.signature.data = signature |
ff6f869273b7
Fix wrong init value for computing checksum
Thinker K.F. Li <thinker@codemud.net>
parents:
125
diff
changeset
|
1888 pass |
ff6f869273b7
Fix wrong init value for computing checksum
Thinker K.F. Li <thinker@codemud.net>
parents:
125
diff
changeset
|
1889 |
67
9504ad530dbf
Add DEXFile.make_checksum()
Thinker K.F. Li <thinker@codemud.net>
parents:
66
diff
changeset
|
1890 def make_checksum(self): |
126
ff6f869273b7
Fix wrong init value for computing checksum
Thinker K.F. Li <thinker@codemud.net>
parents:
125
diff
changeset
|
1891 from paraspace.tools import adler32, adler32_init_value |
120
c7a5de2d2334
Fix issue of compute_size of various types
Thinker K.F. Li <thinker@codemud.net>
parents:
119
diff
changeset
|
1892 |
67
9504ad530dbf
Add DEXFile.make_checksum()
Thinker K.F. Li <thinker@codemud.net>
parents:
66
diff
changeset
|
1893 raw = self.to_str() |
9504ad530dbf
Add DEXFile.make_checksum()
Thinker K.F. Li <thinker@codemud.net>
parents:
66
diff
changeset
|
1894 sz = self.header.fileSize |
9504ad530dbf
Add DEXFile.make_checksum()
Thinker K.F. Li <thinker@codemud.net>
parents:
66
diff
changeset
|
1895 nosum = _DEX_header.magic.sizeof(self.header.magic) + \ |
9504ad530dbf
Add DEXFile.make_checksum()
Thinker K.F. Li <thinker@codemud.net>
parents:
66
diff
changeset
|
1896 _DEX_header.checksum.sizeof(self.header.checksum) |
126
ff6f869273b7
Fix wrong init value for computing checksum
Thinker K.F. Li <thinker@codemud.net>
parents:
125
diff
changeset
|
1897 checksum = adler32(adler32_init_value, raw, nosum, sz - nosum) |
67
9504ad530dbf
Add DEXFile.make_checksum()
Thinker K.F. Li <thinker@codemud.net>
parents:
66
diff
changeset
|
1898 self.header.checksum = checksum |
9504ad530dbf
Add DEXFile.make_checksum()
Thinker K.F. Li <thinker@codemud.net>
parents:
66
diff
changeset
|
1899 pass |
11 | 1900 pass |
1901 | |
1902 | |
93
2fa9b6f21344
Add DEXFile_linked to model linked DEX
Thinker K.F. Li <thinker@codemud.net>
parents:
86
diff
changeset
|
1903 ## \brief A linked version of a DEXFile. |
2fa9b6f21344
Add DEXFile_linked to model linked DEX
Thinker K.F. Li <thinker@codemud.net>
parents:
86
diff
changeset
|
1904 # |
2fa9b6f21344
Add DEXFile_linked to model linked DEX
Thinker K.F. Li <thinker@codemud.net>
parents:
86
diff
changeset
|
1905 # Instances of this class was built from instances of DEXFile. |
2fa9b6f21344
Add DEXFile_linked to model linked DEX
Thinker K.F. Li <thinker@codemud.net>
parents:
86
diff
changeset
|
1906 # Dependencies are linked to depend-on objects; the target of a |
2fa9b6f21344
Add DEXFile_linked to model linked DEX
Thinker K.F. Li <thinker@codemud.net>
parents:
86
diff
changeset
|
1907 # dependence. |
2fa9b6f21344
Add DEXFile_linked to model linked DEX
Thinker K.F. Li <thinker@codemud.net>
parents:
86
diff
changeset
|
1908 # |
2fa9b6f21344
Add DEXFile_linked to model linked DEX
Thinker K.F. Li <thinker@codemud.net>
parents:
86
diff
changeset
|
1909 class DEXFile_linked(DEXFile): |
97
00cd331f8aa8
Get unlinked one from a linked one
Thinker K.F. Li <thinker@codemud.net>
parents:
95
diff
changeset
|
1910 _dep_decls = None |
00cd331f8aa8
Get unlinked one from a linked one
Thinker K.F. Li <thinker@codemud.net>
parents:
95
diff
changeset
|
1911 |
93
2fa9b6f21344
Add DEXFile_linked to model linked DEX
Thinker K.F. Li <thinker@codemud.net>
parents:
86
diff
changeset
|
1912 def _copy_attributes(self, dex): |
2fa9b6f21344
Add DEXFile_linked to model linked DEX
Thinker K.F. Li <thinker@codemud.net>
parents:
86
diff
changeset
|
1913 for attr, value in dex.__dict__.items(): |
2fa9b6f21344
Add DEXFile_linked to model linked DEX
Thinker K.F. Li <thinker@codemud.net>
parents:
86
diff
changeset
|
1914 setattr(self, attr, value) |
2fa9b6f21344
Add DEXFile_linked to model linked DEX
Thinker K.F. Li <thinker@codemud.net>
parents:
86
diff
changeset
|
1915 pass |
2fa9b6f21344
Add DEXFile_linked to model linked DEX
Thinker K.F. Li <thinker@codemud.net>
parents:
86
diff
changeset
|
1916 pass |
2fa9b6f21344
Add DEXFile_linked to model linked DEX
Thinker K.F. Li <thinker@codemud.net>
parents:
86
diff
changeset
|
1917 |
2fa9b6f21344
Add DEXFile_linked to model linked DEX
Thinker K.F. Li <thinker@codemud.net>
parents:
86
diff
changeset
|
1918 ## \brief Factory function to return a DEXFile_linked of given DEXFile. |
119
4f508f84c8a1
Add inject_redir.py example
Thinker K.F. Li <thinker@codemud.net>
parents:
116
diff
changeset
|
1919 # |
4f508f84c8a1
Add inject_redir.py example
Thinker K.F. Li <thinker@codemud.net>
parents:
116
diff
changeset
|
1920 # \param dex is a DEXFile instance. |
4f508f84c8a1
Add inject_redir.py example
Thinker K.F. Li <thinker@codemud.net>
parents:
116
diff
changeset
|
1921 # \param dep_decls is a dictionary returned by prepare_dep_decls(). |
4f508f84c8a1
Add inject_redir.py example
Thinker K.F. Li <thinker@codemud.net>
parents:
116
diff
changeset
|
1922 # \return a DEXFile_linked. |
4f508f84c8a1
Add inject_redir.py example
Thinker K.F. Li <thinker@codemud.net>
parents:
116
diff
changeset
|
1923 # |
93
2fa9b6f21344
Add DEXFile_linked to model linked DEX
Thinker K.F. Li <thinker@codemud.net>
parents:
86
diff
changeset
|
1924 @staticmethod |
2fa9b6f21344
Add DEXFile_linked to model linked DEX
Thinker K.F. Li <thinker@codemud.net>
parents:
86
diff
changeset
|
1925 def build_dependencies(dex, dep_decls): |
2fa9b6f21344
Add DEXFile_linked to model linked DEX
Thinker K.F. Li <thinker@codemud.net>
parents:
86
diff
changeset
|
1926 from paraspace.dex_deptracker import build_dependencies |
2fa9b6f21344
Add DEXFile_linked to model linked DEX
Thinker K.F. Li <thinker@codemud.net>
parents:
86
diff
changeset
|
1927 |
2fa9b6f21344
Add DEXFile_linked to model linked DEX
Thinker K.F. Li <thinker@codemud.net>
parents:
86
diff
changeset
|
1928 if not isinstance(dex, DEXFile): |
2fa9b6f21344
Add DEXFile_linked to model linked DEX
Thinker K.F. Li <thinker@codemud.net>
parents:
86
diff
changeset
|
1929 raise TypeError, 'first argument must be an instance of DEXFile' |
2fa9b6f21344
Add DEXFile_linked to model linked DEX
Thinker K.F. Li <thinker@codemud.net>
parents:
86
diff
changeset
|
1930 |
2fa9b6f21344
Add DEXFile_linked to model linked DEX
Thinker K.F. Li <thinker@codemud.net>
parents:
86
diff
changeset
|
1931 linked = DEXFile_linked() |
2fa9b6f21344
Add DEXFile_linked to model linked DEX
Thinker K.F. Li <thinker@codemud.net>
parents:
86
diff
changeset
|
1932 build_dependencies(dex, dep_decls) |
2fa9b6f21344
Add DEXFile_linked to model linked DEX
Thinker K.F. Li <thinker@codemud.net>
parents:
86
diff
changeset
|
1933 linked._copy_attributes(dex) |
97
00cd331f8aa8
Get unlinked one from a linked one
Thinker K.F. Li <thinker@codemud.net>
parents:
95
diff
changeset
|
1934 |
00cd331f8aa8
Get unlinked one from a linked one
Thinker K.F. Li <thinker@codemud.net>
parents:
95
diff
changeset
|
1935 linked._dep_decls = dep_decls |
93
2fa9b6f21344
Add DEXFile_linked to model linked DEX
Thinker K.F. Li <thinker@codemud.net>
parents:
86
diff
changeset
|
1936 |
2fa9b6f21344
Add DEXFile_linked to model linked DEX
Thinker K.F. Li <thinker@codemud.net>
parents:
86
diff
changeset
|
1937 return linked |
94
88645ab29aeb
dexfile_insert_class() returns a clone object
Thinker K.F. Li <thinker@codemud.net>
parents:
93
diff
changeset
|
1938 |
88645ab29aeb
dexfile_insert_class() returns a clone object
Thinker K.F. Li <thinker@codemud.net>
parents:
93
diff
changeset
|
1939 ## \brief Return name string of a linked class definition item |
88645ab29aeb
dexfile_insert_class() returns a clone object
Thinker K.F. Li <thinker@codemud.net>
parents:
93
diff
changeset
|
1940 @staticmethod |
88645ab29aeb
dexfile_insert_class() returns a clone object
Thinker K.F. Li <thinker@codemud.net>
parents:
93
diff
changeset
|
1941 def get_classdef_name(classdef): |
104 | 1942 return DEXFile_linked.get_typeid_name(classdef.classIdx) |
1943 | |
1944 ## \brief Return name string of a linked type ID item. | |
1945 @staticmethod | |
1946 def get_typeid_name(typeid): | |
1947 return typeid.descriptorIdx.stringDataOff.data.data | |
1948 | |
1949 ## \brief Get index of given type ID. | |
1950 def get_idx_typeid(self, typeid): | |
1951 return self.typeIds.items.index(typeid) | |
1952 | |
1953 ## \brief Find type ID item with given name. | |
1954 def find_typeid_name(self, name): | |
1955 for typeid in self.typeIds.items: | |
1956 typeid_name = DEXFile_linked.get_typeid_name(typeid) | |
1957 if typeid_name == name: | |
1958 return typeid | |
1959 pass | |
1960 pass | |
119
4f508f84c8a1
Add inject_redir.py example
Thinker K.F. Li <thinker@codemud.net>
parents:
116
diff
changeset
|
1961 |
4f508f84c8a1
Add inject_redir.py example
Thinker K.F. Li <thinker@codemud.net>
parents:
116
diff
changeset
|
1962 ## \brief Get index of given _DEX_ClassDef. |
4f508f84c8a1
Add inject_redir.py example
Thinker K.F. Li <thinker@codemud.net>
parents:
116
diff
changeset
|
1963 def get_idx_classdef(self, classdef): |
4f508f84c8a1
Add inject_redir.py example
Thinker K.F. Li <thinker@codemud.net>
parents:
116
diff
changeset
|
1964 from paraspace.dexfile import _DEX_ClassDef |
4f508f84c8a1
Add inject_redir.py example
Thinker K.F. Li <thinker@codemud.net>
parents:
116
diff
changeset
|
1965 assert isinstance(classdef, _DEX_ClassDef) |
4f508f84c8a1
Add inject_redir.py example
Thinker K.F. Li <thinker@codemud.net>
parents:
116
diff
changeset
|
1966 typeidx = self.get_idx_typeid(classdef.classIdx) |
4f508f84c8a1
Add inject_redir.py example
Thinker K.F. Li <thinker@codemud.net>
parents:
116
diff
changeset
|
1967 return typeidx |
104 | 1968 |
1969 ## \brief Return type ID item with given index. | |
1970 def find_typeid_idx(self, idx): | |
1971 return self.typeIds.items[idx] | |
94
88645ab29aeb
dexfile_insert_class() returns a clone object
Thinker K.F. Li <thinker@codemud.net>
parents:
93
diff
changeset
|
1972 |
88645ab29aeb
dexfile_insert_class() returns a clone object
Thinker K.F. Li <thinker@codemud.net>
parents:
93
diff
changeset
|
1973 def find_class_name(self, name): |
88645ab29aeb
dexfile_insert_class() returns a clone object
Thinker K.F. Li <thinker@codemud.net>
parents:
93
diff
changeset
|
1974 for classdef in self.classDefs.items: |
88645ab29aeb
dexfile_insert_class() returns a clone object
Thinker K.F. Li <thinker@codemud.net>
parents:
93
diff
changeset
|
1975 classdef_name = DEXFile_linked.get_classdef_name(classdef) |
88645ab29aeb
dexfile_insert_class() returns a clone object
Thinker K.F. Li <thinker@codemud.net>
parents:
93
diff
changeset
|
1976 if classdef_name == name: |
88645ab29aeb
dexfile_insert_class() returns a clone object
Thinker K.F. Li <thinker@codemud.net>
parents:
93
diff
changeset
|
1977 return classdef |
88645ab29aeb
dexfile_insert_class() returns a clone object
Thinker K.F. Li <thinker@codemud.net>
parents:
93
diff
changeset
|
1978 pass |
88645ab29aeb
dexfile_insert_class() returns a clone object
Thinker K.F. Li <thinker@codemud.net>
parents:
93
diff
changeset
|
1979 raise ValueError, 'can not find class definition for \'%s\'' % (name) |
97
00cd331f8aa8
Get unlinked one from a linked one
Thinker K.F. Li <thinker@codemud.net>
parents:
95
diff
changeset
|
1980 |
104 | 1981 ## \brief Return a class definition corresponding for give type ID. |
1982 def find_class_typeid(self, typeid): | |
1983 for classdef in self.classDefs.items: | |
1984 if classdef.classIdx == typeid: | |
1985 return classdef | |
1986 pass | |
1987 raise ValueError, \ | |
1988 'can not find class definition for typeid %s' % (repr(typeid)) | |
1989 | |
98
c0c127c7b37e
Check and fix issues of map sizes
Thinker K.F. Li <thinker@codemud.net>
parents:
97
diff
changeset
|
1990 ## \brief Update size of map items. |
c0c127c7b37e
Check and fix issues of map sizes
Thinker K.F. Li <thinker@codemud.net>
parents:
97
diff
changeset
|
1991 # |
c0c127c7b37e
Check and fix issues of map sizes
Thinker K.F. Li <thinker@codemud.net>
parents:
97
diff
changeset
|
1992 # Corresponding data lists of maps may be changed, it should be updated |
c0c127c7b37e
Check and fix issues of map sizes
Thinker K.F. Li <thinker@codemud.net>
parents:
97
diff
changeset
|
1993 # before restore dependencies and keep it consistent. |
c0c127c7b37e
Check and fix issues of map sizes
Thinker K.F. Li <thinker@codemud.net>
parents:
97
diff
changeset
|
1994 # |
c0c127c7b37e
Check and fix issues of map sizes
Thinker K.F. Li <thinker@codemud.net>
parents:
97
diff
changeset
|
1995 def _update_map_sizes(self): |
c0c127c7b37e
Check and fix issues of map sizes
Thinker K.F. Li <thinker@codemud.net>
parents:
97
diff
changeset
|
1996 for mapitem in self.maps.items.items: |
c0c127c7b37e
Check and fix issues of map sizes
Thinker K.F. Li <thinker@codemud.net>
parents:
97
diff
changeset
|
1997 attr = DEXFile.block_defs[mapitem.type] |
c0c127c7b37e
Check and fix issues of map sizes
Thinker K.F. Li <thinker@codemud.net>
parents:
97
diff
changeset
|
1998 datalist = getattr(self, attr) |
c0c127c7b37e
Check and fix issues of map sizes
Thinker K.F. Li <thinker@codemud.net>
parents:
97
diff
changeset
|
1999 if isinstance(datalist, array): |
c0c127c7b37e
Check and fix issues of map sizes
Thinker K.F. Li <thinker@codemud.net>
parents:
97
diff
changeset
|
2000 mapitem.size = len(datalist.items) |
c0c127c7b37e
Check and fix issues of map sizes
Thinker K.F. Li <thinker@codemud.net>
parents:
97
diff
changeset
|
2001 pass |
c0c127c7b37e
Check and fix issues of map sizes
Thinker K.F. Li <thinker@codemud.net>
parents:
97
diff
changeset
|
2002 pass |
c0c127c7b37e
Check and fix issues of map sizes
Thinker K.F. Li <thinker@codemud.net>
parents:
97
diff
changeset
|
2003 pass |
c0c127c7b37e
Check and fix issues of map sizes
Thinker K.F. Li <thinker@codemud.net>
parents:
97
diff
changeset
|
2004 |
c0c127c7b37e
Check and fix issues of map sizes
Thinker K.F. Li <thinker@codemud.net>
parents:
97
diff
changeset
|
2005 ## \brief Return an unlinked version. |
97
00cd331f8aa8
Get unlinked one from a linked one
Thinker K.F. Li <thinker@codemud.net>
parents:
95
diff
changeset
|
2006 def get_unlinked(self): |
00cd331f8aa8
Get unlinked one from a linked one
Thinker K.F. Li <thinker@codemud.net>
parents:
95
diff
changeset
|
2007 from paraspace.dex_deptracker import restore_dependencies |
98
c0c127c7b37e
Check and fix issues of map sizes
Thinker K.F. Li <thinker@codemud.net>
parents:
97
diff
changeset
|
2008 |
c0c127c7b37e
Check and fix issues of map sizes
Thinker K.F. Li <thinker@codemud.net>
parents:
97
diff
changeset
|
2009 self._update_map_sizes() |
c0c127c7b37e
Check and fix issues of map sizes
Thinker K.F. Li <thinker@codemud.net>
parents:
97
diff
changeset
|
2010 |
97
00cd331f8aa8
Get unlinked one from a linked one
Thinker K.F. Li <thinker@codemud.net>
parents:
95
diff
changeset
|
2011 unlinked = DEXFile() |
00cd331f8aa8
Get unlinked one from a linked one
Thinker K.F. Li <thinker@codemud.net>
parents:
95
diff
changeset
|
2012 for attr, value in self.__dict__.items(): |
00cd331f8aa8
Get unlinked one from a linked one
Thinker K.F. Li <thinker@codemud.net>
parents:
95
diff
changeset
|
2013 setattr(unlinked, attr, value) |
00cd331f8aa8
Get unlinked one from a linked one
Thinker K.F. Li <thinker@codemud.net>
parents:
95
diff
changeset
|
2014 pass |
00cd331f8aa8
Get unlinked one from a linked one
Thinker K.F. Li <thinker@codemud.net>
parents:
95
diff
changeset
|
2015 |
00cd331f8aa8
Get unlinked one from a linked one
Thinker K.F. Li <thinker@codemud.net>
parents:
95
diff
changeset
|
2016 restore_dependencies(unlinked, self._dep_decls) |
00cd331f8aa8
Get unlinked one from a linked one
Thinker K.F. Li <thinker@codemud.net>
parents:
95
diff
changeset
|
2017 |
00cd331f8aa8
Get unlinked one from a linked one
Thinker K.F. Li <thinker@codemud.net>
parents:
95
diff
changeset
|
2018 return unlinked |
101
b2db11aed6b8
Provide method of insert class definition in DEXFile_linked class.
Thinker K.F. Li <thinker@codemud.net>
parents:
98
diff
changeset
|
2019 |
b2db11aed6b8
Provide method of insert class definition in DEXFile_linked class.
Thinker K.F. Li <thinker@codemud.net>
parents:
98
diff
changeset
|
2020 ## \brief Insert a linked class definition into the DEX file. |
b2db11aed6b8
Provide method of insert class definition in DEXFile_linked class.
Thinker K.F. Li <thinker@codemud.net>
parents:
98
diff
changeset
|
2021 def insert_class(self, classdef): |
b2db11aed6b8
Provide method of insert class definition in DEXFile_linked class.
Thinker K.F. Li <thinker@codemud.net>
parents:
98
diff
changeset
|
2022 from paraspace.injection import dexfile_insert_class |
b2db11aed6b8
Provide method of insert class definition in DEXFile_linked class.
Thinker K.F. Li <thinker@codemud.net>
parents:
98
diff
changeset
|
2023 |
b2db11aed6b8
Provide method of insert class definition in DEXFile_linked class.
Thinker K.F. Li <thinker@codemud.net>
parents:
98
diff
changeset
|
2024 assert isinstance(classdef, _DEX_ClassDef) |
b2db11aed6b8
Provide method of insert class definition in DEXFile_linked class.
Thinker K.F. Li <thinker@codemud.net>
parents:
98
diff
changeset
|
2025 |
b2db11aed6b8
Provide method of insert class definition in DEXFile_linked class.
Thinker K.F. Li <thinker@codemud.net>
parents:
98
diff
changeset
|
2026 clone = dexfile_insert_class(self, classdef) |
b2db11aed6b8
Provide method of insert class definition in DEXFile_linked class.
Thinker K.F. Li <thinker@codemud.net>
parents:
98
diff
changeset
|
2027 return clone |
102
7fcd555d802b
Add the function for finding method with a name
Thinker K.F. Li <thinker@codemud.net>
parents:
101
diff
changeset
|
2028 |
7fcd555d802b
Add the function for finding method with a name
Thinker K.F. Li <thinker@codemud.net>
parents:
101
diff
changeset
|
2029 ## \brief Get name string of given method. |
7fcd555d802b
Add the function for finding method with a name
Thinker K.F. Li <thinker@codemud.net>
parents:
101
diff
changeset
|
2030 @staticmethod |
7fcd555d802b
Add the function for finding method with a name
Thinker K.F. Li <thinker@codemud.net>
parents:
101
diff
changeset
|
2031 def get_method_name(method): |
7fcd555d802b
Add the function for finding method with a name
Thinker K.F. Li <thinker@codemud.net>
parents:
101
diff
changeset
|
2032 methodid = method.methodIdx |
108
18be67af7f1e
Use method redirection map for defining redirection
Thinker K.F. Li <thinker@codemud.net>
parents:
107
diff
changeset
|
2033 return DEXFile_linked.get_methodid_name(methodid) |
18be67af7f1e
Use method redirection map for defining redirection
Thinker K.F. Li <thinker@codemud.net>
parents:
107
diff
changeset
|
2034 |
18be67af7f1e
Use method redirection map for defining redirection
Thinker K.F. Li <thinker@codemud.net>
parents:
107
diff
changeset
|
2035 ## \brief Get name string of given method ID. |
18be67af7f1e
Use method redirection map for defining redirection
Thinker K.F. Li <thinker@codemud.net>
parents:
107
diff
changeset
|
2036 @staticmethod |
18be67af7f1e
Use method redirection map for defining redirection
Thinker K.F. Li <thinker@codemud.net>
parents:
107
diff
changeset
|
2037 def get_methodid_name(methodid): |
102
7fcd555d802b
Add the function for finding method with a name
Thinker K.F. Li <thinker@codemud.net>
parents:
101
diff
changeset
|
2038 namestrid = methodid.nameIdx |
7fcd555d802b
Add the function for finding method with a name
Thinker K.F. Li <thinker@codemud.net>
parents:
101
diff
changeset
|
2039 namestrdata = namestrid.stringDataOff |
7fcd555d802b
Add the function for finding method with a name
Thinker K.F. Li <thinker@codemud.net>
parents:
101
diff
changeset
|
2040 name_str = namestrdata.data.data |
7fcd555d802b
Add the function for finding method with a name
Thinker K.F. Li <thinker@codemud.net>
parents:
101
diff
changeset
|
2041 return name_str |
7fcd555d802b
Add the function for finding method with a name
Thinker K.F. Li <thinker@codemud.net>
parents:
101
diff
changeset
|
2042 |
7fcd555d802b
Add the function for finding method with a name
Thinker K.F. Li <thinker@codemud.net>
parents:
101
diff
changeset
|
2043 ## \brief Find the method of given method name and class definition. |
7fcd555d802b
Add the function for finding method with a name
Thinker K.F. Li <thinker@codemud.net>
parents:
101
diff
changeset
|
2044 # |
7fcd555d802b
Add the function for finding method with a name
Thinker K.F. Li <thinker@codemud.net>
parents:
101
diff
changeset
|
2045 # \param method_name is the method name. |
7fcd555d802b
Add the function for finding method with a name
Thinker K.F. Li <thinker@codemud.net>
parents:
101
diff
changeset
|
2046 # \param classdef is a _DEX_ClassDef. |
7fcd555d802b
Add the function for finding method with a name
Thinker K.F. Li <thinker@codemud.net>
parents:
101
diff
changeset
|
2047 # \return the corresponding _DEX_Method of given method_name and classdef. |
7fcd555d802b
Add the function for finding method with a name
Thinker K.F. Li <thinker@codemud.net>
parents:
101
diff
changeset
|
2048 # |
7fcd555d802b
Add the function for finding method with a name
Thinker K.F. Li <thinker@codemud.net>
parents:
101
diff
changeset
|
2049 def find_method_name(self, method_name, classdef): |
7fcd555d802b
Add the function for finding method with a name
Thinker K.F. Li <thinker@codemud.net>
parents:
101
diff
changeset
|
2050 if not classdef.classDataOffRef.is_true: |
7fcd555d802b
Add the function for finding method with a name
Thinker K.F. Li <thinker@codemud.net>
parents:
101
diff
changeset
|
2051 return |
7fcd555d802b
Add the function for finding method with a name
Thinker K.F. Li <thinker@codemud.net>
parents:
101
diff
changeset
|
2052 |
7fcd555d802b
Add the function for finding method with a name
Thinker K.F. Li <thinker@codemud.net>
parents:
101
diff
changeset
|
2053 classdata = classdef.classDataOffRef.value |
7fcd555d802b
Add the function for finding method with a name
Thinker K.F. Li <thinker@codemud.net>
parents:
101
diff
changeset
|
2054 for wmethod in classdata.directMethods.items + \ |
7fcd555d802b
Add the function for finding method with a name
Thinker K.F. Li <thinker@codemud.net>
parents:
101
diff
changeset
|
2055 classdata.virtualMethods.items: |
7fcd555d802b
Add the function for finding method with a name
Thinker K.F. Li <thinker@codemud.net>
parents:
101
diff
changeset
|
2056 wmethod_name = DEXFile_linked.get_method_name(wmethod) |
7fcd555d802b
Add the function for finding method with a name
Thinker K.F. Li <thinker@codemud.net>
parents:
101
diff
changeset
|
2057 if method_name == wmethod_name: |
7fcd555d802b
Add the function for finding method with a name
Thinker K.F. Li <thinker@codemud.net>
parents:
101
diff
changeset
|
2058 return wmethod |
7fcd555d802b
Add the function for finding method with a name
Thinker K.F. Li <thinker@codemud.net>
parents:
101
diff
changeset
|
2059 pass |
7fcd555d802b
Add the function for finding method with a name
Thinker K.F. Li <thinker@codemud.net>
parents:
101
diff
changeset
|
2060 pass |
104 | 2061 |
107
4b3573d039af
Fix bug of DEXFile_linked.find_method_name_proto().
Thinker K.F. Li <thinker@codemud.net>
parents:
106
diff
changeset
|
2062 ## \brief Return index of given method. |
4b3573d039af
Fix bug of DEXFile_linked.find_method_name_proto().
Thinker K.F. Li <thinker@codemud.net>
parents:
106
diff
changeset
|
2063 def get_idx_method(self, method): |
4b3573d039af
Fix bug of DEXFile_linked.find_method_name_proto().
Thinker K.F. Li <thinker@codemud.net>
parents:
106
diff
changeset
|
2064 methodid = method.methodIdx |
4b3573d039af
Fix bug of DEXFile_linked.find_method_name_proto().
Thinker K.F. Li <thinker@codemud.net>
parents:
106
diff
changeset
|
2065 idx = self.methodIds.items.index(methodid) |
4b3573d039af
Fix bug of DEXFile_linked.find_method_name_proto().
Thinker K.F. Li <thinker@codemud.net>
parents:
106
diff
changeset
|
2066 return idx |
4b3573d039af
Fix bug of DEXFile_linked.find_method_name_proto().
Thinker K.F. Li <thinker@codemud.net>
parents:
106
diff
changeset
|
2067 |
104 | 2068 ## \brief Find the method ID item of given index. |
2069 def find_methodid_idx(self, idx): | |
2070 methodid = self.methodIds.items[idx] | |
2071 return methodid | |
2072 | |
2073 ## \brief Find a method definition with an index to method ID. | |
2074 def find_method_idx(self, idx): | |
2075 methodid = self.find_methodid_idx(idx) | |
108
18be67af7f1e
Use method redirection map for defining redirection
Thinker K.F. Li <thinker@codemud.net>
parents:
107
diff
changeset
|
2076 method_name = DEXFile_linked.get_methodid_name(methodid) |
104 | 2077 method_proto = methodid.protoIdx |
2078 method_typeid = methodid.classIdx | |
2079 classdef = self.find_class_typeid(method_typeid) | |
2080 | |
2081 method = self.find_method_name_proto(method, method_proto, classdef) | |
2082 | |
2083 return method | |
2084 | |
2085 ## \brief Test if prototype of two methods are compatible. | |
2086 @staticmethod | |
2087 def _proto_is_compatible(proto1, proto2): | |
116
c5f59bdbc916
Fix issue of proto matching.
Thinker K.F. Li <thinker@codemud.net>
parents:
111
diff
changeset
|
2088 rtypename1 = DEXFile_linked.get_typeid_name(proto1.returnTypeIdx) |
c5f59bdbc916
Fix issue of proto matching.
Thinker K.F. Li <thinker@codemud.net>
parents:
111
diff
changeset
|
2089 rtypename2 = DEXFile_linked.get_typeid_name(proto2.returnTypeIdx) |
c5f59bdbc916
Fix issue of proto matching.
Thinker K.F. Li <thinker@codemud.net>
parents:
111
diff
changeset
|
2090 if rtypename1 != rtypename2: |
104 | 2091 return False |
2092 typelist1 = proto1.parametersOffRef.value | |
2093 typelist2 = proto2.parametersOffRef.value | |
2094 if len(typelist1.typeItems.items) != len(typelist2.typeItems.items): | |
2095 return False | |
2096 | |
106
7821c6e89622
dexfile_redirect_types() is almost ready.
Thinker K.F. Li <thinker@codemud.net>
parents:
104
diff
changeset
|
2097 for tl_typeid1, tl_typeid2 in map(None, |
7821c6e89622
dexfile_redirect_types() is almost ready.
Thinker K.F. Li <thinker@codemud.net>
parents:
104
diff
changeset
|
2098 typelist1.typeItems.items, |
7821c6e89622
dexfile_redirect_types() is almost ready.
Thinker K.F. Li <thinker@codemud.net>
parents:
104
diff
changeset
|
2099 typelist2.typeItems.items): |
108
18be67af7f1e
Use method redirection map for defining redirection
Thinker K.F. Li <thinker@codemud.net>
parents:
107
diff
changeset
|
2100 typename1 = DEXFile_linked.get_typeid_name(tl_typeid1.typeIdx) |
18be67af7f1e
Use method redirection map for defining redirection
Thinker K.F. Li <thinker@codemud.net>
parents:
107
diff
changeset
|
2101 typename2 = DEXFile_linked.get_typeid_name(tl_typeid2.typeIdx) |
18be67af7f1e
Use method redirection map for defining redirection
Thinker K.F. Li <thinker@codemud.net>
parents:
107
diff
changeset
|
2102 |
18be67af7f1e
Use method redirection map for defining redirection
Thinker K.F. Li <thinker@codemud.net>
parents:
107
diff
changeset
|
2103 if typename1 != typename2: |
104 | 2104 return False |
2105 pass | |
2106 return True | |
2107 | |
108
18be67af7f1e
Use method redirection map for defining redirection
Thinker K.F. Li <thinker@codemud.net>
parents:
107
diff
changeset
|
2108 ## \brief Find the method of given name, prototype and class definition. |
104 | 2109 def find_method_name_proto(self, method_name, proto, classdef): |
2110 if not classdef.classDataOffRef.is_true: | |
2111 return | |
2112 | |
2113 classdata = classdef.classDataOffRef.value | |
2114 for wmethod in classdata.directMethods.items + \ | |
2115 classdata.virtualMethods.items: | |
2116 wmethod_name = DEXFile_linked.get_method_name(wmethod) | |
2117 if method_name != wmethod_name: | |
2118 continue | |
107
4b3573d039af
Fix bug of DEXFile_linked.find_method_name_proto().
Thinker K.F. Li <thinker@codemud.net>
parents:
106
diff
changeset
|
2119 wmethodid = wmethod.methodIdx |
4b3573d039af
Fix bug of DEXFile_linked.find_method_name_proto().
Thinker K.F. Li <thinker@codemud.net>
parents:
106
diff
changeset
|
2120 if DEXFile_linked._proto_is_compatible(wmethodid.protoIdx, proto): |
104 | 2121 return wmethod |
2122 pass | |
2123 raise ValueError, 'can not find a method for given name and prototype' | |
106
7821c6e89622
dexfile_redirect_types() is almost ready.
Thinker K.F. Li <thinker@codemud.net>
parents:
104
diff
changeset
|
2124 |
108
18be67af7f1e
Use method redirection map for defining redirection
Thinker K.F. Li <thinker@codemud.net>
parents:
107
diff
changeset
|
2125 ## \brief Return index of given method ID. |
18be67af7f1e
Use method redirection map for defining redirection
Thinker K.F. Li <thinker@codemud.net>
parents:
107
diff
changeset
|
2126 def get_idx_methodid(self, methodid): |
18be67af7f1e
Use method redirection map for defining redirection
Thinker K.F. Li <thinker@codemud.net>
parents:
107
diff
changeset
|
2127 idx = self.methodIds.items.index(methodid) |
18be67af7f1e
Use method redirection map for defining redirection
Thinker K.F. Li <thinker@codemud.net>
parents:
107
diff
changeset
|
2128 return idx |
18be67af7f1e
Use method redirection map for defining redirection
Thinker K.F. Li <thinker@codemud.net>
parents:
107
diff
changeset
|
2129 |
18be67af7f1e
Use method redirection map for defining redirection
Thinker K.F. Li <thinker@codemud.net>
parents:
107
diff
changeset
|
2130 ## \brief Return method ID for given name, proto, and typeid/ |
18be67af7f1e
Use method redirection map for defining redirection
Thinker K.F. Li <thinker@codemud.net>
parents:
107
diff
changeset
|
2131 def find_methodid_name_proto(self, method_name, proto, typeid): |
18be67af7f1e
Use method redirection map for defining redirection
Thinker K.F. Li <thinker@codemud.net>
parents:
107
diff
changeset
|
2132 for methodid in self.methodIds.items: |
18be67af7f1e
Use method redirection map for defining redirection
Thinker K.F. Li <thinker@codemud.net>
parents:
107
diff
changeset
|
2133 if method_name != DEXFile_linked.get_methodid_name(methodid): |
18be67af7f1e
Use method redirection map for defining redirection
Thinker K.F. Li <thinker@codemud.net>
parents:
107
diff
changeset
|
2134 continue |
18be67af7f1e
Use method redirection map for defining redirection
Thinker K.F. Li <thinker@codemud.net>
parents:
107
diff
changeset
|
2135 if methodid.classIdx != typeid: |
18be67af7f1e
Use method redirection map for defining redirection
Thinker K.F. Li <thinker@codemud.net>
parents:
107
diff
changeset
|
2136 continue |
18be67af7f1e
Use method redirection map for defining redirection
Thinker K.F. Li <thinker@codemud.net>
parents:
107
diff
changeset
|
2137 if not DEXFile_linked. \ |
18be67af7f1e
Use method redirection map for defining redirection
Thinker K.F. Li <thinker@codemud.net>
parents:
107
diff
changeset
|
2138 _proto_is_compatible(methodid.protoIdx, proto): |
18be67af7f1e
Use method redirection map for defining redirection
Thinker K.F. Li <thinker@codemud.net>
parents:
107
diff
changeset
|
2139 continue |
18be67af7f1e
Use method redirection map for defining redirection
Thinker K.F. Li <thinker@codemud.net>
parents:
107
diff
changeset
|
2140 return methodid |
18be67af7f1e
Use method redirection map for defining redirection
Thinker K.F. Li <thinker@codemud.net>
parents:
107
diff
changeset
|
2141 raise ValueError, 'can not find the method ID for given name, ' \ |
18be67af7f1e
Use method redirection map for defining redirection
Thinker K.F. Li <thinker@codemud.net>
parents:
107
diff
changeset
|
2142 'prototype and type ID' |
18be67af7f1e
Use method redirection map for defining redirection
Thinker K.F. Li <thinker@codemud.net>
parents:
107
diff
changeset
|
2143 |
106
7821c6e89622
dexfile_redirect_types() is almost ready.
Thinker K.F. Li <thinker@codemud.net>
parents:
104
diff
changeset
|
2144 @staticmethod |
7821c6e89622
dexfile_redirect_types() is almost ready.
Thinker K.F. Li <thinker@codemud.net>
parents:
104
diff
changeset
|
2145 def get_param_typeids_protoid(protoid): |
7821c6e89622
dexfile_redirect_types() is almost ready.
Thinker K.F. Li <thinker@codemud.net>
parents:
104
diff
changeset
|
2146 if not protoid.parametersOffRef.is_true: |
7821c6e89622
dexfile_redirect_types() is almost ready.
Thinker K.F. Li <thinker@codemud.net>
parents:
104
diff
changeset
|
2147 return () |
7821c6e89622
dexfile_redirect_types() is almost ready.
Thinker K.F. Li <thinker@codemud.net>
parents:
104
diff
changeset
|
2148 tl_typeids = protoid.parametersOffRef.value.typeItems.items |
7821c6e89622
dexfile_redirect_types() is almost ready.
Thinker K.F. Li <thinker@codemud.net>
parents:
104
diff
changeset
|
2149 typeids = [tl_typeid.typeIdx |
7821c6e89622
dexfile_redirect_types() is almost ready.
Thinker K.F. Li <thinker@codemud.net>
parents:
104
diff
changeset
|
2150 for tl_typeid in tl_typeids] |
7821c6e89622
dexfile_redirect_types() is almost ready.
Thinker K.F. Li <thinker@codemud.net>
parents:
104
diff
changeset
|
2151 return typeids |
7821c6e89622
dexfile_redirect_types() is almost ready.
Thinker K.F. Li <thinker@codemud.net>
parents:
104
diff
changeset
|
2152 |
109
835336632aba
Add collect_typeidxs_in_method()
Thinker K.F. Li <thinker@codemud.net>
parents:
108
diff
changeset
|
2153 ## \brief Return code block of given method. |
835336632aba
Add collect_typeidxs_in_method()
Thinker K.F. Li <thinker@codemud.net>
parents:
108
diff
changeset
|
2154 # |
835336632aba
Add collect_typeidxs_in_method()
Thinker K.F. Li <thinker@codemud.net>
parents:
108
diff
changeset
|
2155 # Code block is a string of byte code instructions for Dalvik VM. |
835336632aba
Add collect_typeidxs_in_method()
Thinker K.F. Li <thinker@codemud.net>
parents:
108
diff
changeset
|
2156 # |
835336632aba
Add collect_typeidxs_in_method()
Thinker K.F. Li <thinker@codemud.net>
parents:
108
diff
changeset
|
2157 @staticmethod |
835336632aba
Add collect_typeidxs_in_method()
Thinker K.F. Li <thinker@codemud.net>
parents:
108
diff
changeset
|
2158 def get_code_block_method(method): |
835336632aba
Add collect_typeidxs_in_method()
Thinker K.F. Li <thinker@codemud.net>
parents:
108
diff
changeset
|
2159 if not method.codeOffRef.is_true: |
835336632aba
Add collect_typeidxs_in_method()
Thinker K.F. Li <thinker@codemud.net>
parents:
108
diff
changeset
|
2160 return '' |
835336632aba
Add collect_typeidxs_in_method()
Thinker K.F. Li <thinker@codemud.net>
parents:
108
diff
changeset
|
2161 |
835336632aba
Add collect_typeidxs_in_method()
Thinker K.F. Li <thinker@codemud.net>
parents:
108
diff
changeset
|
2162 code = method.codeOffRef.value |
835336632aba
Add collect_typeidxs_in_method()
Thinker K.F. Li <thinker@codemud.net>
parents:
108
diff
changeset
|
2163 insns = code.insns.data |
835336632aba
Add collect_typeidxs_in_method()
Thinker K.F. Li <thinker@codemud.net>
parents:
108
diff
changeset
|
2164 return insns |
835336632aba
Add collect_typeidxs_in_method()
Thinker K.F. Li <thinker@codemud.net>
parents:
108
diff
changeset
|
2165 |
110
6380730a80b4
Add collect_typeidxs_mentioned_by_class()
Thinker K.F. Li <thinker@codemud.net>
parents:
109
diff
changeset
|
2166 ## \brief Return all method of given class definition. |
6380730a80b4
Add collect_typeidxs_mentioned_by_class()
Thinker K.F. Li <thinker@codemud.net>
parents:
109
diff
changeset
|
2167 @staticmethod |
6380730a80b4
Add collect_typeidxs_mentioned_by_class()
Thinker K.F. Li <thinker@codemud.net>
parents:
109
diff
changeset
|
2168 def get_methods_classdef(classdef): |
6380730a80b4
Add collect_typeidxs_mentioned_by_class()
Thinker K.F. Li <thinker@codemud.net>
parents:
109
diff
changeset
|
2169 if not classdef.classDataOffRef.is_true: |
6380730a80b4
Add collect_typeidxs_mentioned_by_class()
Thinker K.F. Li <thinker@codemud.net>
parents:
109
diff
changeset
|
2170 return [] |
6380730a80b4
Add collect_typeidxs_mentioned_by_class()
Thinker K.F. Li <thinker@codemud.net>
parents:
109
diff
changeset
|
2171 classdata = classdef.classDataOffRef.value |
6380730a80b4
Add collect_typeidxs_mentioned_by_class()
Thinker K.F. Li <thinker@codemud.net>
parents:
109
diff
changeset
|
2172 methods = classdata.directMethods.items + \ |
6380730a80b4
Add collect_typeidxs_mentioned_by_class()
Thinker K.F. Li <thinker@codemud.net>
parents:
109
diff
changeset
|
2173 classdata.virtualMethods.items |
6380730a80b4
Add collect_typeidxs_mentioned_by_class()
Thinker K.F. Li <thinker@codemud.net>
parents:
109
diff
changeset
|
2174 return methods |
6380730a80b4
Add collect_typeidxs_mentioned_by_class()
Thinker K.F. Li <thinker@codemud.net>
parents:
109
diff
changeset
|
2175 |
111
3820379b34e8
Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents:
110
diff
changeset
|
2176 ## \brief Find all method IDs that is part of given type. |
3820379b34e8
Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents:
110
diff
changeset
|
2177 # |
3820379b34e8
Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents:
110
diff
changeset
|
2178 # \param typeid is ID of type that IDs of its methods will be returned. |
3820379b34e8
Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents:
110
diff
changeset
|
2179 # \return a list of method IDs. |
3820379b34e8
Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents:
110
diff
changeset
|
2180 # |
3820379b34e8
Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents:
110
diff
changeset
|
2181 def find_methodids_typeid(self, typeid): |
3820379b34e8
Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents:
110
diff
changeset
|
2182 methodids = [methodid |
3820379b34e8
Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents:
110
diff
changeset
|
2183 for methodid in self.methodIds.items |
3820379b34e8
Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents:
110
diff
changeset
|
2184 if methodid.classIdx == typeid] |
3820379b34e8
Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents:
110
diff
changeset
|
2185 return methodids |
3820379b34e8
Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents:
110
diff
changeset
|
2186 |
106
7821c6e89622
dexfile_redirect_types() is almost ready.
Thinker K.F. Li <thinker@codemud.net>
parents:
104
diff
changeset
|
2187 ## \brief Dump content of a proto ID. |
7821c6e89622
dexfile_redirect_types() is almost ready.
Thinker K.F. Li <thinker@codemud.net>
parents:
104
diff
changeset
|
2188 @staticmethod |
7821c6e89622
dexfile_redirect_types() is almost ready.
Thinker K.F. Li <thinker@codemud.net>
parents:
104
diff
changeset
|
2189 def dump_protoid(protoid): |
7821c6e89622
dexfile_redirect_types() is almost ready.
Thinker K.F. Li <thinker@codemud.net>
parents:
104
diff
changeset
|
2190 rtype_name = DEXFile_linked.get_typeid_name(protoid.returnTypeIdx) |
7821c6e89622
dexfile_redirect_types() is almost ready.
Thinker K.F. Li <thinker@codemud.net>
parents:
104
diff
changeset
|
2191 param_types = DEXFile_linked.get_param_typeids_protoid(protoid) |
7821c6e89622
dexfile_redirect_types() is almost ready.
Thinker K.F. Li <thinker@codemud.net>
parents:
104
diff
changeset
|
2192 ptype_names = [DEXFile_linked.get_typeid_name(ptype) |
7821c6e89622
dexfile_redirect_types() is almost ready.
Thinker K.F. Li <thinker@codemud.net>
parents:
104
diff
changeset
|
2193 for ptype in param_types] |
7821c6e89622
dexfile_redirect_types() is almost ready.
Thinker K.F. Li <thinker@codemud.net>
parents:
104
diff
changeset
|
2194 return '(%s) --> %s' % (', '.join(ptype_names), rtype_name) |
116
c5f59bdbc916
Fix issue of proto matching.
Thinker K.F. Li <thinker@codemud.net>
parents:
111
diff
changeset
|
2195 |
c5f59bdbc916
Fix issue of proto matching.
Thinker K.F. Li <thinker@codemud.net>
parents:
111
diff
changeset
|
2196 @staticmethod |
c5f59bdbc916
Fix issue of proto matching.
Thinker K.F. Li <thinker@codemud.net>
parents:
111
diff
changeset
|
2197 def make_protoid(rtype, args): |
c5f59bdbc916
Fix issue of proto matching.
Thinker K.F. Li <thinker@codemud.net>
parents:
111
diff
changeset
|
2198 arglist = _DEX_TypeList() |
c5f59bdbc916
Fix issue of proto matching.
Thinker K.F. Li <thinker@codemud.net>
parents:
111
diff
changeset
|
2199 arglist.num = len(args) |
c5f59bdbc916
Fix issue of proto matching.
Thinker K.F. Li <thinker@codemud.net>
parents:
111
diff
changeset
|
2200 arglist.typeItems = array(None, _DEX_TypeList_typeid) |
c5f59bdbc916
Fix issue of proto matching.
Thinker K.F. Li <thinker@codemud.net>
parents:
111
diff
changeset
|
2201 |
c5f59bdbc916
Fix issue of proto matching.
Thinker K.F. Li <thinker@codemud.net>
parents:
111
diff
changeset
|
2202 tltypeid_args = [_DEX_TypeList_typeid() |
c5f59bdbc916
Fix issue of proto matching.
Thinker K.F. Li <thinker@codemud.net>
parents:
111
diff
changeset
|
2203 for arg in args] |
c5f59bdbc916
Fix issue of proto matching.
Thinker K.F. Li <thinker@codemud.net>
parents:
111
diff
changeset
|
2204 for tltypeid, arg in map(None, tltypeid_args, args): |
c5f59bdbc916
Fix issue of proto matching.
Thinker K.F. Li <thinker@codemud.net>
parents:
111
diff
changeset
|
2205 tltypeid.typeIdx = arg |
c5f59bdbc916
Fix issue of proto matching.
Thinker K.F. Li <thinker@codemud.net>
parents:
111
diff
changeset
|
2206 pass |
c5f59bdbc916
Fix issue of proto matching.
Thinker K.F. Li <thinker@codemud.net>
parents:
111
diff
changeset
|
2207 |
c5f59bdbc916
Fix issue of proto matching.
Thinker K.F. Li <thinker@codemud.net>
parents:
111
diff
changeset
|
2208 arglist.typeItems.items = tltypeid_args |
c5f59bdbc916
Fix issue of proto matching.
Thinker K.F. Li <thinker@codemud.net>
parents:
111
diff
changeset
|
2209 |
c5f59bdbc916
Fix issue of proto matching.
Thinker K.F. Li <thinker@codemud.net>
parents:
111
diff
changeset
|
2210 param_cond = cond(None, _DEX_TypeList) |
c5f59bdbc916
Fix issue of proto matching.
Thinker K.F. Li <thinker@codemud.net>
parents:
111
diff
changeset
|
2211 param_cond.value = arglist |
c5f59bdbc916
Fix issue of proto matching.
Thinker K.F. Li <thinker@codemud.net>
parents:
111
diff
changeset
|
2212 param_cond.is_true = True |
c5f59bdbc916
Fix issue of proto matching.
Thinker K.F. Li <thinker@codemud.net>
parents:
111
diff
changeset
|
2213 |
c5f59bdbc916
Fix issue of proto matching.
Thinker K.F. Li <thinker@codemud.net>
parents:
111
diff
changeset
|
2214 protoid = _DEX_ProtoId() |
c5f59bdbc916
Fix issue of proto matching.
Thinker K.F. Li <thinker@codemud.net>
parents:
111
diff
changeset
|
2215 protoid.returnTypeIdx = rtype |
c5f59bdbc916
Fix issue of proto matching.
Thinker K.F. Li <thinker@codemud.net>
parents:
111
diff
changeset
|
2216 protoid.parametersOffRef = param_cond |
c5f59bdbc916
Fix issue of proto matching.
Thinker K.F. Li <thinker@codemud.net>
parents:
111
diff
changeset
|
2217 return protoid |
93
2fa9b6f21344
Add DEXFile_linked to model linked DEX
Thinker K.F. Li <thinker@codemud.net>
parents:
86
diff
changeset
|
2218 pass |
2fa9b6f21344
Add DEXFile_linked to model linked DEX
Thinker K.F. Li <thinker@codemud.net>
parents:
86
diff
changeset
|
2219 |
2fa9b6f21344
Add DEXFile_linked to model linked DEX
Thinker K.F. Li <thinker@codemud.net>
parents:
86
diff
changeset
|
2220 |
1
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
2221 if __name__ == '__main__': |
75
9422a25e798d
Pass filename from argument list for dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
67
diff
changeset
|
2222 import sys |
9422a25e798d
Pass filename from argument list for dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
67
diff
changeset
|
2223 |
9422a25e798d
Pass filename from argument list for dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
67
diff
changeset
|
2224 if len(sys.argv) != 2: |
9422a25e798d
Pass filename from argument list for dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
67
diff
changeset
|
2225 print >> sys.stderr, 'Usage: %s <dex file>' % (sys.argv[0]) |
9422a25e798d
Pass filename from argument list for dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
67
diff
changeset
|
2226 sys.exit(1) |
9422a25e798d
Pass filename from argument list for dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
67
diff
changeset
|
2227 pass |
9422a25e798d
Pass filename from argument list for dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
67
diff
changeset
|
2228 |
9422a25e798d
Pass filename from argument list for dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
67
diff
changeset
|
2229 dex_fname = sys.argv[1] |
9422a25e798d
Pass filename from argument list for dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
67
diff
changeset
|
2230 dex = DEXFile.open(dex_fname) |
1
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
2231 |
2 | 2232 print 'Header' |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
2233 h = dex.header |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
2234 for attr in h.child_names: |
2 | 2235 print '\t%s: %s' % (attr, repr(getattr(h, attr))) |
1
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
2236 pass |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
2237 |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
2238 print |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
2239 print 'Size of stringIds is %d bytes' % (dex.stringIds.data_size) |
1
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
2240 |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
2241 print |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
2242 print 'Size of typeIds is %d bytes' % (dex.typeIds.data_size) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
2243 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
2244 print |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
2245 print 'Size of protoIds is %d bytes' % (dex.protoIds.data_size) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
2246 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
2247 print |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
2248 print 'Size of fieldIds is %d bytes' % (dex.fieldIds.data_size) |
2 | 2249 |
2250 print | |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
2251 print 'Size of methodIds is %d bytes' % (dex.methodIds.data_size) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
2252 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
2253 print |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
2254 print 'Size of classDefs is %d bytes' % (dex.classDefs.data_size) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
2255 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
2256 print |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
2257 print 'Size of classDatas is %d bytes' % (dex.classDatas.data_size) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
2258 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
2259 print |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
2260 print 'Size of typeLists is %d bytes' % (dex.typeLists.data_size) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
2261 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
2262 print |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
2263 print 'Size of codeItems is %d bytes' % (dex.codeItems.data_size) |
2 | 2264 |
2265 print | |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
2266 print 'Size of annotationSetItems is %d bytes' % \ |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
2267 (dex.annotationSetItems.data_size) |
2 | 2268 |
2269 print | |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
2270 print 'Size of annotationsDirectoryItems is %d bytes' % \ |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
2271 (dex.annotationsDirectoryItems.data_size) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
2272 |
3
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
2273 print |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
2274 print 'Size of annotationItems is %d bytes' % \ |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
2275 (dex.annotationItems.data_size) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
2276 |
4
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
2277 print |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
2278 print 'Size of encodedArrayItems is %d bytes' % \ |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
2279 (dex.encodedArrayItems.data_size) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
2280 |
8 | 2281 print |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
2282 print 'Size of debugInfoItems is %d bytes' % \ |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
2283 (dex.debugInfoItems.data_size) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
2284 |
10
123c7a8bbf4c
Parse EncodedArrayItems
Thinker K.F. Li <thinker@codemud.net>
parents:
9
diff
changeset
|
2285 print |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
2286 print 'Size of stringDataItems is %d bytes' % \ |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
2287 (dex.stringDataItems.data_size) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
2288 |
2 | 2289 print |
2290 print 'Data maps' | |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
2291 maps = dex.maps.items.items |
2 | 2292 for map in maps: |
2293 print '\t0x%04x(%s) size=%d offset=0x%08x' % (map.type, | |
2294 map.types[map.type], | |
2295 map.size, | |
2296 map.offset) | |
18
f36b14d1f122
collect dependencies for classes in dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
17
diff
changeset
|
2297 pass |
1
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
2298 pass |