def _findUnreachableCode(code) : # code after RETURN or RAISE is unreachable unless there's a branch to it unreachable = {} terminals = code.returnValues[:-1] + code.raiseValues terminals.sort(lambda a, b: cmp(a[2], b[2])) for line, dummy, i in terminals : if not code.branches.has_key(i) : unreachable[i] = line # find the index of the last return lastLine = lastItem = lastIndex = None if code.returnValues: lastLine, lastItem, lastIndex = code.returnValues[-1] if len(code.returnValues) >= 2 : lastIndex = code.returnValues[-2][2] if code.raiseValues : lastIndex = max(lastIndex, code.raiseValues[-1][2]) # remove last return if it's unreachable AND implicit if unreachable.get(lastIndex) == lastLine and lastItem and \ lastItem.isImplicitNone(): del code.returnValues[-1] del unreachable[lastIndex] if cfg().unreachableCode : for index in unreachable.keys() : try : if not OP.JUMP_FORWARD(ord(code.bytes[index])) : code.addWarning(msgs.CODE_UNREACHABLE, unreachable[index]) except IndexError : pass