2009-07-11 Michael Barker <mike@middlesoft.co.uk>
[mono.git] / mcs / class / dlr / Runtime / Microsoft.Scripting.Core / Actions / CallSiteHelpers.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 using System.Reflection;
19 #if CODEPLEX_40
20 namespace System.Runtime.CompilerServices {
21 #else
22 namespace Microsoft.Runtime.CompilerServices {
23 #endif
24     /// <summary>
25     /// Class that contains helper methods for DLR CallSites.
26     /// </summary>
27     public static class CallSiteHelpers {
28         private static Type _knownNonDynamicMethodType = typeof(object).GetMethod("ToString").GetType();
29
30         /// <summary>
31         /// Checks if a <see cref="MethodBase"/> is internally used by DLR and should not
32         /// be displayed on the language code's stack.
33         /// </summary>
34         /// <param name="mb">The input <see cref="MethodBase"/></param>
35         /// <returns>
36         /// True if the input <see cref="MethodBase"/> is internally used by DLR and should not
37         /// be displayed on the language code's stack. Otherwise, false.
38         /// </returns>
39         [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1011:ConsiderPassingBaseTypesAsParameters")]
40         public static bool IsInternalFrame(MethodBase mb) {
41             //All the dynamic methods created for DLR rules have a special name.
42             //We also check if the method has a different type than the known
43             //non-static method. If it does, it is a dynamic method.
44             //This could be improved if the CLR provides a way to attach some information
45             //to the dynamic method we create, like CustomAttributes.
46             if (mb.Name == "CallSite.Target" && mb.GetType() != _knownNonDynamicMethodType) {
47                 return true;
48             }
49
50             //Filter out the helper methods.
51 #if CODEPLEX_40
52             if (mb.DeclaringType == typeof(System.Dynamic.UpdateDelegates)) {
53 #else
54             if (mb.DeclaringType == typeof(Microsoft.Scripting.UpdateDelegates)) {
55 #endif
56                 return true;
57             }
58
59             return false;
60         }
61     }
62 }