From 5df3ffdd2196b606cf5d81911a1fb2a3944eb670 Mon Sep 17 00:00:00 2001 From: Dmitry Avdeev Date: Sun, 11 Mar 2012 12:43:42 +0400 Subject: [PATCH 1/3] better cache --- .../psi/impl/source/xml/XmlTagImpl.java | 30 +++++++++++-------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/xml/impl/src/com/intellij/psi/impl/source/xml/XmlTagImpl.java b/xml/impl/src/com/intellij/psi/impl/source/xml/XmlTagImpl.java index c648003b4bea..fe558eeb8b39 100644 --- a/xml/impl/src/com/intellij/psi/impl/source/xml/XmlTagImpl.java +++ b/xml/impl/src/com/intellij/psi/impl/source/xml/XmlTagImpl.java @@ -92,6 +92,22 @@ public class XmlTagImpl extends XmlElementImpl implements XmlTag { private final int myHC = ourHC++; private static final RecursionGuard ourGuard = RecursionManager.createGuard("xmlTag"); + private static final Key> SUBTAGS_KEY = Key.create("subtags"); + private static final ParameterizedCachedValueProvider CACHED_VALUE_PROVIDER = + new ParameterizedCachedValueProvider() { + @Override + public CachedValueProvider.Result compute(XmlTagImpl tag) { + final List result = new ArrayList(); + + tag.fillSubTags(result); + + final int s = result.size(); + XmlTag[] tags = s > 0 ? ContainerUtil.toArray(result, new XmlTag[s]) : EMPTY; + return CachedValueProvider.Result + .create(tags, PsiModificationTracker.OUT_OF_CODE_BLOCK_MODIFICATION_COUNT, tag.getContainingFile()); + } + }; + @Override public final int hashCode() { return myHC; @@ -606,19 +622,7 @@ public class XmlTagImpl extends XmlElementImpl implements XmlTag { @NotNull public XmlTag[] getSubTags() { - return CachedValuesManager.getManager(getProject()).getCachedValue(this, new CachedValueProvider() { - @Override - public Result compute() { - final List result = new ArrayList(); - - fillSubTags(result); - - final int s = result.size(); - XmlTag[] tags = s > 0 ? ContainerUtil.toArray(result, new XmlTag[s]) : EMPTY; - return Result.create(tags, PsiModificationTracker.OUT_OF_CODE_BLOCK_MODIFICATION_COUNT, getContainingFile()); - - } - }); + return CachedValuesManager.getManager(getProject()).getParameterizedCachedValue(this, SUBTAGS_KEY, CACHED_VALUE_PROVIDER, false, this); } protected void fillSubTags(final List result) { From 9d2da80e37c9f8e29d7f5fd3268f5682b2a1c7a5 Mon Sep 17 00:00:00 2001 From: Dmitry Avdeev Date: Sun, 11 Mar 2012 15:41:28 +0400 Subject: [PATCH 2/3] EA-33679 - NPE: ComponentManagerImpl.disposeComponents --- .../intellij/openapi/components/impl/ComponentManagerImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/core-impl/src/com/intellij/openapi/components/impl/ComponentManagerImpl.java b/platform/core-impl/src/com/intellij/openapi/components/impl/ComponentManagerImpl.java index ef99dd9ca491..3768872a5c30 100644 --- a/platform/core-impl/src/com/intellij/openapi/components/impl/ComponentManagerImpl.java +++ b/platform/core-impl/src/com/intellij/openapi/components/impl/ComponentManagerImpl.java @@ -128,7 +128,7 @@ public abstract class ComponentManagerImpl extends UserDataHolderBase implements return component; } - protected void disposeComponents() { + protected synchronized void disposeComponents() { assert !myDisposeCompleted : "Already disposed!"; final List components = myComponentsRegistry.getRegisteredImplementations(); From 4607cebe725a217a8c66a71733054fec9f44e247 Mon Sep 17 00:00:00 2001 From: Dmitry Avdeev Date: Sun, 11 Mar 2012 15:43:59 +0400 Subject: [PATCH 3/3] EA-31679 - NPE: JarMemoryLoader.load --- platform/util/src/com/intellij/util/lang/JarMemoryLoader.java | 1 + 1 file changed, 1 insertion(+) diff --git a/platform/util/src/com/intellij/util/lang/JarMemoryLoader.java b/platform/util/src/com/intellij/util/lang/JarMemoryLoader.java index 44628c743e82..742959cb1ae8 100644 --- a/platform/util/src/com/intellij/util/lang/JarMemoryLoader.java +++ b/platform/util/src/com/intellij/util/lang/JarMemoryLoader.java @@ -56,6 +56,7 @@ public class JarMemoryLoader { JarMemoryLoader loader = new JarMemoryLoader(); for (int i = 0; i < size; i++) { ZipEntry entry = zipStream.getNextEntry(); + if (entry == null) return loader; byte[] content = FileUtil.loadBytes(zipStream, (int)entry.getSize()); MyResource resource = new MyResource(entry.getName(), new URL(baseUrl, entry.getName()), content); loader.myResources.put(entry.getName(), resource);