@@ -486,7 +486,11 @@ private TrapLocker(IrDeclaration decl, String signature) {
486486 // We encode the metadata into the filename, so that the
487487 // TRAP filenames for different metadatas don't overlap.
488488 trapFileVersion = TrapClassVersion .fromSymbol (sym , log );
489- trapFileBase = new File (normalTrapFile .getParentFile (), normalTrapFile .getName ().replace (".trap.gz" , "" ));
489+ String baseName = normalTrapFile .getName ().replace (".trap.gz" , "" );
490+ // If a class has lots of inner classes, then we get lots of files
491+ // in a single directory. This makes our directory listings later slow.
492+ // To avoid this, rather than using files named .../Foo*, we use .../Foo/Foo*.
493+ trapFileBase = new File (new File (normalTrapFile .getParentFile (), baseName ), baseName );
490494 trapFile = new File (trapFileBase .getPath () + '#' + trapFileVersion .toString () + ".trap.gz" );
491495 }
492496 }
@@ -539,9 +543,14 @@ public void close() {
539543 for (File f : FileUtil .list (trapFileDir )) {
540544 String name = f .getName ();
541545 Matcher m = selectClassVersionComponents .matcher (name );
542- if (m .matches () && m .group (1 ).equals (trapFileBaseName )) {
543- TrapClassVersion v = new TrapClassVersion (Integer .valueOf (m .group (2 )), Integer .valueOf (m .group (3 )), Long .valueOf (m .group (4 )), m .group (5 ));
544- pairs .add (new Pair <File , TrapClassVersion >(f , v ));
546+ if (m .matches ()) {
547+ if (m .group (1 ).equals (trapFileBaseName )) {
548+ TrapClassVersion v = new TrapClassVersion (Integer .valueOf (m .group (2 )), Integer .valueOf (m .group (3 )), Long .valueOf (m .group (4 )), m .group (5 ));
549+ pairs .add (new Pair <File , TrapClassVersion >(f , v ));
550+ } else {
551+ // Everything in this directory should be for the same TRAP file base
552+ log .error ("Unexpected sibling " + m .group (1 ) + " when extracting " + trapFileBaseName );
553+ }
545554 }
546555 }
547556 if (pairs .isEmpty ()) {
0 commit comments