David Srbecký
0d3dd5de44
Apply the negation reduction twice.
...
Also handle expressions in from "!!a"
14 years ago
David Srbecký
f1c1d34cba
Simplify expressions by pushing negations inside.
...
Includes application of De Morgan's laws.
14 years ago
David Srbecký
dacfade7df
Remove parenthesis from primitive value, identifies and expression statements.
14 years ago
David Srbecký
6faf690899
Parenthesize all expression to ensure correctness.
14 years ago
David Srbecký
459742f3ca
Simplify short-circuit branches ("a && b" or "a || b").
...
Two new node types were created for this: SimpleBranch and ShortCircuitBranch.
The short-circuit branches are found by pattern finding - single short-circuit branch forms a specific triangular pattern in the control flow graph. Nested short-circuit branches are found by doing this node reduction repeatedly.
14 years ago
David Srbecký
7abcfaa3ed
Conditional jumps now alone in basic block so that they can be expressed as single bool expression.
14 years ago
David Srbecký
cefcba99d1
When conditional does not have any common reachable nodes, create only 'true' body. 'False' body is then implicitly the code after the conditional.
14 years ago
David Srbecký
a455a6be02
Increased the reduction max count to 10000
14 years ago
David Srbecký
5b997bd44d
Splitted the next statement finding algorithm to several reusable parts.
14 years ago
David Srbecký
110defad02
The next statement for the end of loop is start of loop
14 years ago
David Srbecký
ba59de34fb
When looking what follows a 'goto' statement, exit and enter code blocks.
...
This simplifies code like:
if (p) {
Code();
goto Label; // This goto is redundant
}
for(;;) {
Label:
Code();
}
14 years ago
David Srbecký
e6269f491b
Moved jump reduction to the Ast transform phase
14 years ago
David Srbecký
3643debd61
The Target of decompilation is now Board. It has plenty of nested 'for' loops and 'if's.
14 years ago
David Srbecký
eaa7a63343
castclass
14 years ago
David Srbecký
3ca49743ae
ldtoken
14 years ago
David Srbecký
49eeb49d1b
newobj
14 years ago
David Srbecký
6e7f51fad7
Property access. (Detect properties by naming convention; still needs to be done properly)
14 years ago
David Srbecký
57192a1fdc
stfld
14 years ago
David Srbecký
86ca89b055
callvirt
14 years ago
David Srbecký
6e4b542709
ldfld
14 years ago
David Srbecký
40e1edd7d9
Fixed all bugs that prevented the decompiler from running.
...
The output of decompilation is saved in file output.cs
Unsupported expressions are handled a bit more gracefully -
for example: IL__callvirt(set_AutoSize(), (IL__ldfld(titleLabel, @this )), 1);
this is will eventually become this.titleLabel.AutoSize = 1;
14 years ago
David Srbecký
bc89f0a071
Target of decompilation is now AboutDialog in the Reversi game.
14 years ago
David Srbecký
42451cbd9d
Added a Reversi game from http://www.codeproject.com/KB/game/reversi.aspx
14 years ago
David Srbecký
48c25a5821
Progress Report - Draft 1
14 years ago
David Srbecký
3aa8cc498c
Initial GUI options loaded loaded from class
14 years ago
David Srbecký
598dcfd92c
Bugfix in SimplifyTypeReferences - calling it for second time corrupted some type names
14 years ago
David Srbecký
af14439362
Terminating all optimizations with exceptions
14 years ago
David Srbecký
27d8b0107d
Include blocks jumping outside the parent not as being conditionals
14 years ago
David Srbecký
a95748dc66
More GUI options
14 years ago
David Srbecký
27d70d6897
Reduce "String.Concat(a, b)" to "a + b"
14 years ago
David Srbecký
35f06e0a4b
Label is not reference counted object anymore, it is just a string. During transform we in two passes - find all live labels - remove all dead ones (the rest).
14 years ago
David Srbecký
9aff0b724d
Simplify the transform code by using extension methods.
14 years ago
David Srbecký
479918e7bc
Remove MyBlockStatement.
14 years ago
David Srbecký
ea50b09c0d
NRefactory: Add NodeCollection.AddRange method
14 years ago
David Srbecký
07a2cb2a84
NRefactory: Set parent of child when it is added to collection
14 years ago
David Srbecký
932cf1a232
NRefactory: INode.Children type changed from List<T> to more general IList<T>
14 years ago
David Srbecký
e42166ca85
Add NRefactory source code
14 years ago
David Srbecký
34c8127a9b
Restore loop initializer
14 years ago
David Srbecký
5b48611b69
Replace variable name for integers with "i", "j", "k", etc...
14 years ago
David Srbecký
08528a768a
Reduce 'if' statements in loops.
14 years ago
David Srbecký
5b8b80cc72
Restore loop iterator - move assignment from the end of loop.
14 years ago
David Srbecký
af00ad101a
Restore for loop condition. It is a simple pattern match.
14 years ago
David Srbecký
075c5bebdb
Remove empty 'else body' of 'if' statement.
14 years ago
David Srbecký
d086b446e8
Remove flowing redundant jumps at the end of Ast blocks:
...
- Continue at the very end of loop
- Empty Return at the very end of method
- Goto at the very end of 'if' body, if the goto jumps right after the whole 'if' statement
14 years ago
David Srbecký
6ebd05c0fe
Simplify type names. For example replace "System.Console.WriteLine" with "Console.WriteLine" because we have a "using System;" statement. Replace "Int32" with "int", etc...
14 years ago
David Srbecký
8643290a4c
Remove redundant 'goto' statements in form:
...
goto labelX;
labelX: command();
14 years ago
David Srbecký
ecad71d802
Added custom Ast classes for Goto and Label statements that track the reference count of a label.
...
Added an Ast transform to remove dead labels. (first Ast transform in program, I expect many more to come. Some stuff should be rewritten to use these explicit transforms)
14 years ago
David Srbecký
45bedc8d1d
Try to reconstruct if statements. The following logic is used: Depending on the value of the condition, the control flow will branch to one of two locations - let's call then 'true entry' and 'false entry'. Nodes reachable *only* from the 'true entry' are assumed to be the 'true' body of the if statement. Similarly, nodes reachable only from the 'false entry' are the 'false' body. Nodes reachable from both 'true entry' and 'false entry' and not part of the if statement and are placed after it.
14 years ago
David Srbecký
356c0b0d2f
Completely rewritten the Node tree structure. It became increasingly difficult to maintain the node links (Predecessors, Successors) consistent during transformations. So rather then keeping them consistent I have implemented an algorithm that can calculate the Predecessors or Successors for any given node. There are a few caches on the way so that the calculation does not calculate everything again every time. Affected caches are automatically flushed when a tree structure changes. This is implemented using 'collection with events'.
14 years ago
David Srbecký
7bf471eec3
Some set operations that will be need for 'if' simplification
14 years ago