Browse Source

Support for 'this' in delegate-captured variables

git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@4844 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
shortcuts
David Srbecký 17 years ago
parent
commit
52ab5010c2
  1. 12
      src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Metadata/DebugType.cs
  2. 40
      src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Metadata/MethodInfo.cs
  3. 4
      src/AddIns/Misc/Debugger/Debugger.Tests/Project/Src/TestPrograms/CompilerGeneratedClasses.cs

12
src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Metadata/DebugType.cs

@ -737,6 +737,18 @@ namespace Debugger.MetaData
} }
} }
public bool IsYieldEnumerator {
get {
if (this.IsCompilerGenerated) {
foreach(DebugType intf in this.Interfaces) {
if (intf.FullName == typeof(System.Collections.IEnumerator).FullName)
return true;
}
}
return false;
}
}
public override string ToString() public override string ToString()
{ {
return string.Format("{0}", this.FullName); return string.Format("{0}", this.FullName);

40
src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Metadata/MethodInfo.cs

@ -473,6 +473,9 @@ namespace Debugger.MetaData
)); ));
} }
} }
}
if (this.DeclaringType.IsYieldEnumerator) {
} }
return localVariables; return localVariables;
} }
@ -484,15 +487,19 @@ namespace Debugger.MetaData
foreach(FieldInfo fieldInfo in displayClassType.GetFields()) { foreach(FieldInfo fieldInfo in displayClassType.GetFields()) {
FieldInfo fieldInfoCopy = fieldInfo; FieldInfo fieldInfoCopy = fieldInfo;
if (!fieldInfo.Name.StartsWith("CS$")) { if (!fieldInfo.Name.StartsWith("CS$")) {
vars.Add( LocalVariableInfo locVar = new LocalVariableInfo(
new LocalVariableInfo( fieldInfo.Name,
fieldInfo.Name, fieldInfo.Type,
fieldInfo.Type, delegate(StackFrame context) {
delegate(StackFrame context) { return getDisplayClass(context).GetFieldValue(fieldInfoCopy);
return getDisplayClass(context).GetFieldValue(fieldInfoCopy); }
}
)
); );
locVar.IsCapturedByDelegate = true;
if (fieldInfo.Name.StartsWith("<>") && fieldInfo.Name.EndsWith("__this")) {
locVar.Name = "this";
locVar.IsThis = true;
}
vars.Add(locVar);
} }
} }
} }
@ -554,22 +561,17 @@ namespace Debugger.MetaData
public class LocalVariableInfo public class LocalVariableInfo
{ {
string name;
DebugType type;
ValueGetter getter; ValueGetter getter;
public string Name { public string Name { get; internal set; }
get { return name; } public DebugType Type { get; private set; }
} public bool IsThis { get; internal set; }
public bool IsCapturedByDelegate { get; internal set; }
public DebugType Type {
get { return type; }
}
public LocalVariableInfo(string name, DebugType type, ValueGetter getter) public LocalVariableInfo(string name, DebugType type, ValueGetter getter)
{ {
this.name = name; this.Name = name;
this.type = type; this.Type = type;
this.getter = getter; this.getter = getter;
} }

4
src/AddIns/Misc/Debugger/Debugger.Tests/Project/Src/TestPrograms/CompilerGeneratedClasses.cs

@ -165,7 +165,7 @@ namespace Debugger.Tests {
</Item> </Item>
<Item> <Item>
<AnonymousType <AnonymousType
Name="&lt;&gt;4__this" Name="this"
Value="(()((()(this)).CS$&lt;&gt;8__locals3)).&lt;&gt;4__this = {Debugger.Tests.TestPrograms.CompilerGeneratedClasses}" /> Value="(()((()(this)).CS$&lt;&gt;8__locals3)).&lt;&gt;4__this = {Debugger.Tests.TestPrograms.CompilerGeneratedClasses}" />
</Item> </Item>
</OutterDelegateLocalVariables> </OutterDelegateLocalVariables>
@ -208,7 +208,7 @@ namespace Debugger.Tests {
</Item> </Item>
<Item> <Item>
<AnonymousType <AnonymousType
Name="&lt;&gt;4__this" Name="this"
Value="(()((()(this)).CS$&lt;&gt;8__locals3)).&lt;&gt;4__this = {Debugger.Tests.TestPrograms.CompilerGeneratedClasses}" /> Value="(()((()(this)).CS$&lt;&gt;8__locals3)).&lt;&gt;4__this = {Debugger.Tests.TestPrograms.CompilerGeneratedClasses}" />
</Item> </Item>
</InnterDelegateLocalVariables> </InnterDelegateLocalVariables>

Loading…
Cancel
Save