Mercurial > paraspace
annotate paraspace/dexfile.py @ 19:6008b9a9d33e
Declare dependencies for indics for classes in dexfile.py
author | Thinker K.F. Li <thinker@codemud.net> |
---|---|
date | Wed, 01 Jun 2011 20:48:35 +0800 |
parents | f36b14d1f122 |
children | f031b9d02ce8 |
rev | line source |
---|---|
12
8101024c942b
Document class man_off
Thinker K.F. Li <thinker@codemud.net>
parents:
11
diff
changeset
|
1 ## \brief Manage offset |
8101024c942b
Document class man_off
Thinker K.F. Li <thinker@codemud.net>
parents:
11
diff
changeset
|
2 # |
8101024c942b
Document class man_off
Thinker K.F. Li <thinker@codemud.net>
parents:
11
diff
changeset
|
3 # 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
|
4 # 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
|
5 # size. |
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 # moff = man_off(init_off) |
8101024c942b
Document class man_off
Thinker K.F. Li <thinker@codemud.net>
parents:
11
diff
changeset
|
8 # assert moff(5) == init_off |
8101024c942b
Document class man_off
Thinker K.F. Li <thinker@codemud.net>
parents:
11
diff
changeset
|
9 # assert moff() == (init_off + 5) |
8101024c942b
Document class man_off
Thinker K.F. Li <thinker@codemud.net>
parents:
11
diff
changeset
|
10 # assert moff() == (init_off + 5) |
8101024c942b
Document class man_off
Thinker K.F. Li <thinker@codemud.net>
parents:
11
diff
changeset
|
11 # |
3
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
12 class man_off(object): |
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
13 off = None |
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
14 |
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
15 def __init__(self, off): |
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
16 self.off = off |
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
17 pass |
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
18 |
4
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
19 def __call__(self, sz=0): |
3
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
20 off = self.off |
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
21 self.off = off + sz |
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
22 return off |
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
23 pass |
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
24 |
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
25 |
0 | 26 def _to_uint(data): |
27 v = 0 | |
1
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
28 sh = 0 |
0 | 29 for c in data: |
1
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
30 v = v + (ord(c) << sh) |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
31 sh = sh + 8 |
0 | 32 pass |
33 return v | |
34 | |
35 | |
8 | 36 def _to_int(data): |
37 v = _to_uint(data) | |
38 sz = len(data) | |
39 if sz and ((1 << (sz * 8 - 1)) & v): | |
40 v = -((1 << (sz * 8)) - v) | |
41 pass | |
42 return v | |
43 | |
44 | |
1
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
45 def _uleb128(data): |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
46 sh = 0 |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
47 v = 0 |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
48 for c in data: |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
49 cv = ord(c) |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
50 v = v + ((cv & 0x7f) << sh) |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
51 sh = sh + 7 |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
52 |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
53 if cv <= 0x7f: |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
54 break |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
55 pass |
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 nbytes = sh / 7 |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
58 return v, nbytes |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
59 |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
60 |
13
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
61 def _to_uleb128(v): |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
62 assert v >= 0 |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
63 |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
64 data = '' |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
65 while True: |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
66 if v > 0x7f: |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
67 data = data + chr((v & 0x7f) | 0x80) |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
68 else: |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
69 data = data + chr(v & 0x7f) |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
70 break |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
71 v = v >> 7 |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
72 pass |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
73 |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
74 return data |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
75 |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
76 |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
77 def _uleb128_sz(v): |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
78 return len(_to_uleb128(v)) |
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 |
2 | 81 def _leb128(data): |
82 v, sh = _uleb128(data) | |
83 if v & (1 << (sh * 7 - 1)): | |
84 v = -((1 << (sh * 7)) - v) | |
85 pass | |
86 return v, sh | |
87 | |
88 | |
13
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
89 def _to_leb128(v): |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
90 data = '' |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
91 while True: |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
92 if v > 0x3f or v < ~0x3f: |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
93 data = data + chr((v & 0x7f) | 0x80) |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
94 else: |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
95 data = data + chr(v & 0x7f) |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
96 break |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
97 v = v >> 7 |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
98 pass |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
99 return data |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
100 |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
101 |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
102 def _leb128_sz(v): |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
103 return len(_to_leb128(v)) |
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 _compute_sz(o): |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
107 if hasattr(o, 'compute_size'): |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
108 o.compute_size() |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
109 pass |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
110 return o.data_size |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
111 |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
112 |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
113 def _sum_data_size(obj_list): |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
114 obj_sizes = itertools.imap(_compute_sz, obj_list) |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
115 total = sum(obj_sizes) |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
116 return total |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
117 |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
118 |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
119 class _rawstr(object): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
120 size = None |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
121 factor = None |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
122 data = None |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
123 data_size = None |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
124 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
125 ## |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
126 # \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
|
127 # |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
128 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
|
129 self.size = size |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
130 self.size_name = size_name |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
131 self.factor = factor |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
132 pass |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
133 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
134 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
|
135 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
|
136 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
|
137 size = self.size |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
138 else: |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
139 size = parent |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
140 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
|
141 size = getattr(size, name) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
142 pass |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
143 pass |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
144 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
|
145 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
146 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
|
147 return obj |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
148 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
149 def sizeof(self, v): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
150 return v.data_size |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
151 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
152 def to_str(self, v): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
153 return v |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
154 pass |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
155 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
156 class rawstr(_rawstr): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
157 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
|
158 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
|
159 pass |
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 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
163 class rawstr_size_name(_rawstr): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
164 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
|
165 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
|
166 factor=factor) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
167 pass |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
168 pass |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
169 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
170 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
171 class tap(object): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
172 @staticmethod |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
173 def parse(parent, data, off): |
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 @staticmethod |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
177 def sizeof(v): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
178 return 0 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
179 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
180 @staticmethod |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
181 def to_str(v): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
182 return '' |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
183 pass |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
184 |
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 class uint32(object): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
187 @staticmethod |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
188 def parse(parent, data, off): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
189 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
|
190 return v |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
191 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
192 @staticmethod |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
193 def sizeof(v): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
194 return 4 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
195 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
196 @staticmethod |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
197 def to_str(v): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
198 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
|
199 chr((v >> 24) & 0xff) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
200 pass |
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 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
203 class uint16(object): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
204 @staticmethod |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
205 def parse(parent, data, off): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
206 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
|
207 return v |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
208 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
209 @staticmethod |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
210 def sizeof(v): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
211 return 2 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
212 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
213 @staticmethod |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
214 def to_str(v): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
215 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
|
216 pass |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
217 |
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 class uint8(object): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
220 @staticmethod |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
221 def parse(parent, data, off): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
222 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
|
223 return v |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
224 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
225 @staticmethod |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
226 def sizeof(v): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
227 return 1 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
228 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
229 @staticmethod |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
230 def to_str(v): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
231 return chr(v & 0xff) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
232 pass |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
233 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
234 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
235 class int32(object): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
236 @staticmethod |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
237 def parse(parent, data, off): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
238 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
|
239 return v |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
240 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
241 @staticmethod |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
242 def sizeof(v): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
243 return 4 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
244 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
245 @staticmethod |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
246 def to_str(v): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
247 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
|
248 chr((v >> 24) & 0xff) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
249 pass |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
250 |
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 class int16(object): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
253 @staticmethod |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
254 def parse(parent, data, off): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
255 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
|
256 return v |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
257 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
258 @staticmethod |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
259 def sizeof(v): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
260 return 2 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
261 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
262 @staticmethod |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
263 def to_str(v): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
264 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
|
265 pass |
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 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
268 class uleb128(object): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
269 @staticmethod |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
270 def parse(parent, data, off): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
271 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
|
272 return v |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
273 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
274 @staticmethod |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
275 def sizeof(v): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
276 return _uleb128_sz(v) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
277 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
278 @staticmethod |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
279 def to_str(v): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
280 return _to_uleb128(v) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
281 pass |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
282 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
283 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
284 class leb128(object): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
285 @staticmethod |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
286 def parse(parent, data, off): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
287 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
|
288 return v |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
289 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
290 @staticmethod |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
291 def sizeof(v): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
292 return _leb128_sz(v) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
293 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
294 @staticmethod |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
295 def to_str(v): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
296 return _to_leb128(v) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
297 pass |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
298 |
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 class auto_align(object): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
301 bits = None |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
302 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
303 def __init__(self, bits): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
304 self.bits = bits |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
305 pass |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
306 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
307 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
|
308 mask = (1 << self.bits) - 1 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
309 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
|
310 return padding_sz |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
311 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
312 @staticmethod |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
313 def sizeof(v): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
314 return v |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
315 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
316 @staticmethod |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
317 def to_str(v): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
318 return '\x00' * v |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
319 pass |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
320 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
321 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
322 def _get_sz(o): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
323 if isinstance(o, relocatable): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
324 return o.data_size |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
325 return o.__class__.sizeof(o) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
326 |
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 class relocatable(object): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
329 data_size = None |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
330 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
331 @staticmethod |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
332 def parse(parent, data, off): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
333 pass |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
334 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
335 @staticmethod |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
336 def sizeof(v): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
337 return v.data_size |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
338 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
339 def to_str(self): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
340 pass |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
341 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
342 def compute_size(self): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
343 pass |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
344 pass |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
345 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
346 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
347 class array(relocatable): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
348 count_name = None |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
349 child_type = None |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
350 items = None |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
351 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
352 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
|
353 super(array, self).__init__() |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
354 self.count_name = count_name |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
355 self.child_type = child_type |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
356 pass |
0 | 357 |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
358 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
|
359 nitem = parent |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
360 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
|
361 nitem = getattr(nitem, name) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
362 pass |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
363 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
|
364 return obj |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
365 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
366 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
|
367 moff = man_off(off) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
368 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
369 obj = array(self.count_name, self.child_type) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
370 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
371 def parse(): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
372 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
|
373 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
|
374 moff(item_sz) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
375 return item |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
376 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
377 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
|
378 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
379 obj.items = items |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
380 obj.data_size = moff() - off |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
381 return obj |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
382 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
383 def compute_size(self): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
384 sizes = [compute_size(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
|
385 size = sum(sizes) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
386 self.data_size = size |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
387 pass |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
388 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
389 def to_str(self): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
390 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
|
391 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
|
392 return ''.join(strs) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
393 pass |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
394 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
395 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
396 class composite(relocatable): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
397 child_names = None |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
398 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
399 def __init__(self): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
400 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
|
401 setattr(self, child_name, None) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
402 pass |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
403 pass |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
404 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
405 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
|
406 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
|
407 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
|
408 setattr(self, child_name, child) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
409 pass |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
410 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
411 @classmethod |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
412 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
|
413 moff = man_off(off) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
414 obj = clazz() |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
415 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
416 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
|
417 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
|
418 child = getattr(obj, child_name) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
419 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
|
420 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
|
421 moff(child_sz) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
422 pass |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
423 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
424 obj.data_size = moff() - off |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
425 return obj |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
426 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
427 def compute_size(self): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
428 children = [getattr(self, child_name) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
429 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
|
430 child_sizes = [compute_size(child) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
431 for child in children] |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
432 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
|
433 pass |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
434 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
435 def to_str(self): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
436 child_clazzs = [getattr(self.__class__, child_name) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
437 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
|
438 children = [getattr(self, child_name) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
439 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
|
440 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
|
441 child_clazz.to_str(child), |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
442 child_clazzs, children) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
443 return ''.join(child_strs) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
444 pass |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
445 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
446 |
17
d0806672da04
Declare dependencies for dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
15
diff
changeset
|
447 class cond(relocatable): |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
448 condition = None |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
449 child_type = None |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
450 value = None |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
451 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
452 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
|
453 self.condition = cond |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
454 self.child_type = child_type |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
455 pass |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
456 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
457 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
|
458 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
|
459 value = self.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
|
460 else: |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
461 value = None |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
462 pass |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
463 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
464 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
|
465 obj.value = value |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
466 obj.data_size = self.sizeof(obj) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
467 return obj |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
468 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
469 def sizeof(self, v): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
470 if v.value is None: |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
471 return 0 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
472 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
|
473 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
474 def compute_size(self): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
475 if isinstance(self.value, relocatable): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
476 self.value.compute_size() |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
477 pass |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
478 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
479 self.data_size = self.sizeof(self.value) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
480 pass |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
481 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
482 def to_str(self): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
483 if self.value is None: |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
484 return '' |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
485 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
486 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
|
487 return data |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
488 pass |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
489 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
490 |
17
d0806672da04
Declare dependencies for dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
15
diff
changeset
|
491 class switch(relocatable): |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
492 selector = None |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
493 map = None |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
494 child_type = None |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
495 value = None |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
496 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
497 def __init__(self, selector, map): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
498 self.selector = selector |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
499 self.map = map |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
500 pass |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
501 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
502 def _get_child_type(self, parent): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
503 selector = self.selector |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
504 sel_value = parent |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
505 for name in selector.split('.'): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
506 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
|
507 pass |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
508 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
509 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
|
510 return child_type |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
511 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
512 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
|
513 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
|
514 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
|
515 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
516 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
|
517 obj.value = value |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
518 obj.child_type = child_type |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
519 obj.data_size = self.sizeof(obj) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
520 return obj |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
521 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
522 @staticmethod |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
523 def sizeof(v): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
524 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
|
525 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
526 def compute_size(self): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
527 if isinstance(self.value, relocatable): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
528 self.value.compute_size() |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
529 pass |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
530 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
531 self.data_size = self.sizeof(self.value) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
532 pass |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
533 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
534 def to_str(self): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
535 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
|
536 return data |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
537 pass |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
538 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
539 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
540 class abs_value(object): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
541 value = None |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
542 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
543 def __init__(self, value): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
544 self.value = value |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
545 pass |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
546 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
547 def parse(self, parse, data, off): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
548 obj = abs_value(self.value) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
549 return obj |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
550 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
551 def sizeof(self, v): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
552 return 0 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
553 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
554 def to_str(self): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
555 return '' |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
556 pass |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
557 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
558 |
17
d0806672da04
Declare dependencies for dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
15
diff
changeset
|
559 class depend(relocatable): |
d0806672da04
Declare dependencies for dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
15
diff
changeset
|
560 depend_on = None |
d0806672da04
Declare dependencies for dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
15
diff
changeset
|
561 child_type = None |
d0806672da04
Declare dependencies for dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
15
diff
changeset
|
562 |
d0806672da04
Declare dependencies for dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
15
diff
changeset
|
563 def __init__(self, depend_on): |
d0806672da04
Declare dependencies for dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
15
diff
changeset
|
564 self.depend_on = depend_on |
d0806672da04
Declare dependencies for dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
15
diff
changeset
|
565 pass |
d0806672da04
Declare dependencies for dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
15
diff
changeset
|
566 |
d0806672da04
Declare dependencies for dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
15
diff
changeset
|
567 def __call__(self, child_type): |
d0806672da04
Declare dependencies for dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
15
diff
changeset
|
568 self.child_type = child_type |
d0806672da04
Declare dependencies for dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
15
diff
changeset
|
569 return self |
d0806672da04
Declare dependencies for dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
15
diff
changeset
|
570 |
d0806672da04
Declare dependencies for dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
15
diff
changeset
|
571 def parse(self, parent, data, off): |
d0806672da04
Declare dependencies for dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
15
diff
changeset
|
572 v = self.child_type.parse(parent, data, off) |
d0806672da04
Declare dependencies for dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
15
diff
changeset
|
573 return v |
d0806672da04
Declare dependencies for dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
15
diff
changeset
|
574 |
d0806672da04
Declare dependencies for dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
15
diff
changeset
|
575 def sizeof(self, v): |
d0806672da04
Declare dependencies for dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
15
diff
changeset
|
576 v = self.child_type.sizeof(v) |
d0806672da04
Declare dependencies for dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
15
diff
changeset
|
577 return v |
d0806672da04
Declare dependencies for dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
15
diff
changeset
|
578 |
d0806672da04
Declare dependencies for dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
15
diff
changeset
|
579 def compute_size(self, child): |
d0806672da04
Declare dependencies for dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
15
diff
changeset
|
580 if issubclass(self.child_type, relocatable): |
d0806672da04
Declare dependencies for dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
15
diff
changeset
|
581 self.child_type.compute_size(child) |
d0806672da04
Declare dependencies for dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
15
diff
changeset
|
582 pass |
d0806672da04
Declare dependencies for dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
15
diff
changeset
|
583 pass |
d0806672da04
Declare dependencies for dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
15
diff
changeset
|
584 |
d0806672da04
Declare dependencies for dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
15
diff
changeset
|
585 def to_str(self, child): |
d0806672da04
Declare dependencies for dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
15
diff
changeset
|
586 return self.child_type.to_str(child) |
d0806672da04
Declare dependencies for dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
15
diff
changeset
|
587 pass |
d0806672da04
Declare dependencies for dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
15
diff
changeset
|
588 |
d0806672da04
Declare dependencies for dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
15
diff
changeset
|
589 |
d0806672da04
Declare dependencies for dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
15
diff
changeset
|
590 class depend_off(depend): |
d0806672da04
Declare dependencies for dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
15
diff
changeset
|
591 pass |
d0806672da04
Declare dependencies for dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
15
diff
changeset
|
592 |
d0806672da04
Declare dependencies for dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
15
diff
changeset
|
593 |
d0806672da04
Declare dependencies for dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
15
diff
changeset
|
594 class depend_off_rel(depend): |
d0806672da04
Declare dependencies for dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
15
diff
changeset
|
595 relative_to = None |
d0806672da04
Declare dependencies for dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
15
diff
changeset
|
596 |
d0806672da04
Declare dependencies for dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
15
diff
changeset
|
597 def __init__(self, relative_to, depend_on): |
d0806672da04
Declare dependencies for dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
15
diff
changeset
|
598 super(depend_off_rel, self).__init__(depend_on) |
d0806672da04
Declare dependencies for dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
15
diff
changeset
|
599 pass |
d0806672da04
Declare dependencies for dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
15
diff
changeset
|
600 pass |
d0806672da04
Declare dependencies for dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
15
diff
changeset
|
601 |
d0806672da04
Declare dependencies for dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
15
diff
changeset
|
602 |
19
6008b9a9d33e
Declare dependencies for indics for classes in dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
18
diff
changeset
|
603 class depend_idx(depend): |
6008b9a9d33e
Declare dependencies for indics for classes in dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
18
diff
changeset
|
604 pass |
6008b9a9d33e
Declare dependencies for indics for classes in dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
18
diff
changeset
|
605 |
6008b9a9d33e
Declare dependencies for indics for classes in dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
18
diff
changeset
|
606 |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
607 class _DEX_header(composite): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
608 magic = rawstr(8) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
609 checksum = uint32 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
610 signature = rawstr(20) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
611 fileSize = uint32 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
612 headerSize = uint32 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
613 endianTag = uint32 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
614 linkSize = uint32 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
615 linkOff = uint32 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
616 mapOff = uint32 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
617 stringIdsSize = uint32 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
618 stringIdsOff = uint32 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
619 typeIdsSize = uint32 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
620 typeIdsOff = uint32 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
621 protoIdsSize = uint32 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
622 protoIdsOff = uint32 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
623 fieldIdsSize = uint32 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
624 fieldIdsOff = uint32 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
625 methodIdsSize = uint32 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
626 methodIdsOff = uint32 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
627 classDefsSize = uint32 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
628 classDefsOff = uint32 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
629 dataSize = uint32 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
630 dataOff = uint32 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
631 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
632 child_names = \ |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
633 '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
|
634 '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
|
635 'typeIdsOff protoIdsSize protoIdsOff fieldIdsSize fieldIdsOff ' \ |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
636 'methodIdsSize methodIdsOff classDefsSize classDefsOff ' \ |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
637 'dataSize dataOff'.split() |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
638 pass |
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 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
641 class _DEX_MapItem(composite): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
642 type = uint16 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
643 unused = uint16 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
644 size = uint32 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
645 offset = uint32 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
646 |
2 | 647 types = { |
648 0x0000: 'kDexTypeHeaderItem', | |
649 0x0001: 'kDexTypeStringIdItem', | |
650 0x0002: 'kDexTypeTypeIdItem', | |
651 0x0003: 'kDexTypeProtoIdItem', | |
652 0x0004: 'kDexTypeFieldIdItem', | |
653 0x0005: 'kDexTypeMethodIdItem', | |
654 0x0006: 'kDexTypeClassDefItem', | |
655 0x1000: 'kDexTypeMapList', | |
656 0x1001: 'kDexTypeTypeList', | |
657 0x1002: 'kDexTypeAnnotationSetRefList', | |
658 0x1003: 'kDexTypeAnnotationSetItem', | |
659 0x2000: 'kDexTypeClassDataItem', | |
660 0x2001: 'kDexTypeCodeItem', | |
661 0x2002: 'kDexTypeStringDataItem', | |
662 0x2003: 'kDexTypeDebugInfoItem', | |
663 0x2004: 'kDexTypeAnnotationItem', | |
664 0x2005: 'kDexTypeEncodedArrayItem', | |
665 0x2006: 'kDexTypeAnnotationsDirectoryItem' | |
666 } | |
0 | 667 |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
668 child_names = \ |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
669 'type unused size offset'.split() |
0 | 670 pass |
671 | |
672 | |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
673 class _DEX_MapItemBlock(composite): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
674 num = uint32 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
675 items = array('num', _DEX_MapItem) |
0 | 676 |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
677 child_names = 'num items'.split() |
0 | 678 pass |
679 | |
680 | |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
681 class _DEX_StringId(composite): |
17
d0806672da04
Declare dependencies for dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
15
diff
changeset
|
682 stringDataOff = depend_off('_DEX_StringDataItem')(uint32) |
0 | 683 |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
684 child_names = ('stringDataOff',) |
0 | 685 pass |
686 | |
687 | |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
688 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
|
689 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
|
690 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
691 child_names = ('descriptorIdx',) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
692 pass |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
693 |
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 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
|
696 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
|
697 returnTypeIdx = depend_idx('DEXFile.typeIds')(uint32) |
17
d0806672da04
Declare dependencies for dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
15
diff
changeset
|
698 parametersOff = depend_off('_DEX_TypeList')(uint32) |
0 | 699 |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
700 child_names = 'shortyIdx returnTypeIdx parametersOff'.split() |
0 | 701 pass |
702 | |
1
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
703 |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
704 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
|
705 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
|
706 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
|
707 nameIdx = depend_idx('DEXFile.stringIds')(uint32) |
0 | 708 |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
709 child_names = 'classIdx typeIdx nameIdx'.split() |
0 | 710 pass |
711 | |
712 | |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
713 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
|
714 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
|
715 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
|
716 nameIdx = depend_idx('DEXFile.stringIds')(uint32) |
2 | 717 |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
718 child_names = 'classIdx protoIdx nameIdx'.split() |
2 | 719 pass |
720 | |
721 | |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
722 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
|
723 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
|
724 accessFlags = uint32 |
19
6008b9a9d33e
Declare dependencies for indics for classes in dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
18
diff
changeset
|
725 superclassIdx = depend_idx('DEXFile.typeIds')(uint32) |
17
d0806672da04
Declare dependencies for dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
15
diff
changeset
|
726 interfacesOff = depend_off('_DEX_TypeList')(uint32) |
19
6008b9a9d33e
Declare dependencies for indics for classes in dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
18
diff
changeset
|
727 sourceFileIdx = depend_idx('DEXFile.stringIds')(uint32) |
17
d0806672da04
Declare dependencies for dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
15
diff
changeset
|
728 annotationsOff = depend_off('_DEX_AnnotationsDirectoryItem')(uint32) |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
729 classDataOff = uint32 |
17
d0806672da04
Declare dependencies for dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
15
diff
changeset
|
730 staticValuesOff = depend_off('_DEX_EncodedArrayItem')(uint32) |
2 | 731 |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
732 child_names = \ |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
733 'classIdx accessFlags superclassIdx interfacesOff ' \ |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
734 'sourceFileIdx annotationsOff classDataOff staticValuesOff'.split() |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
735 pass |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
736 |
2 | 737 |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
738 class _DEX_ClassDataHeader(composite): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
739 staticFieldsSize = uleb128 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
740 instanceFieldsSize = uleb128 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
741 directMethodsSize = uleb128 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
742 virtualMethodsSize = uleb128 |
13
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
743 |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
744 child_names = \ |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
745 'staticFieldsSize instanceFieldsSize directMethodsSize ' \ |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
746 'virtualMethodsSize'.split() |
2 | 747 pass |
748 | |
749 | |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
750 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
|
751 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
|
752 accessFlags = uleb128 |
2 | 753 |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
754 child_names = 'fieldIdx accessFlags'.split() |
2 | 755 pass |
756 | |
757 | |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
758 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
|
759 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
|
760 accessFlags = uleb128 |
17
d0806672da04
Declare dependencies for dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
15
diff
changeset
|
761 codeOff = depend_off('_DEX_Code')(uleb128) |
2 | 762 |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
763 child_names = 'methodIdx accessFlags codeOff'.split() |
2 | 764 pass |
765 | |
766 | |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
767 class _DEX_ClassData(composite): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
768 header = _DEX_ClassDataHeader |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
769 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
|
770 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
|
771 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
|
772 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
|
773 |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
774 child_names = \ |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
775 'header ' \ |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
776 '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
|
777 pass |
917f0a9b9d06
Refactor _DEX_TypeItem from _DEX_TypeList for layout info tracking
Thinker K.F. Li <thinker@codemud.net>
parents:
5
diff
changeset
|
778 |
917f0a9b9d06
Refactor _DEX_TypeItem from _DEX_TypeList for layout info tracking
Thinker K.F. Li <thinker@codemud.net>
parents:
5
diff
changeset
|
779 |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
780 class _DEX_TypeList(composite): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
781 padding = auto_align(2) # 2 bits alignment |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
782 num = uint32 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
783 typeItems = array('num', uint16) |
6
917f0a9b9d06
Refactor _DEX_TypeItem from _DEX_TypeList for layout info tracking
Thinker K.F. Li <thinker@codemud.net>
parents:
5
diff
changeset
|
784 |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
785 child_names = 'padding num typeItems'.split() |
2 | 786 pass |
787 | |
788 | |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
789 class _DEX_Try(composite): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
790 startAddr = uint32 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
791 insnCount = uint16 |
17
d0806672da04
Declare dependencies for dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
15
diff
changeset
|
792 handlerOff = depend_off_rel('_DEX_Code.handlers_size', |
d0806672da04
Declare dependencies for dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
15
diff
changeset
|
793 '_DEX_Catch')(uint16) |
2 | 794 |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
795 child_names = 'startAddr insnCount handlerOff'.split() |
2 | 796 pass |
797 | |
798 | |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
799 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
|
800 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
|
801 address = uleb128 |
2 | 802 |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
803 child_names = 'typeIdx address'.split() |
2 | 804 pass |
805 | |
806 | |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
807 class _DEX_CatchAllHandler(composite): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
808 address = uleb128 |
2 | 809 |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
810 child_names = 'address'.split() |
2 | 811 pass |
812 | |
813 | |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
814 class _DEX_Catch(composite): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
815 size = leb128 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
816 handlers = array('count', _DEX_CatchHandler) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
817 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
|
818 _DEX_CatchAllHandler) |
2 | 819 |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
820 child_names = 'size handlers catchAllHandler'.split() |
2 | 821 |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
822 @property |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
823 def catchesAll(self): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
824 return self.size <= 0 |
2 | 825 |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
826 @property |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
827 def count(self): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
828 if self.size < 0: |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
829 return -self.size |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
830 return self.size |
2 | 831 pass |
832 | |
833 | |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
834 class _DEX_Code(composite): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
835 registersSize = uint16 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
836 insSize = uint16 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
837 outsSize = uint16 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
838 triesSize = uint16 |
17
d0806672da04
Declare dependencies for dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
15
diff
changeset
|
839 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
|
840 insnsSize = uint32 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
841 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
|
842 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
843 _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
|
844 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
845 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
|
846 try_items = cond(_has_tries, |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
847 array('triesSize', _DEX_Try)) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
848 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
849 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
|
850 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
|
851 array('handlers_size.value', _DEX_Catch)) |
2 | 852 |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
853 padding2 = auto_align(2) |
2 | 854 |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
855 child_names = \ |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
856 'registersSize insSize outsSize triesSize debugInfoOff ' \ |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
857 'insnsSize insns padding try_items handlers_size ' \ |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
858 'catch_handler_items padding2'.split() |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
859 pass |
13
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
860 |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
861 |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
862 class _DEX_AnnotationSetItem(composite): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
863 size = uint32 |
17
d0806672da04
Declare dependencies for dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
15
diff
changeset
|
864 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
|
865 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
866 child_names = 'size annotationOffs'.split() |
2 | 867 pass |
868 | |
869 | |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
870 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
|
871 fieldIdx = depend_idx('DEXFile.fieldIds')(uint32) |
17
d0806672da04
Declare dependencies for dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
15
diff
changeset
|
872 annotationsOff = depend_off('_DEX_AnnotationSetItem')(uint32) |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
873 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
874 child_names = 'fieldIdx annotationsOff'.split() |
4
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
875 pass |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
876 |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
877 |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
878 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
|
879 methodIdx = depend_idx('DEXFile.methodIds')(uint32) |
17
d0806672da04
Declare dependencies for dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
15
diff
changeset
|
880 annotationsOff = depend_off('_DEX_AnnotationSetItem')(uint32) |
4
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
881 |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
882 child_names = 'methodIdx annotationsOff'.split() |
4
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
883 pass |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
884 |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
885 |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
886 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
|
887 methodIdx = depend_idx('DEXFile.methodIds')(uint32) |
17
d0806672da04
Declare dependencies for dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
15
diff
changeset
|
888 annotationsOff = depend_off('_DEX_AnnotationSetItem')(uint32) |
4
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
889 |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
890 child_names = 'methodIdx annotationsOff'.split() |
4
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
891 pass |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
892 |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
893 |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
894 class _DEX_AnnotationsDirectoryItem(composite): |
17
d0806672da04
Declare dependencies for dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
15
diff
changeset
|
895 classAnnotationsOff = depend_off('_DEX_AnnotationSetItem')(uint32) |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
896 fieldsSize = uint32 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
897 methodsSize = uint32 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
898 parametersSize = uint32 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
899 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
900 fieldAnnotationsItems = array('fieldsSize', _DEX_FieldAnnotationsItem) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
901 methodAnnotationsItems = array('methodsSize', _DEX_MethodAnnotationsItem) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
902 parameterAnnotationsItems = array('parametersSize', |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
903 _DEX_ParameterAnnotationsItem) |
4
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
904 |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
905 child_names = 'classAnnotationsOff fieldsSize methodsSize ' \ |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
906 'parametersSize fieldAnnotationsItems methodAnnotationsItems ' \ |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
907 'parameterAnnotationsItems'.split() |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
908 pass |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
909 |
13
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
910 |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
911 class _DEX_AnnotationArray(composite): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
912 size = uleb128 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
913 # 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
|
914 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
915 child_names = 'size annotations'.split() |
3
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
916 pass |
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
917 |
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
918 |
8 | 919 ## |
920 # | |
921 # \see createAnnotationMember() in dalvik/vm/reflect/Annotation.c | |
922 # | |
19
6008b9a9d33e
Declare dependencies for indics for classes in dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
18
diff
changeset
|
923 class _DEX_AnnotationMember_noname(composite): |
8 | 924 # |
925 # Constants from DexFile.h | |
926 # | |
927 kDexAnnotationByte = 0x00 | |
928 kDexAnnotationShort = 0x02 | |
929 kDexAnnotationChar = 0x03 | |
930 kDexAnnotationInt = 0x04 | |
931 kDexAnnotationLong = 0x06 | |
932 kDexAnnotationFloat = 0x10 | |
933 kDexAnnotationDouble = 0x11 | |
934 kDexAnnotationString = 0x17 | |
935 kDexAnnotationType = 0x18 | |
936 kDexAnnotationField = 0x19 | |
937 kDexAnnotationMethod = 0x1a | |
938 kDexAnnotationEnum = 0x1b | |
939 kDexAnnotationArray = 0x1c | |
940 kDexAnnotationAnnotation = 0x1d | |
941 kDexAnnotationNull = 0x1e | |
942 kDexAnnotationBoolean = 0x1f | |
943 | |
944 kDexAnnotationValueTypeMask = 0x1f | |
945 kDexAnnotationValueArgShift = 5 | |
946 | |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
947 valueType = uint8 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
948 value_map = { |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
949 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
|
950 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
|
951 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
|
952 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
|
953 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
|
954 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
|
955 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
|
956 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
|
957 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
|
958 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
|
959 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
|
960 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
|
961 kDexAnnotationNull: abs_value(0), |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
962 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
|
963 kDexAnnotationArray: _DEX_AnnotationArray, |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
964 # kDexAnnotationAnnotation: _DEX_AnnotationItem_novisibility |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
965 } |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
966 value = switch('vtype', value_map) |
8 | 967 |
19
6008b9a9d33e
Declare dependencies for indics for classes in dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
18
diff
changeset
|
968 child_names = 'valueType value'.split() |
8 | 969 |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
970 @property |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
971 def vtype(self): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
972 vtype = self.valueType & self.kDexAnnotationValueTypeMask |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
973 return vtype |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
974 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
975 @property |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
976 def width(self): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
977 width = self.valueType >> self.kDexAnnotationValueArgShift |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
978 return width |
13
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
979 |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
980 @property |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
981 def value_width(self): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
982 width = self.valueType >> self.kDexAnnotationValueArgShift |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
983 return width + 1 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
984 pass |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
985 |
13
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
986 |
19
6008b9a9d33e
Declare dependencies for indics for classes in dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
18
diff
changeset
|
987 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
|
988 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
|
989 |
6008b9a9d33e
Declare dependencies for indics for classes in dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
18
diff
changeset
|
990 child_names = 'nameIdx valueType value'.split() |
8 | 991 pass |
992 | |
993 | |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
994 _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
|
995 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
996 |
8 | 997 ## \brief Annotation item |
998 # | |
999 # \see processEncodedAnnotation() in dalvik/vm/reflect/Annotation.c | |
1000 # | |
19
6008b9a9d33e
Declare dependencies for indics for classes in dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
18
diff
changeset
|
1001 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
|
1002 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
|
1003 size = uleb128 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1004 members = array('size', _DEX_AnnotationMember) |
8 | 1005 |
19
6008b9a9d33e
Declare dependencies for indics for classes in dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
18
diff
changeset
|
1006 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
|
1007 |
8 | 1008 kDexVisibilityBuild = 0x00 |
1009 kDexVisibilityRuntime = 0x01 | |
1010 kDexVisibilitySystem = 0x02 | |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1011 pass |
8 | 1012 |
1013 | |
19
6008b9a9d33e
Declare dependencies for indics for classes in dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
18
diff
changeset
|
1014 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
|
1015 visibility = uint8 |
6008b9a9d33e
Declare dependencies for indics for classes in dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
18
diff
changeset
|
1016 |
6008b9a9d33e
Declare dependencies for indics for classes in dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
18
diff
changeset
|
1017 child_names = 'visibility typeIdx size members'.split() |
8 | 1018 pass |
1019 | |
1020 | |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1021 _DEX_AnnotationMember. \ |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1022 value_map[_DEX_AnnotationMember.kDexAnnotationAnnotation] = \ |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1023 _DEX_AnnotationItem_novisibility |
10
123c7a8bbf4c
Parse EncodedArrayItems
Thinker K.F. Li <thinker@codemud.net>
parents:
9
diff
changeset
|
1024 |
123c7a8bbf4c
Parse EncodedArrayItems
Thinker K.F. Li <thinker@codemud.net>
parents:
9
diff
changeset
|
1025 |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1026 class _DEX_EncodedArrayItem(composite): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1027 size = uleb128 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1028 elements = array('size', _DEX_AnnotationMember_noname) |
10
123c7a8bbf4c
Parse EncodedArrayItems
Thinker K.F. Li <thinker@codemud.net>
parents:
9
diff
changeset
|
1029 |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1030 child_names = 'size elements'.split() |
10
123c7a8bbf4c
Parse EncodedArrayItems
Thinker K.F. Li <thinker@codemud.net>
parents:
9
diff
changeset
|
1031 pass |
123c7a8bbf4c
Parse EncodedArrayItems
Thinker K.F. Li <thinker@codemud.net>
parents:
9
diff
changeset
|
1032 |
123c7a8bbf4c
Parse EncodedArrayItems
Thinker K.F. Li <thinker@codemud.net>
parents:
9
diff
changeset
|
1033 |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1034 class _DEX_DebugCodeBlock(relocatable): |
11 | 1035 DBG_END_SEQUENCE = 0x00 |
1036 DBG_ADVANCE_PC = 0x01 | |
1037 DBG_ADVANCE_LINE = 0x02 | |
1038 DBG_START_LOCAL = 0x03 | |
1039 DBG_START_LOCAL_EXTENDED = 0x04 | |
1040 DBG_END_LOCAL = 0x05 | |
1041 DBG_RESTART_LOCAL = 0x06 | |
1042 DBG_SET_PROLOGUE_END = 0x07 | |
1043 DBG_SET_EPILOGUE_BEGIN = 0x08 | |
1044 DBG_SET_FILE = 0x09 | |
1045 DBG_FIRST_SPECIAL = 0x0a | |
1046 DBG_LINE_BASE = -4 | |
1047 DBG_LINE_RANGE = 15 | |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1048 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1049 opcodes = None |
11 | 1050 data_size = None |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1051 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1052 @staticmethod |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1053 def parse(parent, data, off): |
11 | 1054 moff = man_off(off) |
1055 | |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1056 self = _DEX_DebugCodeBlock() |
11 | 1057 |
1058 # | |
1059 # Parse debug opcodes | |
1060 # | |
1061 opcodes = [] | |
1062 while True: | |
1063 opcode = _to_uint(data[moff(1):moff()]) | |
1064 | |
1065 if opcode == self.DBG_END_SEQUENCE: | |
1066 opcodes.append((opcode,)) | |
1067 break | |
1068 elif opcode == self.DBG_ADVANCE_PC: | |
1069 adv, sh = _uleb128(data[moff():moff() + 5]) | |
1070 moff(sh) | |
1071 opcodes.append((opcode, adv)) | |
1072 pass | |
1073 elif opcode == self.DBG_ADVANCE_LINE: | |
13
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1074 adv, sh = _leb128(data[moff():moff() + 5]) |
11 | 1075 moff(sh) |
1076 opcodes.append((opcode, adv)) | |
1077 pass | |
1078 elif opcode in (self.DBG_START_LOCAL, | |
1079 self.DBG_START_LOCAL_EXTENDED): | |
1080 reg, sh = _uleb128(data[moff():moff() + 5]) | |
1081 moff(sh) | |
1082 name, sh = _uleb128(data[moff():moff() + 5]) | |
1083 moff(sh) | |
1084 descriptor, sh = _uleb128(data[moff():moff() + 5]) | |
1085 moff(sh) | |
1086 if opcode == self.DBG_START_LOCAL_EXTENDED: | |
1087 signature, sh = _uleb128(data[moff():moff() + 5]) | |
1088 moff(sh) | |
1089 opcodes.append((opcode, reg, name, descriptor, signature)) | |
1090 else: | |
1091 opcodes.append((opcode, reg, name, descriptor)) | |
1092 pass | |
1093 pass | |
1094 elif opcode == self.DBG_END_LOCAL: | |
1095 reg, sh = _uleb128(data[moff():moff() + 5]) | |
1096 moff(sh) | |
1097 opcodes.append((opcode, reg)) | |
1098 pass | |
1099 elif opcode == self.DBG_RESTART_LOCAL: | |
1100 reg, sh = _uleb128(data[moff():moff() + 5]) | |
1101 moff(sh) | |
1102 opcodes.append((opcode, reg)) | |
1103 pass | |
1104 elif opcode in (self.DBG_SET_PROLOGUE_END, | |
1105 self.DBG_SET_EPILOGUE_BEGIN, | |
1106 self.DBG_SET_FILE): | |
1107 opcodes.append((opcode,)) | |
1108 pass | |
1109 else: | |
1110 opcodes.append((opcode,)) | |
1111 pass | |
1112 pass | |
1113 self.opcodes = opcodes | |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1114 |
11 | 1115 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
|
1116 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1117 return self |
13
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1118 |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1119 def compute_size(self): |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1120 def compute_opcode_size(code): |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1121 opcode = code[0] |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1122 |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1123 if opcode == self.DBG_END_SEQUENCE: |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1124 size = 1 |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1125 elif opcode == self.DBG_ADVANCE_PC: |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1126 size = 1 + _uleb128_sz(code[1]) |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1127 elif opcode == self.DBG_ADVANCE_LINE: |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1128 size = 1 + _leb128_sz(code[1]) |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1129 elif opcode in (self.DBG_START_LOCAL, |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1130 self.DBG_START_LOCAL_EXTENDED): |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1131 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
|
1132 _uleb128_sz(code[3]) |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1133 if len(code) == 5: |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1134 size = size + _uleb128_sz(code[4]) |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1135 pass |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1136 pass |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1137 elif opcode == self.DBG_END_LOCAL: |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1138 size = 1 + _uleb128_sz(code[1]) |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1139 elif opcode == self.DBG_RESTART_LOCAL: |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1140 size = 1 + _uleb128_sz(code[1]) |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1141 elif opcode in (self.DBG_SET_PROLOGUE_END, |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1142 self.DBG_SET_EPILOGUE_BEGIN, |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1143 self.DBG_SET_FILE): |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1144 size = 1 |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1145 else: |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1146 size = 1 |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1147 pass |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1148 |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1149 return size |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1150 |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1151 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
|
1152 opcode_sizes = [i for i in opcode_sizes] |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1153 opcodes_size = sum(opcode_sizes) |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1154 |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1155 self.data_size = opcodes_size |
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 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1158 def to_str(self): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1159 # |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1160 # Parse debug opcodes |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1161 # |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1162 opcodes = self.opcodes |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1163 opcodebins = [] |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1164 for code in opcodes: |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1165 opcode = code[0] |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1166 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1167 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
|
1168 opcodebins.append(chr(opcode)) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1169 break |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1170 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
|
1171 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
|
1172 opcodebins.append(codebin) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1173 pass |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1174 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
|
1175 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
|
1176 opcodebins.append(codebin) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1177 pass |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1178 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
|
1179 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
|
1180 _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
|
1181 codebins.append(codebin) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1182 pass |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1183 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
|
1184 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
|
1185 _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
|
1186 _to_uleb128(code[4]) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1187 codebins.append(codebin) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1188 pass |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1189 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
|
1190 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
|
1191 codebins.append(codebin) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1192 pass |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1193 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
|
1194 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
|
1195 codebins.append(codebin) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1196 pass |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1197 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
|
1198 self.DBG_SET_EPILOGUE_BEGIN, |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1199 self.DBG_SET_FILE): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1200 opcodebins.append(chr(opcode)) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1201 pass |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1202 else: |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1203 opcodebins.append(chr(opcode)) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1204 pass |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1205 pass |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1206 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1207 return ''.join(opcodebins) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1208 pass |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1209 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1210 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1211 class _DEX_DebugInfoItem(composite): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1212 start_line = uleb128 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1213 parameters_size = uleb128 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1214 parameters = array('parameters_size', uleb128) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1215 opcodes = _DEX_DebugCodeBlock |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1216 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1217 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
|
1218 pass |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1219 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1220 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1221 class _DEX_StringDataItem(relocatable): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1222 size = None |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1223 data = None |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1224 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1225 data_size = None |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1226 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1227 @staticmethod |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1228 def parse(parent, data, off): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1229 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
|
1230 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
|
1231 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1232 self = _DEX_StringDataItem() |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1233 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1234 self.size = size |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1235 self.data = data |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1236 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
|
1237 return self |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1238 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1239 def compute_size(self): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1240 size = len(self.data) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1241 self.size = size |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1242 size_sz = _uleb128_sz(size) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1243 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
|
1244 pass |
13
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1245 |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1246 def to_str(self): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1247 size = len(self.data) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1248 self.size = size |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1249 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
|
1250 return data |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1251 pass |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1252 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1253 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1254 class DEXFile(composite): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1255 fname = None |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1256 data = None |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1257 header = _DEX_header |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1258 maps = _DEX_MapItemBlock |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1259 stringIds = array(None, _DEX_StringId) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1260 typeIds = array(None, _DEX_TypeId) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1261 protoIds = array(None, _DEX_ProtoId) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1262 fieldIds = array(None, _DEX_FieldId) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1263 methodIds = array(None, _DEX_MethodId) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1264 classDefs = array(None, _DEX_ClassDef) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1265 classDatas = array(None, _DEX_ClassData) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1266 typeLists = array(None, _DEX_TypeList) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1267 codeItems = array(None, _DEX_Code) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1268 annotationSetItems = array(None, _DEX_AnnotationSetItem) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1269 annotationsDirectoryItems = array(None, _DEX_AnnotationsDirectoryItem) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1270 annotationItems = array(None, _DEX_AnnotationItem) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1271 encodedArrayItems = array(None, _DEX_EncodedArrayItem) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1272 debugInfoItems = array(None, _DEX_DebugInfoItem) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1273 stringDataItems = array(None, _DEX_StringDataItem) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1274 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1275 child_names = 'header'.split() |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1276 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1277 block_defs = { |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1278 # 0x0000: 'kDexTypeHeaderItem', |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1279 0x0001: 'stringIds', |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1280 0x0002: 'typeIds', |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1281 0x0003: 'protoIds', |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1282 0x0004: 'fieldIds', |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1283 0x0005: 'methodIds', |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1284 0x0006: 'classDefs', |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1285 # 0x1000: 'kDexTypeMapList', |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1286 0x1001: 'typeLists', |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1287 # 0x1002: 'kDexTypeAnnotationSetRefList', |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1288 0x1003: 'annotationSetItems', |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1289 0x2000: 'classDatas', |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1290 0x2001: 'codeItems', |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1291 0x2002: 'stringDataItems', |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1292 0x2003: 'debugInfoItems', |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1293 0x2004: 'annotationItems', |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1294 0x2005: 'encodedArrayItems', |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1295 0x2006: 'annotationsDirectoryItems' |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1296 } |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1297 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1298 @staticmethod |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1299 def open(fname): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1300 fo = file(fname, 'r') |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1301 data = fo.read() |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1302 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1303 dex = DEXFile.parse(data) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1304 dex.fname = fname |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1305 return dex |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1306 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1307 @classmethod |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1308 def parse(clazz, data): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1309 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
|
1310 obj.data = data |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1311 obj._parse(data) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1312 return obj |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1313 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1314 def _parse_maps(self): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1315 data = self.data |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1316 header = self.header |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1317 off = header.mapOff |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1318 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
|
1319 pass |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1320 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1321 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
|
1322 if block_map.type not in self.block_defs: |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1323 return |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1324 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1325 data = self.data |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1326 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1327 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
|
1328 off = block_map.offset |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1329 num = block_map.size |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1330 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1331 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
|
1332 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
|
1333 setattr(self, child_name, blk) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1334 pass |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1335 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1336 def _parse_blocks(self): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1337 data = self.data |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1338 maps = self.maps.items.items |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1339 for map in maps: |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1340 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
|
1341 self._parse_block(map) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1342 pass |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1343 pass |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1344 pass |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1345 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1346 def _parse(self, data): |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1347 self._parse_maps() |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1348 self._parse_blocks() |
13
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1349 pass |
11 | 1350 pass |
1351 | |
1352 | |
18
f36b14d1f122
collect dependencies for classes in dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
17
diff
changeset
|
1353 _nest_types = (array, cond, switch) |
f36b14d1f122
collect dependencies for classes in dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
17
diff
changeset
|
1354 |
f36b14d1f122
collect dependencies for classes in dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
17
diff
changeset
|
1355 |
19
6008b9a9d33e
Declare dependencies for indics for classes in dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
18
diff
changeset
|
1356 def _dig_clazz(name_path, clazz, population): |
18
f36b14d1f122
collect dependencies for classes in dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
17
diff
changeset
|
1357 deps = {} |
f36b14d1f122
collect dependencies for classes in dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
17
diff
changeset
|
1358 |
f36b14d1f122
collect dependencies for classes in dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
17
diff
changeset
|
1359 for attr in dir(clazz): |
19
6008b9a9d33e
Declare dependencies for indics for classes in dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
18
diff
changeset
|
1360 namelist = [name_path, attr] |
6008b9a9d33e
Declare dependencies for indics for classes in dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
18
diff
changeset
|
1361 |
6008b9a9d33e
Declare dependencies for indics for classes in dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
18
diff
changeset
|
1362 digged_flag = False |
6008b9a9d33e
Declare dependencies for indics for classes in dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
18
diff
changeset
|
1363 |
18
f36b14d1f122
collect dependencies for classes in dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
17
diff
changeset
|
1364 value_type = getattr(clazz, attr) |
f36b14d1f122
collect dependencies for classes in dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
17
diff
changeset
|
1365 while isinstance(value_type, _nest_types) or \ |
f36b14d1f122
collect dependencies for classes in dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
17
diff
changeset
|
1366 (type(value_type) == type and |
f36b14d1f122
collect dependencies for classes in dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
17
diff
changeset
|
1367 issubclass(value_type, _nest_types)): |
f36b14d1f122
collect dependencies for classes in dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
17
diff
changeset
|
1368 if isinstance(value_type, array): |
f36b14d1f122
collect dependencies for classes in dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
17
diff
changeset
|
1369 namelist.append('items') |
f36b14d1f122
collect dependencies for classes in dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
17
diff
changeset
|
1370 value_type = value_type.child_type |
f36b14d1f122
collect dependencies for classes in dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
17
diff
changeset
|
1371 elif isinstance(value_type, cond): |
f36b14d1f122
collect dependencies for classes in dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
17
diff
changeset
|
1372 namelist.append('value') |
f36b14d1f122
collect dependencies for classes in dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
17
diff
changeset
|
1373 value_type = value_type.child_type |
f36b14d1f122
collect dependencies for classes in dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
17
diff
changeset
|
1374 elif isinstance(value_type, switch): |
19
6008b9a9d33e
Declare dependencies for indics for classes in dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
18
diff
changeset
|
1375 for key, child_type in value_type.map.items(): |
6008b9a9d33e
Declare dependencies for indics for classes in dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
18
diff
changeset
|
1376 if child_type in population.values(): |
6008b9a9d33e
Declare dependencies for indics for classes in dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
18
diff
changeset
|
1377 continue |
6008b9a9d33e
Declare dependencies for indics for classes in dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
18
diff
changeset
|
1378 child_name_path = '.'.join(namelist) + '.' + repr(key) |
6008b9a9d33e
Declare dependencies for indics for classes in dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
18
diff
changeset
|
1379 child_deps = \ |
6008b9a9d33e
Declare dependencies for indics for classes in dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
18
diff
changeset
|
1380 _dig_clazz(child_name_path, child_type, population) |
6008b9a9d33e
Declare dependencies for indics for classes in dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
18
diff
changeset
|
1381 deps.update(child_deps) |
6008b9a9d33e
Declare dependencies for indics for classes in dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
18
diff
changeset
|
1382 pass |
6008b9a9d33e
Declare dependencies for indics for classes in dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
18
diff
changeset
|
1383 digged_flag = True |
6008b9a9d33e
Declare dependencies for indics for classes in dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
18
diff
changeset
|
1384 break |
18
f36b14d1f122
collect dependencies for classes in dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
17
diff
changeset
|
1385 pass |
19
6008b9a9d33e
Declare dependencies for indics for classes in dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
18
diff
changeset
|
1386 |
6008b9a9d33e
Declare dependencies for indics for classes in dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
18
diff
changeset
|
1387 if digged_flag: |
6008b9a9d33e
Declare dependencies for indics for classes in dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
18
diff
changeset
|
1388 continue |
18
f36b14d1f122
collect dependencies for classes in dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
17
diff
changeset
|
1389 |
f36b14d1f122
collect dependencies for classes in dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
17
diff
changeset
|
1390 if isinstance(value_type, depend): |
f36b14d1f122
collect dependencies for classes in dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
17
diff
changeset
|
1391 from_name = '.'.join(namelist) |
f36b14d1f122
collect dependencies for classes in dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
17
diff
changeset
|
1392 if isinstance(value_type, depend_off): |
f36b14d1f122
collect dependencies for classes in dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
17
diff
changeset
|
1393 depend_name = value_type.depend_on |
f36b14d1f122
collect dependencies for classes in dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
17
diff
changeset
|
1394 deps[from_name] = (depend_off, depend_name) |
f36b14d1f122
collect dependencies for classes in dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
17
diff
changeset
|
1395 elif isinstance(value_type, depend_off_rel): |
f36b14d1f122
collect dependencies for classes in dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
17
diff
changeset
|
1396 depend_name = value_type.depend_on |
f36b14d1f122
collect dependencies for classes in dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
17
diff
changeset
|
1397 relative_to = value_type.relative_to |
f36b14d1f122
collect dependencies for classes in dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
17
diff
changeset
|
1398 deps[from_name] = (depend_off_rel, depend_name, relative_to) |
19
6008b9a9d33e
Declare dependencies for indics for classes in dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
18
diff
changeset
|
1399 elif isinstance(value_type, depend_idx): |
6008b9a9d33e
Declare dependencies for indics for classes in dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
18
diff
changeset
|
1400 depend_name = value_type.depend_on |
6008b9a9d33e
Declare dependencies for indics for classes in dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
18
diff
changeset
|
1401 deps[from_name] = (depend_idx, depend_name) |
18
f36b14d1f122
collect dependencies for classes in dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
17
diff
changeset
|
1402 pass |
f36b14d1f122
collect dependencies for classes in dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
17
diff
changeset
|
1403 pass |
f36b14d1f122
collect dependencies for classes in dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
17
diff
changeset
|
1404 pass |
f36b14d1f122
collect dependencies for classes in dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
17
diff
changeset
|
1405 return deps |
f36b14d1f122
collect dependencies for classes in dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
17
diff
changeset
|
1406 |
f36b14d1f122
collect dependencies for classes in dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
17
diff
changeset
|
1407 def collect_dependencies(): |
f36b14d1f122
collect dependencies for classes in dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
17
diff
changeset
|
1408 population = dict([(name, value) |
f36b14d1f122
collect dependencies for classes in dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
17
diff
changeset
|
1409 for name, value in globals().items() |
f36b14d1f122
collect dependencies for classes in dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
17
diff
changeset
|
1410 if name.startswith('_DEX_')]) |
f36b14d1f122
collect dependencies for classes in dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
17
diff
changeset
|
1411 |
f36b14d1f122
collect dependencies for classes in dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
17
diff
changeset
|
1412 all_deps = {} |
19
6008b9a9d33e
Declare dependencies for indics for classes in dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
18
diff
changeset
|
1413 for name_path, clazz in population.items(): |
6008b9a9d33e
Declare dependencies for indics for classes in dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
18
diff
changeset
|
1414 deps = _dig_clazz(name_path, clazz, population) |
18
f36b14d1f122
collect dependencies for classes in dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
17
diff
changeset
|
1415 all_deps.update(deps) |
f36b14d1f122
collect dependencies for classes in dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
17
diff
changeset
|
1416 pass |
f36b14d1f122
collect dependencies for classes in dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
17
diff
changeset
|
1417 |
f36b14d1f122
collect dependencies for classes in dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
17
diff
changeset
|
1418 return all_deps |
f36b14d1f122
collect dependencies for classes in dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
17
diff
changeset
|
1419 |
f36b14d1f122
collect dependencies for classes in dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
17
diff
changeset
|
1420 |
1
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1421 if __name__ == '__main__': |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1422 dex = DEXFile.open('../data/testdata1.dex') |
1
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1423 |
2 | 1424 print 'Header' |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1425 h = dex.header |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1426 for attr in h.child_names: |
2 | 1427 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
|
1428 pass |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1429 |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1430 print |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1431 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
|
1432 |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1433 print |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1434 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
|
1435 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1436 print |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1437 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
|
1438 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1439 print |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1440 print 'Size of fieldIds is %d bytes' % (dex.fieldIds.data_size) |
2 | 1441 |
1442 print | |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1443 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
|
1444 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1445 print |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1446 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
|
1447 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1448 print |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1449 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
|
1450 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1451 print |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1452 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
|
1453 |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1454 print |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1455 print 'Size of codeItems is %d bytes' % (dex.codeItems.data_size) |
2 | 1456 |
1457 print | |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1458 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
|
1459 (dex.annotationSetItems.data_size) |
2 | 1460 |
1461 print | |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1462 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
|
1463 (dex.annotationsDirectoryItems.data_size) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1464 |
3
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
1465 print |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1466 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
|
1467 (dex.annotationItems.data_size) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1468 |
4
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
1469 print |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1470 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
|
1471 (dex.encodedArrayItems.data_size) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1472 |
8 | 1473 print |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1474 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
|
1475 (dex.debugInfoItems.data_size) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1476 |
10
123c7a8bbf4c
Parse EncodedArrayItems
Thinker K.F. Li <thinker@codemud.net>
parents:
9
diff
changeset
|
1477 print |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1478 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
|
1479 (dex.stringDataItems.data_size) |
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1480 |
2 | 1481 print |
1482 print 'Data maps' | |
15
c98be35b572b
Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents:
14
diff
changeset
|
1483 maps = dex.maps.items.items |
2 | 1484 for map in maps: |
1485 print '\t0x%04x(%s) size=%d offset=0x%08x' % (map.type, | |
1486 map.types[map.type], | |
1487 map.size, | |
1488 map.offset) | |
18
f36b14d1f122
collect dependencies for classes in dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
17
diff
changeset
|
1489 pass |
f36b14d1f122
collect dependencies for classes in dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
17
diff
changeset
|
1490 |
f36b14d1f122
collect dependencies for classes in dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
17
diff
changeset
|
1491 import pprint |
f36b14d1f122
collect dependencies for classes in dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
17
diff
changeset
|
1492 print |
f36b14d1f122
collect dependencies for classes in dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
17
diff
changeset
|
1493 print 'Dependencies' |
f36b14d1f122
collect dependencies for classes in dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents:
17
diff
changeset
|
1494 pprint.pprint(collect_dependencies()) |
1
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1495 pass |