Add Full AOT support for System.Linq.Expression.
authorRodrigo Kumpera <kumpera@gmail.com>
Tue, 6 Nov 2012 15:09:41 +0000 (10:09 -0500)
committerRodrigo Kumpera <kumpera@gmail.com>
Tue, 6 Nov 2012 23:18:13 +0000 (18:18 -0500)
* System.Core/System.Linq.Expressions/*.cs: To bring LINQ expressions
to Full AOT we disable all code that depends on SRE or dynamic code generation.

22 files changed:
mcs/class/System.Core/System.Linq.Expressions/BinaryExpression.cs
mcs/class/System.Core/System.Linq.Expressions/ConditionalExpression.cs
mcs/class/System.Core/System.Linq.Expressions/ConstantExpression.cs
mcs/class/System.Core/System.Linq.Expressions/ElementInit.cs
mcs/class/System.Core/System.Linq.Expressions/EmitContext.cs
mcs/class/System.Core/System.Linq.Expressions/Expression.cs
mcs/class/System.Core/System.Linq.Expressions/InvocationExpression.cs
mcs/class/System.Core/System.Linq.Expressions/LambdaExpression.cs
mcs/class/System.Core/System.Linq.Expressions/ListInitExpression.cs
mcs/class/System.Core/System.Linq.Expressions/MemberAssignment.cs
mcs/class/System.Core/System.Linq.Expressions/MemberBinding.cs
mcs/class/System.Core/System.Linq.Expressions/MemberExpression.cs
mcs/class/System.Core/System.Linq.Expressions/MemberInitExpression.cs
mcs/class/System.Core/System.Linq.Expressions/MemberListBinding.cs
mcs/class/System.Core/System.Linq.Expressions/MemberMemberBinding.cs
mcs/class/System.Core/System.Linq.Expressions/MethodCallExpression.cs
mcs/class/System.Core/System.Linq.Expressions/NewArrayExpression.cs
mcs/class/System.Core/System.Linq.Expressions/NewExpression.cs
mcs/class/System.Core/System.Linq.Expressions/ParameterExpression.cs
mcs/class/System.Core/System.Linq.Expressions/TypeBinaryExpression.cs
mcs/class/System.Core/System.Linq.Expressions/UnaryExpression.cs
mcs/class/System.Core/System.Runtime.CompilerServices/ExecutionScope.cs

index 569299e8fbdcb2277abe5241e23d55e7e2538735..143f57513f47f7ba7c38307bf8729162d48b5d95 100644 (file)
@@ -97,6 +97,7 @@ namespace System.Linq.Expressions {
                        this.is_lifted = is_lifted;
                }
 
+#if !FULL_AOT_RUNTIME
                void EmitArrayAccess (EmitContext ec)
                {
                        left.Emit (ec);
@@ -768,5 +769,6 @@ namespace System.Linq.Expressions {
                                throw new NotSupportedException (this.NodeType.ToString ());
                        }
                }
+#endif
        }
 }
index b9286535bc188321b0130002444229b39a6835d5..6d6d5dd60eca27dfa7da896d430566048555c914 100644 (file)
@@ -57,6 +57,7 @@ namespace System.Linq.Expressions {
                        this.if_false = if_false;
                }
 
+#if !FULL_AOT_RUNTIME
                internal override void Emit (EmitContext ec)
                {
                        var ig = ec.ig;
@@ -74,5 +75,6 @@ namespace System.Linq.Expressions {
 
                        ig.MarkLabel (end_target);
                }
+#endif
        }
 }
index dd45bdc967c6f7a82073b4e3e792a66fb915b7ba..38a7b3cab66116f54649681a2016c64a5b4de9af 100644 (file)
@@ -50,6 +50,7 @@ namespace System.Linq.Expressions {
                        this.value = value;
                }
 
+#if !FULL_AOT_RUNTIME
                internal override void Emit (EmitContext ec)
                {
                        if (Type.IsNullable ()) {
@@ -190,5 +191,6 @@ namespace System.Linq.Expressions {
 
                        emit (ec);
                }
+#endif
        }
 }
index 0880f12f770d76b78eea402595488dfc37b38623..2069927b3066aed4119802c8272b32e1ee243406 100644 (file)
@@ -57,6 +57,7 @@ namespace System.Linq.Expressions {
                        return ExpressionPrinter.ToString (this);
                }
 
+#if !FULL_AOT_RUNTIME
                void EmitPopIfNeeded (EmitContext ec)
                {
                        if (add_method.ReturnType == typeof (void))
@@ -70,5 +71,6 @@ namespace System.Linq.Expressions {
                        ec.EmitCall (local, arguments, add_method);
                        EmitPopIfNeeded (ec);
                }
+#endif
        }
 }
index dd9934218b2565857f8caf113d7e2697e8dadd84..a43b87f728bf0f2ad672b30c2e2b2edea1a2b808 100644 (file)
@@ -27,6 +27,7 @@
 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 //
 
+#if !FULL_AOT_RUNTIME
 using System;
 using System.Collections.ObjectModel;
 using System.Collections.Generic;
@@ -606,3 +607,4 @@ namespace System.Linq.Expressions {
                }
        }
 }
+#endif
index ebc27e0545776a5ae3546bfbfbed58a7de58c004..bfe939a5cb0901bb47395d82de7a18de15840b68 100644 (file)
@@ -2268,9 +2268,11 @@ namespace System.Linq.Expressions {
                // This method must be overwritten by derived classes to
                // compile the expression
                //
+#if !FULL_AOT_RUNTIME
                internal virtual void Emit (EmitContext ec)
                {
                        throw new NotImplementedException (String.Format ("Emit method is not implemented in expression type {0}", GetType ()));
                }
+#endif
        }
 }
index 13994a13202c076824b8c274e15757a0edddb1a9..ad12dc38460dc405f4d5b5fdbf7ef4915e74f275 100644 (file)
@@ -53,9 +53,11 @@ namespace System.Linq.Expressions {
                        this.arguments = arguments;
                }
 
+#if !FULL_AOT_RUNTIME
                internal override void Emit (EmitContext ec)
                {
                        ec.EmitCall (expression, arguments, expression.Type.GetInvokeMethod ());
                }
+#endif
        }
 }
index 96d3ed817115e39b11fff83603eb8c172822556f..92a40c6d4b7f220bf1591ba48ff3b976b833fd00 100644 (file)
@@ -55,6 +55,7 @@ namespace System.Linq.Expressions {
                        this.parameters = parameters;
                }
 
+#if !FULL_AOT_RUNTIME
                void EmitPopIfNeeded (EmitContext ec)
                {
                        if (GetReturnType () == typeof (void) && body.Type != typeof (void))
@@ -72,6 +73,7 @@ namespace System.Linq.Expressions {
                        EmitPopIfNeeded (ec);
                        ec.ig.Emit (OpCodes.Ret);
                }
+#endif
 
                internal Type GetReturnType ()
                {
index 30915a89dc3b28933cae728236ef027a61509023..517ad39a72d2f15f6e81de091fae72dc90588070 100644 (file)
@@ -53,11 +53,13 @@ namespace System.Linq.Expressions {
                        this.initializers = initializers;
                }
 
+#if !FULL_AOT_RUNTIME
                internal override void Emit (EmitContext ec)
                {
                        var local = ec.EmitStored (new_expression);
                        ec.EmitCollection (initializers, local);
                        ec.EmitLoad (local);
                }
+#endif
        }
 }
index f62acfb2ff55e69befc750f62fde12ea1b1a51ef..cf58105456810d348056be60d01d7f53ee5c1221 100644 (file)
@@ -47,6 +47,7 @@ namespace System.Linq.Expressions {
                        this.expression = expression;
                }
 
+#if !FULL_AOT_RUNTIME
                internal override void Emit (EmitContext ec, LocalBuilder local)
                {
                        this.Member.OnFieldOrProperty (
@@ -71,5 +72,6 @@ namespace System.Linq.Expressions {
                        expression.Emit (ec);
                        ec.EmitCall (setter);
                }
+#endif
        }
 }
index 5187fa551f194f320bab8d3d68855c8be880ce68..bf0c6835c3fb9c351301af610b557d0881cbb1eb 100644 (file)
@@ -56,6 +56,7 @@ namespace System.Linq.Expressions {
                        return ExpressionPrinter.ToString (this);
                }
 
+#if !FULL_AOT_RUNTIME
                internal abstract void Emit (EmitContext ec, LocalBuilder local);
 
                internal LocalBuilder EmitLoadMember (EmitContext ec, LocalBuilder local)
@@ -86,5 +87,6 @@ namespace System.Linq.Expressions {
                        ec.ig.Emit (OpCodes.Stloc, store);
                        return store;
                }
+#endif
        }
 }
index 91a6aa0c1a89ad75063005ef90d80a580be4bdaa..1a0255f4ea776b9f1fc36d7fc4d2a95919a1cab6 100644 (file)
@@ -52,6 +52,7 @@ namespace System.Linq.Expressions {
                        this.member = member;
                }
 
+#if !FULL_AOT_RUNTIME
                internal override void Emit (EmitContext ec)
                {
                        member.OnFieldOrProperty (
@@ -76,5 +77,6 @@ namespace System.Linq.Expressions {
                        } else
                                ec.ig.Emit (OpCodes.Ldsfld, field);
                }
+#endif
        }
 }
index 59b71baeef3ae4e953a6a2955cc8ca7e5d10d8d6..ed30e9c2fb93a9d2287b7d2e8ca87689cf6b9f18 100644 (file)
@@ -52,11 +52,13 @@ namespace System.Linq.Expressions {
                        this.bindings = bindings;
                }
 
+#if !FULL_AOT_RUNTIME
                internal override void Emit (EmitContext ec)
                {
                        var local = ec.EmitStored (new_expression);
                        ec.EmitCollection (bindings, local);
                        ec.EmitLoad (local);
                }
+#endif
        }
 }
index 03b7e67da63bd8ae166778ec2f57abc564a77317..3c320e63e30a2c4e375287fb3b633507d40caebc 100644 (file)
@@ -47,6 +47,7 @@ namespace System.Linq.Expressions {
                        this.initializers = initializers;
                }
 
+#if !FULL_AOT_RUNTIME
                internal override void Emit (EmitContext ec, LocalBuilder local)
                {
                        var member = EmitLoadMember (ec, local);
@@ -54,5 +55,6 @@ namespace System.Linq.Expressions {
                        foreach (var initializer in initializers)
                                initializer.Emit (ec, member);
                }
+#endif
        }
 }
index 9eb0c515d9dbc3644d47613dfe0bbaa59aa57aab..ec10de5c5266d8fb05bb1d76e9ac076f85b0a61e 100644 (file)
@@ -47,6 +47,7 @@ namespace System.Linq.Expressions {
                        this.bindings = bindings;
                }
 
+#if !FULL_AOT_RUNTIME
                internal override void Emit (EmitContext ec, LocalBuilder local)
                {
                        var member = EmitLoadMember (ec, local);
@@ -54,5 +55,6 @@ namespace System.Linq.Expressions {
                        foreach (var binding in bindings)
                                binding.Emit (ec, member);
                }
+#endif
        }
 }
index 02718ffa055d354d3ec44bdbd20edee520ca2293..7f898689c0a796adb10d6fd09d2bab77d2683f2c 100644 (file)
@@ -66,9 +66,11 @@ namespace System.Linq.Expressions {
                        this.arguments = arguments;
                }
 
+#if !FULL_AOT_RUNTIME
                internal override void Emit (EmitContext ec)
                {
                        ec.EmitCall (obj, arguments, method);
                }
+#endif
        }
 }
index b952b8c0057c48c5a46966bb927f78090dfceab6..c30bec70537a335bae16f82adc8511281d05fd10 100644 (file)
@@ -48,6 +48,7 @@ namespace System.Linq.Expressions {
                        this.expressions = expressions;
                }
 
+#if !FULL_AOT_RUNTIME
                void EmitNewArrayInit (EmitContext ec, Type type)
                {
                        var size = expressions.Count;
@@ -107,5 +108,6 @@ namespace System.Linq.Expressions {
                                throw new NotSupportedException ();
                        }
                }
+#endif
        }
 }
index 8e6673c616c8b7714708969cfe65d909cee858df..005d17569ec8d9c4943cd897e927b59b4bb0973d 100644 (file)
@@ -65,6 +65,7 @@ namespace System.Linq.Expressions {
                        this.members = members;
                }
 
+#if !FULL_AOT_RUNTIME
                internal override void Emit (EmitContext ec)
                {
                        var ig = ec.ig;
@@ -90,6 +91,7 @@ namespace System.Linq.Expressions {
                        } else
                                ig.Emit (OpCodes.Newobj, constructor ?? GetDefaultConstructor (type));
                }
+#endif
 
                static ConstructorInfo GetDefaultConstructor (Type type)
                {
index 651f9a90b94c71532848e5db6b2e75cd070b5b62..94bd0ea4475dd02c125aa06473877b73481f9300 100644 (file)
@@ -46,6 +46,7 @@ namespace System.Linq.Expressions {
                        this.name = name;
                }
 
+#if !FULL_AOT_RUNTIME
                void EmitLocalParameter (EmitContext ec, int position)
                {
                        ec.ig.Emit (OpCodes.Ldarg, position);
@@ -82,5 +83,6 @@ namespace System.Linq.Expressions {
 
                        throw new InvalidOperationException ("Parameter out of scope");
                }
+#endif
        }
 }
index 4463e4e8b29a754f90933b0e66db17edd3e3bacb..2629c96c4f20e9c94d7198cfd29edbf4434f81a9 100644 (file)
@@ -51,6 +51,7 @@ namespace System.Linq.Expressions {
                        this.type_operand = type_operand;
                }
 
+#if !FULL_AOT_RUNTIME
                internal override void Emit (EmitContext ec)
                {
                        if (expression.Type == typeof (void)) {
@@ -63,5 +64,6 @@ namespace System.Linq.Expressions {
                        ec.ig.Emit (OpCodes.Ldnull);
                        ec.ig.Emit (OpCodes.Cgt_Un);
                }
+#endif
        }
 }
index 11e6240afca4b70ded4a82ad505686b9327ad32d..4f6f9cb890d679651918e0c48e23a76d984df4d8 100644 (file)
@@ -68,6 +68,7 @@ namespace System.Linq.Expressions {
                        this.is_lifted = is_lifted;
                }
 
+#if !FULL_AOT_RUNTIME
                void EmitArrayLength (EmitContext ec)
                {
                        operand.Emit (ec);
@@ -431,5 +432,6 @@ namespace System.Linq.Expressions {
                                throw new NotImplementedException (this.NodeType.ToString ());
                        }
                }
+#endif
        }
 }
index ef063be4974a686f8bed9f2f8aba0eb623924d8f..b64fd4e55ae881487a412ebb24536b23021cb3ae 100644 (file)
@@ -27,6 +27,7 @@
 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 //
 
+#if !FULL_AOT_RUNTIME
 using System;
 using System.Linq.Expressions;
 
@@ -96,3 +97,4 @@ namespace System.Runtime.CompilerServices {
                }
        }
 }
+#endif