RuntimeObj BitwiseShift(RuntimeObj val, RuntimeObj shift, bool right) { if (val == JSEvalNumber.Zero) { return(val); } double dR = shift.ToDouble(); int iShift; if (Double.IsNaN(dR) || (iShift = (dR < 0 ? (int)Math.Ceiling(dR) : (int)Math.Floor(dR)) % 64) == 0) { return(Global.CreateNumber(val)); } if (right && iShift < 0) { return(JSEvalNumber.Zero); } Int32 lN = JSSupport.ToInt32(val.ToDouble()); if (lN == 0) { return(JSEvalNumber.Zero); } return(Global.CreateNumber(right ? lN >> iShift : lN << iShift)); }
RuntimeObj BitwiseShift(RuntimeObj val, RuntimeObj shift, bool right) { if (val == DoubleObj.Zero) { return(val); } double dR = shift.ToDouble(); int iShift; if (double.IsNaN(dR) || (iShift = (dR < 0 ? (int)Math.Ceiling(dR) : (int)Math.Floor(dR)) % 64) == 0) { return(val.ToValue() as DoubleObj ?? DoubleObj.Create(val.ToDouble())); } if (right && iShift < 0) { return(DoubleObj.Zero); } int lN = JSSupport.ToInt32(val.ToDouble()); if (lN == 0) { return(DoubleObj.Zero); } return(DoubleObj.Create(right ? lN >> iShift : lN << iShift)); }
public override PExpr Visit(IAccessorFrame frame) { var s = frame.GetState(c => c.On("toString").OnCall((f, args) => { int radix = 10; if (args.Count == 1) { radix = JSSupport.ToInt32(args[0].ToDouble()); } if (radix < 2 || radix > 36) { return(f.SetError("Radix must be between 2 and 36.")); } return(f.SetResult(f.Global.CreateString(JSSupport.ToString(_value, radix)))); } )); return(s != null?s.Visit() : frame.SetError()); }
public override PExpr Visit(IAccessorFrame frame) { var s = frame.GetState(c => c.On("charAt").OnCall((f, args) => { int idx = args.Count > 0 ? JSSupport.ToInt32(args[0].ToDouble()) : 0; if (idx < 0 || idx >= _value.Length) { return(f.SetResult(JSEvalString.EmptyString)); } return(f.SetResult(f.Global.CreateString(new String(_value[idx], 1)))); }) .On("toString").OnCall((f, args) => { return(f.SetResult(this)); } )); return(s != null?s.Visit() : frame.SetError()); }
public override PExpr Visit(IAccessorFrame frame) { var s = frame.GetImplementationState(c => c.OnIndex((f, arg) => { int idx = JSSupport.ToInt32(arg.ToDouble()); if (idx < 0 || idx >= _value.Length) { return(f.SetResult(EmptyString)); } return(f.SetResult(Create(new string( _value[idx], 1 )))); }) .On("ToString").OnCall((f, args) => { return(f.SetResult(this)); } )); return(s != null?s.Visit() : frame.SetError()); }