The Labs \ Source Viewer \ SSCLI \ Microsoft.JScript \ JSMethodInfo

  1. // ==++==
  2. //
  3. //
  4. // Copyright (c) 2006 Microsoft Corporation. All rights reserved.
  5. //
  6. // The use and distribution terms for this software are contained in the file
  7. // named license.txt, which can be found in the root of this distribution.
  8. // By using this software in any fashion, you are agreeing to be bound by the
  9. // terms of this license.
  10. //
  11. // You must not remove this notice, or any other, from this software.
  12. //
  13. //
  14. // ==--==
  15. namespace Microsoft.JScript
  16. {
  17.    
  18.     using System;
  19.     using System.Reflection;
  20.     using System.Reflection.Emit;
  21.     using System.Globalization;
  22.     using System.Diagnostics;
  23.    
  24.     public sealed class JSMethodInfo : MethodInfo
  25.     {
  26.         internal MethodInfo method;
  27.         private MethodAttributes methAttributes;
  28.         private string name = null;
  29.         private Type declaringType = null;
  30.         private ParameterInfo[] parameters = null;
  31.         private object[] attributes = null;
  32.         private MethodInvoker methodInvoker = null;
  33.        
  34.         internal JSMethodInfo(MethodInfo method)
  35.         {
  36.             this.method = method;
  37.             this.methAttributes = method.Attributes;
  38.         }
  39.        
  40.         public override MethodAttributes Attributes {
  41.             get { return this.methAttributes; }
  42.         }
  43.        
  44.         public override Type DeclaringType {
  45.             get {
  46.                 Type result = this.declaringType;
  47.                 if (result == null)
  48.                     this.declaringType = result = this.method.DeclaringType;
  49.                 return result;
  50.             }
  51.         }
  52.        
  53.         public override MethodInfo GetBaseDefinition()
  54.         {
  55.             return this.method.GetBaseDefinition();
  56.         }
  57.        
  58.         public override sealed object[] GetCustomAttributes(bool inherit)
  59.         {
  60.             object[] attrs = this.attributes;
  61.             if (attrs != null)
  62.                 return attrs;
  63.             return this.attributes = this.method.GetCustomAttributes(true);
  64.         }
  65.        
  66.         public override sealed object[] GetCustomAttributes(Type type, bool inherit)
  67.         {
  68.             if (type != typeof(JSFunctionAttribute))
  69.                 return null;
  70.             object[] attrs = this.attributes;
  71.             if (attrs != null)
  72.                 return attrs;
  73.             return this.attributes = CustomAttribute.GetCustomAttributes(this.method, type, true);
  74.         }
  75.        
  76.         public override MethodImplAttributes GetMethodImplementationFlags()
  77.         {
  78.             return this.method.GetMethodImplementationFlags();
  79.         }
  80.        
  81.         public override ParameterInfo[] GetParameters()
  82.         {
  83.             ParameterInfo[] parameters = this.parameters;
  84.             if (parameters != null)
  85.                 return parameters;
  86.             parameters = this.method.GetParameters();
  87.             for (int i = 0int n = parameters.Length; i < n; i++)
  88.                 parameters[i] = new JSParameterInfo(parameters[i]);
  89.             return this.parameters = parameters;
  90.         }
  91.        
  92.         #if !DEBUG
  93.         [DebuggerStepThroughAttribute()]
  94.         [DebuggerHiddenAttribute()]
  95.         #endif
  96.         public override object Invoke(object obj, BindingFlags options, Binder binder, object[] parameters, CultureInfo culture)
  97.         {
  98.             MethodInfo method = TypeReferences.ToExecutionContext(this.method);
  99.             if (binder != null) {
  100.                 try {
  101.                     return method.Invoke(obj, options, binder, parameters, culture);
  102.                 }
  103.                 catch (TargetInvocationException e) {
  104.                     throw e.InnerException;
  105.                 }
  106.             }
  107.             MethodInvoker invoker = this.methodInvoker;
  108.             if (invoker == null) {
  109.                 this.methodInvoker = invoker = MethodInvoker.GetInvokerFor(method);
  110.                 if (invoker == null)
  111.                     //because the method is not safe to call via a thunk
  112.                     try {
  113.                         return method.Invoke(obj, options, binder, parameters, culture);
  114.                     }
  115.                     catch (TargetInvocationException e) {
  116.                         throw e.InnerException;
  117.                     }
  118.             }
  119.             return invoker.Invoke(obj, parameters);
  120.         }
  121.        
  122.         public override sealed bool IsDefined(Type type, bool inherit)
  123.         {
  124.             Debug.PreCondition(type == typeof(JSFunctionAttribute));
  125.             object[] attrs = this.attributes;
  126.             if (attrs == null)
  127.                 this.attributes = attrs = CustomAttribute.GetCustomAttributes(this.method, type, true);
  128.             return attrs.Length > 0;
  129.         }
  130.        
  131.         public override MemberTypes MemberType {
  132.             get { return MemberTypes.Method; }
  133.         }
  134.        
  135.         public override RuntimeMethodHandle MethodHandle {
  136.             get { return this.method.MethodHandle; }
  137.         }
  138.        
  139.         public override string Name {
  140.             get {
  141.                 string result = this.name;
  142.                 if (result == null)
  143.                     this.name = result = this.method.Name;
  144.                 return result;
  145.             }
  146.         }
  147.        
  148.         public override Type ReflectedType {
  149.             get { return this.method.ReflectedType; }
  150.         }
  151.        
  152.         public override Type ReturnType {
  153.             get { return this.method.ReturnType; }
  154.         }
  155.        
  156.         public override ICustomAttributeProvider ReturnTypeCustomAttributes {
  157.             get { return this.method.ReturnTypeCustomAttributes; }
  158.         }
  159.        
  160.         public override string ToString()
  161.         {
  162.             return this.method.ToString();
  163.         }
  164.        
  165.     }
  166. }

Developer Fusion