From b004499495afdced45e968a13a1c05216e47a4a1 Mon Sep 17 00:00:00 2001 From: sweinreuter Date: Fri, 26 Oct 2012 10:02:56 +0200 Subject: [PATCH] EA-37379 - SOE: XsltContextProviderBase.processElementDescriptors --- .../xslt/context/XsltContextProviderBase.java | 14 +++---- .../descriptors/RecursionSaveWalker.java | 38 +++++++++++-------- 2 files changed, 29 insertions(+), 23 deletions(-) diff --git a/plugins/xpath/xpath-lang/src/org/intellij/lang/xpath/xslt/context/XsltContextProviderBase.java b/plugins/xpath/xpath-lang/src/org/intellij/lang/xpath/xslt/context/XsltContextProviderBase.java index c040db58b432..5eb0be3361ce 100644 --- a/plugins/xpath/xpath-lang/src/org/intellij/lang/xpath/xslt/context/XsltContextProviderBase.java +++ b/plugins/xpath/xpath-lang/src/org/intellij/lang/xpath/xslt/context/XsltContextProviderBase.java @@ -116,9 +116,6 @@ public abstract class XsltContextProviderBase extends ContextProvider { final Map namespaceDeclarations = rootTag.getLocalNamespaceDeclarations(); final Collection prefixes = namespaceDeclarations.keySet(); - //noinspection unchecked - final Set history = new THashSet(); - final XmlElementFactory ef = XmlElementFactory.getInstance(file.getProject()); int noSchemaNamespaces = 0; for (String prefix : prefixes) { @@ -141,9 +138,12 @@ public abstract class XsltContextProviderBase extends ContextProvider { //noinspection unchecked names.dependencies.add(rootDescriptor.getDescriptorFile()); + //noinspection unchecked + final Set history = new THashSet(); + final XmlElementDescriptor[] e = rootDescriptor.getRootElementsDescriptors(document); for (XmlElementDescriptor descriptor : e) { - processElementDescriptors(descriptor, tag, names, history); + processElementDescriptors(descriptor, tag, names, history, 0); } } @@ -161,8 +161,8 @@ public abstract class XsltContextProviderBase extends ContextProvider { return IGNORED_URIS.contains(namespace) || prefix.length() == 0 || "xmlns".equals(prefix); } - private static void processElementDescriptors(XmlElementDescriptor descriptor, XmlTag tag, ElementNames names, Set history) { - if (!history.add(descriptor)) { + private static void processElementDescriptors(XmlElementDescriptor descriptor, XmlTag tag, ElementNames names, Set history, int depth) { + if (!history.add(descriptor) || ++depth == 200) { return; } final String namespace = descriptor instanceof XmlElementDescriptorImpl @@ -178,7 +178,7 @@ public abstract class XsltContextProviderBase extends ContextProvider { final XmlElementDescriptor[] descriptors = descriptor.getElementsDescriptors(tag); for (XmlElementDescriptor elem : descriptors) { - processElementDescriptors(elem, tag, names, history); + processElementDescriptors(elem, tag, names, history, depth); } } diff --git a/xml/relaxng/src/org/intellij/plugins/relaxNG/model/descriptors/RecursionSaveWalker.java b/xml/relaxng/src/org/intellij/plugins/relaxNG/model/descriptors/RecursionSaveWalker.java index 4fcb1fc5b164..9ad535f61d94 100644 --- a/xml/relaxng/src/org/intellij/plugins/relaxNG/model/descriptors/RecursionSaveWalker.java +++ b/xml/relaxng/src/org/intellij/plugins/relaxNG/model/descriptors/RecursionSaveWalker.java @@ -27,18 +27,21 @@ import org.kohsuke.rngom.digested.*; * Date: 19.07.2007 */ public class RecursionSaveWalker extends DPatternWalker { - private THashSet myVisited; + private THashSet myVisited; protected RecursionSaveWalker() { } @Override public Void onGrammar(DGrammarPattern p) { - try { - return super.onGrammar(p); - } catch (NullPointerException e) { - return null; // missing start pattern + if (myVisited.add(p)) { + try { + return super.onGrammar(p); + } catch (NullPointerException e) { + return null; // missing start pattern + } } + return null; } public Void onRef(DRefPattern p) { @@ -53,11 +56,14 @@ public class RecursionSaveWalker extends DPatternWalker { } protected Void onUnary(DUnaryPattern p) { - try { - return super.onUnary(p); - } catch (NullPointerException e) { - return null; // empty element + if (myVisited.add(p)) { + try { + return super.onUnary(p); + } catch (NullPointerException e) { + return null; // empty element + } } + return null; } protected void doAccept(DPattern... p) { @@ -72,24 +78,24 @@ public class RecursionSaveWalker extends DPatternWalker { } } - private static final SpinAllocator> ourAllocator = new SpinAllocator>( - new SpinAllocator.ICreator>() { + private static final SpinAllocator> ourAllocator = new SpinAllocator>( + new SpinAllocator.ICreator>() { @SuppressWarnings({ "unchecked" }) - public THashSet createInstance() { - return new THashSet(64, TObjectHashingStrategy.IDENTITY) { + public THashSet createInstance() { + return new THashSet(256, TObjectHashingStrategy.IDENTITY) { public void clear() { if (size() == 0) return; super.clear(); final int c = capacity(); - if (c > 64) { + if (c > 256) { super.compact(); } } }; } }, - new SpinAllocator.IDisposer>() { - public void disposeInstance(THashSet instance) { + new SpinAllocator.IDisposer>() { + public void disposeInstance(THashSet instance) { instance.clear(); } });