# HG changeset patch # User Thinker K.F. Li # Date 1308960976 -28800 # Node ID fa8fe7d714b9342c3a0421dee9ca2cbffa7692f6 # Parent 7f23def22a957e02dd500932439cc616311daea1 Fix semantic bug of dexfile.depend_off_rel by searching relative offset. - _DEX_Try.handlerOff is not one2one mapped to a _DEX_Catch of common _DEX_Code object. - But, previous _link_dependencies() was wrote based on this idea. - This changeset fix the behavior by searching depend-on object with right offset related to 'relative_to' object of the 'depend_off_rel' instance. diff -r 7f23def22a95 -r fa8fe7d714b9 paraspace/dex_deptracker.py --- a/paraspace/dex_deptracker.py Fri Jun 24 10:56:33 2011 +0800 +++ b/paraspace/dex_deptracker.py Sat Jun 25 08:16:16 2011 +0800 @@ -519,7 +519,7 @@ name_path1 = dep[1] if name_path1 not in all_markers: all_markers.add(name_path1) - _install_rel_offset_marker(name_path1) + _install_offset_marker(name_path1) pass name_path2 = dep[2] @@ -715,8 +715,9 @@ dep = all_dep_decls[name_path] dep_type = dep[0] if dep_type == dexfile.depend_off_rel: - depon1 = _rel_offset_marker.find_depon(dep[1], parents) depon2 = _rel_offset_marker.find_depon(dep[2], parents) + offset = depon2.data_offset + obj + depon1 = markers_info[dep[1]][offset] name = name_path.split('.')[-1] _dex_tree_set_child(imm_parent, name, (depon1, depon2)) diff -r 7f23def22a95 -r fa8fe7d714b9 paraspace/dexfile.py --- a/paraspace/dexfile.py Fri Jun 24 10:56:33 2011 +0800 +++ b/paraspace/dexfile.py Sat Jun 25 08:16:16 2011 +0800 @@ -1006,11 +1006,10 @@ class _DEX_Try(composite): startAddr = uint32 insnCount = uint16 - catch_ref = ref('_DEX_Catch') handlerOff = depend_off_rel('_DEX_Code.handlers_size', - '_DEX_Try.catch_ref')(uint16) + '_DEX_Catch')(uint16) - child_names = 'startAddr insnCount catch_ref handlerOff'.split() + child_names = 'startAddr insnCount handlerOff'.split() pass @@ -1034,9 +1033,8 @@ handlers = array('count', _DEX_CatchHandler) catchAllHandler = cond((lambda parent, data, off: parent.catchesAll), _DEX_CatchAllHandler) - try_ref = ref('_DEX_Try') - child_names = 'size handlers catchAllHandler try_ref'.split() + child_names = 'size handlers catchAllHandler'.split() @property def catchesAll(self): @@ -1068,15 +1066,13 @@ handlers_size = cond(_has_tries, uleb128) catch_handler_items = cond(_has_tries, array('handlers_size.value', _DEX_Catch)) - try_catch_asso = one2one('try_items.value.items', 'catch_ref', - 'catch_handler_items.value.items', 'try_ref') padding2 = auto_align(2) child_names = \ 'registersSize insSize outsSize triesSize debugInfoOff ' \ 'insnsSize insns padding try_items handlers_size ' \ - 'catch_handler_items try_catch_asso padding2'.split() + 'catch_handler_items padding2'.split() pass diff -r 7f23def22a95 -r fa8fe7d714b9 paraspace/tests/dexfile_test.py --- a/paraspace/tests/dexfile_test.py Fri Jun 24 10:56:33 2011 +0800 +++ b/paraspace/tests/dexfile_test.py Sat Jun 25 08:16:16 2011 +0800 @@ -37,7 +37,7 @@ assert deps['_DEX_ClassDef.staticValuesOffRef.value'][1] == \ '_DEX_EncodedArrayItem' assert deps['_DEX_Try.handlerOff'][0] == dexfile.depend_off_rel - assert deps['_DEX_Try.handlerOff'][1] == '_DEX_Try.catch_ref' + assert deps['_DEX_Try.handlerOff'][1] == '_DEX_Catch' assert deps['_DEX_Try.handlerOff'][2] == '_DEX_Code.handlers_size' pass @@ -248,13 +248,6 @@ code_item = dex.codeItems.items[0] assert code_item.debugInfoOff.__class__.__name__ == '_DEX_DebugInfoItem' - - code_item = dex.codeItems.items[4] - assert code_item.try_items.value - try_item = code_item.try_items.value.items[0] - assert try_item.catch_ref is not None - catch_item = code_item.catch_handler_items.value.items[0] - assert catch_item.try_ref is not None anno_dir_item = dex.annotationsDirectoryItems.items[0] assert isinstance(anno_dir_item.classAnnotationsOffRef.value,