Daniel Grunwald
df13f0ce01
Fix #1605 : Inline ref locals more aggressively; this is necessary for VB compound assignments.
6 years ago
Daniel Grunwald
7f8689c464
Allow inlining of compiler-generated value-type-temporaries when field accesses are involved.
6 years ago
Daniel Grunwald
752f0de978
Further adjustments to transforms now that copy propagation no longer runs.
6 years ago
Daniel Grunwald
33c7425fa2
Fix several bugs with compound assignments on indexers.
...
Closes #1580 .
6 years ago
Daniel Grunwald
ccdabf2325
Fix a bunch of XmlDoc compiler warnings.
6 years ago
Daniel Grunwald
f2151972a0
Redesign CompoundAssignmentInstruction to support an 'Address' mode where we don't implicitly turn an LdObj into an StObj, but instead directly operate on an address.
...
This means we can get rid of the special case in TransformDisplayClassUsage, as compound.assign can now also be used with the address of a local variable.
6 years ago
Siegfried Pammer
b03aa488aa
Performance: Cache ChainedConstructorCallILOffset in ILFunction to avoid having to scan the method body in every inlining step. Take a shortcut for static ctors, as there cannot be chained ctor calls in static ctors.
6 years ago
Daniel Grunwald
8d99af14c5
Add support for 'ref readonly' return type.
6 years ago
Daniel Grunwald
416425b681
Readonly struct method calls on readonly lvalues don't generate temporaries.
6 years ago
Daniel Grunwald
4ad4f6a232
Fix #882 : Don't inline value-type temporaries for setter calls.
6 years ago
Daniel Grunwald
eb942b4a21
Fix #1430 : Improve performance in ILInlining.
6 years ago
Siegfried Pammer
6e49efd5aa
Extend ILInlining to work with StringToInt instructions inside Switch instruction.
6 years ago
Siegfried Pammer
c1fca21e8a
Make ILRange field private - introduce public API for IL range manipulation.
6 years ago
Daniel Grunwald
da5693e605
Fix #1339 : fixed statement not decompiled correctly when pinned variable is reset in finally block
6 years ago
Siegfried Pammer
ecde53969c
Add IsInConstructorInitializer case to ILInlining.OptionsForBlock.
7 years ago
Siegfried Pammer
ab8c73b2f7
#1336 : Add limit in HandleSimpleArrayInitializer.
7 years ago
Siegfried Pammer
0dac55d584
Add transformation for stackalloc to Span<T>.
7 years ago
Daniel Grunwald
4a3185c823
#907 : Add tests
7 years ago
Daniel Grunwald
e041454987
Add pretty tests for "yield return" and fix some minor bugs:
...
* remove redundant casts on yield-return-expression
* keep variable name from metadata for foreach loops
* fix 'yield break;' in nested try-finally sometimes causing a decompiler error
7 years ago
Daniel Grunwald
dd5845e83d
Support short-circuiting operators with dynamic. (e.g. "if (x.A && x.B)" where "x" is dynamic)
7 years ago
Daniel Grunwald
9479e8af13
Support overloaded operator &&/||.
7 years ago
Siegfried Pammer
0bf56ce9ca
Add inlining special cases for dynamic compound assignments
7 years ago
Siegfried Pammer
805b9f4bb4
Add missing CallInlineAssign block kind to ILInlining.FindLoadInNext
7 years ago
Daniel Grunwald
6886d2f753
Add support for ?. operator on dynamic.
7 years ago
Daniel Grunwald
f86bec4e0c
Move named arguments to its own transform.
...
Like other statement transforms that build inline blocks, it's
important that the named argument transform runs after the
ExpressionTransforms.
7 years ago
Daniel Grunwald
ca09f09222
Don't use named arguments when IL stack is empty after the stloc.
...
An empty stack indicates the statement is complete, so the code
is usually more readable if we keep the local variable.
7 years ago
Daniel Grunwald
21d3881e37
Introduce named arguments only in the statement transform.
...
Don't use extension method syntax when 'this' parameter of
extension method is named.
7 years ago
Daniel Grunwald
810adea8b4
#1083 : Initial implementation of named arguments.
7 years ago
Daniel Grunwald
bcc1586f72
ILAst transform for named arguments.
7 years ago
Siegfried Pammer
845c620a9f
Implement UserDefinedCompoundAssign
...
rename CompoundAssignmentInstruction -> NumericCompoundAssign
7 years ago
Pent Ploompuu
a63e65fae8
Reduced allocations in ILInlining
7 years ago
Siegfried Pammer
deb1b6918f
Fix bug and typo in IsInConstructorInitializer
7 years ago
Siegfried Pammer
96eb7e07dc
Force ILInlining to aggressively inline constructor initializer statements.
7 years ago
Daniel Grunwald
3c720b2030
Implement ?. operator when the result of the call is not used
...
For example: "if (x != null) x.M();" -> "x?.M();"
8 years ago
Daniel Grunwald
a8a852b742
Add instructions for modeling the "?." operator in the ILAst.
8 years ago
Daniel Grunwald
d949d4e638
Fix #991 : explicit represent T->T? conversion in lifted operator calls.
8 years ago
Daniel Grunwald
02db362838
Ensure that StLoc.Value.ResultType == StLoc.Variable.StackType
...
This introduce a new explicit conversion (StartGCTracking) when converting unmanaged pointers to managed references.
8 years ago
Siegfried Pammer
349183544a
Rename BlockType to BlockKind
8 years ago
Daniel Grunwald
faa0c8a805
Aggressively inline in the whole catch-when block, not just on top-level.
8 years ago
Daniel Grunwald
51c895d5a5
Fix inlining into switch instructions.
8 years ago
Siegfried Pammer
1ebc7581d8
Fix IsUsedAsThisPointerInCall: if we deal with an unspecified generic type, we assume it's a value type as ldloca should be allowed as this pointer in those cases.
8 years ago
Daniel Grunwald
a6559d941b
Allow inlining into object/collection initializers.
8 years ago
Daniel Grunwald
7017c6f6e6
Replace LoopingBlockTransform with StatementTransform.
...
This transform interleaves statement-combining transforms so that nested structures can be detected better.
8 years ago
Daniel Grunwald
6988260ea3
Add ILInlining.IsUsedAsThisPointerInCall().
8 years ago
Daniel Grunwald
f380c29852
Refactor IsGeneratedValueTypeTemporary.
8 years ago
Daniel Grunwald
46e36f7e9a
Fix #868 : incorrect inlining of readonly fields.
8 years ago
Siegfried Pammer
4f7a479320
Add ILAstWritingOptions parameter to LockInstruction/UsingInstruction.WriteTo, fix merge errors.
8 years ago
Siegfried Pammer
fa25b5d2e8
Implement foreach loop detection in StatementBuilder.
8 years ago
Daniel Grunwald
96c6b03d9b
[nullables] operator! on bool?
8 years ago
Daniel Grunwald
919219524b
Eliminate the dedicated logic.not instruction, and treat it as syntax sugar similar to logic.and/logic.or.
...
'logic.not(arg)' is now represented using 'comp(arg == ldc.i4 0)'.
8 years ago