def scan_file_object()

in src/advisor/scanners/source_scanner.py [0:0]


    def scan_file_object(self, filename, file_object, report):
        continuation_parser = ContinuationParser()
        naive_cpp = NaiveCpp()
        comment_parser = NaiveCommentParser()
        function_parser = NaiveFunctionParser()

        found_aarch64_inline_asm = False
        inline_asm_issues = []
        preprocessor_errors = []

        for lineno, line in enumerate(file_object, 1):
            line = continuation_parser.parse_line(line)

            if not line:
                continue

            is_comment = comment_parser.parse_line(line)
            if is_comment:
                continue

            result = naive_cpp.parse_line(line)
            if result.directive_type == PreprocessorDirective.TYPE_ERROR \
                    and naive_cpp.in_other_arch_else_code():
                preprocessor_errors.append(PreprocessorErrorIssue(filename,
                                                                  lineno,
                                                                  line.strip(),
                                                                  function=function_parser.current_function))
            elif result.directive_type == PreprocessorDirective.TYPE_CONDITIONAL \
                    and result.is_compiler:
                if_line = result.if_line or line
                if if_line != line:
                    if_line = '%s /* %s */' % (line.strip(),
                                               if_line.strip())
                else:
                    if_line = if_line.strip()
                report.add_issue(CompilerSpecificIssue(
                                 filename, lineno, if_line.strip(),
                                 function=function_parser.current_function))
            elif result.directive_type == PreprocessorDirective.TYPE_PRAGMA \
                    and SourceScanner.PRAGMA_SIMD_RE_PROG.search(line):
                report.add_issue(PragmaSimdIssue(
                    filename, lineno, line.strip(),
                    function=function_parser.current_function))
            elif (result.directive_type == PreprocessorDirective.TYPE_DEFINE and result.body) \
                    or not result.directive_type:
                if result.directive_type == PreprocessorDirective.TYPE_DEFINE:
                    line = result.body
                    function = result.macro_name
                else:
                    function_parser.parse_line(line)
                    function = function_parser.current_function

                if naive_cpp.in_aarch64_specific_code() or is_aarch64_specific_file_name(filename):
                    if function:
                        self.aarch64_functions.add(function)

                if SourceScanner.INLINE_ASM_RE_PROG.search(line) and \
                    not '(""' in line and \
                        not '".symver ' in line:
                    if naive_cpp.in_aarch64_specific_code():
                        found_aarch64_inline_asm = True
                    else:
                        inline_asm_issues.append(
                            InlineAsmIssue(filename, lineno, function=function))
                    if naive_cpp.in_aarch64_specific_code() or is_aarch64_specific_file_name(filename):
                        self.aarch64_intrinsic_inline_asm_files.add(filename)
                        if function:
                            self.aarch64_intrinsic_inline_asm_functions.add(function)
                    else:
                        if not filename in self.other_arch_intrinsic_inline_asm_files:
                            self.other_arch_intrinsic_inline_asm_files[filename] = \
                                NoEquivalentInlineAsmIssue(filename, lineno)
                        if function and not function in self.other_arch_intrinsic_inline_asm_functions:
                            self.other_arch_intrinsic_inline_asm_functions[function] = \
                                NoEquivalentInlineAsmIssue(filename, lineno, function=function)

                arm_match = SourceScanner.ARM_INTRINSICS_RE_PROG.search(line)
                other_match = SourceScanner.OTHER_ARCH_INTRINSICS_RE_PROG.search(line)
                avx_256_match = SourceScanner.AVX_256_ARCH_INTRINSICS_RE_PROG.search(line)
                avx_512_match = SourceScanner.AVX_512_ARCH_INTRINSICS_RE_PROG.search(line)
                if other_match and not arm_match:
                    intrinsic = other_match.group(1)
                    if not self.filter_ported_code or not naive_cpp.in_other_arch_specific_code():
                        if avx_256_match:
                            report.add_issue(Avx256IntrinsicIssue(
                                filename, lineno, intrinsic, function=function))
                        elif avx_512_match:
                            report.add_issue(Avx512IntrinsicIssue(
                                filename, lineno, intrinsic, function=function))
                        else:
                            report.add_issue(IntrinsicIssue(
                                filename, lineno, intrinsic, function=function))
                    if not filename in self.other_arch_intrinsic_inline_asm_files:
                        self.other_arch_intrinsic_inline_asm_files[filename] = \
                            NoEquivalentIntrinsicIssue(filename, lineno, intrinsic)
                    if function and not function in self.other_arch_intrinsic_inline_asm_functions:
                        self.other_arch_intrinsic_inline_asm_functions[function] = \
                            NoEquivalentIntrinsicIssue(filename, lineno, intrinsic, function=function)

                if arm_match:
                    self.aarch64_intrinsic_inline_asm_files.add(filename)
                    if function:
                        self.aarch64_intrinsic_inline_asm_functions.add(function)

        if not self.filter_ported_code or not found_aarch64_inline_asm:
            for issue in inline_asm_issues:
                if not self.filter_ported_code or not issue.function or not issue.function in self.aarch64_functions:
                    report.add_issue(issue)
        for issue in preprocessor_errors:
            report.add_issue(issue)