internal override object GetDefaultValue(PreferredType preferred_type)
 {
     if (base.GetParent() is LenientStringPrototype)
     {
         return base.GetDefaultValue(preferred_type);
     }
     if (preferred_type == PreferredType.String)
     {
         if (!base.noExpando && (base.NameTable["toString"] != null))
         {
             return base.GetDefaultValue(preferred_type);
         }
         return this.value;
     }
     if (preferred_type == PreferredType.LocaleString)
     {
         return base.GetDefaultValue(preferred_type);
     }
     if (!base.noExpando)
     {
         object obj3 = base.NameTable["valueOf"];
         if ((obj3 == null) && (preferred_type == PreferredType.Either))
         {
             obj3 = base.NameTable["toString"];
         }
         if (obj3 != null)
         {
             return base.GetDefaultValue(preferred_type);
         }
     }
     return this.value;
 }
 internal override object GetDefaultValue(PreferredType preferred_type)
 {
     if (base.GetParent() is LenientStringPrototype)
     {
         return(base.GetDefaultValue(preferred_type));
     }
     if (preferred_type == PreferredType.String)
     {
         if (!base.noExpando && (base.NameTable["toString"] != null))
         {
             return(base.GetDefaultValue(preferred_type));
         }
         return(this.value);
     }
     if (preferred_type == PreferredType.LocaleString)
     {
         return(base.GetDefaultValue(preferred_type));
     }
     if (!base.noExpando)
     {
         object obj3 = base.NameTable["valueOf"];
         if ((obj3 == null) && (preferred_type == PreferredType.Either))
         {
             obj3 = base.NameTable["toString"];
         }
         if (obj3 != null)
         {
             return(base.GetDefaultValue(preferred_type));
         }
     }
     return(this.value);
 }
Beispiel #3
0
 internal override object GetDefaultValue(PreferredType preferred_type)
 {
     if ((preferred_type != PreferredType.String) && (preferred_type != PreferredType.LocaleString))
     {
         return((double)1.0 / (double)0.0);
     }
     return("");
 }
 internal override Object GetDefaultValue(PreferredType preferred_type)
 {
     if (preferred_type == PreferredType.String || preferred_type == PreferredType.LocaleString)
     {
         return("");
     }
     else
     {
         return(Double.NaN);
     }
 }
Beispiel #5
0
        public override DataType Clone()
        {
            DataType pre = PreferredType != null?PreferredType.Clone() : null;

            UnionType u = new UnionType(Name, pre);

            u.UserDefined = UserDefined;
            foreach (UnionAlternative a in this.Alternatives.Values)
            {
                u.Alternatives.Add(a.Clone());
            }
            return(u);
        }
Beispiel #6
0
        public override DataType Clone(IDictionary <DataType, DataType>?clonedTypes)
        {
            var pre = PreferredType?.Clone(clonedTypes);
            var u   = new UnionType(Name, pre);

            u.Qualifier   = Qualifier;
            u.UserDefined = UserDefined;
            foreach (var a in this.Alternatives.Values)
            {
                u.Alternatives.Add(a.Clone());
            }
            return(u);
        }
 internal override Object GetDefaultValue(PreferredType preferred_type)
 {
     if (this.GetParent() is LenientDatePrototype)
     {
         return(base.GetDefaultValue(preferred_type));
     }
     if (preferred_type == PreferredType.String || preferred_type == PreferredType.Either)
     {
         if (!this.noExpando)
         {
             Object field = this.NameTable["toString"];
             if (field != null)
             {
                 return(base.GetDefaultValue(preferred_type));
             }
         }
         return(DatePrototype.toString(this));
     }
     else if (preferred_type == PreferredType.LocaleString)
     {
         if (!this.noExpando)
         {
             Object field = this.NameTable["toLocaleString"];
             if (field != null)
             {
                 return(base.GetDefaultValue(preferred_type));
             }
         }
         return(DatePrototype.toLocaleString(this));
     }
     else
     {
         if (!this.noExpando)
         {
             Object field = this.NameTable["valueOf"];
             if (field == null && preferred_type == PreferredType.Either)
             {
                 field = this.NameTable["toString"];
             }
             if (field != null)
             {
                 return(base.GetDefaultValue(preferred_type));
             }
         }
         return(this.value);
     }
 }
Beispiel #8
0
 internal override Object GetDefaultValue(PreferredType preferred_type){
   if (this.GetParent() is LenientNumberPrototype) return base.GetDefaultValue(preferred_type);
   if (preferred_type == PreferredType.String){
     if (!this.noExpando){
       Object field = this.NameTable["toString"];
       if (field != null) return base.GetDefaultValue(preferred_type);
     }
     return Convert.ToString(this.value);
   }else if (preferred_type == PreferredType.LocaleString){
     return base.GetDefaultValue(preferred_type);
   }else{
     if (!this.noExpando){
       Object field = this.NameTable["valueOf"];
       if (field == null && preferred_type == PreferredType.Either)
         field = this.NameTable["toString"];
       if (field != null) return base.GetDefaultValue(preferred_type);
     }
     return this.value;
   }
 }
Beispiel #9
0
 internal override Object GetDefaultValue(PreferredType preferred_type){
   return this.GetFullName();
 }
 internal static object ToPrimitive(object value, PreferredType preferredType, ref IConvertible ic)
 {
     TypeCode typeCode = GetTypeCode(value, ic);
     switch (typeCode)
     {
         case TypeCode.Object:
         case TypeCode.DateTime:
         {
             object obj2 = ToPrimitive(value, preferredType, ic, typeCode);
             if (obj2 != value)
             {
                 value = obj2;
                 ic = GetIConvertible(value);
             }
             break;
         }
     }
     return value;
 }
Beispiel #11
0
 internal override Object GetDefaultValue(PreferredType preferred_type)
 {
     if (preferred_type == PreferredType.String)
     {
         ScriptFunction toString = this.GetMemberValue("toString") as ScriptFunction;
         if (toString != null)
         {
             Object result = toString.Call(new Object[0], this);
             if (result == null)
             {
                 return(result);
             }
             IConvertible ic = Convert.GetIConvertible(result);
             if (ic != null && ic.GetTypeCode() != TypeCode.Object)
             {
                 return(result);
             }
         }
         ScriptFunction valueOf = this.GetMemberValue("valueOf") as ScriptFunction;
         if (valueOf != null)
         {
             Object result = valueOf.Call(new Object[0], this);
             if (result == null)
             {
                 return(result);
             }
             IConvertible ic = Convert.GetIConvertible(result);
             if (ic != null && ic.GetTypeCode() != TypeCode.Object)
             {
                 return(result);
             }
         }
     }
     else if (preferred_type == PreferredType.LocaleString)
     {
         ScriptFunction toLocaleString = this.GetMemberValue("toLocaleString") as ScriptFunction;
         if (toLocaleString != null)
         {
             return(toLocaleString.Call(new Object[0], this));
         }
     }
     else
     {
         if (preferred_type == PreferredType.Either && this is DateObject)
         {
             return(this.GetDefaultValue(PreferredType.String));
         }
         ScriptFunction valueOf = this.GetMemberValue("valueOf") as ScriptFunction;
         if (valueOf != null)
         {
             Object result = valueOf.Call(new Object[0], this);
             if (result == null)
             {
                 return(result);
             }
             IConvertible ic = Convert.GetIConvertible(result);
             if (ic != null && ic.GetTypeCode() != TypeCode.Object)
             {
                 return(result);
             }
         }
         ScriptFunction toString = this.GetMemberValue("toString") as ScriptFunction;
         if (toString != null)
         {
             Object result = toString.Call(new Object[0], this);
             if (result == null)
             {
                 return(result);
             }
             IConvertible ic = Convert.GetIConvertible(result);
             if (ic != null && ic.GetTypeCode() != TypeCode.Object)
             {
                 return(result);
             }
         }
     }
     return(this);
 }
Beispiel #12
0
 internal override Object GetDefaultValue(PreferredType preferred_type){
   if (preferred_type == PreferredType.String){
     ScriptFunction toString = this.GetMemberValue("toString") as ScriptFunction;
     if (toString != null){
       Object result = toString.Call(new Object[0], this);
       if (result == null) return result;
       IConvertible ic = Convert.GetIConvertible(result);
       if (ic != null && ic.GetTypeCode() != TypeCode.Object) return result;
     }
     ScriptFunction valueOf = this.GetMemberValue("valueOf") as ScriptFunction;
     if (valueOf != null){
       Object result = valueOf.Call(new Object[0], this);
       if (result == null) return result;
       IConvertible ic = Convert.GetIConvertible(result);
       if (ic != null && ic.GetTypeCode() != TypeCode.Object) return result;
     }
   }else if (preferred_type == PreferredType.LocaleString){
     ScriptFunction toLocaleString = this.GetMemberValue("toLocaleString") as ScriptFunction;
     if (toLocaleString != null){
       return toLocaleString.Call(new Object[0], this);
     }
   }else{
     if (preferred_type == PreferredType.Either && this is DateObject)
       return this.GetDefaultValue(PreferredType.String);
     ScriptFunction valueOf = this.GetMemberValue("valueOf") as ScriptFunction;
     if (valueOf != null){
       Object result = valueOf.Call(new Object[0], this);
       if (result == null) return result;
       IConvertible ic = Convert.GetIConvertible(result);
       if (ic != null && ic.GetTypeCode() != TypeCode.Object) return result;
     }
     ScriptFunction toString = this.GetMemberValue("toString") as ScriptFunction;
     if (toString != null){
       Object result = toString.Call(new Object[0], this);
       if (result == null) return result;
       IConvertible ic = Convert.GetIConvertible(result);
       if (ic != null && ic.GetTypeCode() != TypeCode.Object) return result;
     }
   }
   return this;
 }
Beispiel #13
0
 internal static String ToString(Object value, PreferredType pref, IConvertible ic, bool explicitOK){
   Enum e = value as Enum;
   if (e != null) return e.ToString("G");
   EnumWrapper ew = value as EnumWrapper;
   if (ew != null) return ew.ToString();
   TypeCode code = Convert.GetTypeCode(value, ic);
   if (pref == PreferredType.LocaleString){
     switch (code){
       case TypeCode.SByte:
       case TypeCode.Byte:
       case TypeCode.Int16:
       case TypeCode.UInt16:
       case TypeCode.Int32:
       case TypeCode.UInt32:
       case TypeCode.Single:
       case TypeCode.Double: {
         double d = ic.ToDouble(null);
         return d.ToString(d <= -1e+15 || d >= 1e+15 ? "g" : "n", NumberFormatInfo.CurrentInfo);
       }
       case TypeCode.Int64: return ic.ToInt64(null).ToString("n", NumberFormatInfo.CurrentInfo);
       case TypeCode.UInt64: return ic.ToUInt64(null).ToString("n", NumberFormatInfo.CurrentInfo);
       case TypeCode.Decimal: return ic.ToDecimal(null).ToString("n", NumberFormatInfo.CurrentInfo);
     }
   }
   switch (code){
     case TypeCode.Empty: return explicitOK ? "undefined" : null;
     case TypeCode.Object: return Convert.ToString(Convert.ToPrimitive(value, pref, ref ic), ic);
     case TypeCode.DBNull: return explicitOK ? "null" : null;
     case TypeCode.Boolean: return ic.ToBoolean(null) ? "true" : "false";
     case TypeCode.Char:
     case TypeCode.SByte:
     case TypeCode.Byte:
     case TypeCode.Int16:
     case TypeCode.UInt16:
     case TypeCode.Int32:
     case TypeCode.UInt32:
     case TypeCode.Int64:
     case TypeCode.UInt64:
     case TypeCode.Decimal:
     case TypeCode.String: return ic.ToString(null);
     case TypeCode.DateTime: return Convert.ToString(DateConstructor.ob.Construct(ic.ToDateTime(null)));
     case TypeCode.Single:
     case TypeCode.Double: return Convert.ToString(ic.ToDouble(null));
   }
   return null; //Should never get here
 }
 internal virtual object GetDefaultValue(PreferredType preferred_type)
 {
     throw new JScriptException(JSError.InternalError);
 }
        internal static string ToString(object value, PreferredType pref, IConvertible ic, bool explicitOK)
        {
            Enum enum2 = value as Enum;
            if (enum2 != 0)
            {
                return enum2.ToString("G");
            }
            EnumWrapper wrapper = value as EnumWrapper;
            if (wrapper != null)
            {
                return wrapper.ToString();
            }
            TypeCode typeCode = GetTypeCode(value, ic);
            if (pref == PreferredType.LocaleString)
            {
                switch (typeCode)
                {
                    case TypeCode.SByte:
                    case TypeCode.Byte:
                    case TypeCode.Int16:
                    case TypeCode.UInt16:
                    case TypeCode.Int32:
                    case TypeCode.UInt32:
                    case TypeCode.Single:
                    case TypeCode.Double:
                    {
                        double num = ic.ToDouble(null);
                        return num.ToString(((num <= -1E+15) || (num >= 1E+15)) ? "g" : "n", NumberFormatInfo.CurrentInfo);
                    }
                    case TypeCode.Int64:
                        return ic.ToInt64(null).ToString("n", NumberFormatInfo.CurrentInfo);

                    case TypeCode.UInt64:
                        return ic.ToUInt64(null).ToString("n", NumberFormatInfo.CurrentInfo);

                    case TypeCode.Decimal:
                        return ic.ToDecimal(null).ToString("n", NumberFormatInfo.CurrentInfo);
                }
            }
            switch (typeCode)
            {
                case TypeCode.Empty:
                    if (explicitOK)
                    {
                        return "undefined";
                    }
                    return null;

                case TypeCode.Object:
                    return ToString(ToPrimitive(value, pref, ref ic), ic);

                case TypeCode.DBNull:
                    if (explicitOK)
                    {
                        return "null";
                    }
                    return null;

                case TypeCode.Boolean:
                    if (ic.ToBoolean(null))
                    {
                        return "true";
                    }
                    return "false";

                case TypeCode.Char:
                case TypeCode.SByte:
                case TypeCode.Byte:
                case TypeCode.Int16:
                case TypeCode.UInt16:
                case TypeCode.Int32:
                case TypeCode.UInt32:
                case TypeCode.Int64:
                case TypeCode.UInt64:
                case TypeCode.Decimal:
                case TypeCode.String:
                    return ic.ToString(null);

                case TypeCode.Single:
                case TypeCode.Double:
                    return ToString(ic.ToDouble(null));

                case TypeCode.DateTime:
                    return ToString(DateConstructor.ob.Construct(ic.ToDateTime(null)));
            }
            return null;
        }
Beispiel #16
0
      private static Object ToPrimitive(Object value, PreferredType preferredType, IConvertible ic, TypeCode tcode){
        switch (tcode){
          case TypeCode.Object:
            System.Array arr = value as System.Array;
            if (arr != null && arr.Rank == 1) value = new ArrayWrapper(ArrayPrototype.ob, arr, true);
            if (value is ScriptObject){
              Object result = ((ScriptObject)value).GetDefaultValue(preferredType);
              if (Convert.GetTypeCode(result) != TypeCode.Object)
                return result;
              else if (value == result && preferredType == PreferredType.String || preferredType == PreferredType.LocaleString){
                if (value is JSObject){
                  ScriptObject proto = ((JSObject)value).GetParent();
                  if (proto is ClassScope)
                    return ((ClassScope)proto).GetFullName();
                  return "[object Object]";
                }
                return value.ToString();
              }else
                throw new JScriptException(JSError.TypeMismatch);
            }else if (value is Missing || value is System.Reflection.Missing)
              return null;
            else{
              IReflect ir;
              if (value is IReflect && !(value is Type))
                ir = (IReflect)value;
              else
                ir = value.GetType();

              //Look for an op_Explicit conversion to String or Double (this always fails for IDispatch/Ex objects
              MethodInfo meth = null;
              if (preferredType == PreferredType.String || preferredType == PreferredType.LocaleString)
                meth = Convert.GetToXXXXMethod(ir, Typeob.String, true);
              else{
                meth = Convert.GetToXXXXMethod(ir, Typeob.Double, true);
                if (meth == null)
                  meth = Convert.GetToXXXXMethod(ir, Typeob.Int64, true);
                if (meth == null)
                  meth = Convert.GetToXXXXMethod(ir, Typeob.UInt64, true);
              }
              if (meth != null){
                meth = new JSMethodInfo(meth);
                return meth.Invoke(null, BindingFlags.SuppressChangeType, null, new Object[]{value}, null);
              }

              //Invoke the default method/property or get the value of the default field. If an exception is thrown
              //because the target doesn't have a non-paramterized default member, mask it and execute the
              //default handling.
              try{
                try{
                  MemberInfo member = LateBinding.SelectMember(JSBinder.GetDefaultMembers(ir));
                  if (member != null){
                    switch(member.MemberType){
                      case MemberTypes.Field: return ((FieldInfo)member).GetValue(value);
                      case MemberTypes.Method: return ((MethodInfo)member).Invoke(value, new Object[0]);
                      case MemberTypes.Property: return JSProperty.GetValue((PropertyInfo)member, value, null);
                      case MemberTypes.Event: return null;
                      case MemberTypes.NestedType: return member;
                    }
                  }
                  
                  
                  return ir.InvokeMember(String.Empty, BindingFlags.ExactBinding|BindingFlags.SuppressChangeType|
                                                       BindingFlags.InvokeMethod|BindingFlags.GetProperty|BindingFlags.GetField,
                                         null, value, new Object[0], null, null, new String[0]);
                }catch(TargetInvocationException e){
                  throw e.InnerException;
                }
              }catch(ArgumentException){
              }catch(IndexOutOfRangeException){
              }catch(MissingMemberException){
              }catch(TargetParameterCountException){
              }

              if (preferredType != PreferredType.Number)
                if (value is Char[])
                  return new System.String((Char[])value);
                else
                  return value.ToString();
              return value;
            }
          case TypeCode.DateTime:
            return DateConstructor.ob.Construct(ic.ToDateTime(null)).GetDefaultValue(preferredType);
        }
        return value;
      }
        internal override object GetDefaultValue(PreferredType preferred_type)
        {
            if (preferred_type == PreferredType.String)
            {
                ScriptFunction memberValue = this.GetMemberValue("toString") as ScriptFunction;
                if (memberValue != null)
                {
                    object ob = memberValue.Call(new object[0], this);
                    if (ob == null)
                    {
                        return(ob);
                    }
                    IConvertible iConvertible = Microsoft.JScript.Convert.GetIConvertible(ob);
                    if ((iConvertible != null) && (iConvertible.GetTypeCode() != TypeCode.Object))
                    {
                        return(ob);
                    }
                }
                ScriptFunction function2 = this.GetMemberValue("valueOf") as ScriptFunction;
                if (function2 != null)
                {
                    object obj3 = function2.Call(new object[0], this);
                    if (obj3 != null)
                    {
                        IConvertible convertible2 = Microsoft.JScript.Convert.GetIConvertible(obj3);
                        if ((convertible2 == null) || (convertible2.GetTypeCode() == TypeCode.Object))
                        {
                            goto Label_015D;
                        }
                    }
                    return(obj3);
                }
            }
            else if (preferred_type == PreferredType.LocaleString)
            {
                ScriptFunction function3 = this.GetMemberValue("toLocaleString") as ScriptFunction;
                if (function3 != null)
                {
                    return(function3.Call(new object[0], this));
                }
            }
            else
            {
                if ((preferred_type == PreferredType.Either) && (this is DateObject))
                {
                    return(this.GetDefaultValue(PreferredType.String));
                }
                ScriptFunction function4 = this.GetMemberValue("valueOf") as ScriptFunction;
                if (function4 != null)
                {
                    object obj4 = function4.Call(new object[0], this);
                    if (obj4 == null)
                    {
                        return(obj4);
                    }
                    IConvertible convertible3 = Microsoft.JScript.Convert.GetIConvertible(obj4);
                    if ((convertible3 != null) && (convertible3.GetTypeCode() != TypeCode.Object))
                    {
                        return(obj4);
                    }
                }
                ScriptFunction function5 = this.GetMemberValue("toString") as ScriptFunction;
                if (function5 != null)
                {
                    object obj5 = function5.Call(new object[0], this);
                    if (obj5 == null)
                    {
                        return(obj5);
                    }
                    IConvertible convertible4 = Microsoft.JScript.Convert.GetIConvertible(obj5);
                    if ((convertible4 != null) && (convertible4.GetTypeCode() != TypeCode.Object))
                    {
                        return(obj5);
                    }
                }
            }
Label_015D:
            return(this);
        }
 internal static object ToPrimitive(object value, PreferredType preferredType)
 {
     IConvertible iConvertible = GetIConvertible(value);
     TypeCode typeCode = GetTypeCode(value, iConvertible);
     return ToPrimitive(value, preferredType, iConvertible, typeCode);
 }
Beispiel #19
0
 internal virtual Object GetDefaultValue(PreferredType preferred_type)
 {
     throw new JScriptException(JSError.InternalError);
 }
Beispiel #20
0
        public virtual Object InvokeMember(String name, BindingFlags invokeAttr, Binder binder, Object target,
                                           Object[] args, ParameterModifier[] modifiers, CultureInfo locale, String[] namedParameters)
        {
            if (target != this)
            {
                throw new TargetException();
            }

            bool preferredTypeSpecified = name.StartsWith("< JScript-");
            bool dispid0 = (name == null || name == String.Empty || name.Equals("[DISPID=0]") || preferredTypeSpecified);

            if ((invokeAttr & BindingFlags.CreateInstance) != 0)
            {
                if ((invokeAttr & (BindingFlags.InvokeMethod | BindingFlags.GetField | BindingFlags.GetProperty |
                                   BindingFlags.SetField | BindingFlags.SetProperty | BindingFlags.PutDispProperty)) != 0)
                {
                    throw new ArgumentException();
                }
                //js: x = new foo() --> dispid0, create
                if (dispid0)
                {
                    throw new MissingMethodException();
                }

                //js: x = new foo.name() --> dispid0, create
                LateBinding lb = new LateBinding(name, this);
                return(lb.Call(binder, args, modifiers, locale, namedParameters, true, false, this.engine));
            }

            //According to docs, name == null is only valid for CreateInstance
            if (name == null)
            {
                throw new ArgumentException();
            }

            if ((invokeAttr & (BindingFlags.InvokeMethod | BindingFlags.GetField | BindingFlags.GetProperty)) != 0)
            {
                if ((invokeAttr & (BindingFlags.SetField | BindingFlags.SetProperty | BindingFlags.PutDispProperty)) != 0)
                {
                    throw new ArgumentException();
                }

                if (dispid0)
                {
                    //All callable functions inherit from ScriptFunction which overrides this method to handle
                    //the InvokeMethod case.

                    //js,vbs: x = foo() --> dispid0, invoke
                    if ((invokeAttr & (BindingFlags.GetField | BindingFlags.GetProperty)) == 0)
                    {
                        throw new MissingMethodException();
                    }

                    //js: x = foo --> dispid0, propget; vbs: x = foo --> dispid0, invoke|propget
                    if (args == null || args.Length == 0)
                    {
                        if (this is JSObject || this is GlobalScope || this is ClassScope)
                        {
                            PreferredType preferredType = PreferredType.Either;
                            if (preferredTypeSpecified)
                            {
                                if (name.StartsWith("< JScript-Number"))
                                {
                                    preferredType = PreferredType.Number;
                                }
                                else if (name.StartsWith("< JScript-String"))
                                {
                                    preferredType = PreferredType.String;
                                }
                                else if (name.StartsWith("< JScript-LocaleString"))
                                {
                                    preferredType = PreferredType.LocaleString;
                                }
                            }
                            return(this.GetDefaultValue(preferredType));
                        }
                        throw new MissingFieldException();
                    }

                    //We support indexed properties with exactly one index on all script objects.

                    //js,vbs: x = foo(1,2) --> dispid0, invoke|propget
                    if (args.Length > 1)
                    {
                        throw new ArgumentException();
                    }

                    //js,vbs: x = foo(1) --> dispid0, invoke|propget
                    Object val = args[0];
                    if (val is Int32)
                    {
                        return(this[(int)val]);
                    }
                    IConvertible ic = Convert.GetIConvertible(val);
                    if (ic != null && Convert.IsPrimitiveNumericTypeCode(ic.GetTypeCode()))
                    {
                        double d = ic.ToDouble(null);
                        if (d >= 0 && d <= Int32.MaxValue && d == System.Math.Round(d))
                        {
                            return(this[(int)d]);
                        }
                    }
                    return(this[Convert.ToString(val)]);
                }

                //If no arguments are supplied, prefer GetXXXX rather than Invoke.
                //js: x = foo.bar --> name="bar", propget; vbs: x = foo.bar --> name="bar", propget|invoke
                if ((args == null || args.Length == 0) && (invokeAttr & (BindingFlags.GetField | BindingFlags.GetProperty)) != 0)
                {
                    Object member = this.GetMemberValue(name);
                    if (member != Missing.Value)
                    {
                        return(member);
                    }

                    //js: x = foo.bar --> name="bar", propget
                    if ((invokeAttr & BindingFlags.InvokeMethod) == 0)
                    {
                        throw new MissingFieldException();
                    }
                }

                //Use LateBinding to call because arguments have been supplied.
                //vbs: x = foo.bar --> name="bar", propget|invoke
                //js,vbs: x = foo.bar() --> name="bar", invoke
                //js,vbs: x = foo.bar(1) --> name="bar", invoke|propget
                LateBinding lb = new LateBinding(name, this);
                return(lb.Call(binder, args, modifiers, locale, namedParameters, false, false, this.engine));
            }

            if ((invokeAttr & (BindingFlags.SetField | BindingFlags.SetProperty | BindingFlags.PutDispProperty)) != 0)
            {
                if (dispid0)
                {
                    if (args == null || args.Length != 2)
                    {
                        throw new ArgumentException();
                    }
                    Object val = args[0];
                    if (val is Int32)
                    {
                        this[(int)val] = args[1];
                        return(null);
                    }
                    IConvertible ic = Convert.GetIConvertible(val);
                    if (ic != null && Convert.IsPrimitiveNumericTypeCode(ic.GetTypeCode()))
                    {
                        double d = ic.ToDouble(null);
                        if (d >= 0 && d <= Int32.MaxValue && d == System.Math.Round(d))
                        {
                            this[(int)d] = args[1];
                            return(null);
                        }
                    }
                    this[Convert.ToString(val)] = args[1];
                    return(null);
                }
                if (args == null || args.Length > 1)
                {
                    throw new ArgumentException();
                }
                this.SetMemberValue(name, args[0]);
                return(null);
            }

            throw new ArgumentException();
        }
 internal override object GetDefaultValue(PreferredType preferred_type)
 {
     return(this.GetFullName());
 }
Beispiel #22
0
 internal static Object ToPrimitive(Object value, PreferredType preferredType){
   IConvertible ic = Convert.GetIConvertible(value);
   TypeCode tcode = Convert.GetTypeCode(value, ic);
   return Convert.ToPrimitive(value, preferredType, ic, tcode);
 }
 internal static string ToString(object value, PreferredType pref, bool explicitOK)
 {
     string str = value as string;
     if (str != null)
     {
         return str;
     }
     StringObject obj2 = value as StringObject;
     if ((obj2 != null) && obj2.noExpando)
     {
         return obj2.value;
     }
     return ToString(value, pref, GetIConvertible(value), explicitOK);
 }
Beispiel #24
0
 internal static Object ToPrimitive(Object value, PreferredType preferredType, ref IConvertible ic){
   TypeCode tcode = Convert.GetTypeCode(value, ic);
   switch (tcode){
     case TypeCode.Object:
     case TypeCode.DateTime:
       Object result = Convert.ToPrimitive(value, preferredType, ic, tcode);
       if (result != value){
         value = result;
         ic = Convert.GetIConvertible(value);
       }
       break;
   }
   return value;
 }
 internal override object GetDefaultValue(PreferredType preferred_type)
 {
     if ((preferred_type != PreferredType.String) && (preferred_type != PreferredType.LocaleString))
     {
         return (double) 1.0 / (double) 0.0;
     }
     return "";
 }
Beispiel #26
0
 internal static String ToString(Object value, PreferredType pref, bool explicitOK){
   String str = value as String;
   if (str != null) return str;
   StringObject strObj = value as StringObject;
   if (strObj != null && strObj.noExpando) return strObj.value;
   return Convert.ToString(value, pref, Convert.GetIConvertible(value), explicitOK);
 }
        private static object ToPrimitive(object value, PreferredType preferredType, IConvertible ic, TypeCode tcode)
        {
            IReflect reflect;
            TypeCode code = tcode;
            if (code != TypeCode.Object)
            {
                if (code == TypeCode.DateTime)
                {
                    return DateConstructor.ob.Construct(ic.ToDateTime(null)).GetDefaultValue(preferredType);
                }
                return value;
            }
            Array array = value as Array;
            if ((array != null) && (array.Rank == 1))
            {
                value = new ArrayWrapper(ArrayPrototype.ob, array, true);
            }
            if (value is ScriptObject)
            {
                object defaultValue = ((ScriptObject) value).GetDefaultValue(preferredType);
                if (GetTypeCode(defaultValue) != TypeCode.Object)
                {
                    return defaultValue;
                }
                if (((value != defaultValue) || (preferredType != PreferredType.String)) && (preferredType != PreferredType.LocaleString))
                {
                    throw new JScriptException(JSError.TypeMismatch);
                }
                if (!(value is JSObject))
                {
                    return value.ToString();
                }
                ScriptObject parent = ((JSObject) value).GetParent();
                if (parent is ClassScope)
                {
                    return ((ClassScope) parent).GetFullName();
                }
                return "[object Object]";
            }
            if ((value is Microsoft.JScript.Missing) || (value is System.Reflection.Missing))
            {
                return null;
            }
            if ((value is IReflect) && !(value is Type))
            {
                reflect = (IReflect) value;
            }
            else
            {
                reflect = value.GetType();
            }
            MethodInfo method = null;
            if ((preferredType == PreferredType.String) || (preferredType == PreferredType.LocaleString))
            {
                method = GetToXXXXMethod(reflect, typeof(string), true);
            }
            else
            {
                method = GetToXXXXMethod(reflect, typeof(double), true);
                if (method == null)
                {
                    method = GetToXXXXMethod(reflect, typeof(long), true);
                }
                if (method == null)
                {
                    method = GetToXXXXMethod(reflect, typeof(ulong), true);
                }
            }
            if (method != null)
            {
                method = new JSMethodInfo(method);
                return method.Invoke(null, BindingFlags.SuppressChangeType, null, new object[] { value }, null);
            }
            try
            {
                try
                {
                    MemberInfo info2 = LateBinding.SelectMember(JSBinder.GetDefaultMembers(Runtime.TypeRefs, reflect));
                    if (info2 != null)
                    {
                        switch (info2.MemberType)
                        {
                            case MemberTypes.Property:
                                return JSProperty.GetValue((PropertyInfo) info2, value, null);

                            case MemberTypes.NestedType:
                                return info2;

                            case MemberTypes.Event:
                                return null;

                            case MemberTypes.Field:
                                return ((FieldInfo) info2).GetValue(value);

                            case MemberTypes.Method:
                                return ((MethodInfo) info2).Invoke(value, new object[0]);
                        }
                    }
                    if (value == reflect)
                    {
                        Type type = value.GetType();
                        if (TypeReflector.GetTypeReflectorFor(type).Is__ComObject() && (!VsaEngine.executeForJSEE || !(value is IDebuggerObject)))
                        {
                            reflect = type;
                        }
                    }
                    if (VsaEngine.executeForJSEE)
                    {
                        IDebuggerObject obj4 = reflect as IDebuggerObject;
                        if (obj4 != null)
                        {
                            if (!obj4.IsScriptObject())
                            {
                                throw new JScriptException(JSError.NonSupportedInDebugger);
                            }
                            return reflect.InvokeMember("< JScript-" + preferredType.ToString() + " >", BindingFlags.SuppressChangeType | BindingFlags.ExactBinding | BindingFlags.GetProperty | BindingFlags.GetField | BindingFlags.InvokeMethod, null, value, new object[0], null, null, new string[0]);
                        }
                    }
                    return reflect.InvokeMember(string.Empty, BindingFlags.SuppressChangeType | BindingFlags.ExactBinding | BindingFlags.GetProperty | BindingFlags.GetField | BindingFlags.InvokeMethod, null, value, new object[0], null, null, new string[0]);
                }
                catch (TargetInvocationException exception)
                {
                    throw exception.InnerException;
                }
            }
            catch (ArgumentException)
            {
            }
            catch (IndexOutOfRangeException)
            {
            }
            catch (MissingMemberException)
            {
            }
            catch (SecurityException)
            {
            }
            catch (TargetParameterCountException)
            {
            }
            catch (COMException exception2)
            {
                if (exception2.ErrorCode != -2147352573)
                {
                    throw exception2;
                }
            }
            if (preferredType == PreferredType.Number)
            {
                return value;
            }
            if (value.GetType().IsCOMObject)
            {
                return "ActiveXObject";
            }
            if (value is char[])
            {
                return new string((char[]) value);
            }
            return value.ToString();
        }
Beispiel #28
0
        public virtual object InvokeMember(string name, BindingFlags invokeAttr, Binder binder, object target, object[] args, ParameterModifier[] modifiers, CultureInfo locale, string[] namedParameters)
        {
            if (target != this)
            {
                throw new TargetException();
            }
            bool flag  = name.StartsWith("< JScript-", StringComparison.Ordinal);
            bool flag2 = (((name == null) || (name == string.Empty)) || name.Equals("[DISPID=0]")) || flag;

            if ((invokeAttr & BindingFlags.CreateInstance) != BindingFlags.Default)
            {
                if ((invokeAttr & (BindingFlags.PutDispProperty | BindingFlags.SetProperty | BindingFlags.GetProperty | BindingFlags.SetField | BindingFlags.GetField | BindingFlags.InvokeMethod)) != BindingFlags.Default)
                {
                    throw new ArgumentException(JScriptException.Localize("Bad binding flags", locale));
                }
                if (flag2)
                {
                    throw new MissingMethodException();
                }
                LateBinding binding = new LateBinding(name, this);
                return(binding.Call(binder, args, modifiers, locale, namedParameters, true, false, this.engine));
            }
            if (name == null)
            {
                throw new ArgumentException(JScriptException.Localize("Bad name", locale));
            }
            if ((invokeAttr & (BindingFlags.GetProperty | BindingFlags.GetField | BindingFlags.InvokeMethod)) != BindingFlags.Default)
            {
                if ((invokeAttr & (BindingFlags.PutDispProperty | BindingFlags.SetProperty | BindingFlags.SetField)) != BindingFlags.Default)
                {
                    throw new ArgumentException(JScriptException.Localize("Bad binding flags", locale));
                }
                if (flag2)
                {
                    if ((invokeAttr & (BindingFlags.GetProperty | BindingFlags.GetField)) == BindingFlags.Default)
                    {
                        throw new MissingMethodException();
                    }
                    if ((args == null) || (args.Length == 0))
                    {
                        if ((!(this is JSObject) && !(this is GlobalScope)) && !(this is ClassScope))
                        {
                            throw new MissingFieldException();
                        }
                        PreferredType either = PreferredType.Either;
                        if (flag)
                        {
                            if (name.StartsWith("< JScript-Number", StringComparison.Ordinal))
                            {
                                either = PreferredType.Number;
                            }
                            else if (name.StartsWith("< JScript-String", StringComparison.Ordinal))
                            {
                                either = PreferredType.String;
                            }
                            else if (name.StartsWith("< JScript-LocaleString", StringComparison.Ordinal))
                            {
                                either = PreferredType.LocaleString;
                            }
                        }
                        return(this.GetDefaultValue(either));
                    }
                    if (args.Length > 1)
                    {
                        throw new ArgumentException(JScriptException.Localize("Too many arguments", locale));
                    }
                    object ob = args[0];
                    if (ob is int)
                    {
                        return(this[(int)ob]);
                    }
                    IConvertible iConvertible = Microsoft.JScript.Convert.GetIConvertible(ob);
                    if ((iConvertible != null) && Microsoft.JScript.Convert.IsPrimitiveNumericTypeCode(iConvertible.GetTypeCode()))
                    {
                        double a = iConvertible.ToDouble(null);
                        if (((a >= 0.0) && (a <= 2147483647.0)) && (a == Math.Round(a)))
                        {
                            return(this[(int)a]);
                        }
                    }
                    return(this[Microsoft.JScript.Convert.ToString(ob)]);
                }
                if (((args == null) || (args.Length == 0)) && ((invokeAttr & (BindingFlags.GetProperty | BindingFlags.GetField)) != BindingFlags.Default))
                {
                    object memberValue = this.GetMemberValue(name);
                    if (memberValue != Microsoft.JScript.Missing.Value)
                    {
                        return(memberValue);
                    }
                    if ((invokeAttr & BindingFlags.InvokeMethod) == BindingFlags.Default)
                    {
                        throw new MissingFieldException();
                    }
                }
                LateBinding binding2 = new LateBinding(name, this);
                return(binding2.Call(binder, args, modifiers, locale, namedParameters, false, false, this.engine));
            }
            if ((invokeAttr & (BindingFlags.PutDispProperty | BindingFlags.SetProperty | BindingFlags.SetField)) == BindingFlags.Default)
            {
                throw new ArgumentException(JScriptException.Localize("Bad binding flags", locale));
            }
            if (flag2)
            {
                if ((args == null) || (args.Length < 2))
                {
                    throw new ArgumentException(JScriptException.Localize("Too few arguments", locale));
                }
                if (args.Length > 2)
                {
                    throw new ArgumentException(JScriptException.Localize("Too many arguments", locale));
                }
                object obj4 = args[0];
                if (obj4 is int)
                {
                    this[(int)obj4] = args[1];
                    return(null);
                }
                IConvertible convertible2 = Microsoft.JScript.Convert.GetIConvertible(obj4);
                if ((convertible2 != null) && Microsoft.JScript.Convert.IsPrimitiveNumericTypeCode(convertible2.GetTypeCode()))
                {
                    double num2 = convertible2.ToDouble(null);
                    if (((num2 >= 0.0) && (num2 <= 2147483647.0)) && (num2 == Math.Round(num2)))
                    {
                        this[(int)num2] = args[1];
                        return(null);
                    }
                }
                this[Microsoft.JScript.Convert.ToString(obj4)] = args[1];
                return(null);
            }
            if ((args == null) || (args.Length < 1))
            {
                throw new ArgumentException(JScriptException.Localize("Too few arguments", locale));
            }
            if (args.Length > 1)
            {
                throw new ArgumentException(JScriptException.Localize("Too many arguments", locale));
            }
            this.SetMemberValue(name, args[0]);
            return(null);
        }
Beispiel #29
0
 internal override Object GetDefaultValue(PreferredType preferred_type){
   if (preferred_type == PreferredType.String || preferred_type == PreferredType.LocaleString)
     return "";
   else
     return Double.NaN;
 }