checkpatch: improve octal permissions test speed
[linux-2.6-block.git] / scripts / checkpatch.pl
index 3d3ef2ff62b2965d892f0ea31817a6e927107376..9f03345a1c5cdc7e9ac22ed3f17306729681c00d 100755 (executable)
@@ -388,6 +388,13 @@ our @mode_permission_funcs = (
        ["(?:CLASS|DEVICE|SENSOR)_ATTR", 2],
 );
 
+#Create a search pattern for all these functions to speed up a loop below
+our $mode_perms_search = "";
+foreach my $entry (@mode_permission_funcs) {
+       $mode_perms_search .= '|' if ($mode_perms_search ne "");
+       $mode_perms_search .= $entry->[0];
+}
+
 our $allowed_asm_includes = qr{(?x:
        irq|
        memory
@@ -4524,26 +4531,30 @@ sub process {
                             "Exporting world writable files is usually an error. Consider more restrictive permissions.\n" . $herecurr);
                }
 
-               foreach my $entry (@mode_permission_funcs) {
-                       my $func = $entry->[0];
-                       my $arg_pos = $entry->[1];
-
-                       my $skip_args = "";
-                       if ($arg_pos > 1) {
-                               $arg_pos--;
-                               $skip_args = "(?:\\s*$FuncArg\\s*,\\s*){$arg_pos,$arg_pos}";
-                       }
-                       my $test = "\\b$func\\s*\\(${skip_args}([\\d]+)\\s*[,\\)]";
-                       if ($^V && $^V ge 5.10.0 &&
-                           $line =~ /$test/) {
-                               my $val = $1;
-                               $val = $6 if ($skip_args ne "");
-
-                               if ($val !~ /^0$/ &&
-                                   (($val =~ /^$Int$/ && $val !~ /^$Octal$/) ||
-                                    length($val) ne 4)) {
-                                       ERROR("NON_OCTAL_PERMISSIONS",
-                                             "Use 4 digit octal (0777) not decimal permissions\n" . $herecurr);
+# Mode permission misuses where it seems decimal should be octal
+# This uses a shortcut match to avoid unnecessary uses of a slow foreach loop
+               if ($^V && $^V ge 5.10.0 &&
+                   $line =~ /$mode_perms_search/) {
+                       foreach my $entry (@mode_permission_funcs) {
+                               my $func = $entry->[0];
+                               my $arg_pos = $entry->[1];
+
+                               my $skip_args = "";
+                               if ($arg_pos > 1) {
+                                       $arg_pos--;
+                                       $skip_args = "(?:\\s*$FuncArg\\s*,\\s*){$arg_pos,$arg_pos}";
+                               }
+                               my $test = "\\b$func\\s*\\(${skip_args}([\\d]+)\\s*[,\\)]";
+                               if ($line =~ /$test/) {
+                                       my $val = $1;
+                                       $val = $6 if ($skip_args ne "");
+
+                                       if ($val !~ /^0$/ &&
+                                           (($val =~ /^$Int$/ && $val !~ /^$Octal$/) ||
+                                            length($val) ne 4)) {
+                                               ERROR("NON_OCTAL_PERMISSIONS",
+                                                     "Use 4 digit octal (0777) not decimal permissions\n" . $herecurr);
+                                       }
                                }
                        }
                }