annotate paraspace/dexfile.py @ 14:f5728c6868b2

Doc on position depended structure
author Thinker K.F. Li <thinker@codemud.net>
date Fri, 27 May 2011 00:40:14 +0800
parents c05fac334ab1
children c98be35b572b
rev   line source
13
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1 import itertools
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
2
0
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
3 class _DEX_header(object):
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
4 magic = None # 0x00, 8 bytes
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
5 checksum = None # 0x08, 4 bytes
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
6 signature = None # 0x0c, 20 bytes
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
7 fileSize = None # 0x20, 4 bytes
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
8 headerSize = None # 0x24
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
9 endianTag = None # 0x28
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
10 linkSize = None # 0x2c
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
11 linkOff = None # 0x30
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
12 mapOff = None # 0x34
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
13 stringIdsSize = None # 0x38
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
14 stringIdsOff = None # 0x3c
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
15 typeIdsSize = None # 0x40
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
16 typeIdsOff = None # 0x44
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
17 protoIdsSize = None # 0x48
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
18 protoIdsOff = None # 0x4c
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
19 fieldIdsSize = None # 0x50
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
20 fieldIdsOff = None # 0x54
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
21 methodIdsSize = None # 0x58
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
22 methodIdsOff = None # 0x5c
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
23 classDefsSize = None # 0x60
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
24 classDefsOff = None # 0x64
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
25 dataSize = None # 0x68
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
26 dataOff = None # 0x6c
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
27
2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
28 header_fields = \
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
29 'magic checksum signature fileSize headerSize endianTag ' \
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
30 'linkSize linkOff mapOff stringIdsSize stringIdsOff typeIdsSize ' \
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
31 'typeIdsOff protoIdsSize protoIdsOff fieldIdsSize fieldIdsOff ' \
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
32 'methodIdsSize methodIdsOff classDefsSize classDefsOff ' \
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
33 'dataSize dataOff'.split()
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
34
13
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
35 data_size = 0x70
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
36
0
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
37 def parse(self, data):
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
38 self.magic = data[:8]
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
39 self.checksum = data[8: 0x0c]
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
40 self.signature = data[0x0c: 0x20]
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
41
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
42 idx = 0x20
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
43 fields = 'fileSize headerSize endianTag linkSize linkOff mapOff ' \
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
44 'stringIdsSize stringIdsOff typeIdsSize typeIdsOff ' \
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
45 'protoIdsSize protoIdsOff fieldIdsSize fieldIdsOff ' \
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
46 'methodIdsSize methodIdsOff classDefsSize classDefsOff ' \
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
47 'dataSize dataOff'.split()
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
48 for field in fields:
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
49 d = data[idx: idx + 4]
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
50 value = _to_uint(d)
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
51 setattr(self, field, value)
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
52 idx = idx + 4
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
53 pass
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
54 pass
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
55 pass
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
56
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
57
12
8101024c942b Document class man_off
Thinker K.F. Li <thinker@codemud.net>
parents: 11
diff changeset
58 ## \brief Manage offset
8101024c942b Document class man_off
Thinker K.F. Li <thinker@codemud.net>
parents: 11
diff changeset
59 #
8101024c942b Document class man_off
Thinker K.F. Li <thinker@codemud.net>
parents: 11
diff changeset
60 # 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
61 # 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
62 # size.
8101024c942b Document class man_off
Thinker K.F. Li <thinker@codemud.net>
parents: 11
diff changeset
63 #
8101024c942b Document class man_off
Thinker K.F. Li <thinker@codemud.net>
parents: 11
diff changeset
64 # moff = man_off(init_off)
8101024c942b Document class man_off
Thinker K.F. Li <thinker@codemud.net>
parents: 11
diff changeset
65 # assert moff(5) == init_off
8101024c942b Document class man_off
Thinker K.F. Li <thinker@codemud.net>
parents: 11
diff changeset
66 # assert moff() == (init_off + 5)
8101024c942b Document class man_off
Thinker K.F. Li <thinker@codemud.net>
parents: 11
diff changeset
67 # assert moff() == (init_off + 5)
8101024c942b Document class man_off
Thinker K.F. Li <thinker@codemud.net>
parents: 11
diff changeset
68 #
3
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
69 class man_off(object):
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
70 off = None
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
71
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
72 def __init__(self, off):
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
73 self.off = off
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
74 pass
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
75
4
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
76 def __call__(self, sz=0):
3
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
77 off = self.off
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
78 self.off = off + sz
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
79 return off
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
80 pass
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
81
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
82
0
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
83 def _to_uint(data):
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
84 v = 0
1
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
85 sh = 0
0
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
86 for c in data:
1
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
87 v = v + (ord(c) << sh)
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
88 sh = sh + 8
0
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
89 pass
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
90 return v
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
91
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
92
8
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
93 def _to_int(data):
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
94 v = _to_uint(data)
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
95 sz = len(data)
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
96 if sz and ((1 << (sz * 8 - 1)) & v):
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
97 v = -((1 << (sz * 8)) - v)
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
98 pass
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
99 return v
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
100
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
101
1
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
102 def _uleb128(data):
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
103 sh = 0
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
104 v = 0
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
105 for c in data:
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
106 cv = ord(c)
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
107 v = v + ((cv & 0x7f) << sh)
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
108 sh = sh + 7
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
109
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
110 if cv <= 0x7f:
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
111 break
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
112 pass
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
113
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
114 nbytes = sh / 7
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
115 return v, nbytes
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
116
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
117
13
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
118 def _to_uleb128(v):
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
119 assert v >= 0
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
120
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
121 data = ''
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
122 while True:
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
123 if v > 0x7f:
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
124 data = data + chr((v & 0x7f) | 0x80)
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
125 else:
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
126 data = data + chr(v & 0x7f)
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
127 break
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
128 v = v >> 7
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
129 pass
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
130
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
131 return data
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
132
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
133
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
134 def _uleb128_sz(v):
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
135 return len(_to_uleb128(v))
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
136
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
137
2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
138 def _leb128(data):
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
139 v, sh = _uleb128(data)
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
140 if v & (1 << (sh * 7 - 1)):
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
141 v = -((1 << (sh * 7)) - v)
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
142 pass
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
143 return v, sh
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
144
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
145
13
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
146 def _to_leb128(v):
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
147 data = ''
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
148 while True:
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
149 if v > 0x3f or v < ~0x3f:
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
150 data = data + chr((v & 0x7f) | 0x80)
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
151 else:
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
152 data = data + chr(v & 0x7f)
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
153 break
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
154 v = v >> 7
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
155 pass
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
156 return data
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
157
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
158
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
159 def _leb128_sz(v):
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
160 return len(_to_leb128(v))
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
161
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
162
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
163 def _compute_sz(o):
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
164 if hasattr(o, 'compute_size'):
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
165 o.compute_size()
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
166 pass
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
167 return o.data_size
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
168
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
169
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
170 def _sum_data_size(obj_list):
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
171 obj_sizes = itertools.imap(_compute_sz, obj_list)
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
172 total = sum(obj_sizes)
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
173 return total
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
174
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
175
0
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
176 class _DEX_MapItem(object):
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
177 type = None # 2 bytes
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
178 unused = None # 2 bytes
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
179 size = None # 4 bytes
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
180 offset = None # 4 bytes
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
181
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
182 data_size = 12
2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
183 types = {
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
184 0x0000: 'kDexTypeHeaderItem',
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
185 0x0001: 'kDexTypeStringIdItem',
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
186 0x0002: 'kDexTypeTypeIdItem',
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
187 0x0003: 'kDexTypeProtoIdItem',
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
188 0x0004: 'kDexTypeFieldIdItem',
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
189 0x0005: 'kDexTypeMethodIdItem',
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
190 0x0006: 'kDexTypeClassDefItem',
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
191 0x1000: 'kDexTypeMapList',
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
192 0x1001: 'kDexTypeTypeList',
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
193 0x1002: 'kDexTypeAnnotationSetRefList',
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
194 0x1003: 'kDexTypeAnnotationSetItem',
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
195 0x2000: 'kDexTypeClassDataItem',
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
196 0x2001: 'kDexTypeCodeItem',
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
197 0x2002: 'kDexTypeStringDataItem',
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
198 0x2003: 'kDexTypeDebugInfoItem',
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
199 0x2004: 'kDexTypeAnnotationItem',
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
200 0x2005: 'kDexTypeEncodedArrayItem',
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
201 0x2006: 'kDexTypeAnnotationsDirectoryItem'
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
202 }
0
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
203
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
204 def parse(self, data):
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
205 self.type = _to_uint(data[:2])
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
206 self.size = _to_uint(data[4:8])
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
207 self.offset = _to_uint(data[8:12])
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
208 pass
3
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
209
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
210 @classmethod
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
211 def find_type_name(self, type_name):
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
212 type_value = [v
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
213 for v, name in _DEX_MapItem.types.items()
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
214 if name == type_name][0]
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
215 return type_value
0
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
216 pass
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
217
1
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
218
0
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
219 class _DEX_TypeId(object):
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
220 descriptorIdx = None # 4 bytes
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
221
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
222 data_size = 4
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
223
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
224 def parse(self, data):
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
225 self.descriptorIdx = _to_uint(data[:4])
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
226 pass
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
227 pass
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
228
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
229
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
230 class _DEX_ProtoId(object):
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
231 shortyIdx = None # 4 bytes
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
232 returnTypeIdx = None # 4 bytes
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
233 parametersOff = None # 4 bytes
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
234
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
235 data_size = 12
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
236
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
237 def parse(self, data):
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
238 self.shortyIdx = _to_uint(data[:4])
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
239 self.returnTypeIdx = _to_uint(data[4:8])
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
240 self.parametersOff = _to_uint(data[8:12])
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
241 pass
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
242 pass
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
243
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
244
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
245 class _DEX_FieldId(object):
1
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
246 classIdx = None # 2 bytes
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
247 typeIdx = None # 2 bytes
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
248 nameIdx = None # 4 bytes
0
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
249
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
250 data_size = 8
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
251
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
252 def parse(self, data):
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
253 self.classIdx = _to_uint(data[:2])
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
254 self.typeIdx = _to_uint(data[2:4])
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
255 self.nameIdx = _to_uint(data[4:8])
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
256 pass
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
257 pass
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
258
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
259
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
260 class _DEX_MethodId(object):
1
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
261 classIdx = None # 2 bytes
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
262 protoIdx = None # 2 bytes
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
263 nameIdx = None # 4 bytes
0
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
264
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
265 data_size = 8
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
266
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
267 def parse(self, data):
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
268 self.classIdx = _to_uint(data[:2])
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
269 self.protoIdx = _to_uint(data[2:4])
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
270 self.nameIdx = _to_uint(data[4:8])
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
271 pass
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
272 pass
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
273
1
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
274
0
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
275 class _DEX_ClassDef(object):
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
276 classIdx = None # 0x00
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
277 accessFlags = None # 0x04
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
278 superclassIdx = None # 0x08
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
279 interfacesOff = None # 0x0c
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
280 sourceFileIdx = None # 0x10
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
281 annotationsOff = None # 0x14
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
282 classDataOff = None # 0x18
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
283 staticValuesOff = None # 0x1c
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
284
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
285 data_size = 0x20
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
286
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
287 def parse(self, data):
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
288 self.classIdx = _to_uint(data[:4])
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
289 self.accessFlags = _to_uint(data[4:8])
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
290 self.superclassIdx = _to_uint(data[8:0xc])
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
291 self.interfacesOff = _to_uint(data[0xc:0x10])
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
292 self.sourceFileIdx = _to_uint(data[0x10:0x14])
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
293 self.annotationsOff = _to_uint(data[0x14:0x18])
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
294 self.classDataOff = _to_uint(data[0x18:0x1c])
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
295 self.staticValuesOff = _to_uint(data[0x1c:0x20])
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
296 pass
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
297 pass
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
298
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
299
2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
300 class _DEX_ClassDataHeader(object):
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
301 staticFieldsSize = None
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
302 instanceFieldsSize = None
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
303 directMethodsSize = None
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
304 virtualMethodsSize = None
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
305
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
306 data_size = None
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
307
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
308 def parse(self, data, off):
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
309 self.staticFieldsSize, sh = _uleb128(data[off:off + 10])
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
310 sz = sh
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
311 off = off + sh
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
312 self.instanceFieldsSize, sh = _uleb128(data[off:off + 10])
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
313 sz = sz + sh
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
314 off = off + sh
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
315 self.directMethodsSize, sh = _uleb128(data[off:off + 10])
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
316 sz = sz + sh
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
317 off = off + sh
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
318 self.virtualMethodsSize, sh = _uleb128(data[off:off + 10])
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
319 sz = sz + sh
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
320
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
321 self.data_size = sz
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
322 pass
13
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
323
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
324 def compute_size(self):
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
325 self.data_size = \
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
326 _uleb128_sz(self.staticFieldsSize) + \
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
327 _uleb128_sz(self.instanceFieldsSize) + \
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
328 _uleb128_sz(self.directMethodsSize) + \
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
329 _uleb128_sz(self.virtualMethodsSize)
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
330 pass
2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
331 pass
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
332
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
333
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
334 class _DEX_Field(object):
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
335 fieldIdx = None
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
336 accessFlags = None
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
337
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
338 data_size = None
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
339
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
340 def parse(self, data, off):
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
341 self.fieldIdx, sh = _uleb128(data[off:off + 10])
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
342 sz = sh
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
343 off = off + sh
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
344 self.accessFlags, sh = _uleb128(data[off:off + 10])
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
345 sz = sz + sh
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
346
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
347 self.data_size = sz
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
348 pass
13
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
349
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
350 def compute_size(self):
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
351 self.data_size = \
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
352 _uleb128_sz(self.fieldIdx) + \
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
353 _uleb128_sz(self.accessFlags)
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
354 pass
2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
355 pass
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
356
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
357
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
358 class _DEX_Method(object):
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
359 methodIdx = None
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
360 accessFlags = None
14
f5728c6868b2 Doc on position depended structure
Thinker K.F. Li <thinker@codemud.net>
parents: 13
diff changeset
361 codeOff = None #!< This is only pos depended field
2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
362
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
363 data_size = None
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
364
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
365 def parse(self, data, off):
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
366 self.methodIdx, sh = _uleb128(data[off:off + 10])
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
367 sz = sh
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
368 off = off + sh
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
369
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
370 self.accessFlags, sh = _uleb128(data[off:off + 10])
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
371 sz = sz + sh
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
372 off = off + sh
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
373
14
f5728c6868b2 Doc on position depended structure
Thinker K.F. Li <thinker@codemud.net>
parents: 13
diff changeset
374 #
f5728c6868b2 Doc on position depended structure
Thinker K.F. Li <thinker@codemud.net>
parents: 13
diff changeset
375 # Offset with unsigned leb128 makes its size is vary for
f5728c6868b2 Doc on position depended structure
Thinker K.F. Li <thinker@codemud.net>
parents: 13
diff changeset
376 # position.
f5728c6868b2 Doc on position depended structure
Thinker K.F. Li <thinker@codemud.net>
parents: 13
diff changeset
377 #
2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
378 self.codeOff, sh = _uleb128(data[off:off + 10])
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
379 sz = sz + sh
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
380
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
381 self.data_size = sz
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
382 pass
13
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
383
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
384 def compute_size(self):
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
385 self.data_size = \
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
386 _uleb128_sz(self.methodIdx) + \
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
387 _uleb128_sz(self.accessFlags) + \
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
388 _uleb128_sz(self.codeOff)
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
389 pass
2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
390 pass
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
391
14
f5728c6868b2 Doc on position depended structure
Thinker K.F. Li <thinker@codemud.net>
parents: 13
diff changeset
392 ## \brief Class data
f5728c6868b2 Doc on position depended structure
Thinker K.F. Li <thinker@codemud.net>
parents: 13
diff changeset
393 #
f5728c6868b2 Doc on position depended structure
Thinker K.F. Li <thinker@codemud.net>
parents: 13
diff changeset
394 # This is only top-level (map item) structure that is position
f5728c6868b2 Doc on position depended structure
Thinker K.F. Li <thinker@codemud.net>
parents: 13
diff changeset
395 # depended. Since _DEX_Method is position depended, its size is vary
f5728c6868b2 Doc on position depended structure
Thinker K.F. Li <thinker@codemud.net>
parents: 13
diff changeset
396 # for position.
f5728c6868b2 Doc on position depended structure
Thinker K.F. Li <thinker@codemud.net>
parents: 13
diff changeset
397 #
2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
398 class _DEX_ClassData(object):
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
399 header = None # DexClassDataHeader
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
400 staticFields = None # DexField*
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
401 instanceFields = None # DexField*
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
402 directMethods = None # DexMethod*
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
403 virtualMethods = None # DexMethod*
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
404
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
405 data_size = None
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
406
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
407 def parse(self, data, off):
13
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
408 moff = man_off(off)
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
409
2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
410 header = _DEX_ClassDataHeader()
13
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
411 header.parse(data, moff())
2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
412 self.header = header
13
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
413 moff(header.data_size)
2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
414
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
415 def parse_field():
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
416 field = _DEX_Field()
13
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
417 field.parse(data, moff())
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
418 moff(field.data_size)
2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
419
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
420 #
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
421 # field index depends previous one to reduce size
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
422 #
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
423 field.fieldIdx = field.fieldIdx + idx[0]
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
424 idx[0] = field.fieldIdx
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
425
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
426 return field
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
427
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
428 def parse_method():
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
429 method = _DEX_Method()
13
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
430 method.parse(data, moff())
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
431 moff(method.data_size)
2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
432
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
433 #
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
434 # method index depends previous one to reduce size
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
435 #
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
436 method.methodIdx = method.methodIdx + idx[0]
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
437 idx[0] = method.methodIdx
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
438
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
439 return method
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
440
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
441 idx = [0]
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
442 self.staticFields = [parse_field()
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
443 for i in range(header.staticFieldsSize)]
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
444 idx = [0]
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
445 self.instanceFields = [parse_field()
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
446 for i in range(header.instanceFieldsSize)]
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
447 idx = [0]
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
448 self.directMethods = [parse_method()
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
449 for i in range(header.directMethodsSize)]
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
450 idx = [0]
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
451 self.virtualMethods = [parse_method()
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
452 for i in range(header.virtualMethodsSize)]
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
453
13
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
454 self.data_size = moff() - off
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
455 pass
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
456
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
457 def compute_size(self):
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
458 sz = self.header.data_size
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
459 sz = sz + _sum_data_size(itertools.chain(self.staticFields,
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
460 self.instanceFields,
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
461 self.directMethods,
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
462 self.virtualMethods))
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
463
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
464 self.data_size = sz
2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
465 pass
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
466 pass
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
467
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
468
6
917f0a9b9d06 Refactor _DEX_TypeItem from _DEX_TypeList for layout info tracking
Thinker K.F. Li <thinker@codemud.net>
parents: 5
diff changeset
469 class _DEX_TypeItem(object):
917f0a9b9d06 Refactor _DEX_TypeItem from _DEX_TypeList for layout info tracking
Thinker K.F. Li <thinker@codemud.net>
parents: 5
diff changeset
470 typeIdx = None # 2 bytes
917f0a9b9d06 Refactor _DEX_TypeItem from _DEX_TypeList for layout info tracking
Thinker K.F. Li <thinker@codemud.net>
parents: 5
diff changeset
471
917f0a9b9d06 Refactor _DEX_TypeItem from _DEX_TypeList for layout info tracking
Thinker K.F. Li <thinker@codemud.net>
parents: 5
diff changeset
472 data_size = 2
917f0a9b9d06 Refactor _DEX_TypeItem from _DEX_TypeList for layout info tracking
Thinker K.F. Li <thinker@codemud.net>
parents: 5
diff changeset
473
917f0a9b9d06 Refactor _DEX_TypeItem from _DEX_TypeList for layout info tracking
Thinker K.F. Li <thinker@codemud.net>
parents: 5
diff changeset
474 def parse(self, data, off):
917f0a9b9d06 Refactor _DEX_TypeItem from _DEX_TypeList for layout info tracking
Thinker K.F. Li <thinker@codemud.net>
parents: 5
diff changeset
475 self.typeIdx = _to_uint(data[off:off + 2])
917f0a9b9d06 Refactor _DEX_TypeItem from _DEX_TypeList for layout info tracking
Thinker K.F. Li <thinker@codemud.net>
parents: 5
diff changeset
476 pass
917f0a9b9d06 Refactor _DEX_TypeItem from _DEX_TypeList for layout info tracking
Thinker K.F. Li <thinker@codemud.net>
parents: 5
diff changeset
477 pass
917f0a9b9d06 Refactor _DEX_TypeItem from _DEX_TypeList for layout info tracking
Thinker K.F. Li <thinker@codemud.net>
parents: 5
diff changeset
478
917f0a9b9d06 Refactor _DEX_TypeItem from _DEX_TypeList for layout info tracking
Thinker K.F. Li <thinker@codemud.net>
parents: 5
diff changeset
479
2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
480 class _DEX_TypeList(object):
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
481 typeItems = None
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
482
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
483 data_size = None
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
484
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
485 def parse(self, data, off):
6
917f0a9b9d06 Refactor _DEX_TypeItem from _DEX_TypeList for layout info tracking
Thinker K.F. Li <thinker@codemud.net>
parents: 5
diff changeset
486 moff = man_off(off)
2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
487
6
917f0a9b9d06 Refactor _DEX_TypeItem from _DEX_TypeList for layout info tracking
Thinker K.F. Li <thinker@codemud.net>
parents: 5
diff changeset
488 size = _to_uint(data[moff(4):moff()])
917f0a9b9d06 Refactor _DEX_TypeItem from _DEX_TypeList for layout info tracking
Thinker K.F. Li <thinker@codemud.net>
parents: 5
diff changeset
489
917f0a9b9d06 Refactor _DEX_TypeItem from _DEX_TypeList for layout info tracking
Thinker K.F. Li <thinker@codemud.net>
parents: 5
diff changeset
490 def parse_type_item():
917f0a9b9d06 Refactor _DEX_TypeItem from _DEX_TypeList for layout info tracking
Thinker K.F. Li <thinker@codemud.net>
parents: 5
diff changeset
491 item = _DEX_TypeItem()
917f0a9b9d06 Refactor _DEX_TypeItem from _DEX_TypeList for layout info tracking
Thinker K.F. Li <thinker@codemud.net>
parents: 5
diff changeset
492 item.parse(data, moff())
917f0a9b9d06 Refactor _DEX_TypeItem from _DEX_TypeList for layout info tracking
Thinker K.F. Li <thinker@codemud.net>
parents: 5
diff changeset
493 moff(item.data_size)
917f0a9b9d06 Refactor _DEX_TypeItem from _DEX_TypeList for layout info tracking
Thinker K.F. Li <thinker@codemud.net>
parents: 5
diff changeset
494 return item
917f0a9b9d06 Refactor _DEX_TypeItem from _DEX_TypeList for layout info tracking
Thinker K.F. Li <thinker@codemud.net>
parents: 5
diff changeset
495
917f0a9b9d06 Refactor _DEX_TypeItem from _DEX_TypeList for layout info tracking
Thinker K.F. Li <thinker@codemud.net>
parents: 5
diff changeset
496 typeItems = [parse_type_item()
917f0a9b9d06 Refactor _DEX_TypeItem from _DEX_TypeList for layout info tracking
Thinker K.F. Li <thinker@codemud.net>
parents: 5
diff changeset
497 for i in range(size)]
2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
498
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
499 self.typeItems = typeItems
6
917f0a9b9d06 Refactor _DEX_TypeItem from _DEX_TypeList for layout info tracking
Thinker K.F. Li <thinker@codemud.net>
parents: 5
diff changeset
500 self.data_size = moff() - off
2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
501 pass
13
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
502
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
503 def compute_size(self):
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
504 size = 4 + _sum_data_size(self.typeItems)
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
505
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
506 self.data_size = size
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
507 pass
2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
508 pass
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
509
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
510
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
511 class _DEX_TypeLists(object):
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
512 typeLists = None
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
513
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
514 data_size = None
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
515
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
516 def parse(self, num, data, off):
13
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
517 moff = man_off(off)
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
518
2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
519 def parse():
13
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
520 moff.off = (moff(0) + 3) & ~0x3 # aligned for 4 bytes
2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
521 typeList = _DEX_TypeList()
13
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
522 typeList.parse(data, moff())
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
523 moff(typeList.data_size)
2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
524
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
525 return typeList
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
526
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
527 typeLists = [parse() for i in range(num)]
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
528
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
529 self.typeLists = typeLists
13
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
530 self.data_size = moff(0) - off
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
531 pass
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
532
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
533 def compute_size(self):
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
534 def compute_align(prev, cur):
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
535 v = ((prev + 3) & ~0x3) + cur
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
536 return v
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
537
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
538 sizes = itertools.imap(_compute_sz, self.typeLists)
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
539 size = reduce(compute_align, sizes)
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
540
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
541 self.data_size = size
2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
542 pass
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
543 pass
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
544
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
545
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
546 class _DEX_Try(object):
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
547 startAddr = None # 4 bytes
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
548 insnCount = None # 2 bytes
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
549 handlerOff = None # 2 bytes
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
550
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
551 data_size = 8
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
552
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
553 def parse(self, data, off):
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
554 cur_off = off
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
555 self.startAddr = _to_uint(data[cur_off:cur_off + 4])
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
556 cur_off = cur_off + 4
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
557 self.insnCount = _to_uint(data[cur_off:cur_off + 2])
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
558 cur_off = cur_off + 2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
559 self.handlerOff = _to_uint(data[cur_off:cur_off + 2])
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
560 pass
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
561 pass
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
562
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
563
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
564 class _DEX_CatchHandler(object):
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
565 typeIdx = None
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
566 address = None
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
567
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
568 data_size = None
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
569
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
570 def parse(self, data, off):
13
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
571 moff = man_off(off)
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
572 self.typeIdx, sh = _uleb128(data[moff():moff() + 5])
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
573 moff(sh)
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
574 self.address, sh = _uleb128(data[moff():moff() + 5])
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
575 moff(sh)
2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
576
13
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
577 self.data_size = moff() - off
2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
578 pass
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
579
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
580 def parse1(self, data, off):
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
581 self.address, sh = _uleb128(data[off:off + 5])
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
582
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
583 self.data_size = sh
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
584 pass
13
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
585
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
586 def compute_size(self):
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
587 if self.typeIdx is not None:
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
588 size = _uleb128_sz(self.typeIdx)
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
589 else:
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
590 size = 0
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
591 pass
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
592 size = size + _uleb128_sz(self.address)
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
593
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
594 self.data_size = size
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
595 pass
2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
596 pass
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
597
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
598
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
599 class _DEX_Catch(object):
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
600 catchesAll = None
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
601 handlers = None
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
602
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
603 data_size = None
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
604
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
605 def parse(self, data, off):
5
97b7006ced5f Move move_off imps. to man_off
Thinker K.F. Li <thinker@codemud.net>
parents: 4
diff changeset
606 moff = man_off(off)
2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
607
5
97b7006ced5f Move move_off imps. to man_off
Thinker K.F. Li <thinker@codemud.net>
parents: 4
diff changeset
608 count, sh = _leb128(data[moff():moff() + 5])
2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
609 moff(sh)
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
610
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
611 if count > 0:
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
612 self.catchesAll = False
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
613 else:
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
614 self.catchesAll = True
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
615 count = -count
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
616 pass
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
617
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
618 def parse_handler():
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
619 handler = _DEX_CatchHandler()
5
97b7006ced5f Move move_off imps. to man_off
Thinker K.F. Li <thinker@codemud.net>
parents: 4
diff changeset
620 handler.parse(data, moff())
2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
621 moff(handler.data_size)
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
622 return handler
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
623
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
624 self.handlers = [parse_handler() for i in range(count)]
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
625
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
626 if self.catchesAll:
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
627 #
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
628 # Additional handler for catching all
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
629 #
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
630 handler = _DEX_CatchHandler()
5
97b7006ced5f Move move_off imps. to man_off
Thinker K.F. Li <thinker@codemud.net>
parents: 4
diff changeset
631 handler.parse1(data, moff())
2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
632 moff(handler.data_size)
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
633 self.handlers.append(handler)
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
634 pass
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
635
5
97b7006ced5f Move move_off imps. to man_off
Thinker K.F. Li <thinker@codemud.net>
parents: 4
diff changeset
636 self.data_size = moff() - off
2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
637 pass
13
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
638
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
639 def compute_size(self):
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
640 count = len(self.handlers)
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
641 if self.catchesAll:
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
642 count = -(count - 1)
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
643 pass
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
644 count_sz = _leb128_sz(count)
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
645
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
646 handlers_size = _sum_data_size(self.handlers)
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
647
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
648 size = count_sz + handlers_size
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
649 pass
2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
650 pass
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
651
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
652
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
653 class _DEX_Code(object):
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
654 registersSize = None # 2 bytes
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
655 insSize = None # 2 bytes
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
656 outsSize = None # 2 bytes
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
657 triesSize = None # 2 bytes
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
658 debugInfoOff = None # 4 bytes
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
659 insnsSize = None # 4 bytes
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
660 insns = None
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
661 try_items = None
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
662 catch_handler_items = None
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
663
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
664 data_size = None
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
665
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
666 def parse(self, data, off):
5
97b7006ced5f Move move_off imps. to man_off
Thinker K.F. Li <thinker@codemud.net>
parents: 4
diff changeset
667 moff = man_off(off)
2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
668
5
97b7006ced5f Move move_off imps. to man_off
Thinker K.F. Li <thinker@codemud.net>
parents: 4
diff changeset
669 self.registersSize = _to_uint(data[moff(2):moff()])
97b7006ced5f Move move_off imps. to man_off
Thinker K.F. Li <thinker@codemud.net>
parents: 4
diff changeset
670 self.insSize = _to_uint(data[moff(2):moff()])
97b7006ced5f Move move_off imps. to man_off
Thinker K.F. Li <thinker@codemud.net>
parents: 4
diff changeset
671 self.outsSize = _to_uint(data[moff(2):moff()])
97b7006ced5f Move move_off imps. to man_off
Thinker K.F. Li <thinker@codemud.net>
parents: 4
diff changeset
672 self.triesSize = _to_uint(data[moff(2):moff()])
97b7006ced5f Move move_off imps. to man_off
Thinker K.F. Li <thinker@codemud.net>
parents: 4
diff changeset
673 self.debugInfoOff = _to_uint(data[moff(4):moff()])
97b7006ced5f Move move_off imps. to man_off
Thinker K.F. Li <thinker@codemud.net>
parents: 4
diff changeset
674 self.insnsSize = _to_uint(data[moff(4):moff()])
2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
675
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
676 moff(self.insnsSize * 2) # skip insns
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
677
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
678 if self.triesSize > 0:
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
679 def parse_try_item():
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
680 try_item = _DEX_Try()
5
97b7006ced5f Move move_off imps. to man_off
Thinker K.F. Li <thinker@codemud.net>
parents: 4
diff changeset
681 try_item.parse(data, moff())
2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
682 moff(try_item.data_size)
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
683 return try_item
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
684
5
97b7006ced5f Move move_off imps. to man_off
Thinker K.F. Li <thinker@codemud.net>
parents: 4
diff changeset
685 moff.off = (moff.off + 3) & ~0x3 # align tries to 4 bytes
2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
686 self.try_items = [parse_try_item() for i in range(self.triesSize)]
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
687
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
688 def parse_catch_handler():
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
689 catch = _DEX_Catch()
5
97b7006ced5f Move move_off imps. to man_off
Thinker K.F. Li <thinker@codemud.net>
parents: 4
diff changeset
690 catch.parse(data, moff())
2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
691 moff(catch.data_size)
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
692 return catch
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
693
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
694 #
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
695 # No tries, no catch handlers
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
696 #
5
97b7006ced5f Move move_off imps. to man_off
Thinker K.F. Li <thinker@codemud.net>
parents: 4
diff changeset
697 handlersSize, sh = _uleb128(data[moff():moff() + 5])
2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
698 moff(sh)
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
699 self.catch_handler_items = [parse_catch_handler()
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
700 for i in range(handlersSize)]
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
701 pass
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
702
5
97b7006ced5f Move move_off imps. to man_off
Thinker K.F. Li <thinker@codemud.net>
parents: 4
diff changeset
703 moff.off = (moff() + 3) & ~0x3 # round code item to 4 bytes
97b7006ced5f Move move_off imps. to man_off
Thinker K.F. Li <thinker@codemud.net>
parents: 4
diff changeset
704 self.data_size = moff() - off
2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
705 pass
13
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
706
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
707 def compute_size(self):
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
708 size = 16 + self.insnsSize * 2
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
709
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
710 if self.triesSize > 0:
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
711 size = (size + 0x3) & ~0x3
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
712
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
713 try_items_size = _sum_data_size(self.try_items)
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
714
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
715 catch_handler_items = self.catch_handler_items
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
716 catch_handler_items_cnt = len(catch_handler_items)
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
717 catch_handler_items_cnt_sz = _uleb128_sz(catch_handler_items_cnt)
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
718 catch_handler_items_sz = _sum_data_size(catch_handler_items)
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
719 catch_handler_items_size = \
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
720 catch_handler_items_cnt_sz + \
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
721 catch_handler_items_sz
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
722
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
723 size = size + try_items_size + catch_handler_items_size
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
724 pass
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
725
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
726 self.data_size = (size + 3) & ~0x3
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
727 pass
2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
728 pass
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
729
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
730
4
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
731 ## \brief File offset to Annotation item.
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
732 #
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
733 # This type is not in libdex of Dalvik. We add this class to tracking
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
734 # information for layout algorithm.
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
735 #
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
736 class _DEX_AnnotationRefItem(object):
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
737 annotationOff = None # 4 bytes
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
738
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
739 data_size = 4
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
740
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
741 def parse(self, data, off):
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
742 self.annotationOff = _to_uint(data[off:off + 4])
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
743 pass
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
744 pass
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
745
3
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
746 class _DEX_AnnotationSetItem(object):
4
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
747 # size = None # 4 bytes
3
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
748 annotations = None # 4 * size bytes
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
749
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
750 data_size = None
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
751
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
752 def parse(self, data, off):
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
753 moff = man_off(off)
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
754
4
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
755 size = _to_uint(data[moff(4):moff()])
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
756
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
757 def parse_annotation_ref():
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
758 ref = _DEX_AnnotationRefItem()
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
759 ref.parse(data, moff())
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
760 moff(ref.data_size)
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
761 return ref
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
762
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
763 self.annotations = [parse_annotation_ref()
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
764 for i in range(size)]
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
765
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
766 self.data_size = moff() - off
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
767 pass
13
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
768
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
769 def compute_size(self):
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
770 annotations_size = _sum_data_size(self.annotations)
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
771 size = 4 + annotations_size
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
772
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
773 self.data_size = size
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
774 pass
4
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
775 pass
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
776
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
777
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
778 class _DEX_FieldAnnotationsItem(object):
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
779 fieldIdx = None # 4 bytes
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
780 annotationsOff = None # 4 bytes
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
781
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
782 data_size = 8
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
783
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
784 def parse(self, data, off):
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
785 moff = man_off(off)
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
786
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
787 self.fieldIdx = _to_uint(data[moff(4):moff()])
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
788 self.annotationsOff = _to_uint(data[moff(4):moff()])
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
789 pass
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
790 pass
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
791
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
792
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
793 class _DEX_MethodAnnotationsItem(object):
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
794 methodIdx = None # 4 bytes
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
795 annotationsOff = None # 4 bytes
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
796
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
797 data_size = 8
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
798
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
799 def parse(self, data, off):
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
800 moff = man_off(off)
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
801
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
802 self.methodIdx = _to_uint(data[moff(4):moff()])
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
803 self.annotationsOff = _to_uint(data[moff(4):moff()])
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
804 pass
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
805 pass
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
806
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
807
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
808 class _DEX_ParameterAnnotationsItem(object):
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
809 methodIdx = None # 4 bytes
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
810 annotationsOff = None # 4 bytes
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
811
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
812 data_size = 8
3
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
813
4
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
814 def parse(self, data, off):
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
815 moff = man_off(off)
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
816
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
817 self.methodIdx = _to_uint(data[moff(4):moff()])
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
818 self.annotationsOff = _to_uint(data[moff(4):moff()])
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
819 pass
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
820 pass
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
821
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
822
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
823 class _DEX_AnnotationsDirectoryItem(object):
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
824 classAnnotationsOff = None # 4 bytes
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
825 fieldAnnotationsItems = None
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
826 methodAnnotationsItems = None
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
827 parameterAnnotationsItems = None
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
828
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
829 data_size = None
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
830
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
831 def parse(self, data, off):
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
832 moff = man_off(off)
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
833
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
834 self.classAnnotationsOff = _to_uint(data[moff(4):moff()])
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
835 fieldsSize = _to_uint(data[moff(4):moff()])
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
836 methodsSize = _to_uint(data[moff(4):moff()])
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
837 parametersSize = _to_uint(data[moff(4):moff()])
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
838
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
839 def parse_fieldAnnotationsItem():
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
840 item = _DEX_FieldAnnotationsItem()
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
841 item.parse(data, moff())
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
842 moff(item.data_size)
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
843 return item
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
844
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
845 def parse_methodAnnotationsItem():
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
846 item = _DEX_MethodAnnotationsItem()
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
847 item.parse(data, moff())
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
848 moff(item.data_size)
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
849 return item
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
850
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
851 def parse_parameterAnnotationsItem():
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
852 item = _DEX_ParameterAnnotationsItem()
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
853 item.parse(data, moff())
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
854 moff(item.data_size)
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
855 return item
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
856
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
857 self.fieldAnnotationsItems = [parse_fieldAnnotationsItem()
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
858 for i in range(fieldsSize)]
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
859 self.methodAnnotationsItems = [parse_methodAnnotationsItem()
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
860 for i in range(methodsSize)]
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
861 self.parameterAnnotationsItems = [parse_parameterAnnotationsItem()
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
862 for i in range(parametersSize)]
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
863
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
864 self.data_size = moff() - off
3
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
865 pass
13
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
866
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
867 def compute_size(self):
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
868 field_anno_sz = _sum_data_size(self.fieldAnnotationsItems)
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
869 method_anno_sz = _sum_data_size(self.methodAnnotationsItems)
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
870 parameter_anno_sz = _sum_data_size(self.parameterAnnotationsItems)
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
871
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
872 all_items_size = field_anno_sz + method_anno_sz + parameter_anno_sz
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
873 size = 16 + all_items_size
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
874
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
875 self.data_size = size
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
876 pass
3
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
877 pass
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
878
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
879
8
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
880 ##
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
881 #
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
882 # \see createAnnotationMember() in dalvik/vm/reflect/Annotation.c
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
883 #
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
884 class _DEX_AnnotationMember(object):
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
885 nameIdx = None # optional
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
886 valueType = None # 1 byte
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
887 value = None
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
888
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
889 #
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
890 # Constants from DexFile.h
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
891 #
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
892 kDexAnnotationByte = 0x00
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
893 kDexAnnotationShort = 0x02
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
894 kDexAnnotationChar = 0x03
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
895 kDexAnnotationInt = 0x04
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
896 kDexAnnotationLong = 0x06
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
897 kDexAnnotationFloat = 0x10
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
898 kDexAnnotationDouble = 0x11
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
899 kDexAnnotationString = 0x17
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
900 kDexAnnotationType = 0x18
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
901 kDexAnnotationField = 0x19
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
902 kDexAnnotationMethod = 0x1a
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
903 kDexAnnotationEnum = 0x1b
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
904 kDexAnnotationArray = 0x1c
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
905 kDexAnnotationAnnotation = 0x1d
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
906 kDexAnnotationNull = 0x1e
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
907 kDexAnnotationBoolean = 0x1f
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
908
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
909 kDexAnnotationValueTypeMask = 0x1f
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
910 kDexAnnotationValueArgShift = 5
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
911
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
912 data_size = None
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
913
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
914 def parse(self, data, off):
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
915 self.nameIdx, sh = _uleb128(data[off:off + 5])
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
916
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
917 self.parse_noname(data, off + sh)
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
918
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
919 self.data_size = self.data_size + sh
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
920 pass
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
921
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
922 def parse_noname(self, data, off):
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
923 moff = man_off(off)
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
924
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
925 valueType = _to_uint(data[moff(1):moff()])
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
926 self.valueType = valueType
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
927 width = valueType >> self.kDexAnnotationValueArgShift
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
928
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
929 vtype = valueType & self.kDexAnnotationValueTypeMask
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
930
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
931 if vtype == self.kDexAnnotationByte:
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
932 self.value = _to_int(data[moff(width):moff()])
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
933 moff(1)
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
934 pass
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
935 elif vtype == self.kDexAnnotationShort:
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
936 self.value = _to_int(data[moff(width):moff()])
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
937 pass
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
938 elif vtype == self.kDexAnnotationChar:
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
939 self.value = _to_uint(data[moff(width):moff()])
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
940 moff(1)
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
941 pass
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
942 elif vtype == self.kDexAnnotationInt:
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
943 self.value = _to_int(data[moff(width):moff()])
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
944 moff(1)
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
945 pass
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
946 elif vtype == self.kDexAnnotationLong:
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
947 self.value = _to_int(data[moff(width):moff()])
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
948 moff(1)
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
949 pass
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
950 elif vtype == self.kDexAnnotationFloat:
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
951 self.value = _to_uint(data[moff(width):moff()])
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
952 moff(1)
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
953 pass
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
954 elif vtype == self.kDexAnnotationDouble:
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
955 self.value = _to_uint(data[moff(width):moff()])
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
956 moff(1)
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
957 pass
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
958 elif vtype == self.kDexAnnotationBoolean:
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
959 self.value = width != 0
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
960 pass
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
961 elif vtype == self.kDexAnnotationString: # string index
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
962 self.value = _to_uint(data[moff(width):moff()])
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
963 moff(1)
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
964 pass
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
965 elif vtype == self.kDexAnnotationType: # TypeId index
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
966 self.value = _to_uint(data[moff(width):moff()])
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
967 moff(1)
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
968 pass
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
969 elif vtype == self.kDexAnnotationMethod: # MethodId index
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
970 self.value = _to_uint(data[moff(width):moff()])
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
971 moff(1)
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
972 pass
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
973 elif vtype == self.kDexAnnotationField:
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
974 self.value = _to_uint(data[moff(width):moff()])
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
975 moff(1)
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
976 pass
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
977 elif vtype == self.kDexAnnotationEnum: # FieldId index
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
978 self.value = _to_uint(data[moff(width):moff()])
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
979 moff(1)
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
980 pass
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
981 elif vtype == self.kDexAnnotationArray:
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
982 size, sh = _uleb128(data[moff():moff() + 5])
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
983 moff(sh)
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
984
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
985 def parse_array_elm():
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
986 elm = _DEX_AnnotationMember()
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
987 elm.parse_noname(data, moff())
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
988 moff(elm.data_size)
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
989 return elm
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
990
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
991 self.value = [parse_array_elm()
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
992 for i in range(size)]
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
993 pass
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
994 elif vtype == self.kDexAnnotationAnnotation:
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
995 annoitem = _DEX_AnnotationItem()
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
996 annoitem.parse_novisibility(data, moff())
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
997 moff(annoitem.data_size)
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
998 self.value = annoitem
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
999 pass
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
1000 elif vtype == self.kDexAnnotationNull:
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
1001 self.value = 0
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
1002 pass
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
1003 else:
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
1004 raise ValueError, \
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
1005 'Bad annotation element value byte 0x02x' % (valueType)
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
1006
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
1007 self.data_size = moff() - off
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
1008 pass
13
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1009
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1010 def compute_size(self):
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1011 if self.nameIdx is not None:
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1012 nameIdx_size = _uleb128_sz(self.nameIdx)
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1013 else:
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1014 nameIdx_size = 0
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1015 pass
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1016
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1017 valueType = self.valueType
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1018 width = valueType >> self.kDexAnnotationValueArgShift
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1019
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1020 vtype = valueType & self.kDexAnnotationValueTypeMask
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1021
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1022 if vtype in (self.kDexAnnotationByte,
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1023 self.kDexAnnotationShort,
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1024 self.kDexAnnotationChar,
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1025 self.kDexAnnotationInt,
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1026 self.kDexAnnotationLong,
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1027 self.kDexAnnotationFloat,
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1028 self.kDexAnnotationDouble,
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1029 self.kDexAnnotationString,
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1030 self.kDexAnnotationType,
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1031 self.kDexAnnotationMethod,
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1032 self.kDexAnnotationField,
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1033 self.kDexAnnotationEnum):
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1034 value_size = width + 2
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1035 pass
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1036 elif vtype in (self.kDexAnnotationBoolean,
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1037 self.kDexAnnotationNull):
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1038 value_size = 1
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1039 pass
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1040 elif vtype == self.kDexAnnotationArray:
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1041 array_cnt = len(self.value)
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1042 array_cnt_size = _uleb128_sz(array_cnt)
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1043 array_size = _sum_data_size(self.value)
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1044 value_size = 1 + array_cnt_size + array_size
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1045 pass
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1046 elif vtype == self.kDexAnnotationAnnotation:
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1047 value_size = 1 + _compute_sz(self.value)
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1048 pass
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1049 else:
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1050 raise ValueError, \
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1051 'Bad annotation element value byte 0x02x' % (valueType)
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1052
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1053 self.data_size = nameIdx_size + value_size
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1054 pass
8
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
1055 pass
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
1056
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
1057
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
1058 ## \brief Annotation item
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
1059 #
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
1060 # \see processEncodedAnnotation() in dalvik/vm/reflect/Annotation.c
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
1061 #
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
1062 class _DEX_AnnotationItem(object):
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
1063 visibility = None # 1 byte (optional)
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
1064 typeIdx = None
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
1065 members = None
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
1066
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
1067 kDexVisibilityBuild = 0x00
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
1068 kDexVisibilityRuntime = 0x01
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
1069 kDexVisibilitySystem = 0x02
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
1070
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
1071 data_size = None
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
1072
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
1073 def parse(self, data, off):
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
1074 self.visibility = _to_uint(data[off:off + 1])
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
1075
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
1076 self.parse_novisibility(data, off + 1)
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
1077
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
1078 self.data_size = self.data_size + 1
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
1079 pass
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
1080
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
1081 def parse_novisibility(self, data, off):
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
1082 moff = man_off(off)
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
1083
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
1084 self.typeIdx, sh = _uleb128(data[moff():moff() + 5])
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
1085 moff(sh)
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
1086 size, sh = _uleb128(data[moff():moff() + 5])
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
1087 moff(sh)
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
1088
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
1089 def parse_AnnotationMemmber():
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
1090 member = _DEX_AnnotationMember()
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
1091 member.parse(data, moff())
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
1092 moff(member.data_size)
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
1093 return member
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
1094
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
1095 self.members = [parse_AnnotationMemmber()
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
1096 for i in range(size)]
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
1097
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
1098 self.data_size = moff() - off
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
1099 pass
13
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1100
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1101 def compute_size(self):
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1102 if self.visibility is not None:
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1103 visibility_size = 1
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1104 else:
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1105 visibility_size = 0
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1106 pass
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1107
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1108 typeIdx_size = _uleb128_sz(self.typeIdx)
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1109
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1110 members_cnt_size = _uleb128_sz(len(self.members))
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1111 members_size = members_cnt_size + _sum_data_size(self.members)
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1112
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1113 size = visibility_size + typeIdx_size + members_size
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1114
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1115 self.data_size = size
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1116 pass
8
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
1117 pass
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
1118
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
1119
10
123c7a8bbf4c Parse EncodedArrayItems
Thinker K.F. Li <thinker@codemud.net>
parents: 9
diff changeset
1120 class _DEX_EncodedArrayItem(object):
123c7a8bbf4c Parse EncodedArrayItems
Thinker K.F. Li <thinker@codemud.net>
parents: 9
diff changeset
1121 elements = None
123c7a8bbf4c Parse EncodedArrayItems
Thinker K.F. Li <thinker@codemud.net>
parents: 9
diff changeset
1122
123c7a8bbf4c Parse EncodedArrayItems
Thinker K.F. Li <thinker@codemud.net>
parents: 9
diff changeset
1123 data_size = None
123c7a8bbf4c Parse EncodedArrayItems
Thinker K.F. Li <thinker@codemud.net>
parents: 9
diff changeset
1124
123c7a8bbf4c Parse EncodedArrayItems
Thinker K.F. Li <thinker@codemud.net>
parents: 9
diff changeset
1125 def parse(self, data, off):
123c7a8bbf4c Parse EncodedArrayItems
Thinker K.F. Li <thinker@codemud.net>
parents: 9
diff changeset
1126 moff = man_off(off)
123c7a8bbf4c Parse EncodedArrayItems
Thinker K.F. Li <thinker@codemud.net>
parents: 9
diff changeset
1127
123c7a8bbf4c Parse EncodedArrayItems
Thinker K.F. Li <thinker@codemud.net>
parents: 9
diff changeset
1128 size, sh = _uleb128(data[moff():moff() + 5])
123c7a8bbf4c Parse EncodedArrayItems
Thinker K.F. Li <thinker@codemud.net>
parents: 9
diff changeset
1129 moff(sh)
123c7a8bbf4c Parse EncodedArrayItems
Thinker K.F. Li <thinker@codemud.net>
parents: 9
diff changeset
1130
123c7a8bbf4c Parse EncodedArrayItems
Thinker K.F. Li <thinker@codemud.net>
parents: 9
diff changeset
1131 def parse_element():
123c7a8bbf4c Parse EncodedArrayItems
Thinker K.F. Li <thinker@codemud.net>
parents: 9
diff changeset
1132 element = _DEX_AnnotationMember()
123c7a8bbf4c Parse EncodedArrayItems
Thinker K.F. Li <thinker@codemud.net>
parents: 9
diff changeset
1133 element.parse_noname(data, moff())
123c7a8bbf4c Parse EncodedArrayItems
Thinker K.F. Li <thinker@codemud.net>
parents: 9
diff changeset
1134 moff(element.data_size)
123c7a8bbf4c Parse EncodedArrayItems
Thinker K.F. Li <thinker@codemud.net>
parents: 9
diff changeset
1135 return element
123c7a8bbf4c Parse EncodedArrayItems
Thinker K.F. Li <thinker@codemud.net>
parents: 9
diff changeset
1136
123c7a8bbf4c Parse EncodedArrayItems
Thinker K.F. Li <thinker@codemud.net>
parents: 9
diff changeset
1137 self.elements = [parse_element()
123c7a8bbf4c Parse EncodedArrayItems
Thinker K.F. Li <thinker@codemud.net>
parents: 9
diff changeset
1138 for i in range(size)]
123c7a8bbf4c Parse EncodedArrayItems
Thinker K.F. Li <thinker@codemud.net>
parents: 9
diff changeset
1139
123c7a8bbf4c Parse EncodedArrayItems
Thinker K.F. Li <thinker@codemud.net>
parents: 9
diff changeset
1140 self.data_size = moff() - off
123c7a8bbf4c Parse EncodedArrayItems
Thinker K.F. Li <thinker@codemud.net>
parents: 9
diff changeset
1141 pass
13
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1142
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1143 def compute_size(self):
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1144 elements_cnt_size = _uleb128_sz(len(self.elements))
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1145 size = elements_cnt_size + _sum_data_size(self.elements)
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1146
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1147 self.data_size = size
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1148 pass
10
123c7a8bbf4c Parse EncodedArrayItems
Thinker K.F. Li <thinker@codemud.net>
parents: 9
diff changeset
1149 pass
123c7a8bbf4c Parse EncodedArrayItems
Thinker K.F. Li <thinker@codemud.net>
parents: 9
diff changeset
1150
123c7a8bbf4c Parse EncodedArrayItems
Thinker K.F. Li <thinker@codemud.net>
parents: 9
diff changeset
1151
11
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1152 class _DEX_DebugInfoItem(object):
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1153 start_line = None
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1154 parameters = None
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1155 opcodes = None
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1156
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1157 DBG_END_SEQUENCE = 0x00
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1158 DBG_ADVANCE_PC = 0x01
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1159 DBG_ADVANCE_LINE = 0x02
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1160 DBG_START_LOCAL = 0x03
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1161 DBG_START_LOCAL_EXTENDED = 0x04
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1162 DBG_END_LOCAL = 0x05
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1163 DBG_RESTART_LOCAL = 0x06
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1164 DBG_SET_PROLOGUE_END = 0x07
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1165 DBG_SET_EPILOGUE_BEGIN = 0x08
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1166 DBG_SET_FILE = 0x09
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1167 DBG_FIRST_SPECIAL = 0x0a
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1168 DBG_LINE_BASE = -4
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1169 DBG_LINE_RANGE = 15
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1170
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1171 data_size = None
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1172
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1173 def parse(self, data, off):
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1174 moff = man_off(off)
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1175
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1176 self.start_line, sh = _uleb128(data[moff():moff() + 5])
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1177 moff(sh)
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1178 parameters_size, sh = _uleb128(data[moff():moff() + 5])
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1179 moff(sh)
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1180
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1181 #
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1182 # Parse parameters
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1183 #
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1184 def parse_parameter():
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1185 paramter, sh = _uleb128(data[moff():moff() + 5])
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1186 moff(sh)
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1187 return paramter
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1188
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1189 self.parameters = [parse_parameter()
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1190 for i in range(parameters_size)]
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1191
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1192 #
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1193 # Parse debug opcodes
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1194 #
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1195 opcodes = []
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1196 while True:
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1197 opcode = _to_uint(data[moff(1):moff()])
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1198
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1199 if opcode == self.DBG_END_SEQUENCE:
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1200 opcodes.append((opcode,))
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1201 break
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1202 elif opcode == self.DBG_ADVANCE_PC:
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1203 adv, sh = _uleb128(data[moff():moff() + 5])
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1204 moff(sh)
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1205 opcodes.append((opcode, adv))
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1206 pass
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1207 elif opcode == self.DBG_ADVANCE_LINE:
13
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1208 adv, sh = _leb128(data[moff():moff() + 5])
11
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1209 moff(sh)
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1210 opcodes.append((opcode, adv))
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1211 pass
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1212 elif opcode in (self.DBG_START_LOCAL,
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1213 self.DBG_START_LOCAL_EXTENDED):
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1214 reg, sh = _uleb128(data[moff():moff() + 5])
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1215 moff(sh)
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1216 name, sh = _uleb128(data[moff():moff() + 5])
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1217 moff(sh)
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1218 descriptor, sh = _uleb128(data[moff():moff() + 5])
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1219 moff(sh)
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1220 if opcode == self.DBG_START_LOCAL_EXTENDED:
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1221 signature, sh = _uleb128(data[moff():moff() + 5])
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1222 moff(sh)
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1223 opcodes.append((opcode, reg, name, descriptor, signature))
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1224 else:
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1225 opcodes.append((opcode, reg, name, descriptor))
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1226 pass
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1227 pass
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1228 elif opcode == self.DBG_END_LOCAL:
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1229 reg, sh = _uleb128(data[moff():moff() + 5])
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1230 moff(sh)
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1231 opcodes.append((opcode, reg))
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1232 pass
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1233 elif opcode == self.DBG_RESTART_LOCAL:
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1234 reg, sh = _uleb128(data[moff():moff() + 5])
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1235 moff(sh)
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1236 opcodes.append((opcode, reg))
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1237 pass
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1238 elif opcode in (self.DBG_SET_PROLOGUE_END,
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1239 self.DBG_SET_EPILOGUE_BEGIN,
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1240 self.DBG_SET_FILE):
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1241 opcodes.append((opcode,))
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1242 pass
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1243 else:
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1244 opcodes.append((opcode,))
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1245 pass
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1246 pass
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1247 self.opcodes = opcodes
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1248
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1249 self.data_size = moff() - off
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1250 pass
13
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1251
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1252 def compute_size(self):
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1253 start_line_size = _uleb128_sz(self.start_line)
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1254
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1255 parameters_cnt_size = _uleb128_sz(len(self.parameters))
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1256 parameter_sizes = itertools.imap(_uleb128_sz, self.parameters)
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1257 parameters_size = parameters_cnt_size + sum(parameter_sizes)
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1258
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1259 def compute_opcode_size(code):
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1260 opcode = code[0]
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1261
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1262 if opcode == self.DBG_END_SEQUENCE:
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1263 size = 1
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1264 elif opcode == self.DBG_ADVANCE_PC:
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1265 size = 1 + _uleb128_sz(code[1])
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1266 elif opcode == self.DBG_ADVANCE_LINE:
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1267 size = 1 + _leb128_sz(code[1])
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1268 elif opcode in (self.DBG_START_LOCAL,
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1269 self.DBG_START_LOCAL_EXTENDED):
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1270 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
1271 _uleb128_sz(code[3])
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1272 if len(code) == 5:
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1273 size = size + _uleb128_sz(code[4])
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1274 pass
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1275 pass
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1276 elif opcode == self.DBG_END_LOCAL:
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1277 size = 1 + _uleb128_sz(code[1])
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1278 elif opcode == self.DBG_RESTART_LOCAL:
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1279 size = 1 + _uleb128_sz(code[1])
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1280 elif opcode in (self.DBG_SET_PROLOGUE_END,
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1281 self.DBG_SET_EPILOGUE_BEGIN,
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1282 self.DBG_SET_FILE):
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1283 size = 1
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1284 else:
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1285 size = 1
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1286 pass
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1287
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1288 return size
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1289
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1290 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
1291 opcode_sizes = [i for i in opcode_sizes]
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1292 opcodes_size = sum(opcode_sizes)
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1293
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1294 size = start_line_size + parameters_size + opcodes_size
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1295
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1296 self.data_size = size
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1297 pass
11
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1298 pass
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1299
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1300
0
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1301 class DEXFile(object):
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1302 _data = None
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1303 _header = None
1
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1304 _maps = None
0
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1305 _strings = None
1
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1306 _typeIds = None
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1307 _protoIds = None
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1308 _fieldIds = None
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1309 _methodIds = None
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1310 _classDefs = None
2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1311 _classDatas = None
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1312 _typeLists = None
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1313 _codeItems = None
3
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
1314 _annotationSetItems = None
4
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
1315 _annotationsDirectoryItems = None
8
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
1316 _annotationItems = None
10
123c7a8bbf4c Parse EncodedArrayItems
Thinker K.F. Li <thinker@codemud.net>
parents: 9
diff changeset
1317 _encodedArrayItems = None
11
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1318 _debugInfoItems = None
0
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1319
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1320 def __init__(self):
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1321 pass
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1322
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1323 def open(self, filename):
1
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1324 fo = file(filename, 'r')
0
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1325 data = fo.read()
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1326
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1327 self.parse(data)
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1328 pass
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1329
1
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1330 def _parse_maps(self):
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1331 data = self._data
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1332 header = self._header
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1333 off = header.mapOff
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1334
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1335 num = _to_uint(data[off:off + 4])
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1336 off = off + 4
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1337
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1338 maps = []
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1339 for i in range(num):
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1340 item_data = data[off:off + _DEX_MapItem.data_size]
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1341 item = _DEX_MapItem()
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1342 item.parse(item_data)
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1343 maps.append(item)
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1344 off = off + _DEX_MapItem.data_size
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1345 pass
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1346
2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1347 self._maps = maps
1
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1348 pass
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1349
3
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
1350 def find_map_item(self, type_value):
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
1351 maps = self._maps
7
1d776ec496e5 Migrate all to find_map_item_name()
Thinker K.F. Li <thinker@codemud.net>
parents: 6
diff changeset
1352 try:
1d776ec496e5 Migrate all to find_map_item_name()
Thinker K.F. Li <thinker@codemud.net>
parents: 6
diff changeset
1353 codeItem_map = [map for map in maps if map.type == type_value][0]
1d776ec496e5 Migrate all to find_map_item_name()
Thinker K.F. Li <thinker@codemud.net>
parents: 6
diff changeset
1354 except IndexError:
1d776ec496e5 Migrate all to find_map_item_name()
Thinker K.F. Li <thinker@codemud.net>
parents: 6
diff changeset
1355 return None
3
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
1356
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
1357 return codeItem_map
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
1358
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
1359 def find_map_item_name(self, type_name):
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
1360 type_value = _DEX_MapItem.find_type_name(type_name)
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
1361 map = self.find_map_item(type_value)
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
1362 return map
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
1363
1
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1364 def _parse_strings(self):
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1365 data = self._data
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1366 header = self._header
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1367 strings = []
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1368
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1369 num = header.stringIdsSize
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1370 off = header.stringIdsOff
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1371 for i in range(num):
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1372 str_start_off = _to_uint(data[off:off + 4])
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1373 str_stop_off = data.index('\x00', str_start_off)
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1374 string = data[str_start_off:str_stop_off]
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1375
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1376 sz, sh = _uleb128(string)
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1377 string = string[sh:]
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1378 strings.append(string)
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1379 off = off + 4
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1380 pass
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1381
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1382 self._strings = strings
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1383 pass
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1384
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1385 def _parse_typeIds(self):
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1386 data = self._data
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1387 header = self._header
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1388
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1389 num = header.typeIdsSize
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1390 off = header.typeIdsOff
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1391
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1392 def parse(item_data):
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1393 type_id = _DEX_TypeId()
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1394 type_id.parse(item_data)
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1395 return type_id
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1396
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1397 item_size = _DEX_TypeId.data_size
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1398 item_offs = range(off, off + item_size * num, item_size)
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1399 item_datas = [data[item_off:item_off + item_size]
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1400 for item_off in item_offs]
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1401 typeIds = [parse(item_data) for item_data in item_datas]
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1402
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1403 self._typeIds = typeIds
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1404 pass
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1405
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1406 def _parse_protoIds(self):
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1407 data = self._data
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1408 header = self._header
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1409
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1410 num = header.protoIdsSize
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1411 off = header.protoIdsOff
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1412
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1413 def parse(item_data):
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1414 proto_id = _DEX_ProtoId()
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1415 proto_id.parse(item_data)
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1416 return proto_id
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1417
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1418 item_size = _DEX_ProtoId.data_size
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1419 item_offs = range(off, off + item_size * num, item_size)
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1420 item_datas = [data[item_off:item_off + item_size]
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1421 for item_off in item_offs]
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1422 protoIds = [parse(item_data) for item_data in item_datas]
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1423
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1424 self._protoIds = protoIds
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1425 pass
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1426
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1427 def _parse_fieldIds(self):
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1428 data = self._data
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1429 header = self._header
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1430
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1431 num = header.fieldIdsSize
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1432 off = header.fieldIdsOff
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1433
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1434 def parse(item_data):
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1435 field_id = _DEX_FieldId()
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1436 field_id.parse(item_data)
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1437 return field_id
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1438
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1439 item_size = _DEX_FieldId.data_size
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1440 item_offs = range(off, off + item_size * num, item_size)
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1441 item_datas = [data[item_off:item_off + item_size]
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1442 for item_off in item_offs]
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1443 fieldIds = [parse(item_data) for item_data in item_datas]
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1444
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1445 self._fieldIds = fieldIds
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1446 pass
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1447
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1448 def _parse_methodIds(self):
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1449 data = self._data
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1450 header = self._header
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1451
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1452 num = header.methodIdsSize
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1453 off = header.methodIdsOff
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1454
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1455 def parse(item_data):
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1456 method_id = _DEX_MethodId()
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1457 method_id.parse(item_data)
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1458 return method_id
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1459
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1460 item_size = _DEX_MethodId.data_size
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1461 item_offs = range(off, off + item_size * num, item_size)
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1462 item_datas = [data[item_off:item_off + item_size]
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1463 for item_off in item_offs]
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1464 methodIds = [parse(item_data) for item_data in item_datas]
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1465
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1466 self._methodIds = methodIds
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1467 pass
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1468
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1469 def _parse_classDefs(self):
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1470 data = self._data
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1471 header = self._header
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1472
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1473 num = header.classDefsSize
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1474 off = header.classDefsOff
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1475
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1476 def parse(item_data):
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1477 class_def = _DEX_ClassDef()
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1478 class_def.parse(item_data)
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1479 return class_def
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1480
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1481 item_size = _DEX_ClassDef.data_size
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1482 item_offs = range(off, off + item_size * num, item_size)
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1483 item_datas = [data[item_off:item_off + item_size]
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1484 for item_off in item_offs]
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1485 classDefs = [parse(item_data) for item_data in item_datas]
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1486
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1487 self._classDefs = classDefs
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1488 pass
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1489
2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1490 def _parse_classDatas(self):
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1491 header = self._header
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1492 data = self._data
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1493
7
1d776ec496e5 Migrate all to find_map_item_name()
Thinker K.F. Li <thinker@codemud.net>
parents: 6
diff changeset
1494 class_data_map = self.find_map_item_name('kDexTypeClassDataItem')
2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1495
7
1d776ec496e5 Migrate all to find_map_item_name()
Thinker K.F. Li <thinker@codemud.net>
parents: 6
diff changeset
1496 moff = man_off(class_data_map.offset)
1d776ec496e5 Migrate all to find_map_item_name()
Thinker K.F. Li <thinker@codemud.net>
parents: 6
diff changeset
1497
2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1498 def parse_class_data():
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1499 class_data = _DEX_ClassData()
7
1d776ec496e5 Migrate all to find_map_item_name()
Thinker K.F. Li <thinker@codemud.net>
parents: 6
diff changeset
1500 class_data.parse(data, moff())
1d776ec496e5 Migrate all to find_map_item_name()
Thinker K.F. Li <thinker@codemud.net>
parents: 6
diff changeset
1501 moff(class_data.data_size)
2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1502 return class_data
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1503 class_datas = [parse_class_data() for i in range(class_data_map.size)]
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1504
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1505 self._classDatas = class_datas
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1506 pass
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1507
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1508 def _parse_typeLists(self):
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1509 data = self._data
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1510
7
1d776ec496e5 Migrate all to find_map_item_name()
Thinker K.F. Li <thinker@codemud.net>
parents: 6
diff changeset
1511 typeList_map = self.find_map_item_name('kDexTypeTypeList')
2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1512 num_typeLists = typeList_map.size
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1513
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1514 typeLists = _DEX_TypeLists()
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1515 typeLists.parse(num_typeLists, data, typeList_map.offset)
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1516
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1517 self._typeLists = typeLists
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1518 pass
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1519
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1520 def _parse_codeItems(self):
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1521 data = self._data
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1522
7
1d776ec496e5 Migrate all to find_map_item_name()
Thinker K.F. Li <thinker@codemud.net>
parents: 6
diff changeset
1523 codeItem_map = self.find_map_item_name('kDexTypeCodeItem')
1d776ec496e5 Migrate all to find_map_item_name()
Thinker K.F. Li <thinker@codemud.net>
parents: 6
diff changeset
1524 if codeItem_map is None:
1d776ec496e5 Migrate all to find_map_item_name()
Thinker K.F. Li <thinker@codemud.net>
parents: 6
diff changeset
1525 return
2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1526 num_codeItems = codeItem_map.size
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1527
7
1d776ec496e5 Migrate all to find_map_item_name()
Thinker K.F. Li <thinker@codemud.net>
parents: 6
diff changeset
1528 moff = man_off(codeItem_map.offset)
1d776ec496e5 Migrate all to find_map_item_name()
Thinker K.F. Li <thinker@codemud.net>
parents: 6
diff changeset
1529
2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1530 def parse_code():
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1531 code = _DEX_Code()
7
1d776ec496e5 Migrate all to find_map_item_name()
Thinker K.F. Li <thinker@codemud.net>
parents: 6
diff changeset
1532 code.parse(data, moff())
1d776ec496e5 Migrate all to find_map_item_name()
Thinker K.F. Li <thinker@codemud.net>
parents: 6
diff changeset
1533 moff(code.data_size)
2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1534 return code
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1535
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1536 codeItems = [parse_code() for i in range(num_codeItems)]
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1537
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1538 self._codeItems = codeItems
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1539 pass
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1540
3
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
1541 def _parse_annotationSetItems(self):
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
1542 data = self._data
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
1543
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
1544 annoset_map = self.find_map_item_name('kDexTypeAnnotationSetItem')
7
1d776ec496e5 Migrate all to find_map_item_name()
Thinker K.F. Li <thinker@codemud.net>
parents: 6
diff changeset
1545 if annoset_map is None:
1d776ec496e5 Migrate all to find_map_item_name()
Thinker K.F. Li <thinker@codemud.net>
parents: 6
diff changeset
1546 return
3
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
1547
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
1548 moff = man_off(annoset_map.offset)
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
1549
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
1550 def parse_annotationSetItem():
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
1551 item = _DEX_AnnotationSetItem()
4
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
1552 item.parse(data, moff())
3
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
1553 moff(item.data_size)
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
1554 return item
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
1555
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
1556 self._annotationSetItems = [parse_annotationSetItem()
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
1557 for i in range(annoset_map.size)]
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
1558 pass
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
1559
4
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
1560 def _parse_annotationsDirectoryItems(self):
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
1561 data = self._data
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
1562
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
1563 annodir_map = \
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
1564 self.find_map_item_name('kDexTypeAnnotationsDirectoryItem')
7
1d776ec496e5 Migrate all to find_map_item_name()
Thinker K.F. Li <thinker@codemud.net>
parents: 6
diff changeset
1565 if annodir_map is None:
1d776ec496e5 Migrate all to find_map_item_name()
Thinker K.F. Li <thinker@codemud.net>
parents: 6
diff changeset
1566 return
4
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
1567
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
1568 moff = man_off(annodir_map.offset)
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
1569
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
1570 def parse_annotationDirItem():
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
1571 item = _DEX_AnnotationsDirectoryItem()
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
1572 item.parse(data, moff())
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
1573 moff(item.data_size)
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
1574 return item
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
1575
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
1576 self._annotationsDirectoryItems = [parse_annotationDirItem()
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
1577 for i in range(annodir_map.size)]
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
1578 pass
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
1579
8
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
1580 def _parse_annotationItems(self):
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
1581 data = self._data
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
1582
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
1583 annoitem_map = self.find_map_item_name('kDexTypeAnnotationItem')
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
1584 if annoitem_map is None:
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
1585 return
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
1586
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
1587 moff = man_off(annoitem_map.offset)
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
1588
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
1589 def parse_annotationItem():
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
1590 item = _DEX_AnnotationItem()
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
1591 item.parse(data, moff())
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
1592 moff(item.data_size)
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
1593 return item
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
1594
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
1595 self._annotationItems = [parse_annotationItem()
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
1596 for i in range(annoitem_map.size)]
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
1597 pass
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
1598
9
9a49826b26d4 Refactor _parse_header()
Thinker K.F. Li <thinker@codemud.net>
parents: 8
diff changeset
1599 def _parse_header(self):
9a49826b26d4 Refactor _parse_header()
Thinker K.F. Li <thinker@codemud.net>
parents: 8
diff changeset
1600 data = self._data
0
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1601 header = _DEX_header()
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1602 header.parse(data)
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1603 self._header = header
9
9a49826b26d4 Refactor _parse_header()
Thinker K.F. Li <thinker@codemud.net>
parents: 8
diff changeset
1604 pass
1
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1605
10
123c7a8bbf4c Parse EncodedArrayItems
Thinker K.F. Li <thinker@codemud.net>
parents: 9
diff changeset
1606 def _parse_encodedArrayItems(self):
123c7a8bbf4c Parse EncodedArrayItems
Thinker K.F. Li <thinker@codemud.net>
parents: 9
diff changeset
1607 data = self._data
123c7a8bbf4c Parse EncodedArrayItems
Thinker K.F. Li <thinker@codemud.net>
parents: 9
diff changeset
1608
123c7a8bbf4c Parse EncodedArrayItems
Thinker K.F. Li <thinker@codemud.net>
parents: 9
diff changeset
1609 encodedArrayItem_map = \
123c7a8bbf4c Parse EncodedArrayItems
Thinker K.F. Li <thinker@codemud.net>
parents: 9
diff changeset
1610 self.find_map_item_name('kDexTypeEncodedArrayItem')
123c7a8bbf4c Parse EncodedArrayItems
Thinker K.F. Li <thinker@codemud.net>
parents: 9
diff changeset
1611
123c7a8bbf4c Parse EncodedArrayItems
Thinker K.F. Li <thinker@codemud.net>
parents: 9
diff changeset
1612 moff = man_off(encodedArrayItem_map.offset)
123c7a8bbf4c Parse EncodedArrayItems
Thinker K.F. Li <thinker@codemud.net>
parents: 9
diff changeset
1613
123c7a8bbf4c Parse EncodedArrayItems
Thinker K.F. Li <thinker@codemud.net>
parents: 9
diff changeset
1614 def parse_encodedArrayItem():
123c7a8bbf4c Parse EncodedArrayItems
Thinker K.F. Li <thinker@codemud.net>
parents: 9
diff changeset
1615 item = _DEX_EncodedArrayItem()
123c7a8bbf4c Parse EncodedArrayItems
Thinker K.F. Li <thinker@codemud.net>
parents: 9
diff changeset
1616 item.parse(data, moff())
123c7a8bbf4c Parse EncodedArrayItems
Thinker K.F. Li <thinker@codemud.net>
parents: 9
diff changeset
1617 moff(item.data_size)
123c7a8bbf4c Parse EncodedArrayItems
Thinker K.F. Li <thinker@codemud.net>
parents: 9
diff changeset
1618 return item
123c7a8bbf4c Parse EncodedArrayItems
Thinker K.F. Li <thinker@codemud.net>
parents: 9
diff changeset
1619
123c7a8bbf4c Parse EncodedArrayItems
Thinker K.F. Li <thinker@codemud.net>
parents: 9
diff changeset
1620 self._encodedArrayItems = [parse_encodedArrayItem()
123c7a8bbf4c Parse EncodedArrayItems
Thinker K.F. Li <thinker@codemud.net>
parents: 9
diff changeset
1621 for i in range(encodedArrayItem_map.size)]
123c7a8bbf4c Parse EncodedArrayItems
Thinker K.F. Li <thinker@codemud.net>
parents: 9
diff changeset
1622 pass
123c7a8bbf4c Parse EncodedArrayItems
Thinker K.F. Li <thinker@codemud.net>
parents: 9
diff changeset
1623
11
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1624 def _parse_debugInfoItems(self):
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1625 data = self._data
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1626
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1627 debugInfoItem_map = \
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1628 self.find_map_item_name('kDexTypeDebugInfoItem')
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1629
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1630 moff = man_off(debugInfoItem_map.offset)
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1631
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1632 def parse_debugInfoItem():
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1633 item = _DEX_DebugInfoItem()
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1634 item.parse(data, moff())
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1635 moff(item.data_size)
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1636 return item
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1637
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1638 self._debugInfoItems = [parse_debugInfoItem()
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1639 for i in range(debugInfoItem_map.size)]
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1640 pass
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1641
9
9a49826b26d4 Refactor _parse_header()
Thinker K.F. Li <thinker@codemud.net>
parents: 8
diff changeset
1642 def parse(self, data):
9a49826b26d4 Refactor _parse_header()
Thinker K.F. Li <thinker@codemud.net>
parents: 8
diff changeset
1643 self._data = data
9a49826b26d4 Refactor _parse_header()
Thinker K.F. Li <thinker@codemud.net>
parents: 8
diff changeset
1644 self._parse_header()
1
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1645 self._parse_maps()
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1646 self._parse_strings()
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1647 self._parse_typeIds()
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1648 self._parse_protoIds()
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1649 self._parse_fieldIds()
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1650 self._parse_methodIds()
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1651 self._parse_classDefs()
2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1652 self._parse_classDatas()
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1653 self._parse_typeLists()
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1654 self._parse_codeItems()
3
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
1655 self._parse_annotationSetItems()
4
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
1656 self._parse_annotationsDirectoryItems()
8
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
1657 self._parse_annotationItems()
10
123c7a8bbf4c Parse EncodedArrayItems
Thinker K.F. Li <thinker@codemud.net>
parents: 9
diff changeset
1658 self._parse_encodedArrayItems()
11
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1659 self._parse_debugInfoItems()
0
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1660 pass
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1661 pass
1
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1662
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1663 if __name__ == '__main__':
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1664 dex = DEXFile()
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1665 dex.open('test.dex')
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1666
2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1667 print 'Header'
1
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1668 h = dex._header
2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1669 for attr in h.header_fields:
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1670 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
1671 pass
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1672
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1673 print
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1674 print 'Define Classes'
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1675 strings = dex._strings
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1676 classDefs = dex._classDefs
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1677 typeIds = dex._typeIds
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1678 for classDef in classDefs:
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1679 typeId = typeIds[classDef.classIdx]
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1680 descriptor = strings[typeId.descriptorIdx]
2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1681 data_off = classDef.classDataOff
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1682 print '\t%s @0x%x' % (descriptor, data_off)
1
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1683 pass
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1684
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1685 print
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1686 print 'Reference Classes'
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1687 for typeId in typeIds:
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1688 descriptor = strings[typeId.descriptorIdx]
2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1689 print '\t%s' % (descriptor)
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1690 pass
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1691
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1692 print
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1693 print 'Class data'
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1694 methodIds = dex._methodIds
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1695 classDatas = dex._classDatas
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1696 for classData in classDatas:
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1697 print '\tclass'
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1698 for method in classData.directMethods:
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1699 code_off = method.codeOff
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1700 methodId = methodIds[method.methodIdx]
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1701 name = strings[methodId.nameIdx]
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1702 print '\t\t%s@0x%x' % (name, code_off)
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1703 pass
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1704 for method in classData.virtualMethods:
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1705 code_off = method.codeOff
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1706 methodId = methodIds[method.methodIdx]
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1707 name = strings[methodId.nameIdx]
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1708 print '\t\t%s@0x%x' % (name, code_off)
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1709 pass
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1710 pass
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1711
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1712 print
13
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1713 print 'TypeLists size is %d/%d bytes' % (dex._typeLists.data_size,
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1714 _compute_sz(dex._typeLists))
2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1715
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1716 bytes = sum([code.data_size for code in dex._codeItems])
13
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1717 rbytes = sum([_compute_sz(code) for code in dex._codeItems])
2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1718 print
13
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1719 print 'CodeItems size is %d/%d bytes' % (bytes, rbytes)
2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1720
3
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
1721 bytes = sum([annoset.data_size for annoset in dex._annotationSetItems])
13
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1722 rbytes = sum([_compute_sz(annoset) for annoset in dex._annotationSetItems])
3
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
1723 print
13
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1724 print 'AnnotationSetItems size is %d/%d bytes' % (bytes, rbytes)
3
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
1725
4
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
1726 bytes = sum([annodir.data_size
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
1727 for annodir in dex._annotationsDirectoryItems])
13
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1728 rbytes = sum([_compute_sz(annodir)
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1729 for annodir in dex._annotationsDirectoryItems])
4
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
1730 print
13
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1731 print 'AnnotationsDirtoryItems size is %d/%d bytes' % (bytes, rbytes)
4
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
1732
8
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
1733 bytes = sum([annoitem.data_size
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
1734 for annoitem in dex._annotationItems])
13
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1735 rbytes = sum([_compute_sz(annoitem)
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1736 for annoitem in dex._annotationItems])
8
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
1737 print
13
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1738 print 'AnnotationItems size is %d/%d bytes' % (bytes, rbytes)
8
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
1739
10
123c7a8bbf4c Parse EncodedArrayItems
Thinker K.F. Li <thinker@codemud.net>
parents: 9
diff changeset
1740 bytes = sum([encodeditem.data_size
123c7a8bbf4c Parse EncodedArrayItems
Thinker K.F. Li <thinker@codemud.net>
parents: 9
diff changeset
1741 for encodeditem in dex._encodedArrayItems])
13
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1742 rbytes = sum([_compute_sz(encodeditem)
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1743 for encodeditem in dex._encodedArrayItems])
10
123c7a8bbf4c Parse EncodedArrayItems
Thinker K.F. Li <thinker@codemud.net>
parents: 9
diff changeset
1744 print
13
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1745 print 'EncodedArrayItems size is %d/%d bytes' % (bytes, rbytes)
10
123c7a8bbf4c Parse EncodedArrayItems
Thinker K.F. Li <thinker@codemud.net>
parents: 9
diff changeset
1746
11
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1747 bytes = sum([debuginfoitem.data_size
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1748 for debuginfoitem in dex._debugInfoItems])
13
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1749 rbytes = sum([_compute_sz(debuginfoitem)
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1750 for debuginfoitem in dex._debugInfoItems])
11
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1751 print
13
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1752 print 'DebugInfoItems size is %d/%d bytes' % (bytes, rbytes)
11
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1753
2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1754 print
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1755 print 'Data maps'
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1756 maps = dex._maps
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1757 for map in maps:
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1758 print '\t0x%04x(%s) size=%d offset=0x%08x' % (map.type,
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1759 map.types[map.type],
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1760 map.size,
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1761 map.offset)
1
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1762 pass
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1763 pass