annotate paraspace/dexfile.py @ 41:c5cfc796af8b

Use value_ref & cond in dexfile.py to avoid 0 offset value Some object would use zero value for an invalid dependency offset, it causes an key error. We use dexfile.cond and add dexfile.value_ref class to build dependencies conditional.
author Thinker K.F. Li <thinker@codemud.net>
date Sun, 19 Jun 2011 13:47:35 +0800
parents 0c0a659187c2
children 5cea19126a11
rev   line source
12
8101024c942b Document class man_off
Thinker K.F. Li <thinker@codemud.net>
parents: 11
diff changeset
1 ## \brief Manage offset
8101024c942b Document class man_off
Thinker K.F. Li <thinker@codemud.net>
parents: 11
diff changeset
2 #
8101024c942b Document class man_off
Thinker K.F. Li <thinker@codemud.net>
parents: 11
diff changeset
3 # The instances are initialized with a offset. Every time an instance
8101024c942b Document class man_off
Thinker K.F. Li <thinker@codemud.net>
parents: 11
diff changeset
4 # is called, it return the offset before advancing offset with specify
8101024c942b Document class man_off
Thinker K.F. Li <thinker@codemud.net>
parents: 11
diff changeset
5 # size.
8101024c942b Document class man_off
Thinker K.F. Li <thinker@codemud.net>
parents: 11
diff changeset
6 #
8101024c942b Document class man_off
Thinker K.F. Li <thinker@codemud.net>
parents: 11
diff changeset
7 # moff = man_off(init_off)
8101024c942b Document class man_off
Thinker K.F. Li <thinker@codemud.net>
parents: 11
diff changeset
8 # assert moff(5) == init_off
8101024c942b Document class man_off
Thinker K.F. Li <thinker@codemud.net>
parents: 11
diff changeset
9 # assert moff() == (init_off + 5)
8101024c942b Document class man_off
Thinker K.F. Li <thinker@codemud.net>
parents: 11
diff changeset
10 # assert moff() == (init_off + 5)
8101024c942b Document class man_off
Thinker K.F. Li <thinker@codemud.net>
parents: 11
diff changeset
11 #
3
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
12 class man_off(object):
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
13 off = None
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
14
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
15 def __init__(self, off):
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
16 self.off = off
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
17 pass
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
18
4
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
19 def __call__(self, sz=0):
3
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
20 off = self.off
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
21 self.off = off + sz
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
22 return off
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
23 pass
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
24
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
25
41
c5cfc796af8b Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents: 40
diff changeset
26 ## \brief Get attribute of an object for a given path.
c5cfc796af8b Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents: 40
diff changeset
27 #
c5cfc796af8b Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents: 40
diff changeset
28 def _dex_tree_get_child(obj, child_name):
c5cfc796af8b Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents: 40
diff changeset
29 child_parts = child_name.split('.')
c5cfc796af8b Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents: 40
diff changeset
30 for child_part in child_parts:
c5cfc796af8b Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents: 40
diff changeset
31 if isinstance(obj, list):
c5cfc796af8b Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents: 40
diff changeset
32 idx = int(child_part)
c5cfc796af8b Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents: 40
diff changeset
33 obj = obj[idx]
c5cfc796af8b Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents: 40
diff changeset
34 continue
c5cfc796af8b Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents: 40
diff changeset
35
c5cfc796af8b Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents: 40
diff changeset
36 if isinstance(obj, dexfile.switch):
c5cfc796af8b Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents: 40
diff changeset
37 assert obj.map[eval(child_part)] == obj.child_type
c5cfc796af8b Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents: 40
diff changeset
38 obj = obj.value
c5cfc796af8b Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents: 40
diff changeset
39 continue
c5cfc796af8b Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents: 40
diff changeset
40
c5cfc796af8b Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents: 40
diff changeset
41 obj = getattr(obj, child_part)
c5cfc796af8b Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents: 40
diff changeset
42 pass
c5cfc796af8b Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents: 40
diff changeset
43 return obj
c5cfc796af8b Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents: 40
diff changeset
44
c5cfc796af8b Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents: 40
diff changeset
45
0
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
46 def _to_uint(data):
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
47 v = 0
1
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
48 sh = 0
0
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
49 for c in data:
1
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
50 v = v + (ord(c) << sh)
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
51 sh = sh + 8
0
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
52 pass
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
53 return v
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
54
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
55
8
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
56 def _to_int(data):
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
57 v = _to_uint(data)
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
58 sz = len(data)
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
59 if sz and ((1 << (sz * 8 - 1)) & v):
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
60 v = -((1 << (sz * 8)) - v)
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
61 pass
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
62 return v
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
63
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
64
1
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
65 def _uleb128(data):
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
66 sh = 0
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
67 v = 0
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
68 for c in data:
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
69 cv = ord(c)
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
70 v = v + ((cv & 0x7f) << sh)
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
71 sh = sh + 7
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
72
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
73 if cv <= 0x7f:
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
74 break
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
75 pass
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
76
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
77 nbytes = sh / 7
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
78 return v, nbytes
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
79
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
80
13
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
81 def _to_uleb128(v):
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
82 assert v >= 0
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
83
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
84 data = ''
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
85 while True:
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
86 if v > 0x7f:
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
87 data = data + chr((v & 0x7f) | 0x80)
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
88 else:
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
89 data = data + chr(v & 0x7f)
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
90 break
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
91 v = v >> 7
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
92 pass
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
93
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
94 return data
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
95
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
96
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
97 def _uleb128_sz(v):
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
98 return len(_to_uleb128(v))
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
99
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
100
2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
101 def _leb128(data):
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
102 v, sh = _uleb128(data)
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
103 if v & (1 << (sh * 7 - 1)):
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
104 v = -((1 << (sh * 7)) - v)
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
105 pass
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
106 return v, sh
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
107
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
108
13
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
109 def _to_leb128(v):
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
110 data = ''
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
111 while True:
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
112 if v > 0x3f or v < ~0x3f:
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
113 data = data + chr((v & 0x7f) | 0x80)
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
114 else:
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
115 data = data + chr(v & 0x7f)
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
116 break
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
117 v = v >> 7
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
118 pass
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
119 return data
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
120
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
121
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
122 def _leb128_sz(v):
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
123 return len(_to_leb128(v))
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
124
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
125
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
126 def _compute_sz(o):
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
127 if hasattr(o, 'compute_size'):
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
128 o.compute_size()
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
129 pass
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
130 return o.data_size
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
131
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
132
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
133 def _sum_data_size(obj_list):
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
134 obj_sizes = itertools.imap(_compute_sz, obj_list)
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
135 total = sum(obj_sizes)
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
136 return total
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
137
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
138
27
15cb829ac442 travel_dex_type() recoganizes _dex_type correctly
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
139 class _dex_type(object):
15cb829ac442 travel_dex_type() recoganizes _dex_type correctly
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
140 pass
15cb829ac442 travel_dex_type() recoganizes _dex_type correctly
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
141
15cb829ac442 travel_dex_type() recoganizes _dex_type correctly
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
142
15cb829ac442 travel_dex_type() recoganizes _dex_type correctly
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
143 class _rawstr(_dex_type):
15
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
144 size = None
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
145 factor = None
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
146 data = None
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
147 data_size = None
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
148
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
149 ##
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
150 # \param size_name is dot separated attribute names from the parent.
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
151 #
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
152 def __init__(self, size=None, size_name=None, factor=1):
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
153 self.size = size
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
154 self.size_name = size_name
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
155 self.factor = factor
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
156 pass
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
157
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
158 def parse(self, parent, data, off):
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
159 obj = _rawstr(self.size, self.size_name, self.factor)
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
160 if self.size is not None:
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
161 size = self.size
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
162 else:
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
163 size = parent
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
164 for name in self.size_name.split('.'):
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
165 size = getattr(size, name)
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
166 pass
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
167 pass
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
168 obj.data_size = size * self.factor
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
169
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
170 obj.data = data[off:off + obj.data_size]
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
171 return obj
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
172
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
173 def sizeof(self, v):
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
174 return v.data_size
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
175
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
176 def to_str(self, v):
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
177 return v
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
178 pass
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
179
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
180 class rawstr(_rawstr):
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
181 def __init__(self, size, factor=1):
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
182 super(rawstr, self).__init__(size=size, factor=factor)
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
183 pass
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
184 pass
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
185
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
186
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
187 class rawstr_size_name(_rawstr):
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
188 def __init__(self, size_name, factor=1):
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
189 super(rawstr_size_name, self).__init__(size_name=size_name,
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
190 factor=factor)
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
191 pass
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
192 pass
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
193
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
194
27
15cb829ac442 travel_dex_type() recoganizes _dex_type correctly
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
195 class tap(_dex_type):
15
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
196 @staticmethod
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
197 def parse(parent, data, off):
40
0c0a659187c2 Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents: 33
diff changeset
198 return tap()
15
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
199
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
200 @staticmethod
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
201 def sizeof(v):
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
202 return 0
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
203
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
204 @staticmethod
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
205 def to_str(v):
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
206 return ''
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
207 pass
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
208
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
209
27
15cb829ac442 travel_dex_type() recoganizes _dex_type correctly
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
210 class uint32(_dex_type):
15
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
211 @staticmethod
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
212 def parse(parent, data, off):
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
213 v = _to_uint(data[off:off + 4])
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
214 return v
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
215
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
216 @staticmethod
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
217 def sizeof(v):
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
218 return 4
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
219
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
220 @staticmethod
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
221 def to_str(v):
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
222 return chr(v & 0xff) + chr((v >> 8) & 0xff) + chr((v >> 16) & 0xff) + \
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
223 chr((v >> 24) & 0xff)
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
224 pass
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
225
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
226
27
15cb829ac442 travel_dex_type() recoganizes _dex_type correctly
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
227 class uint16(_dex_type):
15
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
228 @staticmethod
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
229 def parse(parent, data, off):
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
230 v = _to_uint(data[off:off + 2])
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
231 return v
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
232
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
233 @staticmethod
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
234 def sizeof(v):
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
235 return 2
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
236
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
237 @staticmethod
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
238 def to_str(v):
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
239 return chr(v & 0xff) + chr((v >> 8) & 0xff)
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
240 pass
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
241
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
242
27
15cb829ac442 travel_dex_type() recoganizes _dex_type correctly
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
243 class uint8(_dex_type):
15
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
244 @staticmethod
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
245 def parse(parent, data, off):
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
246 v = _to_uint(data[off:off + 1])
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
247 return v
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
248
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
249 @staticmethod
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
250 def sizeof(v):
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
251 return 1
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
252
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
253 @staticmethod
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
254 def to_str(v):
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
255 return chr(v & 0xff)
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
256 pass
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
257
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
258
27
15cb829ac442 travel_dex_type() recoganizes _dex_type correctly
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
259 class int32(_dex_type):
15
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
260 @staticmethod
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
261 def parse(parent, data, off):
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
262 v = _to_int(data[off:off + 4])
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
263 return v
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
264
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
265 @staticmethod
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
266 def sizeof(v):
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
267 return 4
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
268
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
269 @staticmethod
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
270 def to_str(v):
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
271 return chr(v & 0xff) + chr((v >> 8) & 0xff) + chr((v >> 16) & 0xff) + \
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
272 chr((v >> 24) & 0xff)
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
273 pass
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
274
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
275
27
15cb829ac442 travel_dex_type() recoganizes _dex_type correctly
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
276 class int16(_dex_type):
15
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
277 @staticmethod
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
278 def parse(parent, data, off):
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
279 v = _to_int(data[off:off + 2])
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
280 return v
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
281
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
282 @staticmethod
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
283 def sizeof(v):
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
284 return 2
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
285
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
286 @staticmethod
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
287 def to_str(v):
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
288 return chr(v & 0xff) + chr((v >> 8) & 0xff)
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
289 pass
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
290
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
291
27
15cb829ac442 travel_dex_type() recoganizes _dex_type correctly
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
292 class uleb128(_dex_type):
15
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
293 @staticmethod
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
294 def parse(parent, data, off):
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
295 v, sh = _uleb128(data[off:off + 5])
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
296 return v
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
297
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
298 @staticmethod
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
299 def sizeof(v):
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
300 return _uleb128_sz(v)
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
301
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
302 @staticmethod
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
303 def to_str(v):
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
304 return _to_uleb128(v)
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
305 pass
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
306
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
307
27
15cb829ac442 travel_dex_type() recoganizes _dex_type correctly
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
308 class leb128(_dex_type):
15
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
309 @staticmethod
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
310 def parse(parent, data, off):
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
311 v, sh = _leb128(data[off:off + 5])
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
312 return v
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
313
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
314 @staticmethod
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
315 def sizeof(v):
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
316 return _leb128_sz(v)
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
317
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
318 @staticmethod
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
319 def to_str(v):
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
320 return _to_leb128(v)
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
321 pass
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
322
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
323
27
15cb829ac442 travel_dex_type() recoganizes _dex_type correctly
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
324 class auto_align(_dex_type):
15
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
325 bits = None
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
326
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
327 def __init__(self, bits):
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
328 self.bits = bits
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
329 pass
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
330
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
331 def parse(self, parent, data, off):
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
332 mask = (1 << self.bits) - 1
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
333 padding_sz = ((off + mask) & ~mask) - off
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
334 return padding_sz
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
335
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
336 @staticmethod
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
337 def sizeof(v):
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
338 return v
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
339
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
340 @staticmethod
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
341 def to_str(v):
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
342 return '\x00' * v
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
343 pass
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
344
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
345
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
346 def _get_sz(o):
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
347 if isinstance(o, relocatable):
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
348 return o.data_size
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
349 return o.__class__.sizeof(o)
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
350
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
351
40
0c0a659187c2 Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents: 33
diff changeset
352 ## \biref Associate objects from two set of objects.
0c0a659187c2 Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents: 33
diff changeset
353 #
0c0a659187c2 Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents: 33
diff changeset
354 class _objs_asso(_dex_type):
0c0a659187c2 Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents: 33
diff changeset
355 left = None
0c0a659187c2 Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents: 33
diff changeset
356 left_ref = None
0c0a659187c2 Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents: 33
diff changeset
357 right = None
0c0a659187c2 Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents: 33
diff changeset
358 right_ref = None
0c0a659187c2 Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents: 33
diff changeset
359
0c0a659187c2 Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents: 33
diff changeset
360 ## \brief Update references for a element pair from left and right.
0c0a659187c2 Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents: 33
diff changeset
361 #
0c0a659187c2 Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents: 33
diff changeset
362 # This method must be called by derivation to associate a pair of
0c0a659187c2 Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents: 33
diff changeset
363 # elements.
0c0a659187c2 Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents: 33
diff changeset
364 #
0c0a659187c2 Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents: 33
diff changeset
365 def _update_refs(self, left_elt, right_elt):
0c0a659187c2 Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents: 33
diff changeset
366 lref = getattr(left_elt, self.left_ref)
0c0a659187c2 Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents: 33
diff changeset
367 if not isinstance(right_elt, lref.target_path):
0c0a659187c2 Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents: 33
diff changeset
368 raise TypeError, 'invalid target_path in left %s' % (repr(le))
0c0a659187c2 Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents: 33
diff changeset
369
0c0a659187c2 Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents: 33
diff changeset
370 rref = getattr(right_elt, self.right_ref)
0c0a659187c2 Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents: 33
diff changeset
371 if not isinstance(left_elt, rref.target_path):
0c0a659187c2 Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents: 33
diff changeset
372 raise TypeError, 'invalid target_path in right %s' % (repr(re))
0c0a659187c2 Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents: 33
diff changeset
373
0c0a659187c2 Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents: 33
diff changeset
374 new_lref = ref(lref.target_path)
0c0a659187c2 Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents: 33
diff changeset
375 new_lref.target = right_elt
0c0a659187c2 Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents: 33
diff changeset
376 setattr(left_elt, self.left_ref, new_lref)
0c0a659187c2 Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents: 33
diff changeset
377
0c0a659187c2 Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents: 33
diff changeset
378 new_rref = ref(rref.target_path)
0c0a659187c2 Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents: 33
diff changeset
379 new_rref.target = left_elt
0c0a659187c2 Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents: 33
diff changeset
380 setattr(right_elt, self.right_ref, new_rref)
0c0a659187c2 Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents: 33
diff changeset
381 pass
0c0a659187c2 Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents: 33
diff changeset
382
0c0a659187c2 Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents: 33
diff changeset
383 ## \brief Assocate elements from left list to a respective right element.
0c0a659187c2 Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents: 33
diff changeset
384 #
0c0a659187c2 Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents: 33
diff changeset
385 # This method must be called before linking dependencies.
0c0a659187c2 Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents: 33
diff changeset
386 #
0c0a659187c2 Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents: 33
diff changeset
387 def build_associations(self, left, right):
0c0a659187c2 Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents: 33
diff changeset
388 raise NotImplementedError, 'build_associations is not implemented'
0c0a659187c2 Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents: 33
diff changeset
389 pass
0c0a659187c2 Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents: 33
diff changeset
390
0c0a659187c2 Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents: 33
diff changeset
391
0c0a659187c2 Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents: 33
diff changeset
392 ## \brief One to one association.
0c0a659187c2 Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents: 33
diff changeset
393 #
0c0a659187c2 Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents: 33
diff changeset
394 # Associate nth element from left sequence to nth element in right
0c0a659187c2 Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents: 33
diff changeset
395 # sequence.
0c0a659187c2 Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents: 33
diff changeset
396 #
0c0a659187c2 Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents: 33
diff changeset
397 class one2one(_objs_asso):
0c0a659187c2 Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents: 33
diff changeset
398 def __init__(self, left, left_ref, right, right_ref):
0c0a659187c2 Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents: 33
diff changeset
399 self.left = left
0c0a659187c2 Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents: 33
diff changeset
400 self.left_ref = left_ref
0c0a659187c2 Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents: 33
diff changeset
401 self.right = right
0c0a659187c2 Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents: 33
diff changeset
402 self.right_ref = right_ref
0c0a659187c2 Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents: 33
diff changeset
403 pass
0c0a659187c2 Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents: 33
diff changeset
404
0c0a659187c2 Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents: 33
diff changeset
405 ## \brief Associate elements from left list to elements from right list
0c0a659187c2 Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents: 33
diff changeset
406 #
0c0a659187c2 Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents: 33
diff changeset
407 def build_associations(self, left, right):
0c0a659187c2 Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents: 33
diff changeset
408 assert len(left) == len(right)
0c0a659187c2 Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents: 33
diff changeset
409 for le, re in map(None, left, right):
0c0a659187c2 Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents: 33
diff changeset
410 self._update_refs(le, re)
0c0a659187c2 Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents: 33
diff changeset
411 pass
0c0a659187c2 Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents: 33
diff changeset
412 pass
0c0a659187c2 Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents: 33
diff changeset
413 pass
0c0a659187c2 Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents: 33
diff changeset
414
0c0a659187c2 Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents: 33
diff changeset
415
0c0a659187c2 Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents: 33
diff changeset
416 ## \brief Implicit reference to a target.
0c0a659187c2 Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents: 33
diff changeset
417 #
0c0a659187c2 Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents: 33
diff changeset
418 # It is a placeholder for storing relationship defined by an association.
0c0a659187c2 Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents: 33
diff changeset
419 #
0c0a659187c2 Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents: 33
diff changeset
420 class ref(_dex_type):
0c0a659187c2 Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents: 33
diff changeset
421 target_path = None
0c0a659187c2 Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents: 33
diff changeset
422 target = None
0c0a659187c2 Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents: 33
diff changeset
423
0c0a659187c2 Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents: 33
diff changeset
424 def __init__(self, target_path=None):
0c0a659187c2 Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents: 33
diff changeset
425 self.target_path = target_path
0c0a659187c2 Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents: 33
diff changeset
426 pass
41
c5cfc796af8b Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents: 40
diff changeset
427
c5cfc796af8b Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents: 40
diff changeset
428 @staticmethod
c5cfc796af8b Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents: 40
diff changeset
429 def parse(parent, data, off):
c5cfc796af8b Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents: 40
diff changeset
430 pass
c5cfc796af8b Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents: 40
diff changeset
431
c5cfc796af8b Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents: 40
diff changeset
432 @staticmethod
c5cfc796af8b Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents: 40
diff changeset
433 def sizeof(v):
c5cfc796af8b Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents: 40
diff changeset
434 return 0
c5cfc796af8b Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents: 40
diff changeset
435
c5cfc796af8b Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents: 40
diff changeset
436 @staticmethod
c5cfc796af8b Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents: 40
diff changeset
437 def compute_size():
c5cfc796af8b Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents: 40
diff changeset
438 pass
c5cfc796af8b Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents: 40
diff changeset
439
c5cfc796af8b Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents: 40
diff changeset
440 @staticmethod
c5cfc796af8b Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents: 40
diff changeset
441 def to_str():
c5cfc796af8b Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents: 40
diff changeset
442 return ''
c5cfc796af8b Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents: 40
diff changeset
443
c5cfc796af8b Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents: 40
diff changeset
444 def set_value(self, parents):
c5cfc796af8b Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents: 40
diff changeset
445 pass
c5cfc796af8b Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents: 40
diff changeset
446 pass
c5cfc796af8b Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents: 40
diff changeset
447
c5cfc796af8b Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents: 40
diff changeset
448
c5cfc796af8b Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents: 40
diff changeset
449 ## \brief Reference to a value from a given path.
c5cfc796af8b Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents: 40
diff changeset
450 #
c5cfc796af8b Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents: 40
diff changeset
451 class value_ref(ref):
c5cfc796af8b Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents: 40
diff changeset
452 def set_value(self, parents):
c5cfc796af8b Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents: 40
diff changeset
453 pparts = self.target_path.split('.')
c5cfc796af8b Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents: 40
diff changeset
454 clazz = pparts[0]
c5cfc796af8b Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents: 40
diff changeset
455
c5cfc796af8b Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents: 40
diff changeset
456 rev_parents = list(parents)
c5cfc796af8b Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents: 40
diff changeset
457 rev_parents.reverse()
c5cfc796af8b Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents: 40
diff changeset
458
c5cfc796af8b Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents: 40
diff changeset
459 for parent in rev_parents:
c5cfc796af8b Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents: 40
diff changeset
460 if isinstance(rev_parents, clazz):
c5cfc796af8b Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents: 40
diff changeset
461 break
c5cfc796af8b Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents: 40
diff changeset
462 pass
c5cfc796af8b Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents: 40
diff changeset
463 else:
c5cfc796af8b Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents: 40
diff changeset
464 raise ValueError, 'can not find %s' % (self.target_path)
c5cfc796af8b Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents: 40
diff changeset
465
c5cfc796af8b Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents: 40
diff changeset
466 attr_path = '.'.join(pparts[1:])
c5cfc796af8b Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents: 40
diff changeset
467 value = _dex_tree_get_child(parent, attr_path)
c5cfc796af8b Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents: 40
diff changeset
468 self.target = value
c5cfc796af8b Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents: 40
diff changeset
469 pass
40
0c0a659187c2 Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents: 33
diff changeset
470 pass
0c0a659187c2 Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents: 33
diff changeset
471
0c0a659187c2 Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents: 33
diff changeset
472
27
15cb829ac442 travel_dex_type() recoganizes _dex_type correctly
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
473 class relocatable(_dex_type):
15
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
474 data_size = None
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
475
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
476 @staticmethod
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
477 def parse(parent, data, off):
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
478 pass
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
479
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
480 @staticmethod
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
481 def sizeof(v):
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
482 return v.data_size
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
483
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
484 def to_str(self):
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
485 pass
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
486
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
487 def compute_size(self):
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
488 pass
25
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
489
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
490 def children(self):
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
491 raise NotImplementedError, \
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
492 '%s: does not implement children' % (self.__class__.__name__)
15
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
493 pass
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
494
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
495
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
496 class array(relocatable):
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
497 count_name = None
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
498 child_type = None
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
499 items = None
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
500
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
501 def __init__(self, count_name, child_type):
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
502 super(array, self).__init__()
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
503 self.count_name = count_name
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
504 self.child_type = child_type
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
505 pass
0
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
506
15
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
507 def parse(self, parent, data, off):
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
508 nitem = parent
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
509 for name in self.count_name.split('.'):
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
510 nitem = getattr(nitem, name)
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
511 pass
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
512 obj = self.parse_nitem(parent, data, off, nitem)
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
513 return obj
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
514
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
515 def parse_nitem(self, parent, data, off, nitem):
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
516 moff = man_off(off)
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
517
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
518 obj = array(self.count_name, self.child_type)
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
519
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
520 def parse():
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
521 item = obj.child_type.parse(parent, data, moff())
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
522 item_sz = obj.child_type.sizeof(item)
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
523 moff(item_sz)
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
524 return item
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
525
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
526 items = [parse() for i in range(nitem)]
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
527
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
528 obj.items = items
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
529 obj.data_size = moff() - off
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
530 return obj
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
531
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
532 def compute_size(self):
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
533 sizes = [compute_size(item) for item in self.items]
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
534 size = sum(sizes)
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
535 self.data_size = size
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
536 pass
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
537
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
538 def to_str(self):
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
539 to_str = self.child_type.to_str
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
540 strs = [to_str(item) for item in self.items]
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
541 return ''.join(strs)
25
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
542
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
543 def children(self):
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
544 return ('items',)
15
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
545 pass
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
546
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
547
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
548 class composite(relocatable):
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
549 child_names = None
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
550
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
551 def __init__(self):
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
552 for child_name in self.child_names:
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
553 setattr(self, child_name, None)
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
554 pass
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
555 pass
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
556
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
557 def parse_child(self, child_name, data, off):
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
558 child_clazz = getattr(self.__class__, child_name)
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
559 child = child_clazz.parse(self, data, off)
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
560 setattr(self, child_name, child)
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
561 pass
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
562
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
563 @classmethod
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
564 def parse(clazz, parent, data, off):
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
565 moff = man_off(off)
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
566 obj = clazz()
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
567
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
568 for child_name in clazz.child_names:
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
569 obj.parse_child(child_name, data, moff())
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
570 child = getattr(obj, child_name)
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
571 child_clazz = getattr(obj.__class__, child_name)
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
572 child_sz = child_clazz.sizeof(child)
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
573 moff(child_sz)
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
574 pass
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
575
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
576 obj.data_size = moff() - off
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
577 return obj
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
578
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
579 def compute_size(self):
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
580 children = [getattr(self, child_name)
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
581 for child_name in self.child_names]
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
582 child_sizes = [compute_size(child)
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
583 for child in children]
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
584 self.data_size = sum(child_sizes)
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
585 pass
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
586
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
587 def to_str(self):
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
588 child_clazzs = [getattr(self.__class__, child_name)
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
589 for child_name in self.child_names]
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
590 children = [getattr(self, child_name)
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
591 for child_name in self.child_names]
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
592 child_strs = map(lambda child_clazz, child: \
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
593 child_clazz.to_str(child),
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
594 child_clazzs, children)
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
595 return ''.join(child_strs)
25
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
596
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
597 def children(self):
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
598 return self.child_names
15
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
599 pass
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
600
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
601
17
d0806672da04 Declare dependencies for dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents: 15
diff changeset
602 class cond(relocatable):
15
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
603 condition = None
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
604 child_type = None
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
605 value = None
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
606
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
607 def __init__(self, cond, child_type):
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
608 self.condition = cond
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
609 self.child_type = child_type
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
610 pass
25
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
611
15
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
612 def parse(self, parent, data, off):
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
613 if self.condition(parent, data, off):
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
614 value = self.child_type.parse(parent, data, off)
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
615 else:
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
616 value = None
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
617 pass
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
618
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
619 obj = cond(self.condition, self.child_type)
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
620 obj.value = value
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
621 obj.data_size = self.sizeof(obj)
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
622 return obj
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
623
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
624 def sizeof(self, v):
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
625 if v.value is None:
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
626 return 0
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
627 return self.child_type.sizeof(v.value)
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
628
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
629 def compute_size(self):
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
630 if isinstance(self.value, relocatable):
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
631 self.value.compute_size()
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
632 pass
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
633
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
634 self.data_size = self.sizeof(self.value)
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
635 pass
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
636
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
637 def to_str(self):
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
638 if self.value is None:
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
639 return ''
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
640
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
641 data = self.child_type.to_str(self.value)
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
642 return data
25
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
643
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
644 def children(self):
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
645 return ('value',)
15
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
646 pass
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
647
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
648
17
d0806672da04 Declare dependencies for dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents: 15
diff changeset
649 class switch(relocatable):
15
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
650 selector = None
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
651 map = None
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
652 child_type = None
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
653 value = None
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
654
25
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
655 _parent = None
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
656
15
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
657 def __init__(self, selector, map):
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
658 self.selector = selector
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
659 self.map = map
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
660 pass
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
661
25
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
662 def switch_key(self, parent):
15
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
663 selector = self.selector
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
664 sel_value = parent
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
665 for name in selector.split('.'):
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
666 sel_value = getattr(sel_value, name)
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
667 pass
25
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
668 return sel_value
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
669
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
670 def _get_child_type(self, parent):
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
671 sel_value = self.switch_key(parent)
15
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
672
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
673 child_type = self.map[sel_value]
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
674 return child_type
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
675
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
676 def parse(self, parent, data, off):
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
677 child_type = self._get_child_type(parent)
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
678 value = child_type.parse(parent, data, off)
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
679
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
680 obj = switch(self.selector, self.map)
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
681 obj.value = value
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
682 obj.child_type = child_type
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
683 obj.data_size = self.sizeof(obj)
25
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
684 obj._parent = parent
15
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
685 return obj
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
686
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
687 @staticmethod
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
688 def sizeof(v):
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
689 return v.child_type.sizeof(v.value)
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
690
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
691 def compute_size(self):
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
692 if isinstance(self.value, relocatable):
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
693 self.value.compute_size()
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
694 pass
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
695
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
696 self.data_size = self.sizeof(self.value)
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
697 pass
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
698
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
699 def to_str(self):
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
700 data = self.child_type.to_str(self.value)
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
701 return data
25
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
702
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
703 def children(self):
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
704 key = self.switch_key(self._parent)
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
705 return (repr(key),)
15
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
706 pass
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
707
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
708
25
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
709 class abs_value(relocatable):
15
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
710 value = None
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
711
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
712 def __init__(self, value):
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
713 self.value = value
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
714 pass
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
715
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
716 def parse(self, parse, data, off):
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
717 obj = abs_value(self.value)
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
718 return obj
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
719
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
720 def sizeof(self, v):
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
721 return 0
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
722
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
723 def to_str(self):
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
724 return ''
25
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
725
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
726 def children(self):
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
727 return ('value',)
15
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
728 pass
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
729
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
730
17
d0806672da04 Declare dependencies for dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents: 15
diff changeset
731 class depend(relocatable):
d0806672da04 Declare dependencies for dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents: 15
diff changeset
732 depend_on = None
d0806672da04 Declare dependencies for dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents: 15
diff changeset
733 child_type = None
d0806672da04 Declare dependencies for dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents: 15
diff changeset
734
d0806672da04 Declare dependencies for dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents: 15
diff changeset
735 def __init__(self, depend_on):
d0806672da04 Declare dependencies for dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents: 15
diff changeset
736 self.depend_on = depend_on
d0806672da04 Declare dependencies for dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents: 15
diff changeset
737 pass
d0806672da04 Declare dependencies for dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents: 15
diff changeset
738
d0806672da04 Declare dependencies for dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents: 15
diff changeset
739 def __call__(self, child_type):
d0806672da04 Declare dependencies for dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents: 15
diff changeset
740 self.child_type = child_type
d0806672da04 Declare dependencies for dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents: 15
diff changeset
741 return self
d0806672da04 Declare dependencies for dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents: 15
diff changeset
742
d0806672da04 Declare dependencies for dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents: 15
diff changeset
743 def parse(self, parent, data, off):
d0806672da04 Declare dependencies for dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents: 15
diff changeset
744 v = self.child_type.parse(parent, data, off)
d0806672da04 Declare dependencies for dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents: 15
diff changeset
745 return v
d0806672da04 Declare dependencies for dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents: 15
diff changeset
746
d0806672da04 Declare dependencies for dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents: 15
diff changeset
747 def sizeof(self, v):
d0806672da04 Declare dependencies for dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents: 15
diff changeset
748 v = self.child_type.sizeof(v)
d0806672da04 Declare dependencies for dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents: 15
diff changeset
749 return v
d0806672da04 Declare dependencies for dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents: 15
diff changeset
750
d0806672da04 Declare dependencies for dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents: 15
diff changeset
751 def compute_size(self, child):
d0806672da04 Declare dependencies for dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents: 15
diff changeset
752 if issubclass(self.child_type, relocatable):
d0806672da04 Declare dependencies for dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents: 15
diff changeset
753 self.child_type.compute_size(child)
d0806672da04 Declare dependencies for dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents: 15
diff changeset
754 pass
d0806672da04 Declare dependencies for dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents: 15
diff changeset
755 pass
d0806672da04 Declare dependencies for dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents: 15
diff changeset
756
d0806672da04 Declare dependencies for dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents: 15
diff changeset
757 def to_str(self, child):
d0806672da04 Declare dependencies for dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents: 15
diff changeset
758 return self.child_type.to_str(child)
25
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
759
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
760 def link(self, child, name_path, parents, markers_info):
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
761 raise NotImplementedError, 'does not support link() method'
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
762 pass
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
763
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
764
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
765 def _set_name_path_name(parent, name, obj):
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
766 if isinstance(parent, (list, dict)):
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
767 key = eval(name)
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
768 parent[key] = obj
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
769 return
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
770 setattr(parent, name, obj)
17
d0806672da04 Declare dependencies for dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents: 15
diff changeset
771 pass
d0806672da04 Declare dependencies for dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents: 15
diff changeset
772
d0806672da04 Declare dependencies for dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents: 15
diff changeset
773
d0806672da04 Declare dependencies for dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents: 15
diff changeset
774 class depend_off(depend):
25
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
775 def link(self, child, name_path, parents, markers_info):
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
776 parent = parents[-1]
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
777 name = name_path.split('.')[-1]
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
778
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
779 dep_on_name_path = self.depend_on
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
780 id_item_map = markers_info[dep_on_name_path]
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
781 dep_on = id_item_map[child.data_offset]
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
782
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
783 _set_name_path_name(parent, name, dep_on)
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
784 pass
17
d0806672da04 Declare dependencies for dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents: 15
diff changeset
785 pass
d0806672da04 Declare dependencies for dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents: 15
diff changeset
786
d0806672da04 Declare dependencies for dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents: 15
diff changeset
787
d0806672da04 Declare dependencies for dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents: 15
diff changeset
788 class depend_off_rel(depend):
d0806672da04 Declare dependencies for dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents: 15
diff changeset
789 relative_to = None
d0806672da04 Declare dependencies for dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents: 15
diff changeset
790
d0806672da04 Declare dependencies for dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents: 15
diff changeset
791 def __init__(self, relative_to, depend_on):
d0806672da04 Declare dependencies for dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents: 15
diff changeset
792 super(depend_off_rel, self).__init__(depend_on)
25
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
793 self.relative_to = relative_to
17
d0806672da04 Declare dependencies for dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents: 15
diff changeset
794 pass
d0806672da04 Declare dependencies for dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents: 15
diff changeset
795 pass
d0806672da04 Declare dependencies for dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents: 15
diff changeset
796
d0806672da04 Declare dependencies for dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents: 15
diff changeset
797
19
6008b9a9d33e Declare dependencies for indics for classes in dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents: 18
diff changeset
798 class depend_idx(depend):
6008b9a9d33e Declare dependencies for indics for classes in dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents: 18
diff changeset
799 pass
6008b9a9d33e Declare dependencies for indics for classes in dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents: 18
diff changeset
800
6008b9a9d33e Declare dependencies for indics for classes in dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents: 18
diff changeset
801
15
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
802 class _DEX_header(composite):
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
803 magic = rawstr(8)
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
804 checksum = uint32
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
805 signature = rawstr(20)
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
806 fileSize = uint32
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
807 headerSize = uint32
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
808 endianTag = uint32
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
809 linkSize = uint32
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
810 linkOff = uint32
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
811 mapOff = uint32
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
812 stringIdsSize = uint32
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
813 stringIdsOff = uint32
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
814 typeIdsSize = uint32
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
815 typeIdsOff = uint32
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
816 protoIdsSize = uint32
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
817 protoIdsOff = uint32
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
818 fieldIdsSize = uint32
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
819 fieldIdsOff = uint32
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
820 methodIdsSize = uint32
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
821 methodIdsOff = uint32
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
822 classDefsSize = uint32
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
823 classDefsOff = uint32
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
824 dataSize = uint32
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
825 dataOff = uint32
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
826
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
827 child_names = \
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
828 'magic checksum signature fileSize headerSize endianTag ' \
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
829 'linkSize linkOff mapOff stringIdsSize stringIdsOff typeIdsSize ' \
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
830 'typeIdsOff protoIdsSize protoIdsOff fieldIdsSize fieldIdsOff ' \
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
831 'methodIdsSize methodIdsOff classDefsSize classDefsOff ' \
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
832 'dataSize dataOff'.split()
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
833 pass
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
834
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
835
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
836 class _DEX_MapItem(composite):
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
837 type = uint16
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
838 unused = uint16
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
839 size = uint32
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
840 offset = uint32
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
841
2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
842 types = {
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
843 0x0000: 'kDexTypeHeaderItem',
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
844 0x0001: 'kDexTypeStringIdItem',
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
845 0x0002: 'kDexTypeTypeIdItem',
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
846 0x0003: 'kDexTypeProtoIdItem',
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
847 0x0004: 'kDexTypeFieldIdItem',
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
848 0x0005: 'kDexTypeMethodIdItem',
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
849 0x0006: 'kDexTypeClassDefItem',
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
850 0x1000: 'kDexTypeMapList',
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
851 0x1001: 'kDexTypeTypeList',
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
852 0x1002: 'kDexTypeAnnotationSetRefList',
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
853 0x1003: 'kDexTypeAnnotationSetItem',
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
854 0x2000: 'kDexTypeClassDataItem',
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
855 0x2001: 'kDexTypeCodeItem',
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
856 0x2002: 'kDexTypeStringDataItem',
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
857 0x2003: 'kDexTypeDebugInfoItem',
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
858 0x2004: 'kDexTypeAnnotationItem',
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
859 0x2005: 'kDexTypeEncodedArrayItem',
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
860 0x2006: 'kDexTypeAnnotationsDirectoryItem'
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
861 }
0
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
862
15
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
863 child_names = \
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
864 'type unused size offset'.split()
0
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
865 pass
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
866
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
867
15
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
868 class _DEX_MapItemBlock(composite):
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
869 num = uint32
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
870 items = array('num', _DEX_MapItem)
0
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
871
15
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
872 child_names = 'num items'.split()
0
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
873 pass
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
874
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
875
15
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
876 class _DEX_StringId(composite):
17
d0806672da04 Declare dependencies for dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents: 15
diff changeset
877 stringDataOff = depend_off('_DEX_StringDataItem')(uint32)
0
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
878
15
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
879 child_names = ('stringDataOff',)
0
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
880 pass
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
881
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
882
15
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
883 class _DEX_TypeId(composite):
19
6008b9a9d33e Declare dependencies for indics for classes in dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents: 18
diff changeset
884 descriptorIdx = depend_idx('DEXFile.stringIds')(uint32)
15
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
885
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
886 child_names = ('descriptorIdx',)
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
887 pass
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
888
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
889
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
890 class _DEX_ProtoId(composite):
19
6008b9a9d33e Declare dependencies for indics for classes in dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents: 18
diff changeset
891 shortyIdx = depend_idx('DEXFile.stringIds')(uint32)
6008b9a9d33e Declare dependencies for indics for classes in dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents: 18
diff changeset
892 returnTypeIdx = depend_idx('DEXFile.typeIds')(uint32)
41
c5cfc796af8b Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents: 40
diff changeset
893 parametersOff = uint32
c5cfc796af8b Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents: 40
diff changeset
894 parametersOffRef = cond((lambda parent, data, off: parent.parametersOff),
c5cfc796af8b Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents: 40
diff changeset
895 depend_off('_DEX_TypeList')
c5cfc796af8b Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents: 40
diff changeset
896 (value_ref('_DEX_ProtoId.parametersOff')))
0
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
897
41
c5cfc796af8b Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents: 40
diff changeset
898 child_names = 'shortyIdx returnTypeIdx parametersOff ' \
c5cfc796af8b Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents: 40
diff changeset
899 'parametersOffRef'.split()
0
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
900 pass
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
901
1
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
902
15
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
903 class _DEX_FieldId(composite):
19
6008b9a9d33e Declare dependencies for indics for classes in dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents: 18
diff changeset
904 classIdx = depend_idx('DEXFile.typeIds')(uint16)
6008b9a9d33e Declare dependencies for indics for classes in dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents: 18
diff changeset
905 typeIdx = depend_idx('DEXFile.typeIds')(uint16)
6008b9a9d33e Declare dependencies for indics for classes in dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents: 18
diff changeset
906 nameIdx = depend_idx('DEXFile.stringIds')(uint32)
0
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
907
15
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
908 child_names = 'classIdx typeIdx nameIdx'.split()
0
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
909 pass
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
910
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
911
15
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
912 class _DEX_MethodId(composite):
19
6008b9a9d33e Declare dependencies for indics for classes in dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents: 18
diff changeset
913 classIdx = depend_idx('DEXFile.typeIds')(uint16)
6008b9a9d33e Declare dependencies for indics for classes in dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents: 18
diff changeset
914 protoIdx = depend_idx('DEXFile.protoIds')(uint16)
6008b9a9d33e Declare dependencies for indics for classes in dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents: 18
diff changeset
915 nameIdx = depend_idx('DEXFile.stringIds')(uint32)
2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
916
15
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
917 child_names = 'classIdx protoIdx nameIdx'.split()
2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
918 pass
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
919
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
920
15
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
921 class _DEX_ClassDef(composite):
19
6008b9a9d33e Declare dependencies for indics for classes in dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents: 18
diff changeset
922 classIdx = depend_idx('DEXFile.typeIds')(uint32)
15
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
923 accessFlags = uint32
19
6008b9a9d33e Declare dependencies for indics for classes in dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents: 18
diff changeset
924 superclassIdx = depend_idx('DEXFile.typeIds')(uint32)
41
c5cfc796af8b Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents: 40
diff changeset
925 interfacesOff = uint32
c5cfc796af8b Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents: 40
diff changeset
926 interfacesOffRef = cond((lambda parent, data, off: parent.interfacesOff),
c5cfc796af8b Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents: 40
diff changeset
927 depend_off('_DEX_TypeList')
c5cfc796af8b Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents: 40
diff changeset
928 (value_ref('_DEX_ClassDef.interfacesOff')))
19
6008b9a9d33e Declare dependencies for indics for classes in dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents: 18
diff changeset
929 sourceFileIdx = depend_idx('DEXFile.stringIds')(uint32)
41
c5cfc796af8b Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents: 40
diff changeset
930 annotationsOff = uint32
c5cfc796af8b Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents: 40
diff changeset
931 annotationsOffRef = cond((lambda parent, data, off: parent.annotationsOff),
c5cfc796af8b Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents: 40
diff changeset
932 depend_off('_DEX_AnnotationsDirectoryItem')
c5cfc796af8b Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents: 40
diff changeset
933 (value_ref('_DEX_ClassDef.annotationsOff')))
15
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
934 classDataOff = uint32
41
c5cfc796af8b Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents: 40
diff changeset
935 staticValuesOff = uint32
c5cfc796af8b Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents: 40
diff changeset
936 staticValuesOffRef = cond((lambda parent, data, off:
c5cfc796af8b Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents: 40
diff changeset
937 parent.staticValuesOff),
c5cfc796af8b Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents: 40
diff changeset
938 depend_off('_DEX_EncodedArrayItem')
c5cfc796af8b Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents: 40
diff changeset
939 (value_ref('_DEX_ClassDef.staticValuesOff')))
2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
940
15
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
941 child_names = \
41
c5cfc796af8b Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents: 40
diff changeset
942 'classIdx accessFlags superclassIdx interfacesOff interfacesOffRef ' \
c5cfc796af8b Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents: 40
diff changeset
943 'sourceFileIdx annotationsOff annotationsOffRef ' \
c5cfc796af8b Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents: 40
diff changeset
944 'classDataOff staticValuesOff staticValuesOffRef'.split()
15
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
945 pass
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
946
2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
947
15
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
948 class _DEX_ClassDataHeader(composite):
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
949 staticFieldsSize = uleb128
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
950 instanceFieldsSize = uleb128
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
951 directMethodsSize = uleb128
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
952 virtualMethodsSize = uleb128
13
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
953
15
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
954 child_names = \
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
955 'staticFieldsSize instanceFieldsSize directMethodsSize ' \
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
956 'virtualMethodsSize'.split()
2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
957 pass
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
958
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
959
15
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
960 class _DEX_Field(composite):
19
6008b9a9d33e Declare dependencies for indics for classes in dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents: 18
diff changeset
961 fieldIdx = depend_idx('DEXFile.fieldIds')(uleb128)
15
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
962 accessFlags = uleb128
2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
963
15
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
964 child_names = 'fieldIdx accessFlags'.split()
2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
965 pass
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
966
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
967
15
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
968 class _DEX_Method(composite):
19
6008b9a9d33e Declare dependencies for indics for classes in dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents: 18
diff changeset
969 methodIdx = depend_idx('DEXFile.methodIds')(uleb128)
15
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
970 accessFlags = uleb128
41
c5cfc796af8b Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents: 40
diff changeset
971 codeOff = uleb128
c5cfc796af8b Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents: 40
diff changeset
972 codeOffRef = cond((lambda parent, data, off: parent.codeOff),
c5cfc796af8b Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents: 40
diff changeset
973 depend_off('_DEX_Code')
c5cfc796af8b Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents: 40
diff changeset
974 (value_ref('_DEX_Method.codeOff')))
2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
975
41
c5cfc796af8b Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents: 40
diff changeset
976 child_names = 'methodIdx accessFlags codeOff codeOffRef'.split()
2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
977 pass
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
978
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
979
15
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
980 class _DEX_ClassData(composite):
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
981 header = _DEX_ClassDataHeader
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
982 staticFields = array('header.staticFieldsSize', _DEX_Field)
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
983 instanceFields = array('header.instanceFieldsSize', _DEX_Field)
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
984 directMethods = array('header.directMethodsSize', _DEX_Method)
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
985 virtualMethods = array('header.virtualMethodsSize', _DEX_Method)
6
917f0a9b9d06 Refactor _DEX_TypeItem from _DEX_TypeList for layout info tracking
Thinker K.F. Li <thinker@codemud.net>
parents: 5
diff changeset
986
15
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
987 child_names = \
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
988 'header ' \
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
989 'staticFields instanceFields directMethods virtualMethods'.split()
6
917f0a9b9d06 Refactor _DEX_TypeItem from _DEX_TypeList for layout info tracking
Thinker K.F. Li <thinker@codemud.net>
parents: 5
diff changeset
990 pass
917f0a9b9d06 Refactor _DEX_TypeItem from _DEX_TypeList for layout info tracking
Thinker K.F. Li <thinker@codemud.net>
parents: 5
diff changeset
991
917f0a9b9d06 Refactor _DEX_TypeItem from _DEX_TypeList for layout info tracking
Thinker K.F. Li <thinker@codemud.net>
parents: 5
diff changeset
992
15
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
993 class _DEX_TypeList(composite):
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
994 num = uint32
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
995 typeItems = array('num', uint16)
6
917f0a9b9d06 Refactor _DEX_TypeItem from _DEX_TypeList for layout info tracking
Thinker K.F. Li <thinker@codemud.net>
parents: 5
diff changeset
996
40
0c0a659187c2 Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents: 33
diff changeset
997 child_names = 'num typeItems'.split()
0c0a659187c2 Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents: 33
diff changeset
998 pass
0c0a659187c2 Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents: 33
diff changeset
999
0c0a659187c2 Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents: 33
diff changeset
1000
0c0a659187c2 Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents: 33
diff changeset
1001 class _DEX_TypeList_align(composite):
0c0a659187c2 Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents: 33
diff changeset
1002 padding = auto_align(2) # 2 bits alignment
0c0a659187c2 Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents: 33
diff changeset
1003 value = _DEX_TypeList
0c0a659187c2 Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents: 33
diff changeset
1004
0c0a659187c2 Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents: 33
diff changeset
1005 child_names = 'padding value'.split()
2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1006 pass
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1007
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1008
15
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1009 class _DEX_Try(composite):
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1010 startAddr = uint32
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1011 insnCount = uint16
17
d0806672da04 Declare dependencies for dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents: 15
diff changeset
1012 handlerOff = depend_off_rel('_DEX_Code.handlers_size',
40
0c0a659187c2 Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents: 33
diff changeset
1013 '_DEX_Try.catch_ref.target')(uint16)
0c0a659187c2 Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents: 33
diff changeset
1014 catch_ref = ref('_DEX_Catch')
2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1015
15
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1016 child_names = 'startAddr insnCount handlerOff'.split()
2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1017 pass
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1018
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1019
15
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1020 class _DEX_CatchHandler(composite):
19
6008b9a9d33e Declare dependencies for indics for classes in dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents: 18
diff changeset
1021 typeIdx = depend_idx('DEXFile.typeIds')(uleb128)
15
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1022 address = uleb128
2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1023
15
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1024 child_names = 'typeIdx address'.split()
2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1025 pass
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1026
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1027
15
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1028 class _DEX_CatchAllHandler(composite):
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1029 address = uleb128
2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1030
15
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1031 child_names = 'address'.split()
2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1032 pass
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1033
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1034
15
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1035 class _DEX_Catch(composite):
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1036 size = leb128
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1037 handlers = array('count', _DEX_CatchHandler)
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1038 catchAllHandler = cond((lambda parent, data, off: parent.catchesAll),
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1039 _DEX_CatchAllHandler)
40
0c0a659187c2 Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents: 33
diff changeset
1040 try_ref = ref('_DEX_Try')
2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1041
15
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1042 child_names = 'size handlers catchAllHandler'.split()
2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1043
15
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1044 @property
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1045 def catchesAll(self):
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1046 return self.size <= 0
2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1047
15
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1048 @property
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1049 def count(self):
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1050 if self.size < 0:
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1051 return -self.size
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1052 return self.size
2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1053 pass
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1054
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1055
15
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1056 class _DEX_Code(composite):
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1057 registersSize = uint16
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1058 insSize = uint16
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1059 outsSize = uint16
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1060 triesSize = uint16
17
d0806672da04 Declare dependencies for dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents: 15
diff changeset
1061 debugInfoOff = depend_off('_DEX_DebugInfoItem')(uint32)
15
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1062 insnsSize = uint32
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1063 insns = rawstr_size_name('insnsSize', 2)
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1064
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1065 _has_tries = lambda parent, data, off: parent.triesSize > 0
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1066
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1067 padding = cond(_has_tries, auto_align(2))
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1068 try_items = cond(_has_tries,
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1069 array('triesSize', _DEX_Try))
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1070
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1071 handlers_size = cond(_has_tries, uleb128)
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1072 catch_handler_items = cond(_has_tries,
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1073 array('handlers_size.value', _DEX_Catch))
40
0c0a659187c2 Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents: 33
diff changeset
1074 try_catch_asso = one2one('try_items.value.items', 'catch_ref',
0c0a659187c2 Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents: 33
diff changeset
1075 'catch_handler_items.value.items', 'try_ref')
2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1076
15
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1077 padding2 = auto_align(2)
2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1078
15
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1079 child_names = \
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1080 'registersSize insSize outsSize triesSize debugInfoOff ' \
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1081 'insnsSize insns padding try_items handlers_size ' \
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1082 'catch_handler_items padding2'.split()
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1083 pass
13
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1084
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1085
15
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1086 class _DEX_AnnotationSetItem(composite):
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1087 size = uint32
17
d0806672da04 Declare dependencies for dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents: 15
diff changeset
1088 annotationOffs = array('size', depend_off('_DEX_AnnotationItem')(uint32))
15
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1089
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1090 child_names = 'size annotationOffs'.split()
2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1091 pass
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1092
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1093
15
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1094 class _DEX_FieldAnnotationsItem(composite):
19
6008b9a9d33e Declare dependencies for indics for classes in dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents: 18
diff changeset
1095 fieldIdx = depend_idx('DEXFile.fieldIds')(uint32)
41
c5cfc796af8b Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents: 40
diff changeset
1096 annotationsOff = uint32
c5cfc796af8b Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents: 40
diff changeset
1097 annotationsOffRef = cond((lambda parent, data, off: parent.annotationsOff),
c5cfc796af8b Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents: 40
diff changeset
1098 depend_off('_DEX_AnnotationSetItem')
c5cfc796af8b Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents: 40
diff changeset
1099 (value_ref('_DEX_FieldAnnotationsItem.'
c5cfc796af8b Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents: 40
diff changeset
1100 'annotationsOff')))
15
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1101
41
c5cfc796af8b Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents: 40
diff changeset
1102 child_names = 'fieldIdx annotationsOff annotationsOffRef'.split()
4
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
1103 pass
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
1104
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
1105
15
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1106 class _DEX_MethodAnnotationsItem(composite):
19
6008b9a9d33e Declare dependencies for indics for classes in dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents: 18
diff changeset
1107 methodIdx = depend_idx('DEXFile.methodIds')(uint32)
41
c5cfc796af8b Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents: 40
diff changeset
1108 annotationsOff = uint32
c5cfc796af8b Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents: 40
diff changeset
1109 annotationsOffRef = cond((lambda parent, data, off: parent.annotationsOff),
c5cfc796af8b Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents: 40
diff changeset
1110 depend_off('_DEX_AnnotationSetItem')
c5cfc796af8b Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents: 40
diff changeset
1111 (value_ref('_DEX_MethodAnnotationsItem.'
c5cfc796af8b Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents: 40
diff changeset
1112 'annotationsOff')))
4
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
1113
41
c5cfc796af8b Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents: 40
diff changeset
1114 child_names = 'methodIdx annotationsOff annotationsOffRef'.split()
4
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
1115 pass
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
1116
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
1117
15
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1118 class _DEX_ParameterAnnotationsItem(composite):
19
6008b9a9d33e Declare dependencies for indics for classes in dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents: 18
diff changeset
1119 methodIdx = depend_idx('DEXFile.methodIds')(uint32)
41
c5cfc796af8b Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents: 40
diff changeset
1120 annotationsOff = uint32
c5cfc796af8b Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents: 40
diff changeset
1121 annotationsOffRef = cond((lambda parent, data, off: parent.annotationsOff),
c5cfc796af8b Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents: 40
diff changeset
1122 depend_off('_DEX_AnnotationSetItem')
c5cfc796af8b Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents: 40
diff changeset
1123 (value_ref('_DEX_ParameterAnnotationsItem.'
c5cfc796af8b Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents: 40
diff changeset
1124 'annotationsOff')))
4
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
1125
41
c5cfc796af8b Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents: 40
diff changeset
1126 child_names = 'methodIdx annotationsOff annotationsOffRef'.split()
4
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
1127 pass
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
1128
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
1129
15
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1130 class _DEX_AnnotationsDirectoryItem(composite):
41
c5cfc796af8b Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents: 40
diff changeset
1131 classAnnotationsOff = uint32
c5cfc796af8b Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents: 40
diff changeset
1132 classAnnotationsOffRef = cond((lambda parent, data, off:
c5cfc796af8b Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents: 40
diff changeset
1133 parent.classAnnotationsOff),
c5cfc796af8b Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents: 40
diff changeset
1134 depend_off('_DEX_AnnotationSetItem')
c5cfc796af8b Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents: 40
diff changeset
1135 (value_ref('_DEX_AnnotationsDirectoryItem.'
c5cfc796af8b Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents: 40
diff changeset
1136 'classAnnotationsOff')))
15
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1137 fieldsSize = uint32
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1138 methodsSize = uint32
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1139 parametersSize = uint32
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1140
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1141 fieldAnnotationsItems = array('fieldsSize', _DEX_FieldAnnotationsItem)
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1142 methodAnnotationsItems = array('methodsSize', _DEX_MethodAnnotationsItem)
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1143 parameterAnnotationsItems = array('parametersSize',
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1144 _DEX_ParameterAnnotationsItem)
4
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
1145
41
c5cfc796af8b Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents: 40
diff changeset
1146 child_names = 'classAnnotationsOff classAnnotationsOffRef ' \
c5cfc796af8b Use value_ref & cond in dexfile.py to avoid 0 offset value
Thinker K.F. Li <thinker@codemud.net>
parents: 40
diff changeset
1147 'fieldsSize methodsSize ' \
15
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1148 'parametersSize fieldAnnotationsItems methodAnnotationsItems ' \
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1149 'parameterAnnotationsItems'.split()
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1150 pass
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1151
13
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1152
15
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1153 class _DEX_AnnotationArray(composite):
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1154 size = uleb128
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1155 # annotations = array('size', _DEX_AnnotationMember_noname)
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1156
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1157 child_names = 'size annotations'.split()
3
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
1158 pass
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
1159
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
1160
8
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
1161 ##
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
1162 #
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
1163 # \see createAnnotationMember() in dalvik/vm/reflect/Annotation.c
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
1164 #
19
6008b9a9d33e Declare dependencies for indics for classes in dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents: 18
diff changeset
1165 class _DEX_AnnotationMember_noname(composite):
8
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
1166 #
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
1167 # Constants from DexFile.h
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
1168 #
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
1169 kDexAnnotationByte = 0x00
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
1170 kDexAnnotationShort = 0x02
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
1171 kDexAnnotationChar = 0x03
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
1172 kDexAnnotationInt = 0x04
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
1173 kDexAnnotationLong = 0x06
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
1174 kDexAnnotationFloat = 0x10
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
1175 kDexAnnotationDouble = 0x11
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
1176 kDexAnnotationString = 0x17
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
1177 kDexAnnotationType = 0x18
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
1178 kDexAnnotationField = 0x19
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
1179 kDexAnnotationMethod = 0x1a
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
1180 kDexAnnotationEnum = 0x1b
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
1181 kDexAnnotationArray = 0x1c
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
1182 kDexAnnotationAnnotation = 0x1d
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
1183 kDexAnnotationNull = 0x1e
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
1184 kDexAnnotationBoolean = 0x1f
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
1185
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
1186 kDexAnnotationValueTypeMask = 0x1f
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
1187 kDexAnnotationValueArgShift = 5
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
1188
15
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1189 valueType = uint8
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1190 value_map = {
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1191 kDexAnnotationByte: rawstr_size_name('value_width'),
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1192 kDexAnnotationShort: rawstr_size_name('value_width'),
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1193 kDexAnnotationChar: rawstr_size_name('value_width'),
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1194 kDexAnnotationInt: rawstr_size_name('value_width'),
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1195 kDexAnnotationLong: rawstr_size_name('value_width'),
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1196 kDexAnnotationFloat: rawstr_size_name('value_width'),
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1197 kDexAnnotationDouble: rawstr_size_name('value_width'),
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1198 kDexAnnotationString: rawstr_size_name('value_width'),
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1199 kDexAnnotationType: rawstr_size_name('value_width'),
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1200 kDexAnnotationMethod: rawstr_size_name('value_width'),
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1201 kDexAnnotationField: rawstr_size_name('value_width'),
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1202 kDexAnnotationEnum: rawstr_size_name('value_width'),
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1203 kDexAnnotationNull: abs_value(0),
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1204 kDexAnnotationBoolean: abs_value(0), # width != 0
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1205 kDexAnnotationArray: _DEX_AnnotationArray,
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1206 # kDexAnnotationAnnotation: _DEX_AnnotationItem_novisibility
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1207 }
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1208 value = switch('vtype', value_map)
8
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
1209
19
6008b9a9d33e Declare dependencies for indics for classes in dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents: 18
diff changeset
1210 child_names = 'valueType value'.split()
8
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
1211
15
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1212 @property
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1213 def vtype(self):
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1214 vtype = self.valueType & self.kDexAnnotationValueTypeMask
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1215 return vtype
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1216
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1217 @property
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1218 def width(self):
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1219 width = self.valueType >> self.kDexAnnotationValueArgShift
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1220 return width
13
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1221
15
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1222 @property
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1223 def value_width(self):
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1224 width = self.valueType >> self.kDexAnnotationValueArgShift
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1225 return width + 1
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1226 pass
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1227
13
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1228
19
6008b9a9d33e Declare dependencies for indics for classes in dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents: 18
diff changeset
1229 class _DEX_AnnotationMember(_DEX_AnnotationMember_noname):
6008b9a9d33e Declare dependencies for indics for classes in dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents: 18
diff changeset
1230 nameIdx = depend_idx('DEXFile.stringIds')(uleb128)
6008b9a9d33e Declare dependencies for indics for classes in dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents: 18
diff changeset
1231
6008b9a9d33e Declare dependencies for indics for classes in dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents: 18
diff changeset
1232 child_names = 'nameIdx valueType value'.split()
8
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
1233 pass
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
1234
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
1235
15
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1236 _DEX_AnnotationArray.annotations = array('size', _DEX_AnnotationMember_noname)
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1237
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1238
8
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
1239 ## \brief Annotation item
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
1240 #
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
1241 # \see processEncodedAnnotation() in dalvik/vm/reflect/Annotation.c
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
1242 #
19
6008b9a9d33e Declare dependencies for indics for classes in dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents: 18
diff changeset
1243 class _DEX_AnnotationItem_novisibility(composite):
6008b9a9d33e Declare dependencies for indics for classes in dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents: 18
diff changeset
1244 typeIdx = depend_idx('DEXFile.typeIds')(uleb128)
15
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1245 size = uleb128
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1246 members = array('size', _DEX_AnnotationMember)
8
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
1247
19
6008b9a9d33e Declare dependencies for indics for classes in dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents: 18
diff changeset
1248 child_names = 'typeIdx size members'.split()
15
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1249
8
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
1250 kDexVisibilityBuild = 0x00
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
1251 kDexVisibilityRuntime = 0x01
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
1252 kDexVisibilitySystem = 0x02
15
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1253 pass
8
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
1254
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
1255
19
6008b9a9d33e Declare dependencies for indics for classes in dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents: 18
diff changeset
1256 class _DEX_AnnotationItem(_DEX_AnnotationItem_novisibility):
6008b9a9d33e Declare dependencies for indics for classes in dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents: 18
diff changeset
1257 visibility = uint8
6008b9a9d33e Declare dependencies for indics for classes in dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents: 18
diff changeset
1258
6008b9a9d33e Declare dependencies for indics for classes in dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents: 18
diff changeset
1259 child_names = 'visibility typeIdx size members'.split()
8
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
1260 pass
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
1261
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
1262
15
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1263 _DEX_AnnotationMember. \
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1264 value_map[_DEX_AnnotationMember.kDexAnnotationAnnotation] = \
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1265 _DEX_AnnotationItem_novisibility
10
123c7a8bbf4c Parse EncodedArrayItems
Thinker K.F. Li <thinker@codemud.net>
parents: 9
diff changeset
1266
123c7a8bbf4c Parse EncodedArrayItems
Thinker K.F. Li <thinker@codemud.net>
parents: 9
diff changeset
1267
15
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1268 class _DEX_EncodedArrayItem(composite):
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1269 size = uleb128
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1270 elements = array('size', _DEX_AnnotationMember_noname)
10
123c7a8bbf4c Parse EncodedArrayItems
Thinker K.F. Li <thinker@codemud.net>
parents: 9
diff changeset
1271
15
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1272 child_names = 'size elements'.split()
10
123c7a8bbf4c Parse EncodedArrayItems
Thinker K.F. Li <thinker@codemud.net>
parents: 9
diff changeset
1273 pass
123c7a8bbf4c Parse EncodedArrayItems
Thinker K.F. Li <thinker@codemud.net>
parents: 9
diff changeset
1274
123c7a8bbf4c Parse EncodedArrayItems
Thinker K.F. Li <thinker@codemud.net>
parents: 9
diff changeset
1275
15
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1276 class _DEX_DebugCodeBlock(relocatable):
11
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1277 DBG_END_SEQUENCE = 0x00
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1278 DBG_ADVANCE_PC = 0x01
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1279 DBG_ADVANCE_LINE = 0x02
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1280 DBG_START_LOCAL = 0x03
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1281 DBG_START_LOCAL_EXTENDED = 0x04
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1282 DBG_END_LOCAL = 0x05
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1283 DBG_RESTART_LOCAL = 0x06
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1284 DBG_SET_PROLOGUE_END = 0x07
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1285 DBG_SET_EPILOGUE_BEGIN = 0x08
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1286 DBG_SET_FILE = 0x09
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1287 DBG_FIRST_SPECIAL = 0x0a
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1288 DBG_LINE_BASE = -4
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1289 DBG_LINE_RANGE = 15
15
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1290
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1291 opcodes = None
11
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1292 data_size = None
15
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1293
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1294 @staticmethod
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1295 def parse(parent, data, off):
11
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1296 moff = man_off(off)
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1297
15
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1298 self = _DEX_DebugCodeBlock()
11
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1299
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1300 #
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1301 # Parse debug opcodes
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1302 #
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1303 opcodes = []
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1304 while True:
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1305 opcode = _to_uint(data[moff(1):moff()])
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1306
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1307 if opcode == self.DBG_END_SEQUENCE:
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1308 opcodes.append((opcode,))
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1309 break
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1310 elif opcode == self.DBG_ADVANCE_PC:
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1311 adv, sh = _uleb128(data[moff():moff() + 5])
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1312 moff(sh)
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1313 opcodes.append((opcode, adv))
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1314 pass
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1315 elif opcode == self.DBG_ADVANCE_LINE:
13
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1316 adv, sh = _leb128(data[moff():moff() + 5])
11
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1317 moff(sh)
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1318 opcodes.append((opcode, adv))
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1319 pass
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1320 elif opcode in (self.DBG_START_LOCAL,
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1321 self.DBG_START_LOCAL_EXTENDED):
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1322 reg, sh = _uleb128(data[moff():moff() + 5])
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1323 moff(sh)
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1324 name, sh = _uleb128(data[moff():moff() + 5])
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1325 moff(sh)
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1326 descriptor, sh = _uleb128(data[moff():moff() + 5])
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1327 moff(sh)
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1328 if opcode == self.DBG_START_LOCAL_EXTENDED:
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1329 signature, sh = _uleb128(data[moff():moff() + 5])
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1330 moff(sh)
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1331 opcodes.append((opcode, reg, name, descriptor, signature))
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1332 else:
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1333 opcodes.append((opcode, reg, name, descriptor))
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1334 pass
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1335 pass
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1336 elif opcode == self.DBG_END_LOCAL:
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1337 reg, sh = _uleb128(data[moff():moff() + 5])
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1338 moff(sh)
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1339 opcodes.append((opcode, reg))
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1340 pass
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1341 elif opcode == self.DBG_RESTART_LOCAL:
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1342 reg, sh = _uleb128(data[moff():moff() + 5])
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1343 moff(sh)
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1344 opcodes.append((opcode, reg))
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1345 pass
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1346 elif opcode in (self.DBG_SET_PROLOGUE_END,
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1347 self.DBG_SET_EPILOGUE_BEGIN,
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1348 self.DBG_SET_FILE):
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1349 opcodes.append((opcode,))
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1350 pass
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1351 else:
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1352 opcodes.append((opcode,))
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1353 pass
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1354 pass
25
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
1355 self.opcodes = tuple(opcodes)
15
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1356
11
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1357 self.data_size = moff() - off
15
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1358
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1359 return self
13
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1360
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1361 def compute_size(self):
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1362 def compute_opcode_size(code):
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1363 opcode = code[0]
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1364
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1365 if opcode == self.DBG_END_SEQUENCE:
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1366 size = 1
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1367 elif opcode == self.DBG_ADVANCE_PC:
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1368 size = 1 + _uleb128_sz(code[1])
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1369 elif opcode == self.DBG_ADVANCE_LINE:
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1370 size = 1 + _leb128_sz(code[1])
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1371 elif opcode in (self.DBG_START_LOCAL,
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1372 self.DBG_START_LOCAL_EXTENDED):
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1373 size = 1 + _uleb128_sz(code[1]) + _uleb128_sz(code[2]) + \
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1374 _uleb128_sz(code[3])
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1375 if len(code) == 5:
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1376 size = size + _uleb128_sz(code[4])
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1377 pass
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1378 pass
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1379 elif opcode == self.DBG_END_LOCAL:
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1380 size = 1 + _uleb128_sz(code[1])
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1381 elif opcode == self.DBG_RESTART_LOCAL:
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1382 size = 1 + _uleb128_sz(code[1])
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1383 elif opcode in (self.DBG_SET_PROLOGUE_END,
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1384 self.DBG_SET_EPILOGUE_BEGIN,
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1385 self.DBG_SET_FILE):
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1386 size = 1
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1387 else:
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1388 size = 1
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1389 pass
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1390
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1391 return size
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1392
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1393 opcode_sizes = itertools.imap(compute_opcode_size, self.opcodes)
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1394 opcode_sizes = [i for i in opcode_sizes]
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1395 opcodes_size = sum(opcode_sizes)
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1396
15
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1397 self.data_size = opcodes_size
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1398 pass
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1399
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1400 def to_str(self):
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1401 #
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1402 # Parse debug opcodes
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1403 #
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1404 opcodes = self.opcodes
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1405 opcodebins = []
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1406 for code in opcodes:
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1407 opcode = code[0]
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1408
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1409 if opcode == self.DBG_END_SEQUENCE:
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1410 opcodebins.append(chr(opcode))
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1411 break
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1412 elif opcode == self.DBG_ADVANCE_PC:
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1413 codebin = chr(opcode) + _to_uleb128(code[1])
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1414 opcodebins.append(codebin)
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1415 pass
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1416 elif opcode == self.DBG_ADVANCE_LINE:
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1417 codebin = chr(opcode) + _to_leb128(code[1])
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1418 opcodebins.append(codebin)
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1419 pass
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1420 elif opcode == self.DBG_START_LOCAL:
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1421 codebin = chr(opcode) + _to_uleb128(code[1]) + \
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1422 _to_uleb128(code[2]) + _to_uleb128(code[3])
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1423 codebins.append(codebin)
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1424 pass
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1425 elif opcode == self.DBG_START_LOCAL_EXTENDED:
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1426 codebin = chr(opcode) + _to_uleb128(code[1]) + \
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1427 _to_uleb128(code[2]) + _to_uleb128(code[3]) + \
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1428 _to_uleb128(code[4])
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1429 codebins.append(codebin)
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1430 pass
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1431 elif opcode == self.DBG_END_LOCAL:
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1432 codebin = chr(opcode) + _to_uleb128(code[1])
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1433 codebins.append(codebin)
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1434 pass
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1435 elif opcode == self.DBG_RESTART_LOCAL:
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1436 codebin = chr(opcode) + _to_uleb128(code[1])
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1437 codebins.append(codebin)
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1438 pass
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1439 elif opcode in (self.DBG_SET_PROLOGUE_END,
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1440 self.DBG_SET_EPILOGUE_BEGIN,
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1441 self.DBG_SET_FILE):
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1442 opcodebins.append(chr(opcode))
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1443 pass
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1444 else:
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1445 opcodebins.append(chr(opcode))
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1446 pass
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1447 pass
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1448
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1449 return ''.join(opcodebins)
25
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
1450
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
1451 def children(self):
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
1452 return ('opcodes',)
15
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1453 pass
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1454
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1455
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1456 class _DEX_DebugInfoItem(composite):
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1457 start_line = uleb128
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1458 parameters_size = uleb128
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1459 parameters = array('parameters_size', uleb128)
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1460 opcodes = _DEX_DebugCodeBlock
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1461
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1462 child_names = 'start_line parameters_size parameters opcodes'.split()
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1463 pass
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1464
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1465
25
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
1466 class _DEX_StringDataItem(composite):
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
1467 size = uleb128
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
1468 data = rawstr_size_name('size')
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
1469 padding = rawstr(1)
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
1470
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
1471 child_names = 'size data padding'.split()
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
1472 pass
15
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1473
25
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
1474
27
15cb829ac442 travel_dex_type() recoganizes _dex_type correctly
Thinker K.F. Li <thinker@codemud.net>
parents: 25
diff changeset
1475 class dummy(_dex_type):
15
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1476 data_size = None
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1477
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1478 @staticmethod
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1479 def parse(parent, data, off):
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1480 size, sh = _uleb128(data[off:off + 5])
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1481 data = data[off + sh: off + sh + size]
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1482
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1483 self = _DEX_StringDataItem()
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1484
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1485 self.size = size
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1486 self.data = data
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1487 self.data_size = sh + size + 1
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1488 return self
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1489
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1490 def compute_size(self):
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1491 size = len(self.data)
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1492 self.size = size
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1493 size_sz = _uleb128_sz(size)
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1494 self.data_size = size_sz + size + 1
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1495 pass
13
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1496
15
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1497 def to_str(self):
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1498 size = len(self.data)
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1499 self.size = size
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1500 data = _uleb128(size) + self.data + '\x00'
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1501 return data
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1502 pass
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1503
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1504
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1505 class DEXFile(composite):
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1506 fname = None
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1507 data = None
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1508 header = _DEX_header
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1509 maps = _DEX_MapItemBlock
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1510 stringIds = array(None, _DEX_StringId)
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1511 typeIds = array(None, _DEX_TypeId)
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1512 protoIds = array(None, _DEX_ProtoId)
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1513 fieldIds = array(None, _DEX_FieldId)
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1514 methodIds = array(None, _DEX_MethodId)
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1515 classDefs = array(None, _DEX_ClassDef)
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1516 classDatas = array(None, _DEX_ClassData)
40
0c0a659187c2 Use _objs_asso to define association between two set of items.
Thinker K.F. Li <thinker@codemud.net>
parents: 33
diff changeset
1517 typeLists = array(None, _DEX_TypeList_align)
15
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1518 codeItems = array(None, _DEX_Code)
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1519 annotationSetItems = array(None, _DEX_AnnotationSetItem)
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1520 annotationsDirectoryItems = array(None, _DEX_AnnotationsDirectoryItem)
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1521 annotationItems = array(None, _DEX_AnnotationItem)
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1522 encodedArrayItems = array(None, _DEX_EncodedArrayItem)
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1523 debugInfoItems = array(None, _DEX_DebugInfoItem)
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1524 stringDataItems = array(None, _DEX_StringDataItem)
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1525
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1526 child_names = 'header'.split()
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1527
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1528 block_defs = {
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1529 # 0x0000: 'kDexTypeHeaderItem',
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1530 0x0001: 'stringIds',
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1531 0x0002: 'typeIds',
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1532 0x0003: 'protoIds',
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1533 0x0004: 'fieldIds',
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1534 0x0005: 'methodIds',
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1535 0x0006: 'classDefs',
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1536 # 0x1000: 'kDexTypeMapList',
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1537 0x1001: 'typeLists',
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1538 # 0x1002: 'kDexTypeAnnotationSetRefList',
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1539 0x1003: 'annotationSetItems',
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1540 0x2000: 'classDatas',
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1541 0x2001: 'codeItems',
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1542 0x2002: 'stringDataItems',
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1543 0x2003: 'debugInfoItems',
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1544 0x2004: 'annotationItems',
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1545 0x2005: 'encodedArrayItems',
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1546 0x2006: 'annotationsDirectoryItems'
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1547 }
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1548
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1549 @staticmethod
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1550 def open(fname):
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1551 fo = file(fname, 'r')
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1552 data = fo.read()
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1553
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1554 dex = DEXFile.parse(data)
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1555 dex.fname = fname
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1556 return dex
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1557
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1558 @classmethod
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1559 def parse(clazz, data):
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1560 obj = super(DEXFile, clazz).parse(None, data, 0)
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1561 obj.data = data
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1562 obj._parse(data)
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1563 return obj
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1564
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1565 def _parse_maps(self):
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1566 data = self.data
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1567 header = self.header
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1568 off = header.mapOff
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1569 self.parse_child('maps', data, off)
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1570 pass
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1571
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1572 def _parse_block(self, block_map):
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1573 if block_map.type not in self.block_defs:
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1574 return
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1575
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1576 data = self.data
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1577
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1578 child_name = self.block_defs[block_map.type]
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1579 off = block_map.offset
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1580 num = block_map.size
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1581
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1582 child_clazz = getattr(self.__class__, child_name)
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1583 blk = child_clazz.parse_nitem(self, data, off, num)
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1584 setattr(self, child_name, blk)
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1585 pass
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1586
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1587 def _parse_blocks(self):
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1588 data = self.data
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1589 maps = self.maps.items.items
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1590 for map in maps:
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1591 if map.type in self.block_defs:
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1592 self._parse_block(map)
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1593 pass
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1594 pass
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1595 pass
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1596
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1597 def _parse(self, data):
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1598 self._parse_maps()
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1599 self._parse_blocks()
13
c05fac334ab1 compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents: 12
diff changeset
1600 pass
25
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
1601
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
1602 def children(self):
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
1603 return 'header stringIds typeIds protoIds fieldIds methodIds ' \
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
1604 'classDefs typeLists annotationSetItems classDatas codeItems ' \
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
1605 'stringDataItems debugInfoItems annotationItems ' \
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
1606 'encodedArrayItems annotationsDirectoryItems'.split()
11
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1607 pass
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1608
409e2cd76f72 Parse DebugInfoItem
Thinker K.F. Li <thinker@codemud.net>
parents: 10
diff changeset
1609
1
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1610 if __name__ == '__main__':
25
670167ed06bb test dex_deptracker._link_dependencies()
Thinker K.F. Li <thinker@codemud.net>
parents: 24
diff changeset
1611 dex = DEXFile.open('data/testdata1.dex')
1
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1612
2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1613 print 'Header'
15
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1614 h = dex.header
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1615 for attr in h.child_names:
2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1616 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
1617 pass
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1618
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1619 print
15
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1620 print 'Size of stringIds is %d bytes' % (dex.stringIds.data_size)
1
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1621
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1622 print
15
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1623 print 'Size of typeIds is %d bytes' % (dex.typeIds.data_size)
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1624
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1625 print
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1626 print 'Size of protoIds is %d bytes' % (dex.protoIds.data_size)
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1627
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1628 print
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1629 print 'Size of fieldIds is %d bytes' % (dex.fieldIds.data_size)
2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1630
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1631 print
15
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1632 print 'Size of methodIds is %d bytes' % (dex.methodIds.data_size)
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1633
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1634 print
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1635 print 'Size of classDefs is %d bytes' % (dex.classDefs.data_size)
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1636
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1637 print
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1638 print 'Size of classDatas is %d bytes' % (dex.classDatas.data_size)
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1639
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1640 print
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1641 print 'Size of typeLists is %d bytes' % (dex.typeLists.data_size)
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1642
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1643 print
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1644 print 'Size of codeItems is %d bytes' % (dex.codeItems.data_size)
2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1645
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1646 print
15
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1647 print 'Size of annotationSetItems is %d bytes' % \
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1648 (dex.annotationSetItems.data_size)
2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1649
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1650 print
15
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1651 print 'Size of annotationsDirectoryItems is %d bytes' % \
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1652 (dex.annotationsDirectoryItems.data_size)
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1653
3
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
1654 print
15
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1655 print 'Size of annotationItems is %d bytes' % \
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1656 (dex.annotationItems.data_size)
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1657
4
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
1658 print
15
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1659 print 'Size of encodedArrayItems is %d bytes' % \
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1660 (dex.encodedArrayItems.data_size)
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1661
8
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
1662 print
15
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1663 print 'Size of debugInfoItems is %d bytes' % \
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1664 (dex.debugInfoItems.data_size)
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1665
10
123c7a8bbf4c Parse EncodedArrayItems
Thinker K.F. Li <thinker@codemud.net>
parents: 9
diff changeset
1666 print
15
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1667 print 'Size of stringDataItems is %d bytes' % \
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1668 (dex.stringDataItems.data_size)
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1669
2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1670 print
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1671 print 'Data maps'
15
c98be35b572b Rewrote dexfile.py to base on declaration
Thinker K.F. Li <thinker@codemud.net>
parents: 14
diff changeset
1672 maps = dex.maps.items.items
2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1673 for map in maps:
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1674 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
1675 map.types[map.type],
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1676 map.size,
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1677 map.offset)
18
f36b14d1f122 collect dependencies for classes in dexfile.py
Thinker K.F. Li <thinker@codemud.net>
parents: 17
diff changeset
1678 pass
1
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1679 pass