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

  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.     internal sealed class JSWrappedMethod : JSMethod, IWrappedMember
  25.     {
  26.         internal MethodInfo method;
  27.         private ParameterInfo[] pars;
  28.        
  29.         internal JSWrappedMethod(MethodInfo method, object obj) : base(obj)
  30.         {
  31.             this.obj = obj;
  32.             if (method is JSMethodInfo)
  33.                 method = ((JSMethodInfo)method).method;
  34.             this.method = method.GetBaseDefinition();
  35.             this.pars = this.method.GetParameters();
  36.             if (obj is JSObject && !Typeob.JSObject.IsAssignableFrom(method.DeclaringType))
  37.                 if (obj is BooleanObject)
  38.                     this.obj = ((BooleanObject)obj).value;
  39.                 else if (obj is NumberObject)
  40.                     this.obj = ((NumberObject)obj).value;
  41.                 else if (obj is StringObject)
  42.                     this.obj = ((StringObject)obj).value;
  43.                 else if (obj is ArrayWrapper)
  44.                     this.obj = ((ArrayWrapper)obj).value;
  45.         }
  46.        
  47.         public override MethodAttributes Attributes {
  48.             get { return this.method.Attributes; }
  49.         }
  50.        
  51.         private object[] CheckArguments(object[] args)
  52.         {
  53.             object[] newArgs = args;
  54.             if (args != null && args.Length < this.pars.Length) {
  55.                 newArgs = new object[this.pars.Length];
  56.                 ArrayObject.Copy(args, newArgs, args.Length);
  57.                 for (int i = args.Lengthint size = this.pars.Length; i < size; i++)
  58.                     newArgs[i] = System.Type.Missing;
  59.                 // this will take care of the default value
  60.             }
  61.             return newArgs;
  62.         }
  63.        
  64.         internal override object Construct(object[] args)
  65.         {
  66.             if (this.method is JSMethod)
  67.                 return ((JSMethod)(this.method)).Construct(args);
  68.             if (this.method.GetParameters().Length == 0 && this.method.ReturnType == Typeob.Object) {
  69.                 object func = this.method.Invoke(this.obj, BindingFlags.SuppressChangeType, null, null, null);
  70.                 if (func is ScriptFunction)
  71.                     return ((ScriptFunction)func).Construct(args);
  72.             }
  73.             throw new JScriptException(JSError.NoConstructor);
  74.         }
  75.        
  76.         public override Type DeclaringType {
  77.             get { return this.method.DeclaringType; }
  78.         }
  79.        
  80.         internal override string GetClassFullName()
  81.         {
  82.             if (this.method is JSMethod)
  83.                 return ((JSMethod)this.method).GetClassFullName();
  84.             else
  85.                 return this.method.DeclaringType.FullName;
  86.         }
  87.        
  88.         internal override PackageScope GetPackage()
  89.         {
  90.             if (this.method is JSMethod) {
  91.                 return ((JSMethod)this.method).GetPackage();
  92.             }
  93.             return null;
  94.         }
  95.        
  96.         public override ParameterInfo[] GetParameters()
  97.         {
  98.             return this.pars;
  99.         }
  100.        
  101.         internal override MethodInfo GetMethodInfo(CompilerGlobals compilerGlobals)
  102.         {
  103.             if (this.method is JSMethod)
  104.                 return ((JSMethod)(this.method)).GetMethodInfo(compilerGlobals);
  105.             else
  106.                 return this.method;
  107.         }
  108.        
  109.         public object GetWrappedObject()
  110.         {
  111.             return this.obj;
  112.         }
  113.        
  114.         #if !DEBUG
  115.         [DebuggerStepThroughAttribute()]
  116.         [DebuggerHiddenAttribute()]
  117.         #endif
  118.         public override object Invoke(object obj, BindingFlags options, Binder binder, object[] parameters, CultureInfo culture)
  119.         {
  120.             parameters = CheckArguments(parameters);
  121.             return this.Invoke(this.obj, this.obj, options, binder, parameters, culture);
  122.         }
  123.        
  124.         #if !DEBUG
  125.         [DebuggerStepThroughAttribute()]
  126.         [DebuggerHiddenAttribute()]
  127.         #endif
  128.         internal override object Invoke(object obj, object thisob, BindingFlags options, Binder binder, object[] parameters, CultureInfo culture)
  129.         {
  130.             parameters = CheckArguments(parameters);
  131.             if (this.obj != null && !(this.obj is Type))
  132.                 obj = this.obj;
  133.             if (this.method is JSMethod)
  134.                 return ((JSMethod)this.method).Invoke(obj, thisob, options, binder, parameters, culture);
  135.             else
  136.                 return this.method.Invoke(obj, options, binder, parameters, culture);
  137.         }
  138.        
  139.         public override string Name {
  140.             get { return this.method.Name; }
  141.         }
  142.        
  143.         public override Type ReturnType {
  144.             get { return this.method.ReturnType; }
  145.         }
  146.        
  147.         public override string ToString()
  148.         {
  149.             return this.method.ToString();
  150.         }
  151.     }
  152. }

Developer Fusion