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

  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 JSConstructor : ConstructorInfo
  25.     {
  26.         internal FunctionObject cons;
  27.        
  28.         internal JSConstructor(FunctionObject cons)
  29.         {
  30.             this.cons = cons;
  31.         }
  32.        
  33.         public override MethodAttributes Attributes {
  34.             get { return this.cons.attributes; }
  35.         }
  36.        
  37.        
  38.         internal object Construct(object thisob, object[] args)
  39.         {
  40.             return LateBinding.CallValue(this.cons, args, true, false, cons.engine, thisob, JSBinder.ob, null, null);
  41.         }
  42.        
  43.         public override string Name {
  44.             get { return this.cons.name; }
  45.         }
  46.        
  47.         public override Type DeclaringType {
  48.             get { return Convert.ToType(this.cons.enclosing_scope); }
  49.         }
  50.        
  51.         internal string GetClassFullName()
  52.         {
  53.             return ((ClassScope)this.cons.enclosing_scope).GetFullName();
  54.         }
  55.        
  56.         internal ClassScope GetClassScope()
  57.         {
  58.             return (ClassScope)this.cons.enclosing_scope;
  59.         }
  60.        
  61.         internal ConstructorInfo GetConstructorInfo(CompilerGlobals compilerGlobals)
  62.         {
  63.             return this.cons.GetConstructorInfo(compilerGlobals);
  64.         }
  65.        
  66.         public override object[] GetCustomAttributes(Type t, bool inherit)
  67.         {
  68.             return new object[0];
  69.         }
  70.        
  71.         public override object[] GetCustomAttributes(bool inherit)
  72.         {
  73.             if (this.cons != null) {
  74.                 CustomAttributeList caList = this.cons.customAttributes;
  75.                 if (caList != null)
  76.                     return (object[])caList.Evaluate(false);
  77.             }
  78.             return new object[0];
  79.         }
  80.        
  81.        
  82.         public override MethodImplAttributes GetMethodImplementationFlags()
  83.         {
  84.             return (MethodImplAttributes)0;
  85.         }
  86.        
  87.         internal PackageScope GetPackage()
  88.         {
  89.             return ((ClassScope)this.cons.enclosing_scope).GetPackage();
  90.         }
  91.        
  92.         public override ParameterInfo[] GetParameters()
  93.         {
  94.             return this.cons.parameter_declarations;
  95.         }
  96.        
  97.         #if !DEBUG
  98.         [DebuggerStepThroughAttribute()]
  99.         [DebuggerHiddenAttribute()]
  100.         #endif
  101.         public override object Invoke(BindingFlags options, Binder binder, object[] parameters, CultureInfo culture)
  102.         {
  103.             return LateBinding.CallValue(this.cons, parameters, true, false, this.cons.engine, null, binder, culture, null);
  104.         }
  105.        
  106.         #if !DEBUG
  107.         [DebuggerStepThroughAttribute()]
  108.         [DebuggerHiddenAttribute()]
  109.         #endif
  110.         public override object Invoke(object obj, BindingFlags options, Binder binder, object[] parameters, CultureInfo culture)
  111.         {
  112.             return this.cons.Call(parameters, obj, binder, culture);
  113.         }
  114.        
  115.         internal bool IsAccessibleFrom(ScriptObject scope)
  116.         {
  117.             //Never call this if the member is public
  118.             while (scope != null && !(scope is ClassScope))
  119.                 scope = scope.GetParent();
  120.             ClassScope thisScope = (ClassScope)this.cons.enclosing_scope;
  121.             if (this.IsPrivate)
  122.                 if (scope == null)
  123.                     return false;
  124.                 else
  125.                     return scope == thisScope || ((ClassScope)scope).IsNestedIn(thisScope, false);
  126.             else if (this.IsFamily)
  127.                 if (scope == null)
  128.                     return false;
  129.                 else
  130.                     return ((ClassScope)scope).IsSameOrDerivedFrom(thisScope) || ((ClassScope)scope).IsNestedIn(thisScope, false);
  131.             else {
  132.                 // if (this.IsAssembly || this.isFamilyOrAssembly)
  133.                 if (this.IsFamilyOrAssembly && scope != null && (((ClassScope)scope).IsSameOrDerivedFrom(thisScope) || ((ClassScope)scope).IsNestedIn(thisScope, false)))
  134.                     return true;
  135.                 else if (scope == null)
  136.                     return thisScope.GetPackage() == null;
  137.                 else
  138.                     //Code is not in a class and hence it is in the default package
  139.                     //null indicates default package
  140.                     return thisScope.GetPackage() == ((ClassScope)scope).GetPackage();
  141.             }
  142.         }
  143.        
  144.         public override bool IsDefined(Type type, bool inherit)
  145.         {
  146.             return false;
  147.         }
  148.        
  149.         public override MemberTypes MemberType {
  150.             get { return MemberTypes.Constructor; }
  151.         }
  152.        
  153.         public override RuntimeMethodHandle MethodHandle {
  154.             get { return this.GetConstructorInfo(null).MethodHandle; }
  155.         }
  156.        
  157.         internal Type OuterClassType()
  158.         {
  159.             FieldInfo ocField = ((ClassScope)this.cons.enclosing_scope).outerClassField;
  160.             return ocField == null ? null : ocField.FieldType;
  161.         }
  162.        
  163.         public override Type ReflectedType {
  164.             get { return this.DeclaringType; }
  165.         }
  166.     }
  167. }

Developer Fusion