2009-07-11 Michael Barker <mike@middlesoft.co.uk>
[mono.git] / mcs / class / dlr / Runtime / Microsoft.Dynamic / ArgBuilder.cs
1 /* ****************************************************************************
2  *
3  * Copyright (c) Microsoft Corporation. 
4  *
5  * This source code is subject to terms and conditions of the Microsoft Public License. A 
6  * copy of the license can be found in the License.html file at the root of this distribution. If 
7  * you cannot locate the  Microsoft Public License, please send an email to 
8  * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound 
9  * by the terms of the Microsoft Public License.
10  *
11  * You must not remove this notice, or any other, from this software.
12  *
13  *
14  * ***************************************************************************/
15 using System; using Microsoft;
16
17
18 #if !SILVERLIGHT
19
20 #if CODEPLEX_40
21 using System.Linq.Expressions;
22 #else
23 using Microsoft.Linq.Expressions;
24 #endif
25
26 #if CODEPLEX_40
27 namespace System.Dynamic {
28 #else
29 namespace Microsoft.Scripting {
30 #endif
31     /// <summary>
32     /// ArgBuilder provides an argument value used by the MethodBinder.  One ArgBuilder exists for each
33     /// physical parameter defined on a method.  
34     /// 
35     /// Contrast this with ParameterWrapper which represents the logical argument passed to the method.
36     /// </summary>
37     internal abstract class ArgBuilder {
38         /// <summary>
39         /// Provides the Expression which provides the value to be passed to the argument.
40         /// </summary>
41         internal abstract Expression Marshal(Expression parameter);
42
43         /// <summary>
44         /// Provides the Expression which provides the value to be passed to the argument.
45         /// This method is called when result is intended to be used ByRef.
46         /// </summary>
47         internal virtual Expression MarshalToRef(Expression parameter) {
48             return Marshal(parameter);
49         }
50
51         /// <summary>
52         /// Provides an Expression which will update the provided value after a call to the method.
53         /// May return null if no update is required.
54         /// </summary>
55         internal virtual Expression UnmarshalFromRef(Expression newValue) {
56             return newValue;
57         }
58     }
59 }
60
61 #endif