src/jdk/nashorn/internal/objects/NativeDate.java

Print this page

        

*** 842,855 **** * @param key ignored * @return JSON representation of this date */ @Function(attributes = Attribute.NOT_ENUMERABLE) public static Object toJSON(final Object self, final Object key) { - if (self instanceof NativeDate) { - final NativeDate nd = (NativeDate)self; - return (isNaN(nd.getTime())) ? null : toISOStringImpl(nd); - } // NOTE: Date.prototype.toJSON is generic. Accepts other objects as well. final Object selfObj = Global.toObject(self); if (!(selfObj instanceof ScriptObject)) { return null; } --- 842,851 ----
*** 1198,1249 **** } // Convert Date constructor args, checking for NaN, filling in defaults etc. private static double[] convertCtorArgs(final Object[] args) { final double[] d = new double[7]; for (int i = 0; i < d.length; i++) { if (i < args.length) { final double darg = JSType.toNumber(args[i]); if (isNaN(darg) || isInfinite(darg)) { ! return null; } d[i] = (long)darg; } else { d[i] = i == 2 ? 1 : 0; // day in month defaults to 1 } } if (0 <= d[0] && d[0] <= 99) { d[0] += 1900; } ! return d; } // This method does the hard work for all setter methods: If a value is provided // as argument it is used, otherwise the value is calculated from the existing time value. private static double[] convertArgs(final Object[] args, final double time, final int fieldId, final int start, final int length) { final double[] d = new double[length]; for (int i = start; i < start + length; i++) { if (fieldId <= i && i < fieldId + args.length) { final double darg = JSType.toNumber(args[i - fieldId]); if (isNaN(darg) || isInfinite(darg)) { ! return null; } d[i - start] = (long) darg; } else { // Date.prototype.set* methods require first argument to be defined if (i == fieldId) { ! return null; } d[i - start] = valueFromTime(i, time); } } ! return d; } // ECMA 15.9.1.14 TimeClip (time) private static double timeClip(final double time) { if (isInfinite(time) || isNaN(time) || Math.abs(time) > 8.64e15) { --- 1194,1258 ---- } // Convert Date constructor args, checking for NaN, filling in defaults etc. private static double[] convertCtorArgs(final Object[] args) { final double[] d = new double[7]; + boolean nullReturn = false; + // should not bailout on first NaN or infinite. Need to convert all + // subsequent args for possible side-effects via valueOf/toString overrides + // on argument objects. for (int i = 0; i < d.length; i++) { if (i < args.length) { final double darg = JSType.toNumber(args[i]); if (isNaN(darg) || isInfinite(darg)) { ! nullReturn = true; } + d[i] = (long)darg; } else { d[i] = i == 2 ? 1 : 0; // day in month defaults to 1 } } if (0 <= d[0] && d[0] <= 99) { d[0] += 1900; } ! return nullReturn? null : d; } // This method does the hard work for all setter methods: If a value is provided // as argument it is used, otherwise the value is calculated from the existing time value. private static double[] convertArgs(final Object[] args, final double time, final int fieldId, final int start, final int length) { final double[] d = new double[length]; + boolean nullReturn = false; + // Need to call toNumber on all args for side-effects - even if an argument + // fails to convert to number, subsequent toNumber calls needed for possible + // side-effects via valueOf/toString overrides. for (int i = start; i < start + length; i++) { if (fieldId <= i && i < fieldId + args.length) { final double darg = JSType.toNumber(args[i - fieldId]); if (isNaN(darg) || isInfinite(darg)) { ! nullReturn = true; } + d[i - start] = (long) darg; } else { // Date.prototype.set* methods require first argument to be defined if (i == fieldId) { ! nullReturn = true; } + + if (! nullReturn) { d[i - start] = valueFromTime(i, time); } } ! } + return nullReturn? null : d; } // ECMA 15.9.1.14 TimeClip (time) private static double timeClip(final double time) { if (isInfinite(time) || isNaN(time) || Math.abs(time) > 8.64e15) {