Browse Source

Fix #255 InvalidOperationException: The new node 'CheckedExpression' is not valid in the role Initializer

pull/280/merge
Daniel Grunwald 14 years ago
parent
commit
70d1693e91
  1. 2
      ICSharpCode.Decompiler/Ast/Transforms/AddCheckedBlocks.cs
  2. 87
      ICSharpCode.Decompiler/Tests/CheckedUnchecked.cs

2
ICSharpCode.Decompiler/Ast/Transforms/AddCheckedBlocks.cs

@ -339,7 +339,7 @@ namespace ICSharpCode.Decompiler.Ast.Transforms
result.NodesToInsertInCheckedContext = result.NodesToInsertInUncheckedContext + new ConvertCompoundAssignment(expr, false); result.NodesToInsertInCheckedContext = result.NodesToInsertInUncheckedContext + new ConvertCompoundAssignment(expr, false);
} }
} }
} else { } else if (expr.Role.IsValid(Expression.Null)) {
// We use '<' so that expressions are introduced on the deepest level possible (goal 3) // We use '<' so that expressions are introduced on the deepest level possible (goal 3)
if (result.CostInCheckedContext + new Cost(0, 1) < result.CostInUncheckedContext) { if (result.CostInCheckedContext + new Cost(0, 1) < result.CostInUncheckedContext) {
result.CostInUncheckedContext = result.CostInCheckedContext + new Cost(0, 1); result.CostInUncheckedContext = result.CostInCheckedContext + new Cost(0, 1);

87
ICSharpCode.Decompiler/Tests/CheckedUnchecked.cs

@ -65,48 +65,53 @@ public class CheckedUnchecked
} }
} }
} }
public void ObjectCreationInitializerChecked() public void ObjectCreationInitializerChecked()
{ {
this.TestHelp(new this.TestHelp(new
{ {
x = 0, x = 0,
l = 0 l = 0
}, n => checked(new }, n => checked(new
{ {
x = n.x + 1, x = n.x + 1,
l = n.l + 1 l = n.l + 1
})); }));
} }
public void ObjectCreationWithOneFieldChecked() public void ObjectCreationWithOneFieldChecked()
{ {
this.TestHelp(new this.TestHelp(new
{ {
x = 0, x = 0,
l = 0 l = 0
}, n => new }, n => new
{ {
x = checked(n.x + 1), x = checked(n.x + 1),
l = n.l + 1 l = n.l + 1
}); });
} }
public void ArrayInitializerChecked() public void ArrayInitializerChecked()
{ {
this.TestHelp<int[]>(new int[] this.TestHelp<int[]>(new int[]
{ {
1, 1,
2 2
}, (int[] n) => checked(new int[] }, (int[] n) => checked(new int[]
{ {
n[0] + 1, n[0] + 1,
n[1] + 1 n[1] + 1
})); }));
} }
public T TestHelp<T>(T t, Func<T, T> f) public T TestHelp<T>(T t, Func<T, T> f)
{ {
return f(t); return f(t);
} }
public void CheckedInArrayCreationArgument(int a, int b)
{
Console.WriteLine(new int[checked(a + b)]);
}
} }

Loading…
Cancel
Save