annotate paraspace/dexfile.py @ 7:1d776ec496e5

Migrate all to find_map_item_name()
author Thinker K.F. Li <thinker@codemud.net>
date Tue, 24 May 2011 10:28:30 +0800
parents 917f0a9b9d06
children 59dd10bf60f2
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
1
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
78 def _uleb128(data):
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
79 sh = 0
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
80 v = 0
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
81 for c in data:
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
82 cv = ord(c)
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
83 v = v + ((cv & 0x7f) << sh)
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
84 sh = sh + 7
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
85
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
86 if cv <= 0x7f:
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
87 break
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
88 pass
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
89
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
90 nbytes = sh / 7
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
91 return v, nbytes
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
92
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
93
2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
94 def _leb128(data):
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
95 v, sh = _uleb128(data)
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
96 if v & (1 << (sh * 7 - 1)):
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
97 v = -((1 << (sh * 7)) - v)
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
98 pass
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
99 return v, sh
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
100
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
101
0
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
102 class _DEX_MapItem(object):
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
103 type = None # 2 bytes
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
104 unused = None # 2 bytes
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
105 size = None # 4 bytes
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
106 offset = None # 4 bytes
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
107
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
108 data_size = 12
2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
109 types = {
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
110 0x0000: 'kDexTypeHeaderItem',
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
111 0x0001: 'kDexTypeStringIdItem',
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
112 0x0002: 'kDexTypeTypeIdItem',
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
113 0x0003: 'kDexTypeProtoIdItem',
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
114 0x0004: 'kDexTypeFieldIdItem',
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
115 0x0005: 'kDexTypeMethodIdItem',
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
116 0x0006: 'kDexTypeClassDefItem',
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
117 0x1000: 'kDexTypeMapList',
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
118 0x1001: 'kDexTypeTypeList',
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
119 0x1002: 'kDexTypeAnnotationSetRefList',
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
120 0x1003: 'kDexTypeAnnotationSetItem',
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
121 0x2000: 'kDexTypeClassDataItem',
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
122 0x2001: 'kDexTypeCodeItem',
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
123 0x2002: 'kDexTypeStringDataItem',
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
124 0x2003: 'kDexTypeDebugInfoItem',
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
125 0x2004: 'kDexTypeAnnotationItem',
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
126 0x2005: 'kDexTypeEncodedArrayItem',
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
127 0x2006: 'kDexTypeAnnotationsDirectoryItem'
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
128 }
0
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
129
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
130 def parse(self, data):
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
131 self.type = _to_uint(data[:2])
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
132 self.size = _to_uint(data[4:8])
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
133 self.offset = _to_uint(data[8:12])
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
134 pass
3
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
135
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
136 @classmethod
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
137 def find_type_name(self, type_name):
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
138 type_value = [v
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
139 for v, name in _DEX_MapItem.types.items()
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
140 if name == type_name][0]
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
141 return type_value
0
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
142 pass
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
143
1
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
144
0
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
145 class _DEX_TypeId(object):
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
146 descriptorIdx = None # 4 bytes
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
147
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
148 data_size = 4
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
149
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
150 def parse(self, data):
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
151 self.descriptorIdx = _to_uint(data[:4])
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
152 pass
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
153 pass
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
154
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
155
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
156 class _DEX_ProtoId(object):
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
157 shortyIdx = None # 4 bytes
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
158 returnTypeIdx = None # 4 bytes
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
159 parametersOff = None # 4 bytes
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
160
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
161 data_size = 12
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
162
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
163 def parse(self, data):
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
164 self.shortyIdx = _to_uint(data[:4])
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
165 self.returnTypeIdx = _to_uint(data[4:8])
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
166 self.parametersOff = _to_uint(data[8:12])
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
167 pass
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
168 pass
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
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
171 class _DEX_FieldId(object):
1
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
172 classIdx = None # 2 bytes
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
173 typeIdx = None # 2 bytes
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
174 nameIdx = None # 4 bytes
0
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
175
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
176 data_size = 8
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
177
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
178 def parse(self, data):
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
179 self.classIdx = _to_uint(data[:2])
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
180 self.typeIdx = _to_uint(data[2:4])
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
181 self.nameIdx = _to_uint(data[4:8])
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
182 pass
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
183 pass
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
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
186 class _DEX_MethodId(object):
1
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
187 classIdx = None # 2 bytes
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
188 protoIdx = None # 2 bytes
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
189 nameIdx = None # 4 bytes
0
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
190
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
191 data_size = 8
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
192
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
193 def parse(self, data):
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
194 self.classIdx = _to_uint(data[:2])
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
195 self.protoIdx = _to_uint(data[2:4])
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
196 self.nameIdx = _to_uint(data[4:8])
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
197 pass
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
198 pass
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
199
1
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
200
0
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
201 class _DEX_ClassDef(object):
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
202 classIdx = None # 0x00
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
203 accessFlags = None # 0x04
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
204 superclassIdx = None # 0x08
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
205 interfacesOff = None # 0x0c
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
206 sourceFileIdx = None # 0x10
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
207 annotationsOff = None # 0x14
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
208 classDataOff = None # 0x18
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
209 staticValuesOff = None # 0x1c
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
210
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
211 data_size = 0x20
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
212
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
213 def parse(self, data):
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
214 self.classIdx = _to_uint(data[:4])
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
215 self.accessFlags = _to_uint(data[4:8])
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
216 self.superclassIdx = _to_uint(data[8:0xc])
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
217 self.interfacesOff = _to_uint(data[0xc:0x10])
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
218 self.sourceFileIdx = _to_uint(data[0x10:0x14])
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
219 self.annotationsOff = _to_uint(data[0x14:0x18])
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
220 self.classDataOff = _to_uint(data[0x18:0x1c])
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
221 self.staticValuesOff = _to_uint(data[0x1c:0x20])
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
222 pass
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
223 pass
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
224
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
225
2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
226 class _DEX_ClassDataHeader(object):
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
227 staticFieldsSize = None
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
228 instanceFieldsSize = None
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
229 directMethodsSize = None
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
230 virtualMethodsSize = None
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
231
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
232 data_size = None
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
233
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
234 def parse(self, data, off):
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
235 self.staticFieldsSize, sh = _uleb128(data[off:off + 10])
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
236 sz = sh
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
237 off = off + sh
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
238 self.instanceFieldsSize, sh = _uleb128(data[off:off + 10])
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
239 sz = sz + sh
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
240 off = off + sh
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
241 self.directMethodsSize, sh = _uleb128(data[off:off + 10])
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
242 sz = sz + sh
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
243 off = off + sh
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
244 self.virtualMethodsSize, sh = _uleb128(data[off:off + 10])
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
245 sz = sz + sh
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
246
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
247 self.data_size = sz
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
248 pass
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
249 pass
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
250
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
251
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
252 class _DEX_Field(object):
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
253 fieldIdx = None
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
254 accessFlags = None
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 data_size = None
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
257
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
258 def parse(self, data, off):
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
259 self.fieldIdx, sh = _uleb128(data[off:off + 10])
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
260 sz = sh
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
261 off = off + sh
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
262 self.accessFlags, sh = _uleb128(data[off:off + 10])
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
263 sz = sz + sh
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 self.data_size = sz
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
266 pass
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
267 pass
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
268
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
269
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
270 class _DEX_Method(object):
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
271 methodIdx = None
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
272 accessFlags = None
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
273 codeOff = None
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
274
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
275 data_size = None
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
276
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
277 def parse(self, data, off):
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
278 self.methodIdx, sh = _uleb128(data[off:off + 10])
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
279 sz = sh
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
280 off = off + sh
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
281
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
282 self.accessFlags, sh = _uleb128(data[off:off + 10])
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
283 sz = sz + sh
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
284 off = off + sh
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 self.codeOff, sh = _uleb128(data[off:off + 10])
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
287 sz = sz + sh
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
288
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
289 self.data_size = sz
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
290 pass
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
291 pass
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
292
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
293 class _DEX_ClassData(object):
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
294 header = None # DexClassDataHeader
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
295 staticFields = None # DexField*
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
296 instanceFields = None # DexField*
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
297 directMethods = None # DexMethod*
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
298 virtualMethods = None # DexMethod*
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
299
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
300 data_size = None
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 def parse(self, data, off):
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
303 header = _DEX_ClassDataHeader()
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
304 header.parse(data, off)
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
305 self.header = header
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
306
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
307 cur_off = [off + header.data_size]
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 def parse_field():
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
310 field = _DEX_Field()
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
311 off = cur_off[0]
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
312 field.parse(data, off)
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
313 cur_off[0] = cur_off[0] + field.data_size
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
314
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 # field index depends previous one to reduce 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 field.fieldIdx = field.fieldIdx + idx[0]
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
319 idx[0] = field.fieldIdx
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
320
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
321 return field
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
322
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
323 def parse_method():
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
324 method = _DEX_Method()
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
325 off = cur_off[0]
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
326 method.parse(data, off)
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
327 cur_off[0] = cur_off[0] + method.data_size
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
328
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 # method index depends previous one to reduce size
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 method.methodIdx = method.methodIdx + idx[0]
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
333 idx[0] = method.methodIdx
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
334
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
335 return method
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
336
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
337 idx = [0]
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
338 self.staticFields = [parse_field()
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
339 for i in range(header.staticFieldsSize)]
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
340 idx = [0]
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
341 self.instanceFields = [parse_field()
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
342 for i in range(header.instanceFieldsSize)]
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
343 idx = [0]
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
344 self.directMethods = [parse_method()
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
345 for i in range(header.directMethodsSize)]
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.virtualMethods = [parse_method()
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
348 for i in range(header.virtualMethodsSize)]
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
349
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
350 self.data_size = cur_off[0] - off
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
351 pass
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
352 pass
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
353
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
354
6
917f0a9b9d06 Refactor _DEX_TypeItem from _DEX_TypeList for layout info tracking
Thinker K.F. Li <thinker@codemud.net>
parents: 5
diff changeset
355 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
356 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
357
917f0a9b9d06 Refactor _DEX_TypeItem from _DEX_TypeList for layout info tracking
Thinker K.F. Li <thinker@codemud.net>
parents: 5
diff changeset
358 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
359
917f0a9b9d06 Refactor _DEX_TypeItem from _DEX_TypeList for layout info tracking
Thinker K.F. Li <thinker@codemud.net>
parents: 5
diff changeset
360 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
361 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
362 pass
917f0a9b9d06 Refactor _DEX_TypeItem from _DEX_TypeList for layout info tracking
Thinker K.F. Li <thinker@codemud.net>
parents: 5
diff changeset
363 pass
917f0a9b9d06 Refactor _DEX_TypeItem from _DEX_TypeList for layout info tracking
Thinker K.F. Li <thinker@codemud.net>
parents: 5
diff changeset
364
917f0a9b9d06 Refactor _DEX_TypeItem from _DEX_TypeList for layout info tracking
Thinker K.F. Li <thinker@codemud.net>
parents: 5
diff changeset
365
2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
366 class _DEX_TypeList(object):
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
367 typeItems = None
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
368
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
369 data_size = None
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
370
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
371 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
372 moff = man_off(off)
2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
373
6
917f0a9b9d06 Refactor _DEX_TypeItem from _DEX_TypeList for layout info tracking
Thinker K.F. Li <thinker@codemud.net>
parents: 5
diff changeset
374 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
375
917f0a9b9d06 Refactor _DEX_TypeItem from _DEX_TypeList for layout info tracking
Thinker K.F. Li <thinker@codemud.net>
parents: 5
diff changeset
376 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
377 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
378 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
379 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
380 return item
917f0a9b9d06 Refactor _DEX_TypeItem from _DEX_TypeList for layout info tracking
Thinker K.F. Li <thinker@codemud.net>
parents: 5
diff changeset
381
917f0a9b9d06 Refactor _DEX_TypeItem from _DEX_TypeList for layout info tracking
Thinker K.F. Li <thinker@codemud.net>
parents: 5
diff changeset
382 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
383 for i in range(size)]
2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
384
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
385 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
386 self.data_size = moff() - off
2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
387 pass
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
388 pass
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
389
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
390
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
391 class _DEX_TypeLists(object):
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
392 typeLists = None
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 data_size = None
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
395
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
396 def parse(self, num, data, off):
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
397 def parse():
5
97b7006ced5f Move move_off imps. to man_off
Thinker K.F. Li <thinker@codemud.net>
parents: 4
diff changeset
398 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
399 typeList = _DEX_TypeList()
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
400 typeList.parse(data, off)
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
401 cur_off[0] = off + typeList.data_size
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 return typeList
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 cur_off = [off]
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
406 typeLists = [parse() for i in range(num)]
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
407
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
408 self.typeLists = typeLists
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
409 self.data_size = cur_off[0] - off
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
410 pass
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
411 pass
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
412
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 class _DEX_Try(object):
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
415 startAddr = None # 4 bytes
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
416 insnCount = None # 2 bytes
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
417 handlerOff = None # 2 bytes
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
418
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
419 data_size = 8
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
420
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
421 def parse(self, data, off):
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
422 cur_off = off
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
423 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
424 cur_off = cur_off + 4
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
425 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
426 cur_off = cur_off + 2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
427 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
428 pass
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
429 pass
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
430
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
431
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
432 class _DEX_CatchHandler(object):
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
433 typeIdx = None
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
434 address = None
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
435
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
436 data_size = None
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
437
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
438 def parse(self, data, off):
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
439 cur_off = off
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
440 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
441 cur_off = cur_off + sh
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
442 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
443 cur_off = cur_off + sh
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 self.data_size = cur_off - off
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
446 pass
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
447
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
448 def parse1(self, data, off):
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
449 self.address, sh = _uleb128(data[off:off + 5])
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
450
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
451 self.data_size = sh
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
452 pass
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
453 pass
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
454
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
455
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
456 class _DEX_Catch(object):
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
457 catchesAll = None
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
458 handlers = None
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 data_size = None
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
461
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
462 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
463 moff = man_off(off)
2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
464
5
97b7006ced5f Move move_off imps. to man_off
Thinker K.F. Li <thinker@codemud.net>
parents: 4
diff changeset
465 count, sh = _leb128(data[moff():moff() + 5])
2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
466 moff(sh)
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
467
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
468 if count > 0:
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
469 self.catchesAll = False
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
470 else:
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
471 self.catchesAll = True
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
472 count = -count
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
473 pass
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
474
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
475 def parse_handler():
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
476 handler = _DEX_CatchHandler()
5
97b7006ced5f Move move_off imps. to man_off
Thinker K.F. Li <thinker@codemud.net>
parents: 4
diff changeset
477 handler.parse(data, moff())
2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
478 moff(handler.data_size)
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
479 return handler
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
480
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
481 self.handlers = [parse_handler() for i in range(count)]
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
482
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
483 if self.catchesAll:
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
484 #
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
485 # Additional handler for catching all
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
486 #
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
487 handler = _DEX_CatchHandler()
5
97b7006ced5f Move move_off imps. to man_off
Thinker K.F. Li <thinker@codemud.net>
parents: 4
diff changeset
488 handler.parse1(data, moff())
2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
489 moff(handler.data_size)
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
490 self.handlers.append(handler)
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
491 pass
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
492
5
97b7006ced5f Move move_off imps. to man_off
Thinker K.F. Li <thinker@codemud.net>
parents: 4
diff changeset
493 self.data_size = moff() - off
2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
494 pass
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
495 pass
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
496
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
497
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
498 class _DEX_Code(object):
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
499 registersSize = None # 2 bytes
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
500 insSize = None # 2 bytes
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
501 outsSize = None # 2 bytes
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
502 triesSize = None # 2 bytes
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
503 debugInfoOff = None # 4 bytes
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
504 insnsSize = None # 4 bytes
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
505 insns = None
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
506 try_items = None
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
507 catch_handler_items = None
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
508
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
509 data_size = None
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
510
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
511 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
512 moff = man_off(off)
2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
513
5
97b7006ced5f Move move_off imps. to man_off
Thinker K.F. Li <thinker@codemud.net>
parents: 4
diff changeset
514 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
515 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
516 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
517 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
518 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
519 self.insnsSize = _to_uint(data[moff(4):moff()])
2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
520
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
521 moff(self.insnsSize * 2) # skip insns
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
522
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
523 if self.triesSize > 0:
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
524 def parse_try_item():
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
525 try_item = _DEX_Try()
5
97b7006ced5f Move move_off imps. to man_off
Thinker K.F. Li <thinker@codemud.net>
parents: 4
diff changeset
526 try_item.parse(data, moff())
2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
527 moff(try_item.data_size)
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
528 return try_item
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
529
5
97b7006ced5f Move move_off imps. to man_off
Thinker K.F. Li <thinker@codemud.net>
parents: 4
diff changeset
530 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
531 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
532
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
533 def parse_catch_handler():
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
534 catch = _DEX_Catch()
5
97b7006ced5f Move move_off imps. to man_off
Thinker K.F. Li <thinker@codemud.net>
parents: 4
diff changeset
535 catch.parse(data, moff())
2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
536 moff(catch.data_size)
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
537 return catch
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
538
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
539 #
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
540 # No tries, no catch handlers
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
541 #
5
97b7006ced5f Move move_off imps. to man_off
Thinker K.F. Li <thinker@codemud.net>
parents: 4
diff changeset
542 handlersSize, sh = _uleb128(data[moff():moff() + 5])
2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
543 moff(sh)
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
544 self.catch_handler_items = [parse_catch_handler()
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
545 for i in range(handlersSize)]
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
546 pass
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
547
5
97b7006ced5f Move move_off imps. to man_off
Thinker K.F. Li <thinker@codemud.net>
parents: 4
diff changeset
548 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
549 self.data_size = moff() - off
2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
550 pass
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
551 pass
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
552
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
553
4
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
554 ## \brief File offset to Annotation item.
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
555 #
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
556 # 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
557 # information for layout algorithm.
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
558 #
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
559 class _DEX_AnnotationRefItem(object):
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
560 annotationOff = None # 4 bytes
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
561
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
562 data_size = 4
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
563
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
564 def parse(self, data, off):
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
565 self.annotationOff = _to_uint(data[off:off + 4])
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
566 pass
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
567 pass
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
568
3
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
569 class _DEX_AnnotationSetItem(object):
4
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
570 # size = None # 4 bytes
3
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
571 annotations = None # 4 * size bytes
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
572
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
573 data_size = None
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
574
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
575 def parse(self, data, off):
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
576 moff = man_off(off)
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
577
4
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
578 size = _to_uint(data[moff(4):moff()])
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
579
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
580 def parse_annotation_ref():
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
581 ref = _DEX_AnnotationRefItem()
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
582 ref.parse(data, moff())
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
583 moff(ref.data_size)
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
584 return ref
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
585
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
586 self.annotations = [parse_annotation_ref()
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
587 for i in range(size)]
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 self.data_size = moff() - off
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
590 pass
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
591 pass
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
592
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
593
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
594 class _DEX_FieldAnnotationsItem(object):
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
595 fieldIdx = None # 4 bytes
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
596 annotationsOff = None # 4 bytes
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 data_size = 8
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
599
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
600 def parse(self, data, off):
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
601 moff = man_off(off)
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 self.fieldIdx = _to_uint(data[moff(4):moff()])
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
604 self.annotationsOff = _to_uint(data[moff(4):moff()])
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
605 pass
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
606 pass
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
607
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 class _DEX_MethodAnnotationsItem(object):
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
610 methodIdx = None # 4 bytes
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
611 annotationsOff = None # 4 bytes
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
612
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
613 data_size = 8
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
614
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
615 def parse(self, data, off):
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
616 moff = man_off(off)
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 self.methodIdx = _to_uint(data[moff(4):moff()])
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
619 self.annotationsOff = _to_uint(data[moff(4):moff()])
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
620 pass
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
621 pass
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
622
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 class _DEX_ParameterAnnotationsItem(object):
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
625 methodIdx = None # 4 bytes
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
626 annotationsOff = None # 4 bytes
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
627
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
628 data_size = 8
3
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
629
4
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
630 def parse(self, data, off):
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
631 moff = man_off(off)
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 self.methodIdx = _to_uint(data[moff(4):moff()])
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
634 self.annotationsOff = _to_uint(data[moff(4):moff()])
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
635 pass
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
636 pass
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
637
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
638
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
639 class _DEX_AnnotationsDirectoryItem(object):
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
640 classAnnotationsOff = None # 4 bytes
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
641 fieldAnnotationsItems = None
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
642 methodAnnotationsItems = None
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
643 parameterAnnotationsItems = None
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
644
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
645 data_size = None
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 def parse(self, data, off):
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
648 moff = man_off(off)
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
649
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
650 self.classAnnotationsOff = _to_uint(data[moff(4):moff()])
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
651 fieldsSize = _to_uint(data[moff(4):moff()])
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
652 methodsSize = _to_uint(data[moff(4):moff()])
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
653 parametersSize = _to_uint(data[moff(4):moff()])
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
654
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
655 def parse_fieldAnnotationsItem():
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
656 item = _DEX_FieldAnnotationsItem()
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
657 item.parse(data, moff())
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
658 moff(item.data_size)
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
659 return item
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
660
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
661 def parse_methodAnnotationsItem():
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
662 item = _DEX_MethodAnnotationsItem()
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
663 item.parse(data, moff())
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
664 moff(item.data_size)
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
665 return item
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
666
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
667 def parse_parameterAnnotationsItem():
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
668 item = _DEX_ParameterAnnotationsItem()
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
669 item.parse(data, moff())
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
670 moff(item.data_size)
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
671 return item
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
672
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
673 self.fieldAnnotationsItems = [parse_fieldAnnotationsItem()
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
674 for i in range(fieldsSize)]
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
675 self.methodAnnotationsItems = [parse_methodAnnotationsItem()
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
676 for i in range(methodsSize)]
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
677 self.parameterAnnotationsItems = [parse_parameterAnnotationsItem()
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
678 for i in range(parametersSize)]
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
679
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
680 self.data_size = moff() - off
3
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
681 pass
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
682 pass
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
683
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
684
0
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
685 class DEXFile(object):
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
686 _data = None
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
687 _header = None
1
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
688 _maps = None
0
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
689 _strings = None
1
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
690 _typeIds = None
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
691 _protoIds = None
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
692 _fieldIds = None
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
693 _methodIds = None
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
694 _classDefs = None
2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
695 _classDatas = None
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
696 _typeLists = None
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
697 _codeItems = None
3
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
698 _annotationSetItems = None
4
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
699 _annotationsDirectoryItems = None
0
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
700
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
701 def __init__(self):
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
702 pass
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
703
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
704 def open(self, filename):
1
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
705 fo = file(filename, 'r')
0
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
706 data = fo.read()
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
707
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
708 self.parse(data)
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
709 pass
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
710
1
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
711 def _parse_maps(self):
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
712 data = self._data
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
713 header = self._header
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
714 off = header.mapOff
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
715
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
716 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
717 off = off + 4
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
718
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
719 maps = []
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
720 for i in range(num):
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
721 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
722 item = _DEX_MapItem()
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
723 item.parse(item_data)
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
724 maps.append(item)
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
725 off = off + _DEX_MapItem.data_size
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
726 pass
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
727
2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
728 self._maps = maps
1
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
729 pass
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
730
3
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
731 def find_map_item(self, type_value):
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
732 maps = self._maps
7
1d776ec496e5 Migrate all to find_map_item_name()
Thinker K.F. Li <thinker@codemud.net>
parents: 6
diff changeset
733 try:
1d776ec496e5 Migrate all to find_map_item_name()
Thinker K.F. Li <thinker@codemud.net>
parents: 6
diff changeset
734 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
735 except IndexError:
1d776ec496e5 Migrate all to find_map_item_name()
Thinker K.F. Li <thinker@codemud.net>
parents: 6
diff changeset
736 return None
3
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
737
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
738 return codeItem_map
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
739
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
740 def find_map_item_name(self, type_name):
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
741 type_value = _DEX_MapItem.find_type_name(type_name)
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
742 map = self.find_map_item(type_value)
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
743 return map
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
744
1
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
745 def _parse_strings(self):
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
746 data = self._data
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
747 header = self._header
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
748 strings = []
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
749
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
750 num = header.stringIdsSize
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
751 off = header.stringIdsOff
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
752 for i in range(num):
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
753 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
754 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
755 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
756
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
757 sz, sh = _uleb128(string)
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
758 string = string[sh:]
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
759 strings.append(string)
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
760 off = off + 4
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
761 pass
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
762
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
763 self._strings = strings
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
764 pass
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
765
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
766 def _parse_typeIds(self):
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
767 data = self._data
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
768 header = self._header
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
769
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
770 num = header.typeIdsSize
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
771 off = header.typeIdsOff
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
772
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
773 def parse(item_data):
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
774 type_id = _DEX_TypeId()
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
775 type_id.parse(item_data)
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
776 return type_id
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
777
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
778 item_size = _DEX_TypeId.data_size
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
779 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
780 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
781 for item_off in item_offs]
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
782 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
783
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
784 self._typeIds = typeIds
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
785 pass
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
786
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
787 def _parse_protoIds(self):
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
788 data = self._data
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
789 header = self._header
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
790
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
791 num = header.protoIdsSize
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
792 off = header.protoIdsOff
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
793
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
794 def parse(item_data):
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
795 proto_id = _DEX_ProtoId()
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
796 proto_id.parse(item_data)
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
797 return proto_id
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
798
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
799 item_size = _DEX_ProtoId.data_size
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
800 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
801 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
802 for item_off in item_offs]
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
803 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
804
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
805 self._protoIds = protoIds
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
806 pass
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
807
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
808 def _parse_fieldIds(self):
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
809 data = self._data
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
810 header = self._header
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
811
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
812 num = header.fieldIdsSize
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
813 off = header.fieldIdsOff
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
814
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
815 def parse(item_data):
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
816 field_id = _DEX_FieldId()
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
817 field_id.parse(item_data)
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
818 return field_id
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
819
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
820 item_size = _DEX_FieldId.data_size
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
821 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
822 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
823 for item_off in item_offs]
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
824 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
825
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
826 self._fieldIds = fieldIds
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
827 pass
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
828
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
829 def _parse_methodIds(self):
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
830 data = self._data
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
831 header = self._header
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
832
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
833 num = header.methodIdsSize
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
834 off = header.methodIdsOff
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
835
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
836 def parse(item_data):
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
837 method_id = _DEX_MethodId()
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
838 method_id.parse(item_data)
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
839 return method_id
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
840
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
841 item_size = _DEX_MethodId.data_size
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
842 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
843 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
844 for item_off in item_offs]
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
845 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
846
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
847 self._methodIds = methodIds
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
848 pass
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
849
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
850 def _parse_classDefs(self):
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
851 data = self._data
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
852 header = self._header
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
853
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
854 num = header.classDefsSize
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
855 off = header.classDefsOff
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
856
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
857 def parse(item_data):
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
858 class_def = _DEX_ClassDef()
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
859 class_def.parse(item_data)
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
860 return class_def
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
861
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
862 item_size = _DEX_ClassDef.data_size
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
863 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
864 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
865 for item_off in item_offs]
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
866 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
867
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
868 self._classDefs = classDefs
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
869 pass
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
870
2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
871 def _parse_classDatas(self):
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
872 header = self._header
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
873 data = self._data
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
874
7
1d776ec496e5 Migrate all to find_map_item_name()
Thinker K.F. Li <thinker@codemud.net>
parents: 6
diff changeset
875 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
876
7
1d776ec496e5 Migrate all to find_map_item_name()
Thinker K.F. Li <thinker@codemud.net>
parents: 6
diff changeset
877 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
878
2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
879 def parse_class_data():
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
880 class_data = _DEX_ClassData()
7
1d776ec496e5 Migrate all to find_map_item_name()
Thinker K.F. Li <thinker@codemud.net>
parents: 6
diff changeset
881 class_data.parse(data, moff())
1d776ec496e5 Migrate all to find_map_item_name()
Thinker K.F. Li <thinker@codemud.net>
parents: 6
diff changeset
882 moff(class_data.data_size)
2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
883 return class_data
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
884 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
885
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
886 self._classDatas = class_datas
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
887 pass
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
888
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
889 def _parse_typeLists(self):
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
890 data = self._data
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
891
7
1d776ec496e5 Migrate all to find_map_item_name()
Thinker K.F. Li <thinker@codemud.net>
parents: 6
diff changeset
892 typeList_map = self.find_map_item_name('kDexTypeTypeList')
2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
893 num_typeLists = typeList_map.size
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
894
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
895 typeLists = _DEX_TypeLists()
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
896 typeLists.parse(num_typeLists, data, typeList_map.offset)
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
897
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
898 self._typeLists = typeLists
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
899 pass
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
900
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
901 def _parse_codeItems(self):
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
902 data = self._data
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
903
7
1d776ec496e5 Migrate all to find_map_item_name()
Thinker K.F. Li <thinker@codemud.net>
parents: 6
diff changeset
904 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
905 if codeItem_map is None:
1d776ec496e5 Migrate all to find_map_item_name()
Thinker K.F. Li <thinker@codemud.net>
parents: 6
diff changeset
906 return
2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
907 num_codeItems = codeItem_map.size
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
908
7
1d776ec496e5 Migrate all to find_map_item_name()
Thinker K.F. Li <thinker@codemud.net>
parents: 6
diff changeset
909 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
910
2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
911 def parse_code():
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
912 code = _DEX_Code()
7
1d776ec496e5 Migrate all to find_map_item_name()
Thinker K.F. Li <thinker@codemud.net>
parents: 6
diff changeset
913 code.parse(data, moff())
1d776ec496e5 Migrate all to find_map_item_name()
Thinker K.F. Li <thinker@codemud.net>
parents: 6
diff changeset
914 moff(code.data_size)
2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
915 return code
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
916
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
917 codeItems = [parse_code() for i in range(num_codeItems)]
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
918
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
919 self._codeItems = codeItems
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
920 pass
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
921
3
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
922 def _parse_annotationSetItems(self):
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
923 data = self._data
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
924
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
925 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
926 if annoset_map is None:
1d776ec496e5 Migrate all to find_map_item_name()
Thinker K.F. Li <thinker@codemud.net>
parents: 6
diff changeset
927 return
3
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
928
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
929 moff = man_off(annoset_map.offset)
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
930
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
931 def parse_annotationSetItem():
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
932 item = _DEX_AnnotationSetItem()
4
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
933 item.parse(data, moff())
3
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
934 moff(item.data_size)
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
935 return item
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
936
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
937 self._annotationSetItems = [parse_annotationSetItem()
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
938 for i in range(annoset_map.size)]
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
939 pass
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
940
4
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
941 def _parse_annotationsDirectoryItems(self):
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
942 data = self._data
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
943
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
944 annodir_map = \
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
945 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
946 if annodir_map is None:
1d776ec496e5 Migrate all to find_map_item_name()
Thinker K.F. Li <thinker@codemud.net>
parents: 6
diff changeset
947 return
4
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
948
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
949 moff = man_off(annodir_map.offset)
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
950
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
951 def parse_annotationDirItem():
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
952 item = _DEX_AnnotationsDirectoryItem()
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
953 item.parse(data, moff())
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
954 moff(item.data_size)
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
955 return item
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
956
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
957 self._annotationsDirectoryItems = [parse_annotationDirItem()
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
958 for i in range(annodir_map.size)]
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
959 pass
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
960
0
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
961 def parse(self, data):
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
962 self._data = data
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
963 header = _DEX_header()
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
964 header.parse(data)
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
965 self._header = header
1
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
966
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
967 self._parse_maps()
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
968 self._parse_strings()
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
969 self._parse_typeIds()
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
970 self._parse_protoIds()
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
971 self._parse_fieldIds()
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
972 self._parse_methodIds()
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
973 self._parse_classDefs()
2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
974 self._parse_classDatas()
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
975 self._parse_typeLists()
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
976 self._parse_codeItems()
3
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
977 self._parse_annotationSetItems()
4
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
978 self._parse_annotationsDirectoryItems()
0
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
979 pass
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
980 pass
1
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
981
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
982 if __name__ == '__main__':
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
983 dex = DEXFile()
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
984 dex.open('test.dex')
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
985
2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
986 print 'Header'
1
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
987 h = dex._header
2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
988 for attr in h.header_fields:
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
989 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
990 pass
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
991
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
992 print
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
993 print 'Define Classes'
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
994 strings = dex._strings
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
995 classDefs = dex._classDefs
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
996 typeIds = dex._typeIds
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
997 for classDef in classDefs:
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
998 typeId = typeIds[classDef.classIdx]
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
999 descriptor = strings[typeId.descriptorIdx]
2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1000 data_off = classDef.classDataOff
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1001 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
1002 pass
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1003
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1004 print
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1005 print 'Reference Classes'
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1006 for typeId in typeIds:
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1007 descriptor = strings[typeId.descriptorIdx]
2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1008 print '\t%s' % (descriptor)
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1009 pass
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1010
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1011 print
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1012 print 'Class data'
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1013 methodIds = dex._methodIds
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1014 classDatas = dex._classDatas
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1015 for classData in classDatas:
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1016 print '\tclass'
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1017 for method in classData.directMethods:
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1018 code_off = method.codeOff
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1019 methodId = methodIds[method.methodIdx]
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1020 name = strings[methodId.nameIdx]
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1021 print '\t\t%s@0x%x' % (name, code_off)
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1022 pass
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1023 for method in classData.virtualMethods:
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1024 code_off = method.codeOff
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1025 methodId = methodIds[method.methodIdx]
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1026 name = strings[methodId.nameIdx]
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1027 print '\t\t%s@0x%x' % (name, code_off)
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1028 pass
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1029 pass
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1030
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1031 print
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1032 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
1033
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1034 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
1035 print
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1036 print 'CodeItems size is %d bytes' % (bytes)
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1037
3
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
1038 bytes = sum([annoset.data_size for annoset in dex._annotationSetItems])
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
1039 print
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
1040 print 'AnnotationSetItems size is %d bytes' % (bytes)
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
1041
4
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
1042 bytes = sum([annodir.data_size
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
1043 for annodir in dex._annotationsDirectoryItems])
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
1044 print
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
1045 print 'AnnotationsDirtoryItems size is %d bytes' % (bytes)
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
1046
2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1047 print
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1048 print 'Data maps'
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1049 maps = dex._maps
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1050 for map in maps:
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1051 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
1052 map.types[map.type],
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1053 map.size,
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1054 map.offset)
1
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1055 pass
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1056 pass