/// <summary> /// 15.9.5.41 /// </summary> /// <param name="target"></param> /// <param name="parameters"></param> /// <returns></returns> public JsInstance SetUTCFullYearImpl(JsDictionaryObject target, JsInstance[] parameters) { if (parameters.Length == 0) throw new ArgumentException("There was no year specified"); DateTime valueOf = CreateDateTime(target.ToNumber()); valueOf = valueOf.AddYears(-valueOf.Year); valueOf = valueOf.AddYears((int)parameters[0].ToNumber()); target.Value = valueOf; if (parameters.Length > 1) { JsInstance[] innerParams = new JsInstance[parameters.Length - 1]; parameters.CopyTo(innerParams, 1); target = (JsDate)SetMonthImpl(target, innerParams); } return target; }
public void Visit(MethodCall methodCall) { var that = CallTarget; var target = Result; if (target == JsUndefined.Instance || Result == null) { if (!String.IsNullOrEmpty(lastIdentifier)) { } else { throw new JsException(Global.TypeErrorClass.New("Method isn't defined")); } } Type[] genericParameters = null; if (methodCall.Generics.Count > 0) { genericParameters = new Type[methodCall.Generics.Count]; try { int i = 0; foreach (Expression generic in methodCall.Generics) { generic.Accept(this); genericParameters[i] = Global.Marshaller.MarshalJsValue<Type>(Result); i++; } } catch (Exception e) { throw new JintException("A type parameter is required", e); } } #region Evaluates parameters JsInstance[] parameters = new JsInstance[methodCall.Arguments.Count]; if (methodCall.Arguments.Count > 0) { for (int j = 0; j < methodCall.Arguments.Count; j++) { methodCall.Arguments[j].Accept(this); parameters[j] = Result; } } #endregion if (target is JsFunction) { JsFunction function = (JsFunction)target; if (DebugMode) { string stack = function.Name + "("; string[] paramStrings = new string[parameters.Length]; for (int i = 0; i < parameters.Length; i++) { if (parameters[i] != null) paramStrings[i] = parameters[i].ToSource(); else paramStrings[i] = "null"; } stack += String.Join(", ", paramStrings); stack += ")"; CallStack.Push(stack); } returnInstance = JsUndefined.Instance; JsInstance[] original = new JsInstance[parameters.Length]; parameters.CopyTo(original, 0); ExecuteFunction(function, that, parameters, genericParameters); for (int i = 0; i < original.Length; i++) if (original[i] != parameters[i]) { if (methodCall.Arguments[i] is MemberExpression && ((MemberExpression)methodCall.Arguments[i]).Member is IAssignable) Assign((MemberExpression)methodCall.Arguments[i], parameters[i]); else if (methodCall.Arguments[i] is Identifier) Assign(new MemberExpression(methodCall.Arguments[i], null), parameters[i]); } if (DebugMode) { CallStack.Pop(); } Result = returnInstance; returnInstance = JsUndefined.Instance; return; } else { throw new JsException(Global.ErrorClass.New("Function expected.")); } }
/// <summary> /// 15.9.5.35 /// </summary> /// <param name="target"></param> /// <param name="parameters"></param> /// <returns></returns> public JsInstance SetHoursImpl(JsDictionaryObject target, JsInstance[] parameters) { if (parameters.Length == 0) throw new ArgumentException("There was no hour specified"); DateTime valueOf = CreateDateTime(target.ToNumber()).ToLocalTime(); valueOf = valueOf.AddHours(-valueOf.Hour); valueOf = valueOf.AddHours(parameters[0].ToNumber()); target.Value = valueOf; if (parameters.Length > 1) { JsInstance[] innerParams = new JsInstance[parameters.Length - 1]; parameters.CopyTo(innerParams, 1); target = (JsDate)SetMinutesImpl(target, innerParams); } return target; }