nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/NativeDate.java
author attila
Mon, 02 Mar 2015 14:33:55 +0100
changeset 29282 a8523237b66c
parent 27213 957656314d82
child 29625 c35ec1503bf0
permissions -rw-r--r--
8074031: Canonicalize is-a-JS-string tests Reviewed-by: hannesw, lagergren
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
     1
/*
16151
97c1e756ae1e 8005663: Update copyright year to 2013
jlaskey
parents: 16147
diff changeset
     2
 * Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved.
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
     4
 *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
     7
 * published by the Free Software Foundation.  Oracle designates this
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
     8
 * particular file as subject to the "Classpath" exception as provided
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
     9
 * by Oracle in the LICENSE file that accompanied this code.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    10
 *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    11
 * This code is distributed in the hope that it will be useful, but WITHOUT
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    12
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    13
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    14
 * version 2 for more details (a copy is included in the LICENSE file that
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    15
 * accompanied this code).
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    16
 *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    17
 * You should have received a copy of the GNU General Public License version
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    18
 * 2 along with this work; if not, write to the Free Software Foundation,
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    19
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    20
 *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    21
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    22
 * or visit www.oracle.com if you need additional information or have any
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    23
 * questions.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    24
 */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    25
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    26
package jdk.nashorn.internal.objects;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    27
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    28
import static java.lang.Double.NaN;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    29
import static java.lang.Double.isInfinite;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    30
import static java.lang.Double.isNaN;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    31
import static jdk.nashorn.internal.runtime.ECMAErrors.rangeError;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    32
import static jdk.nashorn.internal.runtime.ECMAErrors.typeError;
29282
a8523237b66c 8074031: Canonicalize is-a-JS-string tests
attila
parents: 27213
diff changeset
    33
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    34
import java.util.Locale;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    35
import java.util.TimeZone;
19456
8cc345d620c8 8022524: Memory leaks in nashorn sources and tests found by jhat analysis
sundar
parents: 19097
diff changeset
    36
import java.util.concurrent.Callable;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    37
import jdk.nashorn.internal.objects.annotations.Attribute;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    38
import jdk.nashorn.internal.objects.annotations.Constructor;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    39
import jdk.nashorn.internal.objects.annotations.Function;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    40
import jdk.nashorn.internal.objects.annotations.ScriptClass;
26768
751b0f427090 8025435: Optimistic builtins support, implemented initial optimistic versions of push, pop, and charCodeAt
lagergren
parents: 25865
diff changeset
    41
import jdk.nashorn.internal.objects.annotations.SpecializedFunction;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    42
import jdk.nashorn.internal.objects.annotations.Where;
17966
931209786d11 8015353: Date.parse illegal string parsing issues
sundar
parents: 17764
diff changeset
    43
import jdk.nashorn.internal.parser.DateParser;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    44
import jdk.nashorn.internal.runtime.JSType;
18618
136279c4cbe6 8019157: Avoid calling ScriptObject.setProto() if possible
hannesw
parents: 17966
diff changeset
    45
import jdk.nashorn.internal.runtime.PropertyMap;
16262
75513555e603 8008731: Separate configuration environment (options, error/output writer etc.) from Context
sundar
parents: 16256
diff changeset
    46
import jdk.nashorn.internal.runtime.ScriptEnvironment;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    47
import jdk.nashorn.internal.runtime.ScriptObject;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    48
import jdk.nashorn.internal.runtime.ScriptRuntime;
19088
153f268bfa72 8021122: Not all callables are handled for toString and other function valued properties
sundar
parents: 18851
diff changeset
    49
import jdk.nashorn.internal.runtime.linker.Bootstrap;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    50
import jdk.nashorn.internal.runtime.linker.InvokeByName;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    51
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    52
/**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    53
 * ECMA 15.9 Date Objects
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    54
 *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    55
 */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    56
@ScriptClass("Date")
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    57
public final class NativeDate extends ScriptObject {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    58
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    59
    private static final String INVALID_DATE = "Invalid Date";
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    60
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    61
    private static final int YEAR        = 0;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    62
    private static final int MONTH       = 1;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    63
    private static final int DAY         = 2;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    64
    private static final int HOUR        = 3;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    65
    private static final int MINUTE      = 4;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    66
    private static final int SECOND      = 5;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    67
    private static final int MILLISECOND = 6;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    68
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    69
    private static final int FORMAT_DATE_TIME       = 0;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    70
    private static final int FORMAT_DATE            = 1;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    71
    private static final int FORMAT_TIME            = 2;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    72
    private static final int FORMAT_LOCAL_DATE_TIME = 3;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    73
    private static final int FORMAT_LOCAL_DATE      = 4;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    74
    private static final int FORMAT_LOCAL_TIME      = 5;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    75
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    76
    // Constants defined in ECMA 15.9.1.10
20220
6786e56c6931 8025163: Date methods should not return -0
hannesw
parents: 19456
diff changeset
    77
    private static final int    hoursPerDay      = 24;
6786e56c6931 8025163: Date methods should not return -0
hannesw
parents: 19456
diff changeset
    78
    private static final int    minutesPerHour   = 60;
6786e56c6931 8025163: Date methods should not return -0
hannesw
parents: 19456
diff changeset
    79
    private static final int    secondsPerMinute = 60;
6786e56c6931 8025163: Date methods should not return -0
hannesw
parents: 19456
diff changeset
    80
    private static final int    msPerSecond   = 1_000;
6786e56c6931 8025163: Date methods should not return -0
hannesw
parents: 19456
diff changeset
    81
    private static final int    msPerMinute  = 60_000;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    82
    private static final double msPerHour = 3_600_000;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    83
    private static final double msPerDay = 86_400_000;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    84
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    85
    private static int[][] firstDayInMonth = {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    86
            {0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334}, // normal year
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    87
            {0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335}  // leap year
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    88
    };
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    89
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    90
    private static String[] weekDays = {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    91
            "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    92
    };
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    93
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    94
    private static String[] months = {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    95
            "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    96
    };
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    97
19456
8cc345d620c8 8022524: Memory leaks in nashorn sources and tests found by jhat analysis
sundar
parents: 19097
diff changeset
    98
    private static final Object TO_ISO_STRING = new Object();
8cc345d620c8 8022524: Memory leaks in nashorn sources and tests found by jhat analysis
sundar
parents: 19097
diff changeset
    99
8cc345d620c8 8022524: Memory leaks in nashorn sources and tests found by jhat analysis
sundar
parents: 19097
diff changeset
   100
    private static InvokeByName getTO_ISO_STRING() {
8cc345d620c8 8022524: Memory leaks in nashorn sources and tests found by jhat analysis
sundar
parents: 19097
diff changeset
   101
        return Global.instance().getInvokeByName(TO_ISO_STRING,
8cc345d620c8 8022524: Memory leaks in nashorn sources and tests found by jhat analysis
sundar
parents: 19097
diff changeset
   102
                new Callable<InvokeByName>() {
8cc345d620c8 8022524: Memory leaks in nashorn sources and tests found by jhat analysis
sundar
parents: 19097
diff changeset
   103
                    @Override
8cc345d620c8 8022524: Memory leaks in nashorn sources and tests found by jhat analysis
sundar
parents: 19097
diff changeset
   104
                    public InvokeByName call() {
8cc345d620c8 8022524: Memory leaks in nashorn sources and tests found by jhat analysis
sundar
parents: 19097
diff changeset
   105
                        return new InvokeByName("toISOString", ScriptObject.class, Object.class, Object.class);
8cc345d620c8 8022524: Memory leaks in nashorn sources and tests found by jhat analysis
sundar
parents: 19097
diff changeset
   106
                    }
8cc345d620c8 8022524: Memory leaks in nashorn sources and tests found by jhat analysis
sundar
parents: 19097
diff changeset
   107
                });
8cc345d620c8 8022524: Memory leaks in nashorn sources and tests found by jhat analysis
sundar
parents: 19097
diff changeset
   108
    }
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   109
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   110
    private double time;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   111
    private final TimeZone timezone;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   112
18618
136279c4cbe6 8019157: Avoid calling ScriptObject.setProto() if possible
hannesw
parents: 17966
diff changeset
   113
    // initialized by nasgen
136279c4cbe6 8019157: Avoid calling ScriptObject.setProto() if possible
hannesw
parents: 17966
diff changeset
   114
    private static PropertyMap $nasgenmap$;
136279c4cbe6 8019157: Avoid calling ScriptObject.setProto() if possible
hannesw
parents: 17966
diff changeset
   115
18851
bdb92c95f886 8019947: inherited property invalidation does not work with two globals in same context
sundar
parents: 18618
diff changeset
   116
    private NativeDate(final double time, final ScriptObject proto, final PropertyMap map) {
bdb92c95f886 8019947: inherited property invalidation does not work with two globals in same context
sundar
parents: 18618
diff changeset
   117
        super(proto, map);
16262
75513555e603 8008731: Separate configuration environment (options, error/output writer etc.) from Context
sundar
parents: 16256
diff changeset
   118
        final ScriptEnvironment env = Global.getEnv();
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   119
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   120
        this.time = time;
16262
75513555e603 8008731: Separate configuration environment (options, error/output writer etc.) from Context
sundar
parents: 16256
diff changeset
   121
        this.timezone = env._timezone;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   122
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   123
18851
bdb92c95f886 8019947: inherited property invalidation does not work with two globals in same context
sundar
parents: 18618
diff changeset
   124
    NativeDate(final double time, final Global global) {
23375
a1110f2cbe75 8037400: Remove getInitialMap getters and GlobalObject interface
sundar
parents: 23084
diff changeset
   125
        this(time, global.getDatePrototype(), $nasgenmap$);
18851
bdb92c95f886 8019947: inherited property invalidation does not work with two globals in same context
sundar
parents: 18618
diff changeset
   126
    }
bdb92c95f886 8019947: inherited property invalidation does not work with two globals in same context
sundar
parents: 18618
diff changeset
   127
bdb92c95f886 8019947: inherited property invalidation does not work with two globals in same context
sundar
parents: 18618
diff changeset
   128
    private NativeDate (final double time) {
bdb92c95f886 8019947: inherited property invalidation does not work with two globals in same context
sundar
parents: 18618
diff changeset
   129
        this(time, Global.instance());
bdb92c95f886 8019947: inherited property invalidation does not work with two globals in same context
sundar
parents: 18618
diff changeset
   130
    }
bdb92c95f886 8019947: inherited property invalidation does not work with two globals in same context
sundar
parents: 18618
diff changeset
   131
bdb92c95f886 8019947: inherited property invalidation does not work with two globals in same context
sundar
parents: 18618
diff changeset
   132
    private NativeDate() {
bdb92c95f886 8019947: inherited property invalidation does not work with two globals in same context
sundar
parents: 18618
diff changeset
   133
        this(System.currentTimeMillis());
bdb92c95f886 8019947: inherited property invalidation does not work with two globals in same context
sundar
parents: 18618
diff changeset
   134
    }
bdb92c95f886 8019947: inherited property invalidation does not work with two globals in same context
sundar
parents: 18618
diff changeset
   135
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   136
    @Override
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   137
    public String getClassName() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   138
        return "Date";
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   139
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   140
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   141
    // ECMA 8.12.8 [[DefaultValue]] (hint)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   142
    @Override
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   143
    public Object getDefaultValue(final Class<?> hint) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   144
        // When the [[DefaultValue]] internal method of O is called with no hint,
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   145
        // then it behaves as if the hint were Number, unless O is a Date object
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   146
        // in which case it behaves as if the hint were String.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   147
        return super.getDefaultValue(hint == null ? String.class : hint);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   148
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   149
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   150
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   151
     * Constructor - ECMA 15.9.3.1 new Date
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   152
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   153
     * @param isNew is this Date constructed with the new operator
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   154
     * @param self  self references
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   155
     * @return Date representing now
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   156
     */
26768
751b0f427090 8025435: Optimistic builtins support, implemented initial optimistic versions of push, pop, and charCodeAt
lagergren
parents: 25865
diff changeset
   157
    @SpecializedFunction(isConstructor=true)
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   158
    public static Object construct(final boolean isNew, final Object self) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   159
        final NativeDate result = new NativeDate();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   160
        return isNew ? result : toStringImpl(result, FORMAT_DATE_TIME);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   161
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   162
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   163
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   164
     * Constructor - ECMA 15.9.3.1 new Date (year, month [, date [, hours [, minutes [, seconds [, ms ] ] ] ] ] )
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   165
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   166
     * @param isNew is this Date constructed with the new operator
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   167
     * @param self  self reference
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   168
     * @param args  arguments
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   169
     * @return new Date
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   170
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   171
    @Constructor(arity = 7)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   172
    public static Object construct(final boolean isNew, final Object self, final Object... args) {
18851
bdb92c95f886 8019947: inherited property invalidation does not work with two globals in same context
sundar
parents: 18618
diff changeset
   173
        if (! isNew) {
bdb92c95f886 8019947: inherited property invalidation does not work with two globals in same context
sundar
parents: 18618
diff changeset
   174
            return toStringImpl(new NativeDate(), FORMAT_DATE_TIME);
bdb92c95f886 8019947: inherited property invalidation does not work with two globals in same context
sundar
parents: 18618
diff changeset
   175
        }
bdb92c95f886 8019947: inherited property invalidation does not work with two globals in same context
sundar
parents: 18618
diff changeset
   176
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   177
        NativeDate result;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   178
        switch (args.length) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   179
        case 0:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   180
            result = new NativeDate();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   181
            break;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   182
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   183
        case 1:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   184
            double num;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   185
            final Object arg = JSType.toPrimitive(args[0]);
29282
a8523237b66c 8074031: Canonicalize is-a-JS-string tests
attila
parents: 27213
diff changeset
   186
            if (JSType.isString(arg)) {
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   187
                num = parseDateString(arg.toString());
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   188
            } else {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   189
                num = timeClip(JSType.toNumber(args[0]));
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   190
            }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   191
            result = new NativeDate(num);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   192
            break;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   193
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   194
        default:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   195
            result = new NativeDate(0);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   196
            final double[] d = convertCtorArgs(args);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   197
            if (d == null) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   198
                result.setTime(Double.NaN);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   199
            } else {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   200
                final double time = timeClip(utc(makeDate(d), result.getTimeZone()));
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   201
                result.setTime(time);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   202
            }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   203
            break;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   204
         }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   205
18851
bdb92c95f886 8019947: inherited property invalidation does not work with two globals in same context
sundar
parents: 18618
diff changeset
   206
         return result;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   207
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   208
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   209
    @Override
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   210
    public String safeToString() {
17242
476e2a192a1e 8012931: NativeDate.safeToString() throws RangeError for invalid date
hannesw
parents: 17229
diff changeset
   211
        final String str = isValidDate() ? toISOStringImpl(this) : INVALID_DATE;
476e2a192a1e 8012931: NativeDate.safeToString() throws RangeError for invalid date
hannesw
parents: 17229
diff changeset
   212
        return "[Date " + str + "]";
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   213
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   214
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   215
    @Override
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   216
    public String toString() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   217
        return isValidDate() ? toString(this).toString() : INVALID_DATE;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   218
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   219
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   220
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   221
     * ECMA 15.9.4.2 Date.parse (string)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   222
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   223
     * @param self self reference
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   224
     * @param string string to parse as date
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   225
     * @return Date interpreted from the string, or NaN for illegal values
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   226
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   227
    @Function(attributes = Attribute.NOT_ENUMERABLE, where = Where.CONSTRUCTOR)
23763
950d8bc0554f 8038456: improve nasgen type checks and use specific return type for @Function, @SpecializedFunctio methods
sundar
parents: 23375
diff changeset
   228
    public static double parse(final Object self, final Object string) {
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   229
        return parseDateString(JSType.toString(string));
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   230
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   231
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   232
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   233
     * ECMA 15.9.4.3 Date.UTC (year, month [, date [, hours [, minutes [, seconds [, ms ] ] ] ] ] )
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   234
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   235
     * @param self self reference
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   236
     * @param args mandatory args are year, month. Optional are date, hours, minutes, seconds and milliseconds
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   237
     * @return a time clip according to the ECMA specification
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   238
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   239
    @Function(attributes = Attribute.NOT_ENUMERABLE, arity = 7, where = Where.CONSTRUCTOR)
23763
950d8bc0554f 8038456: improve nasgen type checks and use specific return type for @Function, @SpecializedFunctio methods
sundar
parents: 23375
diff changeset
   240
    public static double UTC(final Object self, final Object... args) {
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   241
        final NativeDate nd = new NativeDate(0);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   242
        final double[] d = convertCtorArgs(args);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   243
        final double time = d == null ? Double.NaN : timeClip(makeDate(d));
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   244
        nd.setTime(time);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   245
        return time;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   246
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   247
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   248
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   249
     * ECMA 15.9.4.4 Date.now ( )
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   250
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   251
     * @param self self reference
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   252
     * @return a Date that points to the current moment in time
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   253
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   254
    @Function(attributes = Attribute.NOT_ENUMERABLE, where = Where.CONSTRUCTOR)
23763
950d8bc0554f 8038456: improve nasgen type checks and use specific return type for @Function, @SpecializedFunctio methods
sundar
parents: 23375
diff changeset
   255
    public static long now(final Object self) {
950d8bc0554f 8038456: improve nasgen type checks and use specific return type for @Function, @SpecializedFunctio methods
sundar
parents: 23375
diff changeset
   256
        return System.currentTimeMillis();
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   257
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   258
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   259
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   260
     * ECMA 15.9.5.2 Date.prototype.toString ( )
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   261
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   262
     * @param self self reference
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   263
     * @return string value that represents the Date in the current time zone
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   264
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   265
    @Function(attributes = Attribute.NOT_ENUMERABLE)
23763
950d8bc0554f 8038456: improve nasgen type checks and use specific return type for @Function, @SpecializedFunctio methods
sundar
parents: 23375
diff changeset
   266
    public static String toString(final Object self) {
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   267
        return toStringImpl(self, FORMAT_DATE_TIME);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   268
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   269
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   270
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   271
     * ECMA 15.9.5.3 Date.prototype.toDateString ( )
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   272
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   273
     * @param self self reference
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   274
     * @return string value with the "date" part of the Date in the current time zone
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   275
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   276
    @Function(attributes = Attribute.NOT_ENUMERABLE)
23763
950d8bc0554f 8038456: improve nasgen type checks and use specific return type for @Function, @SpecializedFunctio methods
sundar
parents: 23375
diff changeset
   277
    public static String toDateString(final Object self) {
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   278
        return toStringImpl(self, FORMAT_DATE);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   279
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   280
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   281
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   282
     * ECMA 15.9.5.4 Date.prototype.toTimeString ( )
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   283
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   284
     * @param self self reference
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   285
     * @return string value with "time" part of Date in the current time zone
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   286
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   287
    @Function(attributes = Attribute.NOT_ENUMERABLE)
23763
950d8bc0554f 8038456: improve nasgen type checks and use specific return type for @Function, @SpecializedFunctio methods
sundar
parents: 23375
diff changeset
   288
    public static String toTimeString(final Object self) {
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   289
        return toStringImpl(self, FORMAT_TIME);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   290
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   291
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   292
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   293
     * ECMA 15.9.5.5 Date.prototype.toLocaleString ( )
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   294
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   295
     * @param self self reference
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   296
     * @return string value that represents the Data in the current time zone and locale
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   297
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   298
    @Function(attributes = Attribute.NOT_ENUMERABLE)
23763
950d8bc0554f 8038456: improve nasgen type checks and use specific return type for @Function, @SpecializedFunctio methods
sundar
parents: 23375
diff changeset
   299
    public static String toLocaleString(final Object self) {
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   300
        return toStringImpl(self, FORMAT_LOCAL_DATE_TIME);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   301
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   302
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   303
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   304
     * ECMA 15.9.5.6 Date.prototype.toLocaleDateString ( )
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   305
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   306
     * @param self self reference
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   307
     * @return string value with the "date" part of the Date in the current time zone and locale
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   308
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   309
    @Function(attributes = Attribute.NOT_ENUMERABLE)
23763
950d8bc0554f 8038456: improve nasgen type checks and use specific return type for @Function, @SpecializedFunctio methods
sundar
parents: 23375
diff changeset
   310
    public static String toLocaleDateString(final Object self) {
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   311
        return toStringImpl(self, FORMAT_LOCAL_DATE);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   312
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   313
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   314
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   315
     * ECMA 15.9.5.7 Date.prototype.toLocaleTimeString ( )
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   316
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   317
     * @param self self reference
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   318
     * @return string value with the "time" part of Date in the current time zone and locale
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   319
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   320
    @Function(attributes = Attribute.NOT_ENUMERABLE)
23763
950d8bc0554f 8038456: improve nasgen type checks and use specific return type for @Function, @SpecializedFunctio methods
sundar
parents: 23375
diff changeset
   321
    public static String toLocaleTimeString(final Object self) {
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   322
        return toStringImpl(self, FORMAT_LOCAL_TIME);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   323
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   324
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   325
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   326
     * ECMA 15.9.5.8 Date.prototype.valueOf ( )
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   327
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   328
     * @param self self reference
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   329
     * @return valueOf - a number which is this time value
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   330
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   331
    @Function(attributes = Attribute.NOT_ENUMERABLE)
23763
950d8bc0554f 8038456: improve nasgen type checks and use specific return type for @Function, @SpecializedFunctio methods
sundar
parents: 23375
diff changeset
   332
    public static double valueOf(final Object self) {
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   333
        final NativeDate nd = getNativeDate(self);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   334
        return (nd != null) ? nd.getTime() : Double.NaN;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   335
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   336
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   337
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   338
     * ECMA 15.9.5.9 Date.prototype.getTime ( )
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   339
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   340
     * @param self self reference
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   341
     * @return time
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   342
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   343
    @Function(attributes = Attribute.NOT_ENUMERABLE)
23763
950d8bc0554f 8038456: improve nasgen type checks and use specific return type for @Function, @SpecializedFunctio methods
sundar
parents: 23375
diff changeset
   344
    public static double getTime(final Object self) {
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   345
        final NativeDate nd = getNativeDate(self);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   346
        return (nd != null) ? nd.getTime() : Double.NaN;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   347
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   348
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   349
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   350
     * ECMA 15.9.5.10 Date.prototype.getFullYear ( )
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   351
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   352
     * @param self self reference
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   353
     * @return full year
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   354
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   355
    @Function(attributes = Attribute.NOT_ENUMERABLE)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   356
    public static Object getFullYear(final Object self) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   357
        return getField(self, YEAR);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   358
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   359
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   360
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   361
     * ECMA 15.9.5.11 Date.prototype.getUTCFullYear( )
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   362
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   363
     * @param self self reference
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   364
     * @return UTC full year
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   365
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   366
    @Function(attributes = Attribute.NOT_ENUMERABLE)
23763
950d8bc0554f 8038456: improve nasgen type checks and use specific return type for @Function, @SpecializedFunctio methods
sundar
parents: 23375
diff changeset
   367
    public static double getUTCFullYear(final Object self) {
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   368
        return getUTCField(self, YEAR);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   369
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   370
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   371
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   372
     * B.2.4 Date.prototype.getYear ( )
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   373
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   374
     * @param self self reference
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   375
     * @return year
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   376
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   377
    @Function(attributes = Attribute.NOT_ENUMERABLE)
23763
950d8bc0554f 8038456: improve nasgen type checks and use specific return type for @Function, @SpecializedFunctio methods
sundar
parents: 23375
diff changeset
   378
    public static double getYear(final Object self) {
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   379
        final NativeDate nd = getNativeDate(self);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   380
        return (nd != null && nd.isValidDate()) ? (yearFromTime(nd.getLocalTime()) - 1900) : Double.NaN;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   381
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   382
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   383
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   384
     * ECMA 15.9.5.12 Date.prototype.getMonth ( )
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   385
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   386
     * @param self self reference
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   387
     * @return month
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   388
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   389
    @Function(attributes = Attribute.NOT_ENUMERABLE)
23763
950d8bc0554f 8038456: improve nasgen type checks and use specific return type for @Function, @SpecializedFunctio methods
sundar
parents: 23375
diff changeset
   390
    public static double getMonth(final Object self) {
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   391
        return getField(self, MONTH);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   392
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   393
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   394
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   395
     * ECMA 15.9.5.13 Date.prototype.getUTCMonth ( )
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   396
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   397
     * @param self self reference
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   398
     * @return UTC month
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   399
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   400
    @Function(attributes = Attribute.NOT_ENUMERABLE)
23763
950d8bc0554f 8038456: improve nasgen type checks and use specific return type for @Function, @SpecializedFunctio methods
sundar
parents: 23375
diff changeset
   401
    public static double getUTCMonth(final Object self) {
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   402
        return getUTCField(self, MONTH);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   403
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   404
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   405
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   406
     * ECMA 15.9.5.14 Date.prototype.getDate ( )
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   407
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   408
     * @param self self reference
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   409
     * @return date
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   410
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   411
    @Function(attributes = Attribute.NOT_ENUMERABLE)
23763
950d8bc0554f 8038456: improve nasgen type checks and use specific return type for @Function, @SpecializedFunctio methods
sundar
parents: 23375
diff changeset
   412
    public static double getDate(final Object self) {
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   413
        return getField(self, DAY);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   414
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   415
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   416
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   417
     * ECMA 15.9.5.15 Date.prototype.getUTCDate ( )
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   418
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   419
     * @param self self reference
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   420
     * @return UTC Date
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   421
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   422
    @Function(attributes = Attribute.NOT_ENUMERABLE)
23763
950d8bc0554f 8038456: improve nasgen type checks and use specific return type for @Function, @SpecializedFunctio methods
sundar
parents: 23375
diff changeset
   423
    public static double getUTCDate(final Object self) {
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   424
        return getUTCField(self, DAY);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   425
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   426
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   427
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   428
     * ECMA 15.9.5.16 Date.prototype.getDay ( )
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   429
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   430
     * @param self self reference
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   431
     * @return day
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   432
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   433
    @Function(attributes = Attribute.NOT_ENUMERABLE)
23763
950d8bc0554f 8038456: improve nasgen type checks and use specific return type for @Function, @SpecializedFunctio methods
sundar
parents: 23375
diff changeset
   434
    public static double getDay(final Object self) {
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   435
        final NativeDate nd = getNativeDate(self);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   436
        return (nd != null && nd.isValidDate()) ? weekDay(nd.getLocalTime()) : Double.NaN;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   437
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   438
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   439
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   440
     * ECMA 15.9.5.17 Date.prototype.getUTCDay ( )
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   441
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   442
     * @param self self reference
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   443
     * @return UTC day
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   444
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   445
    @Function(attributes = Attribute.NOT_ENUMERABLE)
23763
950d8bc0554f 8038456: improve nasgen type checks and use specific return type for @Function, @SpecializedFunctio methods
sundar
parents: 23375
diff changeset
   446
    public static double getUTCDay(final Object self) {
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   447
        final NativeDate nd = getNativeDate(self);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   448
        return (nd != null && nd.isValidDate()) ? weekDay(nd.getTime()) : Double.NaN;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   449
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   450
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   451
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   452
     * ECMA 15.9.5.18 Date.prototype.getHours ( )
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   453
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   454
     * @param self self reference
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   455
     * @return hours
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   456
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   457
    @Function(attributes = Attribute.NOT_ENUMERABLE)
23763
950d8bc0554f 8038456: improve nasgen type checks and use specific return type for @Function, @SpecializedFunctio methods
sundar
parents: 23375
diff changeset
   458
    public static double getHours(final Object self) {
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   459
        return getField(self, HOUR);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   460
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   461
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   462
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   463
     * ECMA 15.9.5.19 Date.prototype.getUTCHours ( )
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   464
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   465
     * @param self self reference
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   466
     * @return UTC hours
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   467
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   468
    @Function(attributes = Attribute.NOT_ENUMERABLE)
23763
950d8bc0554f 8038456: improve nasgen type checks and use specific return type for @Function, @SpecializedFunctio methods
sundar
parents: 23375
diff changeset
   469
    public static double getUTCHours(final Object self) {
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   470
        return getUTCField(self, HOUR);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   471
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   472
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   473
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   474
     * ECMA 15.9.5.20 Date.prototype.getMinutes ( )
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   475
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   476
     * @param self self reference
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   477
     * @return minutes
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   478
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   479
    @Function(attributes = Attribute.NOT_ENUMERABLE)
23763
950d8bc0554f 8038456: improve nasgen type checks and use specific return type for @Function, @SpecializedFunctio methods
sundar
parents: 23375
diff changeset
   480
    public static double getMinutes(final Object self) {
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   481
        return getField(self, MINUTE);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   482
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   483
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   484
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   485
     * ECMA 15.9.5.21 Date.prototype.getUTCMinutes ( )
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   486
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   487
     * @param self self reference
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   488
     * @return UTC minutes
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   489
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   490
    @Function(attributes = Attribute.NOT_ENUMERABLE)
23763
950d8bc0554f 8038456: improve nasgen type checks and use specific return type for @Function, @SpecializedFunctio methods
sundar
parents: 23375
diff changeset
   491
    public static double getUTCMinutes(final Object self) {
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   492
        return getUTCField(self, MINUTE);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   493
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   494
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   495
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   496
     * ECMA 15.9.5.22 Date.prototype.getSeconds ( )
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   497
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   498
     * @param self self reference
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   499
     * @return seconds
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   500
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   501
    @Function(attributes = Attribute.NOT_ENUMERABLE)
23763
950d8bc0554f 8038456: improve nasgen type checks and use specific return type for @Function, @SpecializedFunctio methods
sundar
parents: 23375
diff changeset
   502
    public static double getSeconds(final Object self) {
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   503
        return getField(self, SECOND);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   504
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   505
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   506
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   507
     * ECMA 15.9.5.23 Date.prototype.getUTCSeconds ( )
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   508
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   509
     * @param self self reference
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   510
     * @return UTC seconds
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   511
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   512
    @Function(attributes = Attribute.NOT_ENUMERABLE)
23763
950d8bc0554f 8038456: improve nasgen type checks and use specific return type for @Function, @SpecializedFunctio methods
sundar
parents: 23375
diff changeset
   513
    public static double getUTCSeconds(final Object self) {
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   514
        return getUTCField(self, SECOND);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   515
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   516
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   517
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   518
     * ECMA 15.9.5.24 Date.prototype.getMilliseconds ( )
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   519
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   520
     * @param self self reference
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   521
     * @return milliseconds
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   522
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   523
    @Function(attributes = Attribute.NOT_ENUMERABLE)
23763
950d8bc0554f 8038456: improve nasgen type checks and use specific return type for @Function, @SpecializedFunctio methods
sundar
parents: 23375
diff changeset
   524
    public static double getMilliseconds(final Object self) {
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   525
        return getField(self, MILLISECOND);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   526
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   527
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   528
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   529
     * ECMA 15.9.5.25 Date.prototype.getUTCMilliseconds ( )
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   530
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   531
     * @param self self reference
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   532
     * @return UTC milliseconds
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   533
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   534
    @Function(attributes = Attribute.NOT_ENUMERABLE)
23763
950d8bc0554f 8038456: improve nasgen type checks and use specific return type for @Function, @SpecializedFunctio methods
sundar
parents: 23375
diff changeset
   535
    public static double getUTCMilliseconds(final Object self) {
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   536
        return getUTCField(self, MILLISECOND);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   537
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   538
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   539
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   540
     * ECMA 15.9.5.26 Date.prototype.getTimezoneOffset ( )
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   541
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   542
     * @param self self reference
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   543
     * @return time zone offset or NaN if N/A
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   544
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   545
    @Function(attributes = Attribute.NOT_ENUMERABLE)
23763
950d8bc0554f 8038456: improve nasgen type checks and use specific return type for @Function, @SpecializedFunctio methods
sundar
parents: 23375
diff changeset
   546
    public static double getTimezoneOffset(final Object self) {
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   547
        final NativeDate nd = getNativeDate(self);
17251
444648345fa6 8013337: Issues with Date.prototype's get, set functions
sundar
parents: 17242
diff changeset
   548
        if (nd != null && nd.isValidDate()) {
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   549
            final long msec = (long) nd.getTime();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   550
            return - nd.getTimeZone().getOffset(msec) / msPerMinute;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   551
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   552
        return Double.NaN;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   553
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   554
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   555
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   556
     * ECMA 15.9.5.27 Date.prototype.setTime (time)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   557
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   558
     * @param self self reference
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   559
     * @param time time
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   560
     * @return time
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   561
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   562
    @Function(attributes = Attribute.NOT_ENUMERABLE)
23763
950d8bc0554f 8038456: improve nasgen type checks and use specific return type for @Function, @SpecializedFunctio methods
sundar
parents: 23375
diff changeset
   563
    public static double setTime(final Object self, final Object time) {
17251
444648345fa6 8013337: Issues with Date.prototype's get, set functions
sundar
parents: 17242
diff changeset
   564
        final NativeDate nd  = getNativeDate(self);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   565
        final double     num = timeClip(JSType.toNumber(time));
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   566
        nd.setTime(num);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   567
        return num;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   568
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   569
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   570
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   571
     * ECMA 15.9.5.28 Date.prototype.setMilliseconds (ms)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   572
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   573
     * @param self self reference
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   574
     * @param args milliseconds
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   575
     * @return time
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   576
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   577
    @Function(attributes = Attribute.NOT_ENUMERABLE, arity = 1)
23763
950d8bc0554f 8038456: improve nasgen type checks and use specific return type for @Function, @SpecializedFunctio methods
sundar
parents: 23375
diff changeset
   578
    public static double setMilliseconds(final Object self, final Object... args) {
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   579
        final NativeDate nd = getNativeDate(self);
17251
444648345fa6 8013337: Issues with Date.prototype's get, set functions
sundar
parents: 17242
diff changeset
   580
        setFields(nd, MILLISECOND, args, true);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   581
        return nd.getTime();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   582
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   583
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   584
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   585
     * ECMA 15.9.5.29 Date.prototype.setUTCMilliseconds (ms)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   586
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   587
     * @param self self reference
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   588
     * @param args utc milliseconds
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   589
     * @return time
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   590
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   591
    @Function(attributes = Attribute.NOT_ENUMERABLE, arity = 1)
23763
950d8bc0554f 8038456: improve nasgen type checks and use specific return type for @Function, @SpecializedFunctio methods
sundar
parents: 23375
diff changeset
   592
    public static double setUTCMilliseconds(final Object self, final Object... args) {
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   593
        final NativeDate nd = getNativeDate(self);
17251
444648345fa6 8013337: Issues with Date.prototype's get, set functions
sundar
parents: 17242
diff changeset
   594
        setFields(nd, MILLISECOND, args, false);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   595
        return nd.getTime();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   596
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   597
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   598
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   599
     * ECMA 15.9.5.30 Date.prototype.setSeconds (sec [, ms ] )
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   600
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   601
     * @param self self reference
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   602
     * @param args seconds (milliseconds optional second argument)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   603
     * @return time
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   604
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   605
    @Function(attributes = Attribute.NOT_ENUMERABLE, arity = 2)
23763
950d8bc0554f 8038456: improve nasgen type checks and use specific return type for @Function, @SpecializedFunctio methods
sundar
parents: 23375
diff changeset
   606
    public static double setSeconds(final Object self, final Object... args) {
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   607
        final NativeDate nd = getNativeDate(self);
17251
444648345fa6 8013337: Issues with Date.prototype's get, set functions
sundar
parents: 17242
diff changeset
   608
        setFields(nd, SECOND, args, true);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   609
        return nd.getTime();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   610
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   611
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   612
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   613
     * ECMA 15.9.5.31 Date.prototype.setUTCSeconds (sec [, ms ] )
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   614
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   615
     * @param self self reference
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   616
     * @param args UTC seconds (milliseconds optional second argument)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   617
     * @return time
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   618
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   619
    @Function(attributes = Attribute.NOT_ENUMERABLE, arity = 2)
23763
950d8bc0554f 8038456: improve nasgen type checks and use specific return type for @Function, @SpecializedFunctio methods
sundar
parents: 23375
diff changeset
   620
    public static double setUTCSeconds(final Object self, final Object... args) {
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   621
        final NativeDate nd = getNativeDate(self);
17251
444648345fa6 8013337: Issues with Date.prototype's get, set functions
sundar
parents: 17242
diff changeset
   622
        setFields(nd, SECOND, args, false);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   623
        return nd.getTime();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   624
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   625
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   626
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   627
     * ECMA 15.9.5.32 Date.prototype.setMinutes (min [, sec [, ms ] ] )
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   628
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   629
     * @param self self reference
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   630
     * @param args minutes (seconds and milliseconds are optional second and third arguments)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   631
     * @return time
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   632
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   633
    @Function(attributes = Attribute.NOT_ENUMERABLE, arity = 3)
23763
950d8bc0554f 8038456: improve nasgen type checks and use specific return type for @Function, @SpecializedFunctio methods
sundar
parents: 23375
diff changeset
   634
    public static double setMinutes(final Object self, final Object... args) {
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   635
        final NativeDate nd = getNativeDate(self);
17251
444648345fa6 8013337: Issues with Date.prototype's get, set functions
sundar
parents: 17242
diff changeset
   636
        setFields(nd, MINUTE, args, true);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   637
        return nd.getTime();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   638
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   639
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   640
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   641
     * ECMA 15.9.5.33 Date.prototype.setUTCMinutes (min [, sec [, ms ] ] )
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   642
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   643
     * @param self self reference
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   644
     * @param args minutes (seconds and milliseconds are optional second and third arguments)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   645
     * @return time
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   646
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   647
    @Function(attributes = Attribute.NOT_ENUMERABLE, arity = 3)
23763
950d8bc0554f 8038456: improve nasgen type checks and use specific return type for @Function, @SpecializedFunctio methods
sundar
parents: 23375
diff changeset
   648
    public static double setUTCMinutes(final Object self, final Object... args) {
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   649
        final NativeDate nd = getNativeDate(self);
17251
444648345fa6 8013337: Issues with Date.prototype's get, set functions
sundar
parents: 17242
diff changeset
   650
        setFields(nd, MINUTE, args, false);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   651
        return nd.getTime();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   652
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   653
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   654
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   655
     * ECMA 15.9.5.34 Date.prototype.setHours (hour [, min [, sec [, ms ] ] ] )
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   656
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   657
     * @param self self reference
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   658
     * @param args hour (optional arguments after are minutes, seconds, milliseconds)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   659
     * @return time
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   660
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   661
    @Function(attributes = Attribute.NOT_ENUMERABLE, arity = 4)
23763
950d8bc0554f 8038456: improve nasgen type checks and use specific return type for @Function, @SpecializedFunctio methods
sundar
parents: 23375
diff changeset
   662
    public static double setHours(final Object self, final Object... args) {
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   663
        final NativeDate nd = getNativeDate(self);
17251
444648345fa6 8013337: Issues with Date.prototype's get, set functions
sundar
parents: 17242
diff changeset
   664
        setFields(nd, HOUR, args, true);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   665
        return nd.getTime();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   666
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   667
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   668
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   669
     * ECMA 15.9.5.35 Date.prototype.setUTCHours (hour [, min [, sec [, ms ] ] ] )
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   670
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   671
     * @param self self reference
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   672
     * @param args hour (optional arguments after are minutes, seconds, milliseconds)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   673
     * @return time
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   674
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   675
    @Function(attributes = Attribute.NOT_ENUMERABLE, arity = 4)
23763
950d8bc0554f 8038456: improve nasgen type checks and use specific return type for @Function, @SpecializedFunctio methods
sundar
parents: 23375
diff changeset
   676
    public static double setUTCHours(final Object self, final Object... args) {
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   677
        final NativeDate nd = getNativeDate(self);
17251
444648345fa6 8013337: Issues with Date.prototype's get, set functions
sundar
parents: 17242
diff changeset
   678
        setFields(nd, HOUR, args, false);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   679
        return nd.getTime();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   680
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   681
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   682
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   683
     * ECMA 15.9.5.36 Date.prototype.setDate (date)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   684
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   685
     * @param self self reference
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   686
     * @param args date
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   687
     * @return time
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   688
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   689
    @Function(attributes = Attribute.NOT_ENUMERABLE, arity = 1)
23763
950d8bc0554f 8038456: improve nasgen type checks and use specific return type for @Function, @SpecializedFunctio methods
sundar
parents: 23375
diff changeset
   690
    public static double setDate(final Object self, final Object... args) {
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   691
        final NativeDate nd = getNativeDate(self);
17251
444648345fa6 8013337: Issues with Date.prototype's get, set functions
sundar
parents: 17242
diff changeset
   692
        setFields(nd, DAY, args, true);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   693
        return nd.getTime();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   694
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   695
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   696
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   697
     * ECMA 15.9.5.37 Date.prototype.setUTCDate (date)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   698
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   699
     * @param self self reference
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   700
     * @param args UTC date
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   701
     * @return time
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   702
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   703
    @Function(attributes = Attribute.NOT_ENUMERABLE, arity = 1)
23763
950d8bc0554f 8038456: improve nasgen type checks and use specific return type for @Function, @SpecializedFunctio methods
sundar
parents: 23375
diff changeset
   704
    public static double setUTCDate(final Object self, final Object... args) {
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   705
        final NativeDate nd = getNativeDate(self);
17251
444648345fa6 8013337: Issues with Date.prototype's get, set functions
sundar
parents: 17242
diff changeset
   706
        setFields(nd, DAY, args, false);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   707
        return nd.getTime();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   708
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   709
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   710
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   711
     * ECMA 15.9.5.38 Date.prototype.setMonth (month [, date ] )
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   712
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   713
     * @param self self reference
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   714
     * @param args month (optional second argument is date)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   715
     * @return time
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   716
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   717
    @Function(attributes = Attribute.NOT_ENUMERABLE, arity = 2)
23763
950d8bc0554f 8038456: improve nasgen type checks and use specific return type for @Function, @SpecializedFunctio methods
sundar
parents: 23375
diff changeset
   718
    public static double setMonth(final Object self, final Object... args) {
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   719
        final NativeDate nd = getNativeDate(self);
17251
444648345fa6 8013337: Issues with Date.prototype's get, set functions
sundar
parents: 17242
diff changeset
   720
        setFields(nd, MONTH, args, true);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   721
        return nd.getTime();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   722
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   723
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   724
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   725
     * ECMA 15.9.5.39 Date.prototype.setUTCMonth (month [, date ] )
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   726
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   727
     * @param self self reference
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   728
     * @param args UTC month (optional second argument is date)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   729
     * @return time
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   730
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   731
    @Function(attributes = Attribute.NOT_ENUMERABLE, arity = 2)
23763
950d8bc0554f 8038456: improve nasgen type checks and use specific return type for @Function, @SpecializedFunctio methods
sundar
parents: 23375
diff changeset
   732
    public static double setUTCMonth(final Object self, final Object... args) {
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   733
        final NativeDate nd = ensureNativeDate(self);
17251
444648345fa6 8013337: Issues with Date.prototype's get, set functions
sundar
parents: 17242
diff changeset
   734
        setFields(nd, MONTH, args, false);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   735
        return nd.getTime();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   736
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   737
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   738
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   739
     * ECMA 15.9.5.40 Date.prototype.setFullYear (year [, month [, date ] ] )
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   740
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   741
     * @param self self reference
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   742
     * @param args year (optional second and third arguments are month and date)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   743
     * @return time
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   744
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   745
    @Function(attributes = Attribute.NOT_ENUMERABLE, arity = 3)
23763
950d8bc0554f 8038456: improve nasgen type checks and use specific return type for @Function, @SpecializedFunctio methods
sundar
parents: 23375
diff changeset
   746
    public static double setFullYear(final Object self, final Object... args) {
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   747
        final NativeDate nd   = ensureNativeDate(self);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   748
        if (nd.isValidDate()) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   749
            setFields(nd, YEAR, args, true);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   750
        } else {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   751
            final double[] d = convertArgs(args, 0, YEAR, YEAR, 3);
17251
444648345fa6 8013337: Issues with Date.prototype's get, set functions
sundar
parents: 17242
diff changeset
   752
            if (d != null) {
444648345fa6 8013337: Issues with Date.prototype's get, set functions
sundar
parents: 17242
diff changeset
   753
                nd.setTime(timeClip(utc(makeDate(makeDay(d[0], d[1], d[2]), 0), nd.getTimeZone())));
444648345fa6 8013337: Issues with Date.prototype's get, set functions
sundar
parents: 17242
diff changeset
   754
            } else {
444648345fa6 8013337: Issues with Date.prototype's get, set functions
sundar
parents: 17242
diff changeset
   755
                nd.setTime(NaN);
444648345fa6 8013337: Issues with Date.prototype's get, set functions
sundar
parents: 17242
diff changeset
   756
            }
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   757
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   758
        return nd.getTime();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   759
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   760
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   761
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   762
     * ECMA 15.9.5.41 Date.prototype.setUTCFullYear (year [, month [, date ] ] )
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   763
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   764
     * @param self self reference
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   765
     * @param args UTC full year (optional second and third arguments are month and date)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   766
     * @return time
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   767
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   768
    @Function(attributes = Attribute.NOT_ENUMERABLE, arity = 3)
23763
950d8bc0554f 8038456: improve nasgen type checks and use specific return type for @Function, @SpecializedFunctio methods
sundar
parents: 23375
diff changeset
   769
    public static double setUTCFullYear(final Object self, final Object... args) {
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   770
        final NativeDate nd   = ensureNativeDate(self);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   771
        if (nd.isValidDate()) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   772
            setFields(nd, YEAR, args, false);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   773
        } else {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   774
            final double[] d = convertArgs(args, 0, YEAR, YEAR, 3);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   775
            nd.setTime(timeClip(makeDate(makeDay(d[0], d[1], d[2]), 0)));
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   776
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   777
        return nd.getTime();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   778
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   779
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   780
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   781
     * ECMA B.2.5 Date.prototype.setYear (year)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   782
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   783
     * @param self self reference
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   784
     * @param year year
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   785
     * @return NativeDate
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   786
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   787
    @Function(attributes = Attribute.NOT_ENUMERABLE)
23763
950d8bc0554f 8038456: improve nasgen type checks and use specific return type for @Function, @SpecializedFunctio methods
sundar
parents: 23375
diff changeset
   788
    public static double setYear(final Object self, final Object year) {
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   789
        final NativeDate nd = getNativeDate(self);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   790
        if (isNaN(nd.getTime())) {
17251
444648345fa6 8013337: Issues with Date.prototype's get, set functions
sundar
parents: 17242
diff changeset
   791
            nd.setTime(utc(0, nd.getTimeZone()));
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   792
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   793
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   794
        final double yearNum = JSType.toNumber(year);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   795
        if (isNaN(yearNum)) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   796
            nd.setTime(NaN);
17251
444648345fa6 8013337: Issues with Date.prototype's get, set functions
sundar
parents: 17242
diff changeset
   797
            return nd.getTime();
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   798
        }
17764
29e6eb3bb9df 8010804: Review long and integer usage conventions
hannesw
parents: 17251
diff changeset
   799
        int yearInt = (int)yearNum;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   800
        if (0 <= yearInt && yearInt <= 99) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   801
            yearInt += 1900;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   802
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   803
        setFields(nd, YEAR, new Object[] {yearInt}, true);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   804
17251
444648345fa6 8013337: Issues with Date.prototype's get, set functions
sundar
parents: 17242
diff changeset
   805
        return nd.getTime();
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   806
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   807
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   808
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   809
     * ECMA 15.9.5.42 Date.prototype.toUTCString ( )
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   810
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   811
     * @param self self reference
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   812
     * @return string representation of date
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   813
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   814
    @Function(attributes = Attribute.NOT_ENUMERABLE)
23763
950d8bc0554f 8038456: improve nasgen type checks and use specific return type for @Function, @SpecializedFunctio methods
sundar
parents: 23375
diff changeset
   815
    public static String toUTCString(final Object self) {
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   816
        return toGMTStringImpl(self);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   817
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   818
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   819
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   820
     * ECMA B.2.6 Date.prototype.toGMTString ( )
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   821
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   822
     * See {@link NativeDate#toUTCString(Object)}
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   823
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   824
     * @param self self reference
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   825
     * @return string representation of date
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   826
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   827
    @Function(attributes = Attribute.NOT_ENUMERABLE)
23763
950d8bc0554f 8038456: improve nasgen type checks and use specific return type for @Function, @SpecializedFunctio methods
sundar
parents: 23375
diff changeset
   828
    public static String toGMTString(final Object self) {
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   829
        return toGMTStringImpl(self);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   830
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   831
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   832
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   833
     * ECMA 15.9.5.43 Date.prototype.toISOString ( )
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   834
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   835
     * @param self self reference
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   836
     * @return string representation of date
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   837
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   838
    @Function(attributes = Attribute.NOT_ENUMERABLE)
23763
950d8bc0554f 8038456: improve nasgen type checks and use specific return type for @Function, @SpecializedFunctio methods
sundar
parents: 23375
diff changeset
   839
    public static String toISOString(final Object self) {
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   840
        return toISOStringImpl(self);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   841
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   842
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   843
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   844
     * ECMA 15.9.5.44 Date.prototype.toJSON ( key )
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   845
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   846
     * Provides a string representation of this Date for use by {@link NativeJSON#stringify(Object, Object, Object, Object)}
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   847
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   848
     * @param self self reference
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   849
     * @param key ignored
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   850
     * @return JSON representation of this date
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   851
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   852
    @Function(attributes = Attribute.NOT_ENUMERABLE)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   853
    public static Object toJSON(final Object self, final Object key) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   854
        // NOTE: Date.prototype.toJSON is generic. Accepts other objects as well.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   855
        final Object selfObj = Global.toObject(self);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   856
        if (!(selfObj instanceof ScriptObject)) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   857
            return null;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   858
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   859
        final ScriptObject sobj  = (ScriptObject)selfObj;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   860
        final Object       value = sobj.getDefaultValue(Number.class);
17229
70c3875b3c63 8012462: Date.prototype.toJSON does not handle non-Date 'this' as per the spec.
sundar
parents: 16771
diff changeset
   861
        if (value instanceof Number) {
70c3875b3c63 8012462: Date.prototype.toJSON does not handle non-Date 'this' as per the spec.
sundar
parents: 16771
diff changeset
   862
            final double num = ((Number)value).doubleValue();
70c3875b3c63 8012462: Date.prototype.toJSON does not handle non-Date 'this' as per the spec.
sundar
parents: 16771
diff changeset
   863
            if (isInfinite(num) || isNaN(num)) {
70c3875b3c63 8012462: Date.prototype.toJSON does not handle non-Date 'this' as per the spec.
sundar
parents: 16771
diff changeset
   864
                return null;
70c3875b3c63 8012462: Date.prototype.toJSON does not handle non-Date 'this' as per the spec.
sundar
parents: 16771
diff changeset
   865
            }
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   866
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   867
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   868
        try {
19456
8cc345d620c8 8022524: Memory leaks in nashorn sources and tests found by jhat analysis
sundar
parents: 19097
diff changeset
   869
            final InvokeByName toIsoString = getTO_ISO_STRING();
8cc345d620c8 8022524: Memory leaks in nashorn sources and tests found by jhat analysis
sundar
parents: 19097
diff changeset
   870
            final Object func = toIsoString.getGetter().invokeExact(sobj);
19088
153f268bfa72 8021122: Not all callables are handled for toString and other function valued properties
sundar
parents: 18851
diff changeset
   871
            if (Bootstrap.isCallable(func)) {
19456
8cc345d620c8 8022524: Memory leaks in nashorn sources and tests found by jhat analysis
sundar
parents: 19097
diff changeset
   872
                return toIsoString.getInvoker().invokeExact(func, sobj, key);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   873
            }
16256
f2d9a0c49914 8007002: Replace implicit exception throwing methods with explicit throws - simplify control flow and remove useless code
lagergren
parents: 16188
diff changeset
   874
            throw typeError("not.a.function", ScriptRuntime.safeToString(func));
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   875
        } catch (final RuntimeException | Error e) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   876
            throw e;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   877
        } catch (final Throwable t) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   878
            throw new RuntimeException(t);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   879
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   880
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   881
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   882
    // -- Internals below this point
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   883
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   884
    private static double parseDateString(final String str) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   885
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   886
        final DateParser parser = new DateParser(str);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   887
        if (parser.parse()) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   888
            final Integer[] fields = parser.getDateFields();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   889
            double d = makeDate(fields);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   890
            if (fields[DateParser.TIMEZONE] != null) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   891
                d -= fields[DateParser.TIMEZONE] * 60000;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   892
            } else {
16262
75513555e603 8008731: Separate configuration environment (options, error/output writer etc.) from Context
sundar
parents: 16256
diff changeset
   893
                d = utc(d, Global.getEnv()._timezone);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   894
            }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   895
            d = timeClip(d);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   896
            return d;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   897
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   898
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   899
        return Double.NaN;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   900
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   901
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   902
    private static void zeroPad(final StringBuilder sb, final int n, final int length) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   903
        for (int l = 1, d = 10; l < length; l++, d *= 10) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   904
            if (n < d) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   905
                sb.append('0');
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   906
            }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   907
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   908
        sb.append(n);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   909
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   910
25250
b5a4e0ac31d1 8047359: large string size RangeError should be thrown rather than reporting negative length
sundar
parents: 23763
diff changeset
   911
    @SuppressWarnings("fallthrough")
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   912
    private static String toStringImpl(final Object self, final int format) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   913
        final NativeDate nd = getNativeDate(self);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   914
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   915
        if (nd != null && nd.isValidDate()) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   916
            final StringBuilder sb = new StringBuilder(40);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   917
            final double t = nd.getLocalTime();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   918
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   919
            switch (format) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   920
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   921
                case FORMAT_DATE_TIME:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   922
                case FORMAT_DATE :
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   923
                case FORMAT_LOCAL_DATE_TIME:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   924
                    // EEE MMM dd yyyy
20220
6786e56c6931 8025163: Date methods should not return -0
hannesw
parents: 19456
diff changeset
   925
                    sb.append(weekDays[weekDay(t)])
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   926
                            .append(' ')
20220
6786e56c6931 8025163: Date methods should not return -0
hannesw
parents: 19456
diff changeset
   927
                            .append(months[monthFromTime(t)])
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   928
                            .append(' ');
20220
6786e56c6931 8025163: Date methods should not return -0
hannesw
parents: 19456
diff changeset
   929
                    zeroPad(sb, dayFromTime(t), 2);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   930
                    sb.append(' ');
20220
6786e56c6931 8025163: Date methods should not return -0
hannesw
parents: 19456
diff changeset
   931
                    zeroPad(sb, yearFromTime(t), 4);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   932
                    if (format == FORMAT_DATE) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   933
                        break;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   934
                    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   935
                    sb.append(' ');
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   936
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   937
                case FORMAT_TIME:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   938
                    final TimeZone tz = nd.getTimeZone();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   939
                    final double utcTime = nd.getTime();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   940
                    int offset = tz.getOffset((long) utcTime) / 60000;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   941
                    final boolean inDaylightTime = offset != tz.getRawOffset() / 60000;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   942
                    // Convert minutes to HHmm timezone offset
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   943
                    offset = (offset / 60) * 100 + offset % 60;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   944
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   945
                    // HH:mm:ss GMT+HHmm
20220
6786e56c6931 8025163: Date methods should not return -0
hannesw
parents: 19456
diff changeset
   946
                    zeroPad(sb, hourFromTime(t), 2);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   947
                    sb.append(':');
20220
6786e56c6931 8025163: Date methods should not return -0
hannesw
parents: 19456
diff changeset
   948
                    zeroPad(sb, minFromTime(t), 2);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   949
                    sb.append(':');
20220
6786e56c6931 8025163: Date methods should not return -0
hannesw
parents: 19456
diff changeset
   950
                    zeroPad(sb, secFromTime(t), 2);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   951
                    sb.append(" GMT")
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   952
                            .append(offset < 0 ? '-' : '+');
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   953
                    zeroPad(sb, Math.abs(offset), 4);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   954
                    sb.append(" (")
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   955
                            .append(tz.getDisplayName(inDaylightTime, TimeZone.SHORT, Locale.US))
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   956
                            .append(')');
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   957
                    break;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   958
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   959
                case FORMAT_LOCAL_DATE:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   960
                    // yyyy-MM-dd
20220
6786e56c6931 8025163: Date methods should not return -0
hannesw
parents: 19456
diff changeset
   961
                    zeroPad(sb, yearFromTime(t), 4);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   962
                    sb.append('-');
20220
6786e56c6931 8025163: Date methods should not return -0
hannesw
parents: 19456
diff changeset
   963
                    zeroPad(sb, monthFromTime(t) + 1, 2);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   964
                    sb.append('-');
20220
6786e56c6931 8025163: Date methods should not return -0
hannesw
parents: 19456
diff changeset
   965
                    zeroPad(sb, dayFromTime(t), 2);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   966
                    break;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   967
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   968
                case FORMAT_LOCAL_TIME:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   969
                    // HH:mm:ss
20220
6786e56c6931 8025163: Date methods should not return -0
hannesw
parents: 19456
diff changeset
   970
                    zeroPad(sb, hourFromTime(t), 2);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   971
                    sb.append(':');
20220
6786e56c6931 8025163: Date methods should not return -0
hannesw
parents: 19456
diff changeset
   972
                    zeroPad(sb, minFromTime(t), 2);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   973
                    sb.append(':');
20220
6786e56c6931 8025163: Date methods should not return -0
hannesw
parents: 19456
diff changeset
   974
                    zeroPad(sb, secFromTime(t), 2);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   975
                    break;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   976
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   977
                default:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   978
                    throw new IllegalArgumentException("format: " + format);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   979
            }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   980
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   981
            return sb.toString();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   982
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   983
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   984
        return INVALID_DATE;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   985
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   986
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   987
    private static String toGMTStringImpl(final Object self) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   988
        final NativeDate nd = getNativeDate(self);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   989
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   990
        if (nd != null && nd.isValidDate()) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   991
            final StringBuilder sb = new StringBuilder(29);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   992
            final double t = nd.getTime();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   993
            // EEE, dd MMM yyyy HH:mm:ss z
20220
6786e56c6931 8025163: Date methods should not return -0
hannesw
parents: 19456
diff changeset
   994
            sb.append(weekDays[weekDay(t)])
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   995
                    .append(", ");
20220
6786e56c6931 8025163: Date methods should not return -0
hannesw
parents: 19456
diff changeset
   996
            zeroPad(sb, dayFromTime(t), 2);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   997
            sb.append(' ')
20220
6786e56c6931 8025163: Date methods should not return -0
hannesw
parents: 19456
diff changeset
   998
                    .append(months[monthFromTime(t)])
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   999
                    .append(' ');
20220
6786e56c6931 8025163: Date methods should not return -0
hannesw
parents: 19456
diff changeset
  1000
            zeroPad(sb, yearFromTime(t), 4);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1001
            sb.append(' ');
20220
6786e56c6931 8025163: Date methods should not return -0
hannesw
parents: 19456
diff changeset
  1002
            zeroPad(sb, hourFromTime(t), 2);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1003
            sb.append(':');
20220
6786e56c6931 8025163: Date methods should not return -0
hannesw
parents: 19456
diff changeset
  1004
            zeroPad(sb, minFromTime(t), 2);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1005
            sb.append(':');
20220
6786e56c6931 8025163: Date methods should not return -0
hannesw
parents: 19456
diff changeset
  1006
            zeroPad(sb, secFromTime(t), 2);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1007
            sb.append(" GMT");
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1008
            return sb.toString();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1009
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1010
16256
f2d9a0c49914 8007002: Replace implicit exception throwing methods with explicit throws - simplify control flow and remove useless code
lagergren
parents: 16188
diff changeset
  1011
        throw rangeError("invalid.date");
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1012
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1013
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1014
    private static String toISOStringImpl(final Object self) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1015
        final NativeDate nd = getNativeDate(self);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1016
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1017
        if (nd != null && nd.isValidDate()) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1018
            final StringBuilder sb = new StringBuilder(24);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1019
            final double t = nd.getTime();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1020
            // yyyy-MM-dd'T'HH:mm:ss.SSS'Z'
20220
6786e56c6931 8025163: Date methods should not return -0
hannesw
parents: 19456
diff changeset
  1021
            zeroPad(sb, yearFromTime(t), 4);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1022
            sb.append('-');
20220
6786e56c6931 8025163: Date methods should not return -0
hannesw
parents: 19456
diff changeset
  1023
            zeroPad(sb, monthFromTime(t) + 1, 2);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1024
            sb.append('-');
20220
6786e56c6931 8025163: Date methods should not return -0
hannesw
parents: 19456
diff changeset
  1025
            zeroPad(sb, dayFromTime(t), 2);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1026
            sb.append('T');
20220
6786e56c6931 8025163: Date methods should not return -0
hannesw
parents: 19456
diff changeset
  1027
            zeroPad(sb, hourFromTime(t), 2);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1028
            sb.append(':');
20220
6786e56c6931 8025163: Date methods should not return -0
hannesw
parents: 19456
diff changeset
  1029
            zeroPad(sb, minFromTime(t), 2);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1030
            sb.append(':');
20220
6786e56c6931 8025163: Date methods should not return -0
hannesw
parents: 19456
diff changeset
  1031
            zeroPad(sb, secFromTime(t), 2);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1032
            sb.append('.');
20220
6786e56c6931 8025163: Date methods should not return -0
hannesw
parents: 19456
diff changeset
  1033
            zeroPad(sb, msFromTime(t), 3);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1034
            sb.append("Z");
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1035
            return sb.toString();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1036
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1037
16256
f2d9a0c49914 8007002: Replace implicit exception throwing methods with explicit throws - simplify control flow and remove useless code
lagergren
parents: 16188
diff changeset
  1038
        throw rangeError("invalid.date");
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1039
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1040
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1041
    // ECMA 15.9.1.2 Day (t)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1042
    private static double day(final double t) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1043
        return Math.floor(t / msPerDay);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1044
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1045
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1046
    // ECMA 15.9.1.2 TimeWithinDay (t)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1047
    private static double timeWithinDay(final double t) {
27213
957656314d82 8062024: Issue with date.setFullYear when time other than midnight
sundar
parents: 26768
diff changeset
  1048
        final double val = t % msPerDay;
957656314d82 8062024: Issue with date.setFullYear when time other than midnight
sundar
parents: 26768
diff changeset
  1049
        return val < 0? val + msPerDay : val;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1050
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1051
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1052
    // ECMA 15.9.1.3 InLeapYear (t)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1053
    private static boolean isLeapYear(final int y) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1054
        return y % 4 == 0 && (y % 100 != 0 || y % 400 == 0);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1055
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1056
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1057
    // ECMA 15.9.1.3 DaysInYear (y)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1058
    private static int daysInYear(final int y) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1059
        return isLeapYear(y) ? 366 : 365;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1060
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1061
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1062
    // ECMA 15.9.1.3 DayFromYear (y)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1063
    private static double dayFromYear(final double y) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1064
        return 365 * (y - 1970)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1065
                + Math.floor((y -1969) / 4.0)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1066
                - Math.floor((y - 1901) / 100.0)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1067
                + Math.floor((y - 1601) / 400.0);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1068
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1069
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1070
    // ECMA 15.9.1.3 Year Number
20220
6786e56c6931 8025163: Date methods should not return -0
hannesw
parents: 19456
diff changeset
  1071
    private static double timeFromYear(final int y) {
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1072
        return dayFromYear(y) * msPerDay;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1073
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1074
20220
6786e56c6931 8025163: Date methods should not return -0
hannesw
parents: 19456
diff changeset
  1075
    // ECMA 15.9.1.3 Year Number
6786e56c6931 8025163: Date methods should not return -0
hannesw
parents: 19456
diff changeset
  1076
    private static int yearFromTime(final double t) {
6786e56c6931 8025163: Date methods should not return -0
hannesw
parents: 19456
diff changeset
  1077
        int y = (int) Math.floor(t / (msPerDay * 365.2425)) + 1970;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1078
        final double t2 = timeFromYear(y);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1079
        if (t2 > t) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1080
            y--;
20220
6786e56c6931 8025163: Date methods should not return -0
hannesw
parents: 19456
diff changeset
  1081
        } else if (t2 + msPerDay * daysInYear(y) <= t) {
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1082
            y++;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1083
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1084
        return y;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1085
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1086
20220
6786e56c6931 8025163: Date methods should not return -0
hannesw
parents: 19456
diff changeset
  1087
    private static int dayWithinYear(final double t, final int year) {
6786e56c6931 8025163: Date methods should not return -0
hannesw
parents: 19456
diff changeset
  1088
        return (int) (day(t) - dayFromYear(year));
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1089
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1090
20220
6786e56c6931 8025163: Date methods should not return -0
hannesw
parents: 19456
diff changeset
  1091
    private static int monthFromTime(final double t) {
6786e56c6931 8025163: Date methods should not return -0
hannesw
parents: 19456
diff changeset
  1092
        final int year = yearFromTime(t);
6786e56c6931 8025163: Date methods should not return -0
hannesw
parents: 19456
diff changeset
  1093
        final int day = dayWithinYear(t, year);
6786e56c6931 8025163: Date methods should not return -0
hannesw
parents: 19456
diff changeset
  1094
        final int[] firstDay = firstDayInMonth[isLeapYear(year) ? 1 : 0];
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1095
        int month = 0;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1096
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1097
        while (month < 11 && firstDay[month + 1] <= day) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1098
            month++;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1099
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1100
        return month;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1101
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1102
20220
6786e56c6931 8025163: Date methods should not return -0
hannesw
parents: 19456
diff changeset
  1103
    private static int dayFromTime(final double t)  {
6786e56c6931 8025163: Date methods should not return -0
hannesw
parents: 19456
diff changeset
  1104
        final int year = yearFromTime(t);
6786e56c6931 8025163: Date methods should not return -0
hannesw
parents: 19456
diff changeset
  1105
        final int day = dayWithinYear(t, year);
6786e56c6931 8025163: Date methods should not return -0
hannesw
parents: 19456
diff changeset
  1106
        final int[] firstDay = firstDayInMonth[isLeapYear(year) ? 1 : 0];
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1107
        int month = 0;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1108
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1109
        while (month < 11 && firstDay[month + 1] <= day) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1110
            month++;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1111
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1112
        return 1 + day - firstDay[month];
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1113
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1114
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1115
    private static int dayFromMonth(final int month, final int year) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1116
        assert(month >= 0 && month <= 11);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1117
        final int[] firstDay = firstDayInMonth[isLeapYear(year) ? 1 : 0];
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1118
        return firstDay[month];
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1119
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1120
20220
6786e56c6931 8025163: Date methods should not return -0
hannesw
parents: 19456
diff changeset
  1121
    private static int weekDay(final double time) {
6786e56c6931 8025163: Date methods should not return -0
hannesw
parents: 19456
diff changeset
  1122
        final int day = (int) (day(time) + 4) % 7;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1123
        return day < 0 ? day + 7 : day;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1124
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1125
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1126
    // ECMA 15.9.1.9 LocalTime
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1127
    private static double localTime(final double time, final TimeZone tz) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1128
        return time + tz.getOffset((long) time);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1129
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1130
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1131
    // ECMA 15.9.1.9 UTC
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1132
    private static double utc(final double time, final TimeZone tz) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1133
        return time - tz.getOffset((long) (time - tz.getRawOffset()));
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1134
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1135
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1136
    // ECMA 15.9.1.10 Hours, Minutes, Second, and Milliseconds
20220
6786e56c6931 8025163: Date methods should not return -0
hannesw
parents: 19456
diff changeset
  1137
    private static int hourFromTime(final double t) {
6786e56c6931 8025163: Date methods should not return -0
hannesw
parents: 19456
diff changeset
  1138
        final int h = (int) (Math.floor(t / msPerHour) % hoursPerDay);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1139
        return h < 0 ? h + hoursPerDay: h;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1140
    }
20220
6786e56c6931 8025163: Date methods should not return -0
hannesw
parents: 19456
diff changeset
  1141
    private static int minFromTime(final double t) {
6786e56c6931 8025163: Date methods should not return -0
hannesw
parents: 19456
diff changeset
  1142
        final int m = (int) (Math.floor(t / msPerMinute) % minutesPerHour);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1143
        return m < 0 ? m + minutesPerHour : m;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1144
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1145
20220
6786e56c6931 8025163: Date methods should not return -0
hannesw
parents: 19456
diff changeset
  1146
    private static int secFromTime(final double t) {
6786e56c6931 8025163: Date methods should not return -0
hannesw
parents: 19456
diff changeset
  1147
        final int s = (int) (Math.floor(t / msPerSecond) % secondsPerMinute);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1148
        return s < 0 ? s + secondsPerMinute : s;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1149
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1150
20220
6786e56c6931 8025163: Date methods should not return -0
hannesw
parents: 19456
diff changeset
  1151
    private static int msFromTime(final double t) {
6786e56c6931 8025163: Date methods should not return -0
hannesw
parents: 19456
diff changeset
  1152
        final int m = (int) (t % msPerSecond);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1153
        return m < 0 ? m + msPerSecond : m;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1154
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1155
20220
6786e56c6931 8025163: Date methods should not return -0
hannesw
parents: 19456
diff changeset
  1156
    private static int valueFromTime(final int unit, final double t) {
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1157
        switch (unit) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1158
            case YEAR: return yearFromTime(t);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1159
            case MONTH: return monthFromTime(t);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1160
            case DAY: return dayFromTime(t);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1161
            case HOUR: return hourFromTime(t);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1162
            case MINUTE: return minFromTime(t);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1163
            case SECOND: return secFromTime(t);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1164
            case MILLISECOND: return msFromTime(t);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1165
            default: throw new IllegalArgumentException(Integer.toString(unit));
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1166
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1167
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1168
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1169
    // ECMA 15.9.1.11 MakeTime (hour, min, sec, ms)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1170
    private static double makeTime(final double hour, final double min, final double sec, final double ms) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1171
        return hour * 3600000 + min * 60000 + sec * 1000 + ms;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1172
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1173
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1174
    // ECMA 15.9.1.12 MakeDay (year, month, date)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1175
    private static double makeDay(final double year, final double month, final double date) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1176
        final double y = year + Math.floor(month / 12);
20220
6786e56c6931 8025163: Date methods should not return -0
hannesw
parents: 19456
diff changeset
  1177
        int m = (int) (month % 12);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1178
        if (m < 0) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1179
            m += 12;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1180
        }
20220
6786e56c6931 8025163: Date methods should not return -0
hannesw
parents: 19456
diff changeset
  1181
        double d = dayFromYear(y);
6786e56c6931 8025163: Date methods should not return -0
hannesw
parents: 19456
diff changeset
  1182
        d += dayFromMonth(m, (int) y);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1183
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1184
        return d + date - 1;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1185
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1186
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1187
    // ECMA 15.9.1.13 MakeDate (day, time)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1188
    private static double makeDate(final double day, final double time) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1189
        return day * msPerDay + time;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1190
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1191
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1192
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1193
    private static double makeDate(final Integer[] d) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1194
        final double time = makeDay(d[0], d[1], d[2]) * msPerDay;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1195
        return time + makeTime(d[3], d[4], d[5], d[6]);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1196
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1197
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1198
    private static double makeDate(final double[] d) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1199
        final double time = makeDay(d[0], d[1], d[2]) * msPerDay;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1200
        return time + makeTime(d[3], d[4], d[5], d[6]);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1201
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1202
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1203
    // Convert Date constructor args, checking for NaN, filling in defaults etc.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1204
    private static double[] convertCtorArgs(final Object[] args) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1205
        final double[] d = new double[7];
16771
9dd31b14e47c 8011382: Data prototype methods and constructor do not call user defined toISOString, valueOf methods per spec.
sundar
parents: 16262
diff changeset
  1206
        boolean nullReturn = false;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1207
16771
9dd31b14e47c 8011382: Data prototype methods and constructor do not call user defined toISOString, valueOf methods per spec.
sundar
parents: 16262
diff changeset
  1208
        // should not bailout on first NaN or infinite. Need to convert all
9dd31b14e47c 8011382: Data prototype methods and constructor do not call user defined toISOString, valueOf methods per spec.
sundar
parents: 16262
diff changeset
  1209
        // subsequent args for possible side-effects via valueOf/toString overrides
9dd31b14e47c 8011382: Data prototype methods and constructor do not call user defined toISOString, valueOf methods per spec.
sundar
parents: 16262
diff changeset
  1210
        // on argument objects.
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1211
        for (int i = 0; i < d.length; i++) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1212
            if (i < args.length) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1213
                final double darg = JSType.toNumber(args[i]);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1214
                if (isNaN(darg) || isInfinite(darg)) {
16771
9dd31b14e47c 8011382: Data prototype methods and constructor do not call user defined toISOString, valueOf methods per spec.
sundar
parents: 16262
diff changeset
  1215
                    nullReturn = true;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1216
                }
16771
9dd31b14e47c 8011382: Data prototype methods and constructor do not call user defined toISOString, valueOf methods per spec.
sundar
parents: 16262
diff changeset
  1217
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1218
                d[i] = (long)darg;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1219
            } else {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1220
                d[i] = i == 2 ? 1 : 0; // day in month defaults to 1
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1221
            }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1222
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1223
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1224
        if (0 <= d[0] && d[0] <= 99) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1225
            d[0] += 1900;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1226
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1227
16771
9dd31b14e47c 8011382: Data prototype methods and constructor do not call user defined toISOString, valueOf methods per spec.
sundar
parents: 16262
diff changeset
  1228
        return nullReturn? null : d;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1229
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1230
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1231
    // This method does the hard work for all setter methods: If a value is provided
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1232
    // as argument it is used, otherwise the value is calculated from the existing time value.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1233
    private static double[] convertArgs(final Object[] args, final double time, final int fieldId, final int start, final int length) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1234
        final double[] d = new double[length];
16771
9dd31b14e47c 8011382: Data prototype methods and constructor do not call user defined toISOString, valueOf methods per spec.
sundar
parents: 16262
diff changeset
  1235
        boolean nullReturn = false;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1236
16771
9dd31b14e47c 8011382: Data prototype methods and constructor do not call user defined toISOString, valueOf methods per spec.
sundar
parents: 16262
diff changeset
  1237
        // Need to call toNumber on all args for side-effects - even if an argument
9dd31b14e47c 8011382: Data prototype methods and constructor do not call user defined toISOString, valueOf methods per spec.
sundar
parents: 16262
diff changeset
  1238
        // fails to convert to number, subsequent toNumber calls needed for possible
9dd31b14e47c 8011382: Data prototype methods and constructor do not call user defined toISOString, valueOf methods per spec.
sundar
parents: 16262
diff changeset
  1239
        // side-effects via valueOf/toString overrides.
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1240
        for (int i = start; i < start + length; i++) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1241
            if (fieldId <= i && i < fieldId + args.length) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1242
                final double darg = JSType.toNumber(args[i - fieldId]);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1243
                if (isNaN(darg) || isInfinite(darg)) {
16771
9dd31b14e47c 8011382: Data prototype methods and constructor do not call user defined toISOString, valueOf methods per spec.
sundar
parents: 16262
diff changeset
  1244
                    nullReturn = true;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1245
                }
16771
9dd31b14e47c 8011382: Data prototype methods and constructor do not call user defined toISOString, valueOf methods per spec.
sundar
parents: 16262
diff changeset
  1246
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1247
                d[i - start] = (long) darg;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1248
            } else {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1249
                // Date.prototype.set* methods require first argument to be defined
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1250
                if (i == fieldId) {
16771
9dd31b14e47c 8011382: Data prototype methods and constructor do not call user defined toISOString, valueOf methods per spec.
sundar
parents: 16262
diff changeset
  1251
                    nullReturn = true;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1252
                }
16771
9dd31b14e47c 8011382: Data prototype methods and constructor do not call user defined toISOString, valueOf methods per spec.
sundar
parents: 16262
diff changeset
  1253
20220
6786e56c6931 8025163: Date methods should not return -0
hannesw
parents: 19456
diff changeset
  1254
                if (!nullReturn && !isNaN(time)) {
16771
9dd31b14e47c 8011382: Data prototype methods and constructor do not call user defined toISOString, valueOf methods per spec.
sundar
parents: 16262
diff changeset
  1255
                    d[i - start] = valueFromTime(i, time);
9dd31b14e47c 8011382: Data prototype methods and constructor do not call user defined toISOString, valueOf methods per spec.
sundar
parents: 16262
diff changeset
  1256
                }
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1257
            }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1258
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1259
20220
6786e56c6931 8025163: Date methods should not return -0
hannesw
parents: 19456
diff changeset
  1260
        return nullReturn ? null : d;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1261
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1262
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1263
    // ECMA 15.9.1.14 TimeClip (time)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1264
    private static double timeClip(final double time) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1265
        if (isInfinite(time) || isNaN(time) || Math.abs(time) > 8.64e15) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1266
            return Double.NaN;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1267
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1268
        return (long)time;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1269
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1270
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1271
    private static NativeDate ensureNativeDate(final Object self) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1272
        return getNativeDate(self);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1273
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1274
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1275
    private static NativeDate getNativeDate(final Object self) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1276
        if (self instanceof NativeDate) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1277
            return (NativeDate)self;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1278
        } else if (self != null && self == Global.instance().getDatePrototype()) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1279
            return Global.instance().DEFAULT_DATE;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1280
        } else {
16256
f2d9a0c49914 8007002: Replace implicit exception throwing methods with explicit throws - simplify control flow and remove useless code
lagergren
parents: 16188
diff changeset
  1281
            throw typeError("not.a.date", ScriptRuntime.safeToString(self));
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1282
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1283
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1284
23763
950d8bc0554f 8038456: improve nasgen type checks and use specific return type for @Function, @SpecializedFunctio methods
sundar
parents: 23375
diff changeset
  1285
    private static double getField(final Object self, final int field) {
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1286
        final NativeDate nd = getNativeDate(self);
23763
950d8bc0554f 8038456: improve nasgen type checks and use specific return type for @Function, @SpecializedFunctio methods
sundar
parents: 23375
diff changeset
  1287
        return (nd != null && nd.isValidDate()) ? (double)valueFromTime(field, nd.getLocalTime()) : Double.NaN;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1288
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1289
23763
950d8bc0554f 8038456: improve nasgen type checks and use specific return type for @Function, @SpecializedFunctio methods
sundar
parents: 23375
diff changeset
  1290
    private static double getUTCField(final Object self, final int field) {
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1291
        final NativeDate nd = getNativeDate(self);
23763
950d8bc0554f 8038456: improve nasgen type checks and use specific return type for @Function, @SpecializedFunctio methods
sundar
parents: 23375
diff changeset
  1292
        return (nd != null && nd.isValidDate()) ? (double)valueFromTime(field, nd.getTime()) : Double.NaN;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1293
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1294
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1295
    private static void setFields(final NativeDate nd, final int fieldId, final Object[] args, final boolean local) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1296
        int start, length;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1297
        if (fieldId < HOUR) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1298
            start = YEAR;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1299
            length = 3;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1300
        } else {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1301
            start = HOUR;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1302
            length = 4;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1303
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1304
        final double time = local ? nd.getLocalTime() : nd.getTime();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1305
        final double d[] = convertArgs(args, time, fieldId, start, length);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1306
17251
444648345fa6 8013337: Issues with Date.prototype's get, set functions
sundar
parents: 17242
diff changeset
  1307
        if (! nd.isValidDate()) {
444648345fa6 8013337: Issues with Date.prototype's get, set functions
sundar
parents: 17242
diff changeset
  1308
            return;
444648345fa6 8013337: Issues with Date.prototype's get, set functions
sundar
parents: 17242
diff changeset
  1309
        }
444648345fa6 8013337: Issues with Date.prototype's get, set functions
sundar
parents: 17242
diff changeset
  1310
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1311
        double newTime;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1312
        if (d == null) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1313
            newTime = NaN;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1314
        } else {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1315
            if (start == YEAR) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1316
                newTime = makeDate(makeDay(d[0], d[1], d[2]), timeWithinDay(time));
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1317
            } else {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1318
                newTime = makeDate(day(time), makeTime(d[0], d[1], d[2], d[3]));
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1319
            }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1320
            if (local) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1321
                newTime = utc(newTime, nd.getTimeZone());
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1322
            }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1323
            newTime = timeClip(newTime);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1324
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1325
        nd.setTime(newTime);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1326
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1327
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1328
    private boolean isValidDate() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1329
        return !isNaN(time);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1330
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1331
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1332
    private double getLocalTime() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1333
        return localTime(time, timezone);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1334
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1335
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1336
    private double getTime() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1337
        return time;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1338
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1339
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1340
    private void setTime(final double time) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1341
        this.time = time;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1342
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1343
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1344
    private TimeZone getTimeZone() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1345
        return timezone;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1346
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1347
}