Browse Source

Include member reference and method invocation in precedence list.

pull/1/head^2
David Srbecký 18 years ago
parent
commit
10a96cf79f
  1. 80
      bin/Debug/output.cs
  2. 29
      src/Transforms/Ast/RemoveParenthesis.cs

80
bin/Debug/output.cs

@ -33,29 +33,29 @@ namespace Reversi @@ -33,29 +33,29 @@ namespace Reversi
{
for (int i = 0; i < 8; i = i + 1) {
for (int j = 0; j < 8; j = j + 1) {
(@this.squares).Set(i, j, IL__ldsfld(Empty));
(@this.safeDiscs).Set(i, j, 0);
@this.squares.Set(i, j, IL__ldsfld(Empty));
@this.safeDiscs.Set(i, j, 0);
}
}
(@this.squares).Set(3, 3, IL__ldsfld(White));
(@this.squares).Set(3, 4, IL__ldsfld(Black));
(@this.squares).Set(4, 3, IL__ldsfld(Black));
(@this.squares).Set(4, 4, IL__ldsfld(White));
@this.squares.Set(3, 3, IL__ldsfld(White));
@this.squares.Set(3, 4, IL__ldsfld(Black));
@this.squares.Set(4, 3, IL__ldsfld(Black));
@this.squares.Set(4, 4, IL__ldsfld(White));
@this.UpdateCounts();
}
public int GetSquareContents(int row, int col)
{
return ((@this.squares).Get(row, col));
return (@this.squares.Get(row, col));
}
public void MakeMove(int color, int row, int col)
{
(@this.squares).Set(row, col, color);
@this.squares.Set(row, col, color);
for (int i = -1; i <= 1; i = i + 1) {
for (int j = -1; j <= 1; j = j + 1) {
if ((i || j) && (@this.IsOutflanking(color, row, col, i, j))) {
if ((i || j) && @this.IsOutflanking(color, row, col, i, j)) {
int k = row + i;
for (int l = col + j; ((@this.squares).Get(k, l)) == -color; l = l + j) {
(@this.squares).Set(k, l, color);
for (int l = col + j; @this.squares.Get(k, l) == -color; l = l + j) {
@this.squares.Set(k, l, color);
k = k + i;
}
}
@ -76,12 +76,12 @@ namespace Reversi @@ -76,12 +76,12 @@ namespace Reversi
}
public bool IsValidMove(int color, int row, int col)
{
if (!(((@this.squares).Get(row, col)) == IL__ldsfld(Empty))) {
if (!(@this.squares.Get(row, col) == IL__ldsfld(Empty))) {
return 0;
}
for (int i = -1; i <= 1; i = i + 1) {
for (int j = -1; j <= 1; j = j + 1) {
if ((i || j) && (@this.IsOutflanking(color, row, col, i, j))) {
if ((i || j) && @this.IsOutflanking(color, row, col, i, j)) {
return 1;
}
}
@ -103,10 +103,10 @@ namespace Reversi @@ -103,10 +103,10 @@ namespace Reversi
private bool IsOutflanking(int color, int row, int col, int dr, int dc)
{
int i = row + dr;
for (int j = col + dc; i >= 0 && i < 8 && j >= 0 && j < 8 && ((@this.squares).Get(i, j)) == -color; j = j + dc) {
for (int j = col + dc; i >= 0 && i < 8 && j >= 0 && j < 8 && @this.squares.Get(i, j) == -color; j = j + dc) {
i = i + dr;
}
if (i < 0 || i > 7 || j < 0 || j > 7 || i - dr == row && j - dc == col || ((@this.squares).Get(i, j)) != color) {
if (i < 0 || i > 7 || j < 0 || j > 7 || i - dr == row && j - dc == col || @this.squares.Get(i, j) != color) {
return 0;
}
return 1;
@ -124,8 +124,8 @@ namespace Reversi @@ -124,8 +124,8 @@ namespace Reversi
V_2 = 0;
for (int i = 0; i < 8; i = i + 1) {
for (int j = 0; j < 8; j = j + 1) {
if (!(((@this.squares).Get(i, j)) == IL__ldsfld(Empty)) && !((@this.safeDiscs).Get(i, j)) && !(@this.IsOutflankable(i, j))) {
(@this.safeDiscs).Set(i, j, 1);
if (!(@this.squares.Get(i, j) == IL__ldsfld(Empty)) && !@this.safeDiscs.Get(i, j) && !@this.IsOutflankable(i, j)) {
@this.safeDiscs.Set(i, j, 1);
V_2 = 1;
}
}
@ -136,16 +136,16 @@ namespace Reversi @@ -136,16 +136,16 @@ namespace Reversi
j = 0;
for (; j < 8; j = j + 1) {
bool V_5 = 0;
if (!(((@this.squares).Get(i, j)) == IL__ldsfld(Empty))) {
if (!(@this.squares.Get(i, j) == IL__ldsfld(Empty))) {
for (int k = -1; k <= 1; k = k + 1) {
for (int l = -1; l <= 1; l = l + 1) {
if ((k || l) && i + k >= 0 && i + k < 8 && j + l >= 0 && j + l < 8 && !(((@this.squares).Get((i + k), (j + l))) != IL__ldsfld(Empty))) {
if ((k || l) && i + k >= 0 && i + k < 8 && j + l >= 0 && j + l < 8 && !(@this.squares.Get((i + k), (j + l)) != IL__ldsfld(Empty))) {
V_5 = 1;
}
}
}
}
if (!(((@this.squares).Get(i, j)) != IL__ldsfld(Black))) {
if (!(@this.squares.Get(i, j) != IL__ldsfld(Black))) {
IL__dup(@this);
object expr123 = expr122.blackCount;
int expr129 = expr123 + 1;
@ -156,7 +156,7 @@ namespace Reversi @@ -156,7 +156,7 @@ namespace Reversi
int expr13B = expr135 + 1;
expr134.blackFrontierCount = expr13B;
}
if ((@this.safeDiscs).Get(i, j)) {
if (@this.safeDiscs.Get(i, j)) {
IL__dup(@this);
object expr152 = expr151.blackSafeCount;
int expr158 = expr152 + 1;
@ -164,7 +164,7 @@ namespace Reversi @@ -164,7 +164,7 @@ namespace Reversi
}
}
else {
if (!(((@this.squares).Get(i, j)) != IL__ldsfld(White))) {
if (!(@this.squares.Get(i, j) != IL__ldsfld(White))) {
IL__dup(@this);
object expr176 = expr175.whiteCount;
int expr17C = expr176 + 1;
@ -175,7 +175,7 @@ namespace Reversi @@ -175,7 +175,7 @@ namespace Reversi
int expr18E = expr188 + 1;
expr187.whiteFrontierCount = expr18E;
}
if ((@this.safeDiscs).Get(i, j)) {
if (@this.safeDiscs.Get(i, j)) {
IL__dup(@this);
object expr1A5 = expr1A4.whiteSafeCount;
int expr1AB = expr1A5 + 1;
@ -197,28 +197,28 @@ namespace Reversi @@ -197,28 +197,28 @@ namespace Reversi
}
private bool IsOutflankable(int row, int col)
{
int i = (@this.squares).Get(row, col);
int i = @this.squares.Get(row, col);
bool V_3 = 0;
bool V_5 = 0;
bool V_4 = 0;
bool V_6 = 0;
for (int k = 0; k < col && !V_3; k = k + 1) {
if (!(((@this.squares).Get(row, k)) != IL__ldsfld(Empty))) {
if (!(@this.squares.Get(row, k) != IL__ldsfld(Empty))) {
V_3 = 1;
}
else {
if (((@this.squares).Get(row, k)) != i || !((@this.safeDiscs).Get(row, k))) {
if (@this.squares.Get(row, k) != i || !@this.safeDiscs.Get(row, k)) {
V_5 = 1;
}
}
}
k = col + 1;
for (; k < 8 && !V_4; k = k + 1) {
if (!(((@this.squares).Get(row, k)) != IL__ldsfld(Empty))) {
if (!(@this.squares.Get(row, k) != IL__ldsfld(Empty))) {
V_4 = 1;
}
else {
if (((@this.squares).Get(row, k)) != i || !((@this.safeDiscs).Get(row, k))) {
if (@this.squares.Get(row, k) != i || !@this.safeDiscs.Get(row, k)) {
V_6 = 1;
}
}
@ -231,22 +231,22 @@ namespace Reversi @@ -231,22 +231,22 @@ namespace Reversi
V_5 = 0;
V_6 = 0;
for (int j = 0; j < row && !V_3; j = j + 1) {
if (!(((@this.squares).Get(j, col)) != IL__ldsfld(Empty))) {
if (!(@this.squares.Get(j, col) != IL__ldsfld(Empty))) {
V_3 = 1;
}
else {
if (((@this.squares).Get(j, col)) != i || !((@this.safeDiscs).Get(j, col))) {
if (@this.squares.Get(j, col) != i || !@this.safeDiscs.Get(j, col)) {
V_5 = 1;
}
}
}
j = row + 1;
for (; j < 8 && !V_4; j = j + 1) {
if (!(((@this.squares).Get(j, col)) != IL__ldsfld(Empty))) {
if (!(@this.squares.Get(j, col) != IL__ldsfld(Empty))) {
V_4 = 1;
}
else {
if (((@this.squares).Get(j, col)) != i || !((@this.safeDiscs).Get(j, col))) {
if (@this.squares.Get(j, col) != i || !@this.safeDiscs.Get(j, col)) {
V_6 = 1;
}
}
@ -261,11 +261,11 @@ namespace Reversi @@ -261,11 +261,11 @@ namespace Reversi
j = row - 1;
k = col - 1;
for (; j >= 0 && k >= 0 && !V_3; k = k - 1) {
if (!(((@this.squares).Get(j, k)) != IL__ldsfld(Empty))) {
if (!(@this.squares.Get(j, k) != IL__ldsfld(Empty))) {
V_3 = 1;
}
else {
if (((@this.squares).Get(j, k)) != i || !((@this.safeDiscs).Get(j, k))) {
if (@this.squares.Get(j, k) != i || !@this.safeDiscs.Get(j, k)) {
V_5 = 1;
}
}
@ -274,11 +274,11 @@ namespace Reversi @@ -274,11 +274,11 @@ namespace Reversi
j = row + 1;
k = col + 1;
for (; j < 8 && k < 8 && !V_4; k = k + 1) {
if (!(((@this.squares).Get(j, k)) != IL__ldsfld(Empty))) {
if (!(@this.squares.Get(j, k) != IL__ldsfld(Empty))) {
V_4 = 1;
}
else {
if (((@this.squares).Get(j, k)) != i || !((@this.safeDiscs).Get(j, k))) {
if (@this.squares.Get(j, k) != i || !@this.safeDiscs.Get(j, k)) {
V_6 = 1;
}
}
@ -294,11 +294,11 @@ namespace Reversi @@ -294,11 +294,11 @@ namespace Reversi
j = row - 1;
k = col + 1;
for (; j >= 0 && k < 8 && !V_3; k = k + 1) {
if (!(((@this.squares).Get(j, k)) != IL__ldsfld(Empty))) {
if (!(@this.squares.Get(j, k) != IL__ldsfld(Empty))) {
V_3 = 1;
}
else {
if (((@this.squares).Get(j, k)) != i || !((@this.safeDiscs).Get(j, k))) {
if (@this.squares.Get(j, k) != i || !@this.safeDiscs.Get(j, k)) {
V_5 = 1;
}
}
@ -307,11 +307,11 @@ namespace Reversi @@ -307,11 +307,11 @@ namespace Reversi
j = row + 1;
k = col - 1;
for (; j < 8 && k >= 0 && !V_4; k = k - 1) {
if (!(((@this.squares).Get(j, k)) != IL__ldsfld(Empty))) {
if (!(@this.squares.Get(j, k) != IL__ldsfld(Empty))) {
V_4 = 1;
}
else {
if (((@this.squares).Get(j, k)) != i || !((@this.safeDiscs).Get(j, k))) {
if (@this.squares.Get(j, k) != i || !@this.safeDiscs.Get(j, k)) {
V_6 = 1;
}
}

29
src/Transforms/Ast/RemoveParenthesis.cs

@ -47,6 +47,22 @@ namespace Decompiler.Transforms.Ast @@ -47,6 +47,22 @@ namespace Decompiler.Transforms.Ast
return base.VisitUnaryOperatorExpression(unary, data);
}
public override object VisitMemberReferenceExpression(MemberReferenceExpression memberRef, object data)
{
if (GetPrecedence(memberRef.TargetObject) >= GetPrecedence(memberRef)) {
memberRef.TargetObject = Deparenthesize(memberRef.TargetObject);
}
return base.VisitMemberReferenceExpression(memberRef, data);
}
public override object VisitInvocationExpression(InvocationExpression invocation, object data)
{
if (GetPrecedence(invocation.TargetObject) >= GetPrecedence(invocation)) {
invocation.TargetObject = Deparenthesize(invocation.TargetObject);
}
return base.VisitInvocationExpression(invocation, data);
}
public override object VisitBinaryOperatorExpression(BinaryOperatorExpression binary, object data)
{
int? myPrecedence = GetPrecedence(binary);
@ -75,11 +91,6 @@ namespace Decompiler.Transforms.Ast @@ -75,11 +91,6 @@ namespace Decompiler.Transforms.Ast
return base.VisitForStatement(forStatement, data);
}
public override object VisitInvocationExpression(InvocationExpression invocationExpression, object data)
{
return base.VisitInvocationExpression(invocationExpression, data);
}
Expression Deparenthesize(Expression expr)
{
if (expr is ParenthesizedExpression) {
@ -102,15 +113,23 @@ namespace Decompiler.Transforms.Ast @@ -102,15 +113,23 @@ namespace Decompiler.Transforms.Ast
// Primary
// x.y
if (expr is MemberReferenceExpression) return 15;
// f(x)
if (expr is InvocationExpression) return 15;
// a[x]
if (expr is IndexerExpression) return 15;
// x++
if (unary != null && unary.Op == UnaryOperatorType.PostIncrement) return 15;
// x--
if (unary != null && unary.Op == UnaryOperatorType.PostDecrement) return 15;
// new T(...)
if (expr is ObjectCreateExpression) return 15;
// new T(...){...}
// new {...}
// new T[...]
if (expr is ArrayCreateExpression) return 15;
// typeof(T)
if (expr is TypeOfExpression) return 15;
// checked(x)
// unchecked(x)
// default (T)

Loading…
Cancel
Save