示例#1
0
 /// <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;
 }
示例#2
0
        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."));
            }
        }
示例#3
0
 /// <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;
 }