public static Double TryObjectToDouble(object obj, out ConversionStrictness strictness) { string s; if (obj is double) { strictness = ConversionStrictness.ImplExactMatch; return((double)obj); } if (obj is int) { strictness = ConversionStrictness.ImplExactMatch; return((double)(int)obj); } if ((s = PhpVariable.AsString(obj)) != null) { strictness = ConversionStrictness.ImplDomainChange; return(Convert.StringToDouble(s)); } if (obj is bool) { strictness = ConversionStrictness.ImplDomainChange; return((bool)obj ? 1.0 : 0.0); } if (obj is long) { strictness = ConversionStrictness.ImplExactMatch; return((double)(long)obj); } strictness = ConversionStrictness.Failed; return(0.0); }
new public static void GetObjectData(DObject /*!*/ instance, SerializationInfo /*!*/ info, StreamingContext strctx) { info.SetType(typeof(SPLDeserializer)); SerializationContext context = SerializationContext.CreateFromStreamingContext(strctx); object res = PhpVariable.Dereference(instance.InvokeMethod("serialize", null, context.ScriptContext)); if (res == null) { // serialize returned NULL -> this instance will deserialize as NULL info.AddValue(__PHP_Incomplete_Class.ClassNameFieldName, String.Empty); } else { string res_str = PhpVariable.AsString(res); if (res_str == null) { // serialize did not return NULL nor a string -> throw an exception Library.SPL.Exception.ThrowSplException( _ctx => new Library.SPL.Exception(_ctx, true), context.ScriptContext, string.Format(CoreResources.serialize_must_return_null_or_string, instance.TypeName), 0, null); } info.AddValue(SerializedDataFieldName, res_str); info.AddValue(__PHP_Incomplete_Class.ClassNameFieldName, instance.TypeName); } }
public static bool Assert( object assertion, ScriptContext context, Dictionary <string, object> definedVariables, DObject self, DTypeDesc includer, string containingSourcePath, int line, int column, int containerId, NamingContext namingContext) { object result; string code; // skips asserts if not active: if (!context.Config.Assertion.Active) { return(true); } if ((code = PhpVariable.AsString(assertion)) != null) { // disables error reporting if eval should be quite: if (context.Config.Assertion.Quiet) { context.DisableErrorReporting(); } SourceCodeDescriptor descriptor = new SourceCodeDescriptor(containingSourcePath, containerId, line, column); // evaluates the expression: result = EvalInternal("return ", code, ";", EvalKinds.Assert, context, definedVariables, self, includer, descriptor, false, namingContext); // restores error reporting if eval have been quite: if (context.Config.Assertion.Quiet) { context.EnableErrorReporting(); } } else { result = assertion; } // checks the result of assertion: return(CheckAssertion(result, code, context, containingSourcePath, line, column, namingContext)); }
public static String TryObjectToString(object obj, out ConversionStrictness strictness) { string s; PhpReference pr; IPhpConvertible conv; if ((s = PhpVariable.AsString(obj)) != null) { strictness = ConversionStrictness.ImplExactMatch; return(s); } if ((pr = obj as PhpReference) != null) { return(TryObjectToString(pr.Value, out strictness)); } if (obj == null) { strictness = ConversionStrictness.ImplDomainChange; return(null); } if (obj is int) { strictness = ConversionStrictness.ImplDomainChange; return(obj.ToString()); } if (obj is bool) { strictness = ConversionStrictness.ImplDomainChange; return(((bool)obj) ? "1" : String.Empty); } if (obj is double) { strictness = ConversionStrictness.ImplDomainChange; return(Convert.DoubleToString((double)obj)); } if (obj is long) { strictness = ConversionStrictness.ImplDomainChange; return(obj.ToString()); } // explicit conversion if ((conv = obj as IPhpConvertible) != null) { bool success; string ret = conv.ToString(false, out success); strictness = success?ConversionStrictness.Failed:ConversionStrictness.Explicit; return(ret); } strictness = ConversionStrictness.Failed; return(String.Empty); }
public static UInt64 TryObjectToUInt64(object obj, out ConversionStrictness strictness) { string s; if (obj is int) { int ival = (int)obj; strictness = ival >= 0 ? ConversionStrictness.ImplExactMatch : ConversionStrictness.Failed; return(unchecked ((UInt64)ival)); } if (obj is long) { long lval = (long)obj; strictness = lval >= 0 ? ConversionStrictness.ImplExactMatch : ConversionStrictness.Failed; return(unchecked ((UInt64)lval)); } if (obj is bool) { strictness = ConversionStrictness.ImplDomainChange; return((ulong)((bool)obj ? 1 : 0)); } if (obj is double) { double dval = (double)obj; strictness = (dval >= UInt64.MinValue && dval <= UInt64.MaxValue) ? ConversionStrictness.ImplPercisionLost : ConversionStrictness.Failed; return(unchecked ((UInt64)dval)); } if ((s = PhpVariable.AsString(obj)) != null) { int ival; double dval; long lval; // successfull iff the number encoded in the string fits Int32 or Int64: Convert.NumberInfo info = Convert.StringToNumber(s, out ival, out lval, out dval); if ((info & Convert.NumberInfo.Integer) != 0) { strictness = ConversionStrictness.ImplDomainChange; return(unchecked ((UInt64)ival)); } if ((info & Convert.NumberInfo.LongInteger) != 0) { strictness = ConversionStrictness.ImplDomainChange; return(unchecked ((UInt64)lval)); } strictness = (dval >= UInt64.MinValue && dval <= UInt64.MaxValue) ? ConversionStrictness.ImplPercisionLost : ConversionStrictness.Failed; return(unchecked ((UInt64)dval)); } // explicit conversion /*IPhpConvertible conv; * if ((conv = obj as IPhpConvertible) != null) * { * int ival; * double dval; * long lval; * * Convert.NumberInfo info = conv.ToNumber(out ival, out lval, out dval); * if ((info & Convert.NumberInfo.Integer) != 0) * { strictness = ConversionStrictness.Explicit; return unchecked((UInt64)ival); } * if ((info & Convert.NumberInfo.LongInteger) != 0) * { strictness = ConversionStrictness.Explicit; return unchecked((UInt64)lval); } * * strictness = (dval >= UInt64.MinValue && dval <= UInt64.MaxValue) ? * ConversionStrictness.Explicit : ConversionStrictness.Failed; * return unchecked((UInt64)dval); * }*/ strictness = ConversionStrictness.Failed; return(0); }
public static Int32 TryObjectToInt32(object obj, out ConversionStrictness strictness) { string s; if (obj is int) { strictness = ConversionStrictness.ImplExactMatch; return((int)obj); } if (obj is bool) { strictness = ConversionStrictness.ImplDomainChange; return((bool)obj ? 1 : 0); } if (obj is long) { long lval = (long)obj; if (lval < Int32.MinValue || lval > Int32.MaxValue) { strictness = ConversionStrictness.Failed; } else { strictness = ConversionStrictness.ImplExactMatch; } return(unchecked ((Int32)lval)); } if (obj is double) { double dval = (double)obj; if (dval < Int32.MinValue || dval > Int32.MaxValue) { strictness = ConversionStrictness.Failed; } else { strictness = ConversionStrictness.ImplPercisionLost; } return(unchecked ((Int32)dval)); } if ((s = PhpVariable.AsString(obj)) != null) { int ival; double dval; long lval; // successfull iff the number encoded in the string fits the Int32: Convert.NumberInfo info = Convert.StringToNumber(s, out ival, out lval, out dval); if ((info & Convert.NumberInfo.Integer) != 0) { strictness = ConversionStrictness.ImplDomainChange; return(ival); } // "123 hello world" -> 123 (for example) strictness = ConversionStrictness.Failed; return(unchecked ((Int32)lval)); } // explicit conversion /*IPhpConvertible conv; * if ((conv = obj as IPhpConvertible) != null) * { * int ival; * double dval; * long lval; * * Convert.NumberInfo info = conv.ToNumber(out ival, out lval, out dval); * if ((info & (Convert.NumberInfo.Integer | Convert.NumberInfo.IsNumber)) == * (Convert.NumberInfo.Integer | Convert.NumberInfo.IsNumber)) * { * strictness = ConversionStrictness.Explicit; * return ival; * } * * strictness = ConversionStrictness.Failed; * return unchecked((Int32)lval); * }*/ strictness = ConversionStrictness.Failed; return(0); }