### Eclipse Workspace Patch 1.0 #P org.eclipse.jdt.core Index: model/org/eclipse/jdt/internal/core/util/HashtableOfArrayToObject.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/util/HashtableOfArrayToObject.java,v retrieving revision 1.7 diff -u -r1.7 HashtableOfArrayToObject.java --- model/org/eclipse/jdt/internal/core/util/HashtableOfArrayToObject.java 27 Jun 2008 16:03:57 -0000 1.7 +++ model/org/eclipse/jdt/internal/core/util/HashtableOfArrayToObject.java 26 Nov 2008 15:41:51 -0000 @@ -82,6 +82,21 @@ return null; } + public int getIndex(Object[] key) { + int length = this.keyTable.length; + int index = hashCode(key) % length; + int keyLength = key.length; + Object[] currentKey; + while ((currentKey = this.keyTable[index]) != null) { + if (currentKey.length == keyLength && Util.equalArraysOrNull(currentKey, key)) + return index; + if (++index == length) { + index = 0; + } + } + return -1; + } + public Object[] getKey(Object[] key, int keyLength) { int length = this.keyTable.length; int index = hashCode(key, keyLength) % length; Index: model/org/eclipse/jdt/internal/core/NameLookup.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/NameLookup.java,v retrieving revision 1.121 diff -u -r1.121 NameLookup.java --- model/org/eclipse/jdt/internal/core/NameLookup.java 27 Jun 2008 16:03:51 -0000 1.121 +++ model/org/eclipse/jdt/internal/core/NameLookup.java 26 Nov 2008 15:41:51 -0000 @@ -350,8 +350,11 @@ if (index != -1) { cuName= cuName.substring(0, index); } - Object value = this.packageFragments.get(pkgName); - if (value != null) { + int pkgIndex = this.packageFragments.getIndex(pkgName); + if (pkgIndex != -1) { + Object value = this.packageFragments.valueTable[pkgIndex]; + // reuse existing String[] + pkgName = (String[]) this.packageFragments.keyTable[pkgIndex]; if (value instanceof PackageFragmentRoot) { return findCompilationUnit(pkgName, cuName, (PackageFragmentRoot) value); } else { @@ -556,16 +559,19 @@ return result; } else { String[] splittedName = Util.splitOn('.', name, 0, name.length()); - Object value = this.packageFragments.get(splittedName); - if (value == null) + int pkgIndex = this.packageFragments.getIndex(splittedName); + if (pkgIndex == -1) return null; + Object value = this.packageFragments.valueTable[pkgIndex]; + // reuse existing String[] + String[] pkgName = (String[]) this.packageFragments.keyTable[pkgIndex]; if (value instanceof PackageFragmentRoot) { - return new IPackageFragment[] {((PackageFragmentRoot) value).getPackageFragment(splittedName)}; + return new IPackageFragment[] {((PackageFragmentRoot) value).getPackageFragment(pkgName)}; } else { IPackageFragmentRoot[] roots = (IPackageFragmentRoot[]) value; IPackageFragment[] result = new IPackageFragment[roots.length]; for (int i= 0; i < roots.length; i++) { - result[i] = ((PackageFragmentRoot) roots[i]).getPackageFragment(splittedName); + result[i] = ((PackageFragmentRoot) roots[i]).getPackageFragment(pkgName); } return result; } @@ -900,17 +906,22 @@ } } else { String[] splittedName = Util.splitOn('.', name, 0, name.length()); - Object value = this.packageFragments.get(splittedName); - if (value instanceof PackageFragmentRoot) { - requestor.acceptPackageFragment(((PackageFragmentRoot) value).getPackageFragment(splittedName)); - } else { - IPackageFragmentRoot[] roots = (IPackageFragmentRoot[]) value; - if (roots != null) { - for (int i = 0, length = roots.length; i < length; i++) { - if (requestor.isCanceled()) - return; - PackageFragmentRoot root = (PackageFragmentRoot) roots[i]; - requestor.acceptPackageFragment(root.getPackageFragment(splittedName)); + int pkgIndex = this.packageFragments.getIndex(splittedName); + if (pkgIndex != -1) { + Object value = this.packageFragments.valueTable[pkgIndex]; + // reuse existing String[] + String[] pkgName = (String[]) this.packageFragments.keyTable[pkgIndex]; + if (value instanceof PackageFragmentRoot) { + requestor.acceptPackageFragment(((PackageFragmentRoot) value).getPackageFragment(pkgName)); + } else { + IPackageFragmentRoot[] roots = (IPackageFragmentRoot[]) value; + if (roots != null) { + for (int i = 0, length = roots.length; i < length; i++) { + if (requestor.isCanceled()) + return; + PackageFragmentRoot root = (PackageFragmentRoot) roots[i]; + requestor.acceptPackageFragment(root.getPackageFragment(pkgName)); + } } } }