From 29c20bb2cfc4a5654cbe55371b3a022ef9a622e8 Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Thu, 6 May 2010 19:46:07 +0400 Subject: [PATCH] SOE protection in PyFileImpl.getElementNamed() --- .../jetbrains/python/psi/impl/PyFileImpl.java | 43 ++++++++++++------- 1 file changed, 28 insertions(+), 15 deletions(-) diff --git a/python/src/com/jetbrains/python/psi/impl/PyFileImpl.java b/python/src/com/jetbrains/python/psi/impl/PyFileImpl.java index 30d7ee329f42..e382789db64a 100644 --- a/python/src/com/jetbrains/python/psi/impl/PyFileImpl.java +++ b/python/src/com/jetbrains/python/psi/impl/PyFileImpl.java @@ -39,12 +39,8 @@ import java.util.List; public class PyFileImpl extends PsiFileBase implements PyFile, PyExpression { protected PyType myType; - private ThreadLocal> myNameResolveStack = new ThreadLocal>() { - @Override - protected List initialValue() { - return new ArrayList(); - } - }; + private ThreadLocal> myFindExportedNameStack = new ArrayListThreadLocal(); + private ThreadLocal> myGetElementNamedStack = new ArrayListThreadLocal(); public PyFileImpl(FileViewProvider viewProvider) { super(viewProvider, PythonLanguage.getInstance()); @@ -192,7 +188,7 @@ public class PyFileImpl extends PsiFileBase implements PyFile, PyExpression { } public PsiElement findExportedName(String name) { - final List stack = myNameResolveStack.get(); + final List stack = myFindExportedNameStack.get(); if (stack.contains(name)) { return null; } @@ -271,17 +267,27 @@ public class PyFileImpl extends PsiFileBase implements PyFile, PyExpression { @Nullable public PsiElement getElementNamed(String name) { - PsiElement exportedName = findExportedName(name); - if (exportedName == null) { - final PyFile builtins = PyBuiltinCache.getInstance(this).getBuiltinsFile(); - if (builtins != null && builtins != this) { - exportedName = builtins.findExportedName(name); + final List stack = myGetElementNamedStack.get(); + if (stack.contains(name)) { + return null; + } + stack.add(name); + try { + PsiElement exportedName = findExportedName(name); + if (exportedName == null) { + final PyFile builtins = PyBuiltinCache.getInstance(this).getBuiltinsFile(); + if (builtins != null && builtins != this) { + exportedName = builtins.findExportedName(name); + } } + if (exportedName instanceof PyImportElement) { + return ((PyImportElement) exportedName).getElementNamed(name); + } + return exportedName; } - if (exportedName instanceof PyImportElement) { - return ((PyImportElement) exportedName).getElementNamed(name); + finally { + stack.remove(name); } - return exportedName; } @NotNull @@ -406,4 +412,11 @@ public class PyFileImpl extends PsiFileBase implements PyFile, PyExpression { public PsiElement addAfter(@NotNull PsiElement element, PsiElement anchor) throws IncorrectOperationException { return super.addAfter(PyPsiUtils.removeIndentation(element), anchor); } + + private static class ArrayListThreadLocal extends ThreadLocal> { + @Override + protected List initialValue() { + return new ArrayList(); + } + } }