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

  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.Diagnostics;
  20.    
  21.     public enum ErrorType : int
  22.     {
  23.         OtherError,
  24.         EvalError,
  25.         RangeError,
  26.         ReferenceError,
  27.         SyntaxError,
  28.         TypeError,
  29.         URIError
  30.     }
  31.    
  32.     public sealed class ErrorConstructor : ScriptFunction
  33.     {
  34.         static internal readonly ErrorConstructor ob = new ErrorConstructor();
  35.         static internal readonly ErrorConstructor evalOb = new ErrorConstructor("EvalError", ErrorType.EvalError);
  36.         static internal readonly ErrorConstructor rangeOb = new ErrorConstructor("RangeError", ErrorType.RangeError);
  37.         static internal readonly ErrorConstructor referenceOb = new ErrorConstructor("ReferenceError", ErrorType.ReferenceError);
  38.         static internal readonly ErrorConstructor syntaxOb = new ErrorConstructor("SyntaxError", ErrorType.SyntaxError);
  39.         static internal readonly ErrorConstructor typeOb = new ErrorConstructor("TypeError", ErrorType.TypeError);
  40.         static internal readonly ErrorConstructor uriOb = new ErrorConstructor("URIError", ErrorType.URIError);
  41.        
  42.         private ErrorPrototype originalPrototype;
  43.         private ErrorType type;
  44.         private GlobalObject globalObject;
  45.        
  46.         internal ErrorConstructor() : base(ErrorPrototype.ob, "Error", 2)
  47.         {
  48.             this.originalPrototype = ErrorPrototype.ob;
  49.             ErrorPrototype.ob._constructor = this;
  50.             this.proto = ErrorPrototype.ob;
  51.             this.type = ErrorType.OtherError;
  52.             this.globalObject = GlobalObject.commonInstance;
  53.         }
  54.        
  55.         internal ErrorConstructor(LenientFunctionPrototype parent, LenientErrorPrototype prototypeProp, GlobalObject globalObject) : base(parent, "Error", 2)
  56.         {
  57.             this.originalPrototype = prototypeProp;
  58.             prototypeProp.constructor = this;
  59.             this.proto = prototypeProp;
  60.             this.type = ErrorType.OtherError;
  61.             this.globalObject = globalObject;
  62.             this.noExpando = false;
  63.         }
  64.        
  65.         internal ErrorConstructor(string subtypeName, ErrorType type) : base(ErrorConstructor.ob.parent, subtypeName, 2)
  66.         {
  67.             this.originalPrototype = new ErrorPrototype(ob.originalPrototype, subtypeName);
  68.             this.originalPrototype._constructor = this;
  69.             this.proto = this.originalPrototype;
  70.             this.type = type;
  71.             this.globalObject = GlobalObject.commonInstance;
  72.         }
  73.        
  74.         internal ErrorConstructor(string subtypeName, ErrorType type, ErrorConstructor error, GlobalObject globalObject) : base(error.parent, subtypeName, 2)
  75.         {
  76.             this.originalPrototype = new LenientErrorPrototype((LenientFunctionPrototype)error.parent, error.originalPrototype, subtypeName);
  77.             this.noExpando = false;
  78.             this.originalPrototype._constructor = this;
  79.             this.proto = this.originalPrototype;
  80.             this.type = type;
  81.             this.globalObject = globalObject;
  82.             this.noExpando = false;
  83.         }
  84.        
  85.         internal override object Call(object[] args, object thisob)
  86.         {
  87.             return this.Construct(args);
  88.         }
  89.        
  90.         internal override object Construct(object[] args)
  91.         {
  92.             return this.CreateInstance(args);
  93.         }
  94.        
  95.         internal ErrorObject Construct(object e)
  96.         {
  97.             if (!(e is JScriptException) || this != this.globalObject.originalError) {
  98.                 switch (this.type) {
  99.                     case ErrorType.EvalError:
  100.                         return new EvalErrorObject(this.originalPrototype, e);
  101.                     case ErrorType.RangeError:
  102.                         return new RangeErrorObject(this.originalPrototype, e);
  103.                     case ErrorType.ReferenceError:
  104.                         return new ReferenceErrorObject(this.originalPrototype, e);
  105.                     case ErrorType.SyntaxError:
  106.                         return new SyntaxErrorObject(this.originalPrototype, e);
  107.                     case ErrorType.TypeError:
  108.                         return new TypeErrorObject(this.originalPrototype, e);
  109.                     case ErrorType.URIError:
  110.                         return new URIErrorObject(this.originalPrototype, e);
  111.                     default:
  112.                         return new ErrorObject(this.originalPrototype, e);
  113.                 }
  114.             }
  115.             switch (((JScriptException)e).GetErrorType()) {
  116.                 case ErrorType.EvalError:
  117.                     return this.globalObject.originalEvalError.Construct(e);
  118.                 case ErrorType.RangeError:
  119.                     return this.globalObject.originalRangeError.Construct(e);
  120.                 case ErrorType.ReferenceError:
  121.                     return this.globalObject.originalReferenceError.Construct(e);
  122.                 case ErrorType.SyntaxError:
  123.                     return this.globalObject.originalSyntaxError.Construct(e);
  124.                 case ErrorType.TypeError:
  125.                     return this.globalObject.originalTypeError.Construct(e);
  126.                 case ErrorType.URIError:
  127.                     return this.globalObject.originalURIError.Construct(e);
  128.                 default:
  129.                     return new ErrorObject(this.originalPrototype, e);
  130.             }
  131.         }
  132.        
  133.         [JSFunctionAttribute(JSFunctionAttributeEnum.HasVarArgs)]
  134.         public new ErrorObject CreateInstance(params object[] args)
  135.         {
  136.             switch (this.type) {
  137.                 case ErrorType.EvalError:
  138.                     return new EvalErrorObject(this.originalPrototype, args);
  139.                 case ErrorType.RangeError:
  140.                     return new RangeErrorObject(this.originalPrototype, args);
  141.                 case ErrorType.ReferenceError:
  142.                     return new ReferenceErrorObject(this.originalPrototype, args);
  143.                 case ErrorType.SyntaxError:
  144.                     return new SyntaxErrorObject(this.originalPrototype, args);
  145.                 case ErrorType.TypeError:
  146.                     return new TypeErrorObject(this.originalPrototype, args);
  147.                 case ErrorType.URIError:
  148.                     return new URIErrorObject(this.originalPrototype, args);
  149.                 default:
  150.                     return new ErrorObject(this.originalPrototype, args);
  151.             }
  152.         }
  153.        
  154.         [JSFunctionAttribute(JSFunctionAttributeEnum.HasVarArgs)]
  155.         public object Invoke(params object[] args)
  156.         {
  157.             return this.CreateInstance(args);
  158.         }
  159.        
  160.     }
  161. }

Developer Fusion