Finish refactoring out py3compat and delete the file
authorEli Bendersky <eliben@gmail.com>
Tue, 16 Aug 2022 13:38:15 +0000 (06:38 -0700)
committerEli Bendersky <eliben@gmail.com>
Tue, 16 Aug 2022 13:38:15 +0000 (06:38 -0700)
Fixes #415

12 files changed:
elftools/common/py3compat.py [deleted file]
elftools/common/utils.py
elftools/dwarf/datatype_cpp.py
elftools/dwarf/descriptions.py
elftools/dwarf/die.py
elftools/elf/notes.py
examples/dwarf_decode_address.py
examples/dwarf_pubnames_types.py
scripts/dwarfdump.py
scripts/readelf.py
test/test_dwarf_cu_and_die_cache.py
test/utils.py

diff --git a/elftools/common/py3compat.py b/elftools/common/py3compat.py
deleted file mode 100644 (file)
index 7894896..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
-#-------------------------------------------------------------------------------
-# elftools: common/py3compat.py
-#
-# Python 2/3 compatibility code
-#
-# Eli Bendersky (eliben@gmail.com)
-# This code is in the public domain
-#-------------------------------------------------------------------------------
-import sys
-PY3 = sys.version_info[0] == 3
-assert PY3, '''\
-Python 2 is no longer supported by pyelftools; if you need to use Python 2,
-please download an older pyelftools version (such as version 0.29).
-'''
-
-
-if PY3:
-    # Functions for acting on bytestrings and strings. In Python 2 and 3,
-    # strings and bytes are the same and chr/ord can be used to convert between
-    # numeric byte values and their string representations. In Python 3, bytes
-    # and strings are different types and bytes hold numeric values when
-    # iterated over.
-
-
-    def bytes2str(b): return b.decode('latin-1')
-    def str2bytes(s): return s.encode('latin-1')
index 2355ed485895d6e0403c6e53c4155826af683ae7..b4bc1e73a1651bcaaab84691b99ba76113292d48 100644 (file)
@@ -19,6 +19,9 @@ def merge_dicts(*dicts):
         result.update(d)
     return result
 
+def bytes2str(b):
+    """Decode a bytes object into a string."""
+    return b.decode('latin-1')
 
 def bytelist2string(bytelist):
     """ Convert a list of byte values (e.g. [0x10 0x20 0x00]) to a bytes object
index 0986a385c1a555f987702ad13e3d8c26f60eeef8..45b23bb019bf2b365dbe63915d49af0116f59b8e 100644 (file)
@@ -7,7 +7,7 @@
 # Eli Bendersky (eliben@gmail.com)
 # This code is in the public domain
 #-------------------------------------------------------------------------------
-from ..common.py3compat import bytes2str
+from ..common.utils import bytes2str
 
 cpp_symbols = dict(
     pointer   = "*",
@@ -20,7 +20,7 @@ def describe_cpp_datatype(var_die):
 def parse_cpp_datatype(var_die):
     """Given a DIE that describes a variable, a parameter, or a member
     with DW_AT_type in it, tries to return the C++ datatype as a string
-    
+
     Returns a TypeDesc.
 
     Does not follow typedefs, doesn't  resolve array element types
@@ -48,7 +48,7 @@ def parse_cpp_datatype(var_die):
     # From this point on, type_die doesn't change
     t.tag = _strip_type_tag(type_die)
     t.modifiers = tuple(mods)
-    
+
     if t.tag in ('ptr_to_member', 'subroutine'):
         if t.tag == 'ptr_to_member':
             ptr_prefix = DIE_name(type_die.get_DIE_from_attribute('DW_AT_containing_type')) + "::"
@@ -103,8 +103,8 @@ def parse_cpp_datatype(var_die):
         # If unnamed scope, fall back to scope type - like "structure "
         parent = parent.get_parent()
     t.scopes = tuple(scopes)
-    
-    return t  
+
+    return t
 
 #--------------------------------------------------
 
@@ -133,7 +133,7 @@ class TypeDesc(object):
         self.name = None
         self.modifiers = () # Reads left to right
         self.scopes = () # Reads left to right
-        self.tag = None 
+        self.tag = None
         self.dimensions = None
 
     def __str__(self):
@@ -191,7 +191,7 @@ def get_class_spec_if_member(func_spec, the_func):
         class_spec = ClassDesc()
         class_spec.scopes = this_type.scopes + (this_type.name,)
         class_spec.const_member = any(("const", "pointer") == this_type.modifiers[i:i+2]
-            for i in range(len(this_type.modifiers))) # const -> pointer -> const for this arg of const 
+            for i in range(len(this_type.modifiers))) # const -> pointer -> const for this arg of const
         return class_spec
 
     # Check the parent element chain - could be a class
@@ -225,7 +225,7 @@ def DIE_is_ptr_to_member_struct(type_die):
     if type_die.tag == 'DW_TAG_structure_type':
         members = tuple(die for die in type_die.iter_children() if die.tag == "DW_TAG_member")
         return len(members) == 2 and safe_DIE_name(members[0]) == "__pfn" and safe_DIE_name(members[1]) == "__delta"
-    return False                        
+    return False
 
 def _strip_type_tag(die):
     """Given a DIE with DW_TAG_foo_type, returns foo"""
index 7861180f376906dd2bec473b5ffd1a0f04f9f0b5..90cbaa189e5cb5f8ccee6506314eeeeac255b987 100644 (file)
@@ -11,8 +11,7 @@ from collections import defaultdict
 from .constants import *
 from .dwarf_expr import DWARFExprParser
 from .die import DIE
-from ..common.utils import preserve_stream_pos, dwarf_assert
-from ..common.py3compat import bytes2str
+from ..common.utils import preserve_stream_pos, dwarf_assert, bytes2str
 from .callframe import instruction_name, CIE, FDE
 
 
index 6d9a764e953075a39c3076e8c44b6f8e573c76f2..ef6d90834c4bbec77d5f8b11498c69a8b5532855 100755 (executable)
@@ -10,8 +10,7 @@ from collections import namedtuple, OrderedDict
 import os
 
 from ..common.exceptions import DWARFError
-from ..common.py3compat import bytes2str
-from ..common.utils import struct_parse, preserve_stream_pos
+from ..common.utils import bytes2str, struct_parse, preserve_stream_pos
 from .enums import DW_FORM_raw2name
 from .dwarf_util import _resolve_via_offset_table, _get_base_offset
 
index 60648c606ead191fb50f05c4ac50a2eeef8a403c..c708cbfab4090cce6cdcf6308555a58d00381d72 100644 (file)
@@ -6,8 +6,7 @@
 # Eli Bendersky (eliben@gmail.com)
 # This code is in the public domain
 #-------------------------------------------------------------------------------
-from ..common.py3compat import bytes2str
-from ..common.utils import struct_parse, bytes2hex, roundup
+from ..common.utils import struct_parse, bytes2hex, roundup, bytes2str
 from ..construct import CString
 
 
index 007ba080478612e383d7956b14dc1fb0d6384b52..e335d0bb5d9ac48668f31c42fd2b595de275117f 100644 (file)
@@ -14,7 +14,7 @@ import sys
 # examples/ dir of the source distribution.
 sys.path[0:0] = ['.', '..']
 
-from elftools.common.py3compat import bytes2str
+from elftools.common.utils import bytes2str
 from elftools.dwarf.descriptions import describe_form_class
 from elftools.elf.elffile import ELFFile
 
index d9daaff493e934ed2e1a54a3bd5c7de79182f344..708706f52c08e76ee61dca9f5370169ef9c04246 100644 (file)
@@ -17,7 +17,7 @@ import sys
 sys.path[0:0] = ['.', '..']
 
 from elftools.elf.elffile import ELFFile
-from elftools.common.py3compat import bytes2str
+from elftools.common.utils import bytes2str
 
 def process_file(filename):
     print('Processing file:', filename)
index ca6bac3717f5b95be721b9f9f60024e6ae55cbc3..e593f1c63f82387b9b5ca1aea9c4bf41542027a0 100644 (file)
@@ -23,7 +23,7 @@ sys.path.insert(0, '.')
 
 from elftools import __version__
 from elftools.common.exceptions import DWARFError, ELFError
-from elftools.common.py3compat import bytes2str
+from elftools.common.utils import bytes2str
 from elftools.elf.elffile import ELFFile
 from elftools.dwarf.locationlists import LocationParser, LocationEntry, LocationExpr, LocationViewPair, BaseAddressEntry as LocBaseAddressEntry
 from elftools.dwarf.ranges import RangeEntry # ranges.BaseAddressEntry collides with the one above
index cd9d38493ad8a7611df8ebc851d10eb5c951e8df..8a4428254f98e7bdf5bf3004a0454f55eeafa2ad 100755 (executable)
@@ -26,9 +26,7 @@ sys.path.insert(0, '.')
 
 from elftools import __version__
 from elftools.common.exceptions import ELFError
-from elftools.common.py3compat import (
-         bytes2str, str2bytes)
-from elftools.common.utils import iterbytes
+from elftools.common.utils import bytes2str, iterbytes
 from elftools.elf.elffile import ELFFile
 from elftools.elf.dynamic import DynamicSection, DynamicSegment
 from elftools.elf.enums import ENUM_D_TAG
index bf7f4d785ce63cdabc382e978c639d1654d465f0..5180e12d4096c125b53bf5117c433394942f9a22 100644 (file)
@@ -8,7 +8,7 @@ import os
 import unittest
 
 from elftools.elf.elffile import ELFFile
-from elftools.common.py3compat import bytes2str
+from elftools.common.utils import bytes2str
 
 class TestCacheLUTandDIEref(unittest.TestCase):
     def dprint(self, list):
index 4669cf8458a96dc4a02a31a333270b1946931211..f90f653bee0911460afac8c0d9ab014e54e47ab8 100644 (file)
@@ -22,8 +22,7 @@ def run_exe(exe_path, args=[], echo=False):
       print('[cmd]', ' '.join(popen_cmd))
     proc = subprocess.Popen(popen_cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
     proc_stdout = proc.communicate()[0]
-    from elftools.common.py3compat import bytes2str
-    return proc.returncode, bytes2str(proc_stdout)
+    return proc.returncode, proc_stdout.decode('latin-1')
 
 
 def is_in_rootdir():