annotate paraspace/dexfile.py @ 11:409e2cd76f72

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