diff options
author | Ned Batchelder <ned@nedbatchelder.com> | 2010-03-13 20:12:05 -0500 |
---|---|---|
committer | Ned Batchelder <ned@nedbatchelder.com> | 2010-03-13 20:12:05 -0500 |
commit | 78e2e6eb38d229cfcd4d0202f27761cd5bab2495 (patch) | |
tree | 93866af62ea60710682aaa5a6e709b55cd29b69b /coverage/parser.py | |
parent | 543ff12a09952b132abd9aa863d4170c4e2523f4 (diff) | |
parent | a5e4aa218a749f9ea73bccea4cac92bd35387451 (diff) | |
download | python-coveragepy-78e2e6eb38d229cfcd4d0202f27761cd5bab2495.tar.gz |
Merged Ben Finney's use-os-path-module fixes (again?)
Diffstat (limited to 'coverage/parser.py')
-rw-r--r-- | coverage/parser.py | 17 |
1 files changed, 15 insertions, 2 deletions
diff --git a/coverage/parser.py b/coverage/parser.py index 43f691f..aea05f3 100644 --- a/coverage/parser.py +++ b/coverage/parser.py @@ -256,6 +256,11 @@ OPS_CHUNK_END = _opcode_set( 'BREAK_LOOP', 'CONTINUE_LOOP', ) +# Opcodes that unconditionally begin a new code chunk. By starting new chunks +# with unconditional jump instructions, we neatly deal with jumps to jumps +# properly. +OPS_CHUNK_BEGIN = _opcode_set('JUMP_ABSOLUTE', 'JUMP_FORWARD') + # Opcodes that push a block on the block stack. OPS_PUSH_BLOCK = _opcode_set('SETUP_LOOP', 'SETUP_EXCEPT', 'SETUP_FINALLY') @@ -310,7 +315,7 @@ class ByteParser(object): return map(lambda c: ByteParser(code=c), CodeObjects(self.code)) # Getting numbers from the lnotab value changed in Py3.0. - if sys.hexversion >= 0x03000000: + if sys.version_info >= (3, 0): def _lnotab_increments(self, lnotab): """Return a list of ints from the lnotab bytes in 3.x""" return list(lnotab) @@ -399,12 +404,20 @@ class ByteParser(object): ult = penult = None for bc in ByteCodes(self.code.co_code): - # Maybe have to start a new block + # Maybe have to start a new chunk if bc.offset in bytes_lines_map: + # Start a new chunk for each source line number. if chunk: chunk.exits.add(bc.offset) chunk = Chunk(bc.offset, bytes_lines_map[bc.offset]) chunks.append(chunk) + elif bc.op in OPS_CHUNK_BEGIN: + # Jumps deserve their own unnumbered chunk. This fixes + # problems with jumps to jumps getting confused. + if chunk: + chunk.exits.add(bc.offset) + chunk = Chunk(bc.offset) + chunks.append(chunk) if not chunk: chunk = Chunk(bc.offset) |