some performance improvements
authorEli Bendersky <eliben@gmail.com>
Sun, 27 Nov 2011 04:34:47 +0000 (06:34 +0200)
committerEli Bendersky <eliben@gmail.com>
Sun, 27 Nov 2011 04:34:47 +0000 (06:34 +0200)
elftools/common/utils.py
elftools/dwarf/dwarfinfo.py

index 2b55e5e256695150c27de29326a1518df37e4a44..2ce6746506ad954878426133e3e93e101e6e0da7 100644 (file)
@@ -32,6 +32,20 @@ def struct_parse(struct, stream, stream_pos=None):
         raise ELFParseError(e.message)
     
 
+def parse_cstring_from_stream(stream, stream_pos=None):
+    """ Parse a C-string from the given stream. The string is returned without
+        the terminating \x00 byte.
+        If stream_pos is provided, the stream is seeked to this position before
+        the parsing is done. Otherwise, the current position of the stream is
+        used.
+    """
+    # I could've just used construct.CString, but this function is 4x faster.
+    # Since it's needed a lot, I created it as an optimization.
+    if stream_pos is not None:
+        stream.seek(stream_pos)
+    return ''.join(iter(lambda: stream.read(1), '\x00'))
+
+
 def elf_assert(cond, msg=''):
     """ Assert that cond is True, otherwise raise ELFError(msg)
     """
index bfbba8d175fd737584aff6dd1f4fddb39a936d12..db42017f3a929fb61b71e0431fabda58993e9955 100644 (file)
@@ -10,7 +10,8 @@ from collections import namedtuple
 
 from ..construct import CString
 from ..common.exceptions import DWARFError
-from ..common.utils import struct_parse, dwarf_assert
+from ..common.utils import (struct_parse, dwarf_assert,
+                            parse_cstring_from_stream)
 from .structs import DWARFStructs
 from .compileunit import CompileUnit
 from .abbrevtable import AbbrevTable
@@ -115,10 +116,7 @@ class DWARFInfo(object):
         """ Obtain a string from the string table section, given an offset 
             relative to the section.
         """
-        return struct_parse(
-            CString(''),
-            self.debug_str_sec.stream,
-            stream_pos=offset)
+        return parse_cstring_from_stream(self.debug_str_sec.stream, offset)
     
     #------ PRIVATE ------#