comparison paraspace/dexfile.py @ 13:c05fac334ab1

compute size for objects
author Thinker K.F. Li <thinker@codemud.net>
date Wed, 25 May 2011 21:47:15 +0800
parents 8101024c942b
children f5728c6868b2
comparison
equal deleted inserted replaced
12:8101024c942b 13:c05fac334ab1
1 import itertools
2
1 class _DEX_header(object): 3 class _DEX_header(object):
2 magic = None # 0x00, 8 bytes 4 magic = None # 0x00, 8 bytes
3 checksum = None # 0x08, 4 bytes 5 checksum = None # 0x08, 4 bytes
4 signature = None # 0x0c, 20 bytes 6 signature = None # 0x0c, 20 bytes
5 fileSize = None # 0x20, 4 bytes 7 fileSize = None # 0x20, 4 bytes
28 'linkSize linkOff mapOff stringIdsSize stringIdsOff typeIdsSize ' \ 30 'linkSize linkOff mapOff stringIdsSize stringIdsOff typeIdsSize ' \
29 'typeIdsOff protoIdsSize protoIdsOff fieldIdsSize fieldIdsOff ' \ 31 'typeIdsOff protoIdsSize protoIdsOff fieldIdsSize fieldIdsOff ' \
30 'methodIdsSize methodIdsOff classDefsSize classDefsOff ' \ 32 'methodIdsSize methodIdsOff classDefsSize classDefsOff ' \
31 'dataSize dataOff'.split() 33 'dataSize dataOff'.split()
32 34
35 data_size = 0x70
36
33 def parse(self, data): 37 def parse(self, data):
34 self.magic = data[:8] 38 self.magic = data[:8]
35 self.checksum = data[8: 0x0c] 39 self.checksum = data[8: 0x0c]
36 self.signature = data[0x0c: 0x20] 40 self.signature = data[0x0c: 0x20]
37 41
109 113
110 nbytes = sh / 7 114 nbytes = sh / 7
111 return v, nbytes 115 return v, nbytes
112 116
113 117
118 def _to_uleb128(v):
119 assert v >= 0
120
121 data = ''
122 while True:
123 if v > 0x7f:
124 data = data + chr((v & 0x7f) | 0x80)
125 else:
126 data = data + chr(v & 0x7f)
127 break
128 v = v >> 7
129 pass
130
131 return data
132
133
134 def _uleb128_sz(v):
135 return len(_to_uleb128(v))
136
137
114 def _leb128(data): 138 def _leb128(data):
115 v, sh = _uleb128(data) 139 v, sh = _uleb128(data)
116 if v & (1 << (sh * 7 - 1)): 140 if v & (1 << (sh * 7 - 1)):
117 v = -((1 << (sh * 7)) - v) 141 v = -((1 << (sh * 7)) - v)
118 pass 142 pass
119 return v, sh 143 return v, sh
144
145
146 def _to_leb128(v):
147 data = ''
148 while True:
149 if v > 0x3f or v < ~0x3f:
150 data = data + chr((v & 0x7f) | 0x80)
151 else:
152 data = data + chr(v & 0x7f)
153 break
154 v = v >> 7
155 pass
156 return data
157
158
159 def _leb128_sz(v):
160 return len(_to_leb128(v))
161
162
163 def _compute_sz(o):
164 if hasattr(o, 'compute_size'):
165 o.compute_size()
166 pass
167 return o.data_size
168
169
170 def _sum_data_size(obj_list):
171 obj_sizes = itertools.imap(_compute_sz, obj_list)
172 total = sum(obj_sizes)
173 return total
120 174
121 175
122 class _DEX_MapItem(object): 176 class _DEX_MapItem(object):
123 type = None # 2 bytes 177 type = None # 2 bytes
124 unused = None # 2 bytes 178 unused = None # 2 bytes
264 self.virtualMethodsSize, sh = _uleb128(data[off:off + 10]) 318 self.virtualMethodsSize, sh = _uleb128(data[off:off + 10])
265 sz = sz + sh 319 sz = sz + sh
266 320
267 self.data_size = sz 321 self.data_size = sz
268 pass 322 pass
323
324 def compute_size(self):
325 self.data_size = \
326 _uleb128_sz(self.staticFieldsSize) + \
327 _uleb128_sz(self.instanceFieldsSize) + \
328 _uleb128_sz(self.directMethodsSize) + \
329 _uleb128_sz(self.virtualMethodsSize)
330 pass
269 pass 331 pass
270 332
271 333
272 class _DEX_Field(object): 334 class _DEX_Field(object):
273 fieldIdx = None 335 fieldIdx = None
282 self.accessFlags, sh = _uleb128(data[off:off + 10]) 344 self.accessFlags, sh = _uleb128(data[off:off + 10])
283 sz = sz + sh 345 sz = sz + sh
284 346
285 self.data_size = sz 347 self.data_size = sz
286 pass 348 pass
349
350 def compute_size(self):
351 self.data_size = \
352 _uleb128_sz(self.fieldIdx) + \
353 _uleb128_sz(self.accessFlags)
354 pass
287 pass 355 pass
288 356
289 357
290 class _DEX_Method(object): 358 class _DEX_Method(object):
291 methodIdx = None 359 methodIdx = None
305 373
306 self.codeOff, sh = _uleb128(data[off:off + 10]) 374 self.codeOff, sh = _uleb128(data[off:off + 10])
307 sz = sz + sh 375 sz = sz + sh
308 376
309 self.data_size = sz 377 self.data_size = sz
378 pass
379
380 def compute_size(self):
381 self.data_size = \
382 _uleb128_sz(self.methodIdx) + \
383 _uleb128_sz(self.accessFlags) + \
384 _uleb128_sz(self.codeOff)
310 pass 385 pass
311 pass 386 pass
312 387
313 class _DEX_ClassData(object): 388 class _DEX_ClassData(object):
314 header = None # DexClassDataHeader 389 header = None # DexClassDataHeader
318 virtualMethods = None # DexMethod* 393 virtualMethods = None # DexMethod*
319 394
320 data_size = None 395 data_size = None
321 396
322 def parse(self, data, off): 397 def parse(self, data, off):
398 moff = man_off(off)
399
323 header = _DEX_ClassDataHeader() 400 header = _DEX_ClassDataHeader()
324 header.parse(data, off) 401 header.parse(data, moff())
325 self.header = header 402 self.header = header
326 403 moff(header.data_size)
327 cur_off = [off + header.data_size]
328 404
329 def parse_field(): 405 def parse_field():
330 field = _DEX_Field() 406 field = _DEX_Field()
331 off = cur_off[0] 407 field.parse(data, moff())
332 field.parse(data, off) 408 moff(field.data_size)
333 cur_off[0] = cur_off[0] + field.data_size
334 409
335 # 410 #
336 # field index depends previous one to reduce size 411 # field index depends previous one to reduce size
337 # 412 #
338 field.fieldIdx = field.fieldIdx + idx[0] 413 field.fieldIdx = field.fieldIdx + idx[0]
340 415
341 return field 416 return field
342 417
343 def parse_method(): 418 def parse_method():
344 method = _DEX_Method() 419 method = _DEX_Method()
345 off = cur_off[0] 420 method.parse(data, moff())
346 method.parse(data, off) 421 moff(method.data_size)
347 cur_off[0] = cur_off[0] + method.data_size
348 422
349 # 423 #
350 # method index depends previous one to reduce size 424 # method index depends previous one to reduce size
351 # 425 #
352 method.methodIdx = method.methodIdx + idx[0] 426 method.methodIdx = method.methodIdx + idx[0]
365 for i in range(header.directMethodsSize)] 439 for i in range(header.directMethodsSize)]
366 idx = [0] 440 idx = [0]
367 self.virtualMethods = [parse_method() 441 self.virtualMethods = [parse_method()
368 for i in range(header.virtualMethodsSize)] 442 for i in range(header.virtualMethodsSize)]
369 443
370 self.data_size = cur_off[0] - off 444 self.data_size = moff() - off
445 pass
446
447 def compute_size(self):
448 sz = self.header.data_size
449 sz = sz + _sum_data_size(itertools.chain(self.staticFields,
450 self.instanceFields,
451 self.directMethods,
452 self.virtualMethods))
453
454 self.data_size = sz
371 pass 455 pass
372 pass 456 pass
373 457
374 458
375 class _DEX_TypeItem(object): 459 class _DEX_TypeItem(object):
403 for i in range(size)] 487 for i in range(size)]
404 488
405 self.typeItems = typeItems 489 self.typeItems = typeItems
406 self.data_size = moff() - off 490 self.data_size = moff() - off
407 pass 491 pass
492
493 def compute_size(self):
494 size = 4 + _sum_data_size(self.typeItems)
495
496 self.data_size = size
497 pass
408 pass 498 pass
409 499
410 500
411 class _DEX_TypeLists(object): 501 class _DEX_TypeLists(object):
412 typeLists = None 502 typeLists = None
413 503
414 data_size = None 504 data_size = None
415 505
416 def parse(self, num, data, off): 506 def parse(self, num, data, off):
507 moff = man_off(off)
508
417 def parse(): 509 def parse():
418 off = (cur_off[0] + 3) & ~0x3 # type list must aligned for 4 bytes 510 moff.off = (moff(0) + 3) & ~0x3 # aligned for 4 bytes
419 typeList = _DEX_TypeList() 511 typeList = _DEX_TypeList()
420 typeList.parse(data, off) 512 typeList.parse(data, moff())
421 cur_off[0] = off + typeList.data_size 513 moff(typeList.data_size)
422 514
423 return typeList 515 return typeList
424 516
425 cur_off = [off]
426 typeLists = [parse() for i in range(num)] 517 typeLists = [parse() for i in range(num)]
427 518
428 self.typeLists = typeLists 519 self.typeLists = typeLists
429 self.data_size = cur_off[0] - off 520 self.data_size = moff(0) - off
521 pass
522
523 def compute_size(self):
524 def compute_align(prev, cur):
525 v = ((prev + 3) & ~0x3) + cur
526 return v
527
528 sizes = itertools.imap(_compute_sz, self.typeLists)
529 size = reduce(compute_align, sizes)
530
531 self.data_size = size
430 pass 532 pass
431 pass 533 pass
432 534
433 535
434 class _DEX_Try(object): 536 class _DEX_Try(object):
454 address = None 556 address = None
455 557
456 data_size = None 558 data_size = None
457 559
458 def parse(self, data, off): 560 def parse(self, data, off):
459 cur_off = off 561 moff = man_off(off)
460 self.typeIdx, sh = _uleb128(data[cur_off:cur_off + 5]) 562 self.typeIdx, sh = _uleb128(data[moff():moff() + 5])
461 cur_off = cur_off + sh 563 moff(sh)
462 self.address, sh = _uleb128(data[cur_off:cur_off + 5]) 564 self.address, sh = _uleb128(data[moff():moff() + 5])
463 cur_off = cur_off + sh 565 moff(sh)
464 566
465 self.data_size = cur_off - off 567 self.data_size = moff() - off
466 pass 568 pass
467 569
468 def parse1(self, data, off): 570 def parse1(self, data, off):
469 self.address, sh = _uleb128(data[off:off + 5]) 571 self.address, sh = _uleb128(data[off:off + 5])
470 572
471 self.data_size = sh 573 self.data_size = sh
574 pass
575
576 def compute_size(self):
577 if self.typeIdx is not None:
578 size = _uleb128_sz(self.typeIdx)
579 else:
580 size = 0
581 pass
582 size = size + _uleb128_sz(self.address)
583
584 self.data_size = size
472 pass 585 pass
473 pass 586 pass
474 587
475 588
476 class _DEX_Catch(object): 589 class _DEX_Catch(object):
509 moff(handler.data_size) 622 moff(handler.data_size)
510 self.handlers.append(handler) 623 self.handlers.append(handler)
511 pass 624 pass
512 625
513 self.data_size = moff() - off 626 self.data_size = moff() - off
627 pass
628
629 def compute_size(self):
630 count = len(self.handlers)
631 if self.catchesAll:
632 count = -(count - 1)
633 pass
634 count_sz = _leb128_sz(count)
635
636 handlers_size = _sum_data_size(self.handlers)
637
638 size = count_sz + handlers_size
514 pass 639 pass
515 pass 640 pass
516 641
517 642
518 class _DEX_Code(object): 643 class _DEX_Code(object):
566 pass 691 pass
567 692
568 moff.off = (moff() + 3) & ~0x3 # round code item to 4 bytes 693 moff.off = (moff() + 3) & ~0x3 # round code item to 4 bytes
569 self.data_size = moff() - off 694 self.data_size = moff() - off
570 pass 695 pass
696
697 def compute_size(self):
698 size = 16 + self.insnsSize * 2
699
700 if self.triesSize > 0:
701 size = (size + 0x3) & ~0x3
702
703 try_items_size = _sum_data_size(self.try_items)
704
705 catch_handler_items = self.catch_handler_items
706 catch_handler_items_cnt = len(catch_handler_items)
707 catch_handler_items_cnt_sz = _uleb128_sz(catch_handler_items_cnt)
708 catch_handler_items_sz = _sum_data_size(catch_handler_items)
709 catch_handler_items_size = \
710 catch_handler_items_cnt_sz + \
711 catch_handler_items_sz
712
713 size = size + try_items_size + catch_handler_items_size
714 pass
715
716 self.data_size = (size + 3) & ~0x3
717 pass
571 pass 718 pass
572 719
573 720
574 ## \brief File offset to Annotation item. 721 ## \brief File offset to Annotation item.
575 # 722 #
606 self.annotations = [parse_annotation_ref() 753 self.annotations = [parse_annotation_ref()
607 for i in range(size)] 754 for i in range(size)]
608 755
609 self.data_size = moff() - off 756 self.data_size = moff() - off
610 pass 757 pass
758
759 def compute_size(self):
760 annotations_size = _sum_data_size(self.annotations)
761 size = 4 + annotations_size
762
763 self.data_size = size
764 pass
611 pass 765 pass
612 766
613 767
614 class _DEX_FieldAnnotationsItem(object): 768 class _DEX_FieldAnnotationsItem(object):
615 fieldIdx = None # 4 bytes 769 fieldIdx = None # 4 bytes
696 for i in range(methodsSize)] 850 for i in range(methodsSize)]
697 self.parameterAnnotationsItems = [parse_parameterAnnotationsItem() 851 self.parameterAnnotationsItems = [parse_parameterAnnotationsItem()
698 for i in range(parametersSize)] 852 for i in range(parametersSize)]
699 853
700 self.data_size = moff() - off 854 self.data_size = moff() - off
855 pass
856
857 def compute_size(self):
858 field_anno_sz = _sum_data_size(self.fieldAnnotationsItems)
859 method_anno_sz = _sum_data_size(self.methodAnnotationsItems)
860 parameter_anno_sz = _sum_data_size(self.parameterAnnotationsItems)
861
862 all_items_size = field_anno_sz + method_anno_sz + parameter_anno_sz
863 size = 16 + all_items_size
864
865 self.data_size = size
701 pass 866 pass
702 pass 867 pass
703 868
704 869
705 ## 870 ##
829 raise ValueError, \ 994 raise ValueError, \
830 'Bad annotation element value byte 0x02x' % (valueType) 995 'Bad annotation element value byte 0x02x' % (valueType)
831 996
832 self.data_size = moff() - off 997 self.data_size = moff() - off
833 pass 998 pass
999
1000 def compute_size(self):
1001 if self.nameIdx is not None:
1002 nameIdx_size = _uleb128_sz(self.nameIdx)
1003 else:
1004 nameIdx_size = 0
1005 pass
1006
1007 valueType = self.valueType
1008 width = valueType >> self.kDexAnnotationValueArgShift
1009
1010 vtype = valueType & self.kDexAnnotationValueTypeMask
1011
1012 if vtype in (self.kDexAnnotationByte,
1013 self.kDexAnnotationShort,
1014 self.kDexAnnotationChar,
1015 self.kDexAnnotationInt,
1016 self.kDexAnnotationLong,
1017 self.kDexAnnotationFloat,
1018 self.kDexAnnotationDouble,
1019 self.kDexAnnotationString,
1020 self.kDexAnnotationType,
1021 self.kDexAnnotationMethod,
1022 self.kDexAnnotationField,
1023 self.kDexAnnotationEnum):
1024 value_size = width + 2
1025 pass
1026 elif vtype in (self.kDexAnnotationBoolean,
1027 self.kDexAnnotationNull):
1028 value_size = 1
1029 pass
1030 elif vtype == self.kDexAnnotationArray:
1031 array_cnt = len(self.value)
1032 array_cnt_size = _uleb128_sz(array_cnt)
1033 array_size = _sum_data_size(self.value)
1034 value_size = 1 + array_cnt_size + array_size
1035 pass
1036 elif vtype == self.kDexAnnotationAnnotation:
1037 value_size = 1 + _compute_sz(self.value)
1038 pass
1039 else:
1040 raise ValueError, \
1041 'Bad annotation element value byte 0x02x' % (valueType)
1042
1043 self.data_size = nameIdx_size + value_size
1044 pass
834 pass 1045 pass
835 1046
836 1047
837 ## \brief Annotation item 1048 ## \brief Annotation item
838 # 1049 #
874 self.members = [parse_AnnotationMemmber() 1085 self.members = [parse_AnnotationMemmber()
875 for i in range(size)] 1086 for i in range(size)]
876 1087
877 self.data_size = moff() - off 1088 self.data_size = moff() - off
878 pass 1089 pass
1090
1091 def compute_size(self):
1092 if self.visibility is not None:
1093 visibility_size = 1
1094 else:
1095 visibility_size = 0
1096 pass
1097
1098 typeIdx_size = _uleb128_sz(self.typeIdx)
1099
1100 members_cnt_size = _uleb128_sz(len(self.members))
1101 members_size = members_cnt_size + _sum_data_size(self.members)
1102
1103 size = visibility_size + typeIdx_size + members_size
1104
1105 self.data_size = size
1106 pass
879 pass 1107 pass
880 1108
881 1109
882 class _DEX_EncodedArrayItem(object): 1110 class _DEX_EncodedArrayItem(object):
883 elements = None 1111 elements = None
898 1126
899 self.elements = [parse_element() 1127 self.elements = [parse_element()
900 for i in range(size)] 1128 for i in range(size)]
901 1129
902 self.data_size = moff() - off 1130 self.data_size = moff() - off
1131 pass
1132
1133 def compute_size(self):
1134 elements_cnt_size = _uleb128_sz(len(self.elements))
1135 size = elements_cnt_size + _sum_data_size(self.elements)
1136
1137 self.data_size = size
903 pass 1138 pass
904 pass 1139 pass
905 1140
906 1141
907 class _DEX_DebugInfoItem(object): 1142 class _DEX_DebugInfoItem(object):
958 adv, sh = _uleb128(data[moff():moff() + 5]) 1193 adv, sh = _uleb128(data[moff():moff() + 5])
959 moff(sh) 1194 moff(sh)
960 opcodes.append((opcode, adv)) 1195 opcodes.append((opcode, adv))
961 pass 1196 pass
962 elif opcode == self.DBG_ADVANCE_LINE: 1197 elif opcode == self.DBG_ADVANCE_LINE:
963 adv, sh = _uleb128(data[moff():moff() + 5]) 1198 adv, sh = _leb128(data[moff():moff() + 5])
964 moff(sh) 1199 moff(sh)
965 opcodes.append((opcode, adv)) 1200 opcodes.append((opcode, adv))
966 pass 1201 pass
967 elif opcode in (self.DBG_START_LOCAL, 1202 elif opcode in (self.DBG_START_LOCAL,
968 self.DBG_START_LOCAL_EXTENDED): 1203 self.DBG_START_LOCAL_EXTENDED):
1001 pass 1236 pass
1002 self.opcodes = opcodes 1237 self.opcodes = opcodes
1003 1238
1004 self.data_size = moff() - off 1239 self.data_size = moff() - off
1005 pass 1240 pass
1241
1242 def compute_size(self):
1243 start_line_size = _uleb128_sz(self.start_line)
1244
1245 parameters_cnt_size = _uleb128_sz(len(self.parameters))
1246 parameter_sizes = itertools.imap(_uleb128_sz, self.parameters)
1247 parameters_size = parameters_cnt_size + sum(parameter_sizes)
1248
1249 def compute_opcode_size(code):
1250 opcode = code[0]
1251
1252 if opcode == self.DBG_END_SEQUENCE:
1253 size = 1
1254 elif opcode == self.DBG_ADVANCE_PC:
1255 size = 1 + _uleb128_sz(code[1])
1256 elif opcode == self.DBG_ADVANCE_LINE:
1257 size = 1 + _leb128_sz(code[1])
1258 elif opcode in (self.DBG_START_LOCAL,
1259 self.DBG_START_LOCAL_EXTENDED):
1260 size = 1 + _uleb128_sz(code[1]) + _uleb128_sz(code[2]) + \
1261 _uleb128_sz(code[3])
1262 if len(code) == 5:
1263 size = size + _uleb128_sz(code[4])
1264 pass
1265 pass
1266 elif opcode == self.DBG_END_LOCAL:
1267 size = 1 + _uleb128_sz(code[1])
1268 elif opcode == self.DBG_RESTART_LOCAL:
1269 size = 1 + _uleb128_sz(code[1])
1270 elif opcode in (self.DBG_SET_PROLOGUE_END,
1271 self.DBG_SET_EPILOGUE_BEGIN,
1272 self.DBG_SET_FILE):
1273 size = 1
1274 else:
1275 size = 1
1276 pass
1277
1278 return size
1279
1280 opcode_sizes = itertools.imap(compute_opcode_size, self.opcodes)
1281 opcode_sizes = [i for i in opcode_sizes]
1282 opcodes_size = sum(opcode_sizes)
1283
1284 size = start_line_size + parameters_size + opcodes_size
1285
1286 self.data_size = size
1287 pass
1006 pass 1288 pass
1007 1289
1008 1290
1009 class DEXFile(object): 1291 class DEXFile(object):
1010 _data = None 1292 _data = None
1416 print '\t\t%s@0x%x' % (name, code_off) 1698 print '\t\t%s@0x%x' % (name, code_off)
1417 pass 1699 pass
1418 pass 1700 pass
1419 1701
1420 print 1702 print
1421 print 'TypeLists size is %d bytes' % (dex._typeLists.data_size) 1703 print 'TypeLists size is %d/%d bytes' % (dex._typeLists.data_size,
1704 _compute_sz(dex._typeLists))
1422 1705
1423 bytes = sum([code.data_size for code in dex._codeItems]) 1706 bytes = sum([code.data_size for code in dex._codeItems])
1707 rbytes = sum([_compute_sz(code) for code in dex._codeItems])
1424 print 1708 print
1425 print 'CodeItems size is %d bytes' % (bytes) 1709 print 'CodeItems size is %d/%d bytes' % (bytes, rbytes)
1426 1710
1427 bytes = sum([annoset.data_size for annoset in dex._annotationSetItems]) 1711 bytes = sum([annoset.data_size for annoset in dex._annotationSetItems])
1712 rbytes = sum([_compute_sz(annoset) for annoset in dex._annotationSetItems])
1428 print 1713 print
1429 print 'AnnotationSetItems size is %d bytes' % (bytes) 1714 print 'AnnotationSetItems size is %d/%d bytes' % (bytes, rbytes)
1430 1715
1431 bytes = sum([annodir.data_size 1716 bytes = sum([annodir.data_size
1432 for annodir in dex._annotationsDirectoryItems]) 1717 for annodir in dex._annotationsDirectoryItems])
1718 rbytes = sum([_compute_sz(annodir)
1719 for annodir in dex._annotationsDirectoryItems])
1433 print 1720 print
1434 print 'AnnotationsDirtoryItems size is %d bytes' % (bytes) 1721 print 'AnnotationsDirtoryItems size is %d/%d bytes' % (bytes, rbytes)
1435 1722
1436 bytes = sum([annoitem.data_size 1723 bytes = sum([annoitem.data_size
1437 for annoitem in dex._annotationItems]) 1724 for annoitem in dex._annotationItems])
1725 rbytes = sum([_compute_sz(annoitem)
1726 for annoitem in dex._annotationItems])
1438 print 1727 print
1439 print 'AnnotationItems size is %d bytes' % (bytes) 1728 print 'AnnotationItems size is %d/%d bytes' % (bytes, rbytes)
1440 1729
1441 bytes = sum([encodeditem.data_size 1730 bytes = sum([encodeditem.data_size
1442 for encodeditem in dex._encodedArrayItems]) 1731 for encodeditem in dex._encodedArrayItems])
1732 rbytes = sum([_compute_sz(encodeditem)
1733 for encodeditem in dex._encodedArrayItems])
1443 print 1734 print
1444 print 'EncodedArrayItems size is %d bytes' % (bytes) 1735 print 'EncodedArrayItems size is %d/%d bytes' % (bytes, rbytes)
1445 1736
1446 bytes = sum([debuginfoitem.data_size 1737 bytes = sum([debuginfoitem.data_size
1447 for debuginfoitem in dex._debugInfoItems]) 1738 for debuginfoitem in dex._debugInfoItems])
1739 rbytes = sum([_compute_sz(debuginfoitem)
1740 for debuginfoitem in dex._debugInfoItems])
1448 print 1741 print
1449 print 'DebugInfoItems size is %d bytes' % (bytes) 1742 print 'DebugInfoItems size is %d/%d bytes' % (bytes, rbytes)
1450 1743
1451 print 1744 print
1452 print 'Data maps' 1745 print 'Data maps'
1453 maps = dex._maps 1746 maps = dex._maps
1454 for map in maps: 1747 for map in maps: