@@ -486,7 +486,11 @@ private TrapLocker(IrDeclaration decl, String signature) {
486
486
// We encode the metadata into the filename, so that the
487
487
// TRAP filenames for different metadatas don't overlap.
488
488
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 );
490
494
trapFile = new File (trapFileBase .getPath () + '#' + trapFileVersion .toString () + ".trap.gz" );
491
495
}
492
496
}
@@ -539,9 +543,14 @@ public void close() {
539
543
for (File f : FileUtil .list (trapFileDir )) {
540
544
String name = f .getName ();
541
545
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
+ }
545
554
}
546
555
}
547
556
if (pairs .isEmpty ()) {
0 commit comments