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); }
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); } }
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); }
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); } }
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; } }
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; }
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); }
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; }
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; }
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); }
internal virtual Object GetDefaultValue(PreferredType preferred_type) { throw new JScriptException(JSError.InternalError); }
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()); }
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); }
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 ""; }
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(); }
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); }
internal override Object GetDefaultValue(PreferredType preferred_type){ if (preferred_type == PreferredType.String || preferred_type == PreferredType.LocaleString) return ""; else return Double.NaN; }