diff paraspace/injection.py @ 100:355986e5cfbd

Make surce methods of injected class are also being and bug fixed. - dex_type_2_array_attr_map() misses marked array attributes. - It is fixed by skiping marked array and use back type instead.
author Thinker K.F. Li <thinker@codemud.net>
date Tue, 26 Jul 2011 10:06:44 +0800
parents 3898711adb2c
children 61cef1662035
line wrap: on
line diff
--- a/paraspace/injection.py	Mon Jul 25 21:53:33 2011 +0800
+++ b/paraspace/injection.py	Tue Jul 26 10:06:44 2011 +0800
@@ -1,6 +1,14 @@
 
 def _relocatable_children(obj):
-    from paraspace.dexfile import relocatable
+    from paraspace.dexfile import relocatable, array
+    
+    if isinstance(obj, array):
+        if not obj.items:
+            return []
+        rel_children = [(repr(idx), elt)
+                        for idx, elt in enumerate(obj.items)
+                        if isinstance(elt, relocatable)]
+        return rel_children
     
     attr_value_pairs = [(attr, getattr(obj, attr)) for attr in dir(obj)]
     rel_children = [(attr, value) for attr, value in attr_value_pairs
@@ -45,11 +53,12 @@
             pass
         return clazz
     
-    attr_values = [(attr, getattr(DEXFile, attr))
+    attr_values = [(attr, skip_marker_type(getattr(DEXFile, attr)))
                    for attr in dir(DEXFile)]
-    type_2_attr = dict([(skip_marker_type(value.child_type), attr)
-                        for attr, value in attr_values
-                        if isinstance(value, array)])
+    array_attrs = [(skip_marker_type(value.child_type), attr)
+                   for attr, value in attr_values
+                   if isinstance(value, array)]
+    type_2_attr = dict(array_attrs)
     
     dex_type_2_array_attr_map = lambda: type_2_attr