Browse Source

Fix potential infinite loop in IronPython local variable resolver.

pull/1/head
mrward 15 years ago
parent
commit
4a4f2d6bac
  1. 5
      src/AddIns/BackendBindings/Python/PyWalker/NRefactoryAstVisitor.cs
  2. 4
      src/AddIns/BackendBindings/Python/PyWalker/PyWalker.csproj
  3. 10
      src/AddIns/BackendBindings/Python/PythonBinding.sln
  4. 30
      src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonLocalVariableResolver.cs
  5. 11
      src/AddIns/BackendBindings/Python/PythonBinding/Test/Resolver/PythonLocalVariableResolverTests.cs

5
src/AddIns/BackendBindings/Python/PyWalker/NRefactoryAstVisitor.cs

@ -278,11 +278,6 @@ namespace PyWalker @@ -278,11 +278,6 @@ namespace PyWalker
return base.VisitIfElseStatement(ifElseStatement, data);
}
public override object VisitIndexerDeclaration(IndexerDeclaration indexerDeclaration, object data)
{
return base.VisitIndexerDeclaration(indexerDeclaration, data);
}
public override object VisitIndexerExpression(IndexerExpression indexerExpression, object data)
{
return base.VisitIndexerExpression(indexerExpression, data);

4
src/AddIns/BackendBindings/Python/PyWalker/PyWalker.csproj

@ -1,5 +1,5 @@ @@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0">
<PropertyGroup>
<ProjectGuid>{55329704-6046-48EC-8A20-5C80B3092A63}</ProjectGuid>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
@ -7,7 +7,7 @@ @@ -7,7 +7,7 @@
<OutputType>WinExe</OutputType>
<RootNamespace>PyWalker</RootNamespace>
<AssemblyName>PyWalker</AssemblyName>
<TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
<AllowUnsafeBlocks>False</AllowUnsafeBlocks>
<NoStdLib>False</NoStdLib>
<WarningLevel>4</WarningLevel>

10
src/AddIns/BackendBindings/Python/PythonBinding.sln

@ -38,6 +38,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.Scripting", ".. @@ -38,6 +38,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.Scripting", "..
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.Scripting.Tests", "..\Scripting\Test\ICSharpCode.Scripting.Tests.csproj", "{85C09AD8-183B-403A-869A-7226646218A9}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PyWalker", "PyWalker\PyWalker.csproj", "{55329704-6046-48EC-8A20-5C80B3092A63}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@ -128,5 +130,13 @@ Global @@ -128,5 +130,13 @@ Global
{85C09AD8-183B-403A-869A-7226646218A9}.Release|Any CPU.ActiveCfg = Release|x86
{85C09AD8-183B-403A-869A-7226646218A9}.Release|x86.Build.0 = Release|x86
{85C09AD8-183B-403A-869A-7226646218A9}.Release|x86.ActiveCfg = Release|x86
{55329704-6046-48EC-8A20-5C80B3092A63}.Debug|Any CPU.Build.0 = Debug|Any CPU
{55329704-6046-48EC-8A20-5C80B3092A63}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{55329704-6046-48EC-8A20-5C80B3092A63}.Debug|x86.Build.0 = Debug|Any CPU
{55329704-6046-48EC-8A20-5C80B3092A63}.Debug|x86.ActiveCfg = Debug|Any CPU
{55329704-6046-48EC-8A20-5C80B3092A63}.Release|Any CPU.Build.0 = Release|Any CPU
{55329704-6046-48EC-8A20-5C80B3092A63}.Release|Any CPU.ActiveCfg = Release|Any CPU
{55329704-6046-48EC-8A20-5C80B3092A63}.Release|x86.Build.0 = Release|Any CPU
{55329704-6046-48EC-8A20-5C80B3092A63}.Release|x86.ActiveCfg = Release|Any CPU
EndGlobalSection
EndGlobal

30
src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonLocalVariableResolver.cs

@ -105,33 +105,13 @@ namespace ICSharpCode.PythonBinding @@ -105,33 +105,13 @@ namespace ICSharpCode.PythonBinding
///
/// then the expression will be a name expression referring to Class1.
/// </remarks>
static string GetTypeName(Expression node)
public static string GetTypeName(Expression node)
{
// Collect the names that make up the type name.
NameExpression nameExpression = null;
List<string> names = new List<string>();
do {
nameExpression = node as NameExpression;
MemberExpression memberExpression = node as MemberExpression;
string name = String.Empty;
if (memberExpression != null) {
name = memberExpression.Name;
node = memberExpression.Target;
} else if (nameExpression != null) {
name = nameExpression.Name;
}
names.Add(name);
} while (nameExpression == null);
// Create the fully qualified type name by adding the names
// in reverse order.
StringBuilder typeName = new StringBuilder();
typeName.Append(names[names.Count - 1]);
for (int i = names.Count - 2; i >= 0; --i) {
typeName.Append('.');
typeName.Append(names[i]);
NameExpression nameExpression = node as NameExpression;
if (nameExpression != null) {
return nameExpression.Name;
}
return typeName.ToString();
return PythonControlFieldExpression.GetMemberName(node as MemberExpression);
}
public ResolveResult Resolve(PythonResolverContext resolverContext, ExpressionResult expressionResult)

11
src/AddIns/BackendBindings/Python/PythonBinding/Test/Resolver/PythonLocalVariableResolverTests.cs

@ -3,7 +3,9 @@ @@ -3,7 +3,9 @@
using System;
using ICSharpCode.PythonBinding;
using IronPython.Compiler.Ast;
using NUnit.Framework;
using PythonBinding.Tests.Utils;
namespace PythonBinding.Tests.Resolver
{
@ -74,5 +76,14 @@ namespace PythonBinding.Tests.Resolver @@ -74,5 +76,14 @@ namespace PythonBinding.Tests.Resolver
Resolve("a", code);
Assert.AreEqual("Root.Test.Class1", typeName);
}
[Test]
public void GetTypeName_ExpressionIsNotNameOrMemberExpression_ReturnsEmptyStringAndDoesNotGetStuckInInfiniteLoop()
{
AssignmentStatement statement = PythonParserHelper.GetAssignmentStatement("a = 2");
Expression expression = statement.Right;
string typeName = PythonLocalVariableResolver.GetTypeName(expression);
Assert.AreEqual(String.Empty, typeName);
}
}
}

Loading…
Cancel
Save