annotate paraspace/dexfile.py @ 2:add64d56b0e2

Parse code items
author Thinker K.F. Li <thinker@codemud.net>
date Mon, 23 May 2011 21:11:11 +0800
parents 05346b632adb
children a78db169b0c8
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
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
54 def _to_uint(data):
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
55 v = 0
1
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
56 sh = 0
0
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
57 for c in data:
1
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
58 v = v + (ord(c) << sh)
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
59 sh = sh + 8
0
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
60 pass
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
61 return v
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
62
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
63
1
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
64 def _uleb128(data):
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
65 sh = 0
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
66 v = 0
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
67 for c in data:
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
68 cv = ord(c)
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
69 v = v + ((cv & 0x7f) << sh)
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
70 sh = sh + 7
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
71
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
72 if cv <= 0x7f:
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
73 break
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
74 pass
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
75
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
76 nbytes = sh / 7
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
77 return v, nbytes
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
78
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
79
2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
80 def _leb128(data):
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
81 v, sh = _uleb128(data)
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
82 if v & (1 << (sh * 7 - 1)):
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
83 v = -((1 << (sh * 7)) - v)
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
84 pass
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
85 return v, sh
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
86
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
87
0
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
88 class _DEX_MapItem(object):
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
89 type = None # 2 bytes
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
90 unused = None # 2 bytes
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
91 size = None # 4 bytes
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
92 offset = None # 4 bytes
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
93
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
94 data_size = 12
2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
95 types = {
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
96 0x0000: 'kDexTypeHeaderItem',
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
97 0x0001: 'kDexTypeStringIdItem',
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
98 0x0002: 'kDexTypeTypeIdItem',
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
99 0x0003: 'kDexTypeProtoIdItem',
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
100 0x0004: 'kDexTypeFieldIdItem',
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
101 0x0005: 'kDexTypeMethodIdItem',
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
102 0x0006: 'kDexTypeClassDefItem',
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
103 0x1000: 'kDexTypeMapList',
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
104 0x1001: 'kDexTypeTypeList',
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
105 0x1002: 'kDexTypeAnnotationSetRefList',
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
106 0x1003: 'kDexTypeAnnotationSetItem',
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
107 0x2000: 'kDexTypeClassDataItem',
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
108 0x2001: 'kDexTypeCodeItem',
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
109 0x2002: 'kDexTypeStringDataItem',
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
110 0x2003: 'kDexTypeDebugInfoItem',
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
111 0x2004: 'kDexTypeAnnotationItem',
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
112 0x2005: 'kDexTypeEncodedArrayItem',
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
113 0x2006: 'kDexTypeAnnotationsDirectoryItem'
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
114 }
0
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
115
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
116 def parse(self, data):
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
117 self.type = _to_uint(data[:2])
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
118 self.size = _to_uint(data[4:8])
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
119 self.offset = _to_uint(data[8:12])
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
120 pass
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
121 pass
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
122
1
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
123
0
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
124 class _DEX_TypeId(object):
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
125 descriptorIdx = None # 4 bytes
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
126
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
127 data_size = 4
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
128
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
129 def parse(self, data):
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
130 self.descriptorIdx = _to_uint(data[:4])
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
131 pass
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
132 pass
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
133
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
134
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
135 class _DEX_ProtoId(object):
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
136 shortyIdx = None # 4 bytes
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
137 returnTypeIdx = None # 4 bytes
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
138 parametersOff = None # 4 bytes
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
139
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
140 data_size = 12
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
141
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
142 def parse(self, data):
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
143 self.shortyIdx = _to_uint(data[:4])
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
144 self.returnTypeIdx = _to_uint(data[4:8])
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
145 self.parametersOff = _to_uint(data[8:12])
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
146 pass
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
147 pass
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
148
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 class _DEX_FieldId(object):
1
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
151 classIdx = None # 2 bytes
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
152 typeIdx = None # 2 bytes
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
153 nameIdx = None # 4 bytes
0
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 data_size = 8
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
156
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
157 def parse(self, data):
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
158 self.classIdx = _to_uint(data[:2])
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
159 self.typeIdx = _to_uint(data[2:4])
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
160 self.nameIdx = _to_uint(data[4:8])
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
161 pass
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
162 pass
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
163
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
164
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
165 class _DEX_MethodId(object):
1
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
166 classIdx = None # 2 bytes
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
167 protoIdx = None # 2 bytes
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
168 nameIdx = None # 4 bytes
0
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
169
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
170 data_size = 8
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
171
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
172 def parse(self, data):
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
173 self.classIdx = _to_uint(data[:2])
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
174 self.protoIdx = _to_uint(data[2:4])
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
175 self.nameIdx = _to_uint(data[4:8])
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
176 pass
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
177 pass
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
178
1
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
179
0
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
180 class _DEX_ClassDef(object):
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
181 classIdx = None # 0x00
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
182 accessFlags = None # 0x04
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
183 superclassIdx = None # 0x08
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
184 interfacesOff = None # 0x0c
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
185 sourceFileIdx = None # 0x10
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
186 annotationsOff = None # 0x14
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
187 classDataOff = None # 0x18
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
188 staticValuesOff = None # 0x1c
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
189
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
190 data_size = 0x20
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
191
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
192 def parse(self, data):
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
193 self.classIdx = _to_uint(data[:4])
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
194 self.accessFlags = _to_uint(data[4:8])
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
195 self.superclassIdx = _to_uint(data[8:0xc])
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
196 self.interfacesOff = _to_uint(data[0xc:0x10])
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
197 self.sourceFileIdx = _to_uint(data[0x10:0x14])
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
198 self.annotationsOff = _to_uint(data[0x14:0x18])
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
199 self.classDataOff = _to_uint(data[0x18:0x1c])
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
200 self.staticValuesOff = _to_uint(data[0x1c:0x20])
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
201 pass
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
202 pass
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
203
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
204
2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
205 class _DEX_ClassDataHeader(object):
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
206 staticFieldsSize = None
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
207 instanceFieldsSize = None
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
208 directMethodsSize = None
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
209 virtualMethodsSize = None
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
210
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
211 data_size = None
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
212
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
213 def parse(self, data, off):
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
214 self.staticFieldsSize, sh = _uleb128(data[off:off + 10])
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
215 sz = sh
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
216 off = off + sh
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
217 self.instanceFieldsSize, sh = _uleb128(data[off:off + 10])
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
218 sz = sz + sh
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
219 off = off + sh
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
220 self.directMethodsSize, sh = _uleb128(data[off:off + 10])
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
221 sz = sz + sh
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
222 off = off + sh
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
223 self.virtualMethodsSize, sh = _uleb128(data[off:off + 10])
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
224 sz = sz + sh
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
225
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
226 self.data_size = sz
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
227 pass
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
228 pass
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
229
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
230
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
231 class _DEX_Field(object):
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
232 fieldIdx = None
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
233 accessFlags = None
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
234
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
235 data_size = None
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
236
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
237 def parse(self, data, off):
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
238 self.fieldIdx, sh = _uleb128(data[off:off + 10])
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
239 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.accessFlags, 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
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
244 self.data_size = sz
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
245 pass
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
246 pass
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
247
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
248
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
249 class _DEX_Method(object):
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
250 methodIdx = None
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
251 accessFlags = None
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
252 codeOff = None
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
253
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
254 data_size = 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 def parse(self, data, off):
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
257 self.methodIdx, sh = _uleb128(data[off:off + 10])
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
258 sz = sh
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
259 off = off + sh
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
260
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
261 self.accessFlags, sh = _uleb128(data[off:off + 10])
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
262 sz = sz + sh
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
263 off = off + 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.codeOff, sh = _uleb128(data[off:off + 10])
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
266 sz = sz + sh
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
267
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
268 self.data_size = sz
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
269 pass
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
270 pass
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
271
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
272 class _DEX_ClassData(object):
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
273 header = None # DexClassDataHeader
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
274 staticFields = None # DexField*
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
275 instanceFields = None # DexField*
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
276 directMethods = None # DexMethod*
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
277 virtualMethods = None # DexMethod*
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
278
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
279 data_size = None
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
280
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
281 def parse(self, data, off):
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
282 header = _DEX_ClassDataHeader()
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
283 header.parse(data, off)
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
284 self.header = header
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 cur_off = [off + header.data_size]
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
287
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
288 def parse_field():
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
289 field = _DEX_Field()
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
290 off = cur_off[0]
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
291 field.parse(data, off)
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
292 cur_off[0] = cur_off[0] + field.data_size
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
293
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
294 #
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
295 # field index depends previous one to reduce size
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
296 #
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
297 field.fieldIdx = field.fieldIdx + idx[0]
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
298 idx[0] = field.fieldIdx
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 return field
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_method():
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
303 method = _DEX_Method()
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
304 off = cur_off[0]
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
305 method.parse(data, off)
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
306 cur_off[0] = cur_off[0] + method.data_size
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
307
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
308 #
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
309 # method index depends previous one to reduce size
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
310 #
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
311 method.methodIdx = method.methodIdx + idx[0]
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
312 idx[0] = method.methodIdx
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
313
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
314 return method
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 idx = [0]
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
317 self.staticFields = [parse_field()
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
318 for i in range(header.staticFieldsSize)]
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
319 idx = [0]
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
320 self.instanceFields = [parse_field()
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
321 for i in range(header.instanceFieldsSize)]
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
322 idx = [0]
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
323 self.directMethods = [parse_method()
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
324 for i in range(header.directMethodsSize)]
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
325 idx = [0]
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
326 self.virtualMethods = [parse_method()
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
327 for i in range(header.virtualMethodsSize)]
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 self.data_size = cur_off[0] - off
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
330 pass
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
331 pass
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
332
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
333
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
334 class _DEX_TypeList(object):
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
335 typeItems = None
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 data_size = None
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
338
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
339 def parse(self, data, off):
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
340 size = _to_uint(data[off:off + 4])
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
341
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
342 item_off = off + 4
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
343 typeItems = [_to_uint(data[cur_off:cur_off + 2])
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
344 for cur_off in range(item_off, item_off + size * 2, 2)]
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
345 data_size = 4 + size * 2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
346
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
347 self.typeItems = typeItems
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
348 self.data_size = data_size
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
349 pass
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
350 pass
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
351
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
352
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
353 class _DEX_TypeLists(object):
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
354 typeLists = None
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
355
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
356 data_size = None
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
357
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
358 def parse(self, num, data, off):
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
359 def parse():
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
360 off = (cur_off[0] + 3) & ~0x3
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
361 typeList = _DEX_TypeList()
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
362 typeList.parse(data, off)
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
363 cur_off[0] = off + typeList.data_size
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
364
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
365 return typeList
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
366
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
367 cur_off = [off]
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
368 typeLists = [parse() for i in range(num)]
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
369
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
370 self.typeLists = typeLists
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
371 self.data_size = cur_off[0] - off
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
372 pass
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
373 pass
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
374
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
375
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
376 class _DEX_Try(object):
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
377 startAddr = None # 4 bytes
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
378 insnCount = None # 2 bytes
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
379 handlerOff = None # 2 bytes
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
380
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
381 data_size = 8
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
382
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
383 def parse(self, data, off):
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
384 cur_off = off
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
385 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
386 cur_off = cur_off + 4
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
387 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
388 cur_off = cur_off + 2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
389 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
390 pass
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
391 pass
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
392
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 class _DEX_CatchHandler(object):
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
395 typeIdx = None
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
396 address = None
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
397
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
398 data_size = None
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
399
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
400 def parse(self, data, off):
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
401 cur_off = off
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
402 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
403 cur_off = cur_off + sh
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
404 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
405 cur_off = cur_off + sh
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
406
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
407 self.data_size = cur_off - off
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
408 pass
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
409
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
410 def parse1(self, data, off):
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
411 self.address, sh = _uleb128(data[off:off + 5])
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 self.data_size = sh
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
414 pass
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
415 pass
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
416
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
417
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
418 class _DEX_Catch(object):
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
419 catchesAll = None
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
420 handlers = None
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
421
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
422 data_size = None
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
423
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
424 def parse(self, data, off):
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
425 def move_off(sz):
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
426 off = move_off.off
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
427 move_off.off = off + sz
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
428 return off
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
429 move_off.off = off
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
430 moff = move_off
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 count, sh = _leb128(data[moff.off:moff.off + 5])
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
433 moff(sh)
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
434
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
435 if count > 0:
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
436 self.catchesAll = False
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
437 else:
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
438 self.catchesAll = True
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
439 count = -count
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
440 pass
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
441
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
442 def parse_handler():
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
443 handler = _DEX_CatchHandler()
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
444 handler.parse(data, moff.off)
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
445 moff(handler.data_size)
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
446 return handler
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 self.handlers = [parse_handler() for i in range(count)]
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
449
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
450 if self.catchesAll:
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
451 #
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
452 # Additional handler for catching all
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
453 #
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
454 handler = _DEX_CatchHandler()
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
455 handler.parse1(data, moff.off)
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
456 moff(handler.data_size)
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
457 self.handlers.append(handler)
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
458 pass
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
459
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
460 self.data_size = moff.off - off
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
461 pass
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
462 pass
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
463
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
464
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
465 class _DEX_Code(object):
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
466 registersSize = None # 2 bytes
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
467 insSize = None # 2 bytes
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
468 outsSize = None # 2 bytes
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
469 triesSize = None # 2 bytes
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
470 debugInfoOff = None # 4 bytes
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
471 insnsSize = None # 4 bytes
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
472 insns = None
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
473 try_items = None
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
474 catch_handler_items = None
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
475
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
476 data_size = None
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
477
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
478 def parse(self, data, off):
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
479 def move_off(sz):
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
480 off = move_off.off
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
481 move_off.off = off + sz
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
482 return off
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
483 move_off.off = off
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
484 moff = move_off
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
485
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
486 self.registersSize = _to_uint(data[moff.off:moff.off + 2])
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
487 moff(2)
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
488 self.insSize = _to_uint(data[moff.off:moff.off + 2])
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
489 moff(2)
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
490 self.outsSize = _to_uint(data[moff.off:moff.off + 2])
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
491 moff(2)
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
492 self.triesSize = _to_uint(data[moff.off:moff.off + 2])
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
493 moff(2)
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
494 self.debugInfoOff = _to_uint(data[moff.off:moff.off + 4])
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
495 moff(4)
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
496 self.insnsSize = _to_uint(data[moff.off:moff.off + 4])
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
497 moff(4)
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
498
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
499 moff(self.insnsSize * 2) # skip insns
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
500
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
501 if self.triesSize > 0:
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
502 def parse_try_item():
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
503 try_item = _DEX_Try()
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
504 try_item.parse(data, moff.off)
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
505 moff(try_item.data_size)
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
506 return try_item
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
507
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
508 moff.off = (moff.off + 3) & ~0x3
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
509 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
510
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
511 def parse_catch_handler():
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
512 catch = _DEX_Catch()
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
513 catch.parse(data, moff.off)
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
514 moff(catch.data_size)
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
515 return catch
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
516
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
517 #
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
518 # No tries, no catch handlers
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
519 #
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
520 handlersSize, sh = _uleb128(data[moff.off:moff.off + 5])
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
521 moff(sh)
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
522 self.catch_handler_items = [parse_catch_handler()
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
523 for i in range(handlersSize)]
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
524 pass
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
525
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
526 moff.off = (moff.off + 3) & ~0x3
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
527 self.data_size = moff.off - off
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
528 pass
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
529 pass
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
530
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
531
0
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
532 class DEXFile(object):
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
533 _data = None
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
534 _header = None
1
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
535 _maps = None
0
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
536 _strings = None
1
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
537 _typeIds = None
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
538 _protoIds = None
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
539 _fieldIds = None
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
540 _methodIds = None
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
541 _classDefs = None
2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
542 _classDatas = None
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
543 _typeLists = None
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
544 _codeItems = None
0
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
545
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
546 def __init__(self):
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
547 pass
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
548
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
549 def open(self, filename):
1
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
550 fo = file(filename, 'r')
0
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
551 data = fo.read()
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
552
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
553 self.parse(data)
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
554 pass
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
555
1
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
556 def _parse_maps(self):
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
557 data = self._data
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
558 header = self._header
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
559 off = header.mapOff
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
560
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
561 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
562 off = off + 4
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
563
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
564 maps = []
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
565 for i in range(num):
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
566 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
567 item = _DEX_MapItem()
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
568 item.parse(item_data)
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
569 maps.append(item)
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
570 off = off + _DEX_MapItem.data_size
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
571 pass
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
572
2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
573 self._maps = maps
1
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
574 pass
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
575
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
576 def _parse_strings(self):
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
577 data = self._data
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
578 header = self._header
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
579 strings = []
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
580
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
581 num = header.stringIdsSize
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
582 off = header.stringIdsOff
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
583 for i in range(num):
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
584 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
585 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
586 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
587
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
588 sz, sh = _uleb128(string)
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
589 string = string[sh:]
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
590 strings.append(string)
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
591 off = off + 4
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
592 pass
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
593
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
594 self._strings = strings
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
595 pass
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
596
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
597 def _parse_typeIds(self):
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
598 data = self._data
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
599 header = self._header
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
600
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
601 num = header.typeIdsSize
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
602 off = header.typeIdsOff
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
603
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
604 def parse(item_data):
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
605 type_id = _DEX_TypeId()
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
606 type_id.parse(item_data)
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
607 return type_id
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
608
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
609 item_size = _DEX_TypeId.data_size
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
610 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
611 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
612 for item_off in item_offs]
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
613 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
614
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
615 self._typeIds = typeIds
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
616 pass
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
617
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
618 def _parse_protoIds(self):
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
619 data = self._data
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
620 header = self._header
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
621
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
622 num = header.protoIdsSize
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
623 off = header.protoIdsOff
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
624
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
625 def parse(item_data):
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
626 proto_id = _DEX_ProtoId()
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
627 proto_id.parse(item_data)
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
628 return proto_id
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
629
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
630 item_size = _DEX_ProtoId.data_size
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
631 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
632 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
633 for item_off in item_offs]
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
634 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
635
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
636 self._protoIds = protoIds
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
637 pass
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
638
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
639 def _parse_fieldIds(self):
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
640 data = self._data
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
641 header = self._header
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
642
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
643 num = header.fieldIdsSize
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
644 off = header.fieldIdsOff
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
645
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
646 def parse(item_data):
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
647 field_id = _DEX_FieldId()
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
648 field_id.parse(item_data)
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
649 return field_id
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
650
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
651 item_size = _DEX_FieldId.data_size
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
652 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
653 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
654 for item_off in item_offs]
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
655 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
656
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
657 self._fieldIds = fieldIds
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
658 pass
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
659
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
660 def _parse_methodIds(self):
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
661 data = self._data
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
662 header = self._header
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
663
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
664 num = header.methodIdsSize
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
665 off = header.methodIdsOff
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
666
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
667 def parse(item_data):
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
668 method_id = _DEX_MethodId()
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
669 method_id.parse(item_data)
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
670 return method_id
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
671
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
672 item_size = _DEX_MethodId.data_size
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
673 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
674 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
675 for item_off in item_offs]
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
676 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
677
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
678 self._methodIds = methodIds
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
679 pass
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
680
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
681 def _parse_classDefs(self):
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
682 data = self._data
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
683 header = self._header
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
684
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
685 num = header.classDefsSize
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
686 off = header.classDefsOff
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
687
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
688 def parse(item_data):
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
689 class_def = _DEX_ClassDef()
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
690 class_def.parse(item_data)
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
691 return class_def
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
692
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
693 item_size = _DEX_ClassDef.data_size
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
694 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
695 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
696 for item_off in item_offs]
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
697 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
698
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
699 self._classDefs = classDefs
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
700 pass
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
701
2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
702 def _parse_classDatas(self):
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
703 header = self._header
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
704 data = self._data
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
705 maps = self._maps
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
706
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
707 kDexTypeClassDataItem = [type
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
708 for type, name in _DEX_MapItem.types.items()
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
709 if name == 'kDexTypeClassDataItem'][0]
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
710 class_data_map = [map
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
711 for map in maps
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
712 if map.type == kDexTypeClassDataItem][0]
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
713
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
714 off = [class_data_map.offset]
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
715 def parse_class_data():
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
716 class_data = _DEX_ClassData()
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
717 class_data.parse(data, off[0])
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
718 off[0] = off[0] + class_data.data_size
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
719 return class_data
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
720 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
721
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
722 self._classDatas = class_datas
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
723 pass
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
724
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
725 def _parse_typeLists(self):
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
726 maps = self._maps
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
727 data = self._data
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
728
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
729 kDexTypeTypeList = [type
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
730 for type, name in _DEX_MapItem.types.items()
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
731 if name == 'kDexTypeTypeList'][0]
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
732 typeList_map = [map for map in maps if map.type == kDexTypeTypeList][0]
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
733 num_typeLists = typeList_map.size
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
734
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
735 typeLists = _DEX_TypeLists()
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
736 typeLists.parse(num_typeLists, data, typeList_map.offset)
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
737
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
738 self._typeLists = typeLists
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
739 pass
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
740
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
741 def _parse_codeItems(self):
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
742 maps = self._maps
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
743 data = self._data
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
744
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
745 kDexTypeCodeItem = [type
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
746 for type, name in _DEX_MapItem.types.items()
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
747 if name == 'kDexTypeCodeItem'][0]
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
748 codeItem_map = [map for map in maps if map.type == kDexTypeCodeItem][0]
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
749 num_codeItems = codeItem_map.size
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
750
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
751 cur_off = [codeItem_map.offset]
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
752 def parse_code():
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
753 off = cur_off[0]
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
754 code = _DEX_Code()
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
755 code.parse(data, off)
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
756 cur_off[0] = off + code.data_size
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
757 return code
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
758
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
759 codeItems = [parse_code() for i in range(num_codeItems)]
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
760
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
761 self._codeItems = codeItems
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
762 pass
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
763
0
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
764 def parse(self, data):
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
765 self._data = data
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
766 header = _DEX_header()
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
767 header.parse(data)
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
768 self._header = header
1
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 self._parse_maps()
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
771 self._parse_strings()
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
772 self._parse_typeIds()
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
773 self._parse_protoIds()
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
774 self._parse_fieldIds()
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
775 self._parse_methodIds()
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
776 self._parse_classDefs()
2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
777 self._parse_classDatas()
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
778 self._parse_typeLists()
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
779 self._parse_codeItems()
0
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
780 pass
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
781 pass
1
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
782
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
783 if __name__ == '__main__':
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
784 dex = DEXFile()
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
785 dex.open('test.dex')
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
786
2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
787 print 'Header'
1
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
788 h = dex._header
2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
789 for attr in h.header_fields:
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
790 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
791 pass
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
792
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
793 print
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
794 print 'Define Classes'
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
795 strings = dex._strings
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
796 classDefs = dex._classDefs
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
797 typeIds = dex._typeIds
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
798 for classDef in classDefs:
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
799 typeId = typeIds[classDef.classIdx]
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
800 descriptor = strings[typeId.descriptorIdx]
2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
801 data_off = classDef.classDataOff
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
802 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
803 pass
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 print
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
806 print 'Reference Classes'
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
807 for typeId in typeIds:
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
808 descriptor = strings[typeId.descriptorIdx]
2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
809 print '\t%s' % (descriptor)
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
810 pass
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
811
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
812 print
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
813 print 'Class data'
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
814 methodIds = dex._methodIds
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
815 classDatas = dex._classDatas
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
816 for classData in classDatas:
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
817 print '\tclass'
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
818 for method in classData.directMethods:
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
819 code_off = method.codeOff
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
820 methodId = methodIds[method.methodIdx]
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
821 name = strings[methodId.nameIdx]
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
822 print '\t\t%s@0x%x' % (name, code_off)
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
823 pass
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
824 for method in classData.virtualMethods:
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
825 code_off = method.codeOff
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
826 methodId = methodIds[method.methodIdx]
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
827 name = strings[methodId.nameIdx]
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
828 print '\t\t%s@0x%x' % (name, code_off)
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
829 pass
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
830 pass
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
831
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
832 print
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
833 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
834
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
835 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
836 print
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
837 print 'CodeItems size is %d bytes' % (bytes)
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
838
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
839 print
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
840 print 'Data maps'
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
841 maps = dex._maps
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
842 for map in maps:
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
843 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
844 map.types[map.type],
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
845 map.size,
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
846 map.offset)
1
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
847 pass
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
848 pass