Reviewed by Sam.
authoreric@webkit.org <eric@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 7 Jan 2008 06:06:43 +0000 (06:06 +0000)
committereric@webkit.org <eric@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 7 Jan 2008 06:06:43 +0000 (06:06 +0000)
        Abstract all DateObject.set* functions in preparation for fixing:
        http://bugs.webkit.org/show_bug.cgi?id=16753

        SunSpider had random changes here and there but was overall a wash.

        * kjs/date_object.cpp:
        (KJS::fillStructuresUsingTimeArgs):
        (KJS::setNewValueFromTimeArgs):
        (KJS::setNewValueFromDateArgs):
        (KJS::DateProtoFuncSetMilliSeconds::callAsFunction):
        (KJS::DateProtoFuncSetUTCMilliseconds::callAsFunction):
        (KJS::DateProtoFuncSetSeconds::callAsFunction):
        (KJS::DateProtoFuncSetUTCSeconds::callAsFunction):
        (KJS::DateProtoFuncSetMinutes::callAsFunction):
        (KJS::DateProtoFuncSetUTCMinutes::callAsFunction):
        (KJS::DateProtoFuncSetHours::callAsFunction):
        (KJS::DateProtoFuncSetUTCHours::callAsFunction):
        (KJS::DateProtoFuncSetDate::callAsFunction):
        (KJS::DateProtoFuncSetUTCDate::callAsFunction):
        (KJS::DateProtoFuncSetMonth::callAsFunction):
        (KJS::DateProtoFuncSetUTCMonth::callAsFunction):
        (KJS::DateProtoFuncSetFullYear::callAsFunction):
        (KJS::DateProtoFuncSetUTCFullYear::callAsFunction):

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@29217 268f45cc-cd09-0410-ab3c-d52691b4dbfc

JavaScriptCore/ChangeLog
JavaScriptCore/kjs/date_object.cpp

index 1bb373e..0ab6d85 100644 (file)
@@ -1,3 +1,31 @@
+2008-01-06  Eric Seidel  <eric@webkit.org>
+
+        Reviewed by Sam.
+
+        Abstract all DateObject.set* functions in preparation for fixing:
+        http://bugs.webkit.org/show_bug.cgi?id=16753
+        
+        SunSpider had random changes here and there but was overall a wash.
+
+        * kjs/date_object.cpp:
+        (KJS::fillStructuresUsingTimeArgs):
+        (KJS::setNewValueFromTimeArgs):
+        (KJS::setNewValueFromDateArgs):
+        (KJS::DateProtoFuncSetMilliSeconds::callAsFunction):
+        (KJS::DateProtoFuncSetUTCMilliseconds::callAsFunction):
+        (KJS::DateProtoFuncSetSeconds::callAsFunction):
+        (KJS::DateProtoFuncSetUTCSeconds::callAsFunction):
+        (KJS::DateProtoFuncSetMinutes::callAsFunction):
+        (KJS::DateProtoFuncSetUTCMinutes::callAsFunction):
+        (KJS::DateProtoFuncSetHours::callAsFunction):
+        (KJS::DateProtoFuncSetUTCHours::callAsFunction):
+        (KJS::DateProtoFuncSetDate::callAsFunction):
+        (KJS::DateProtoFuncSetUTCDate::callAsFunction):
+        (KJS::DateProtoFuncSetMonth::callAsFunction):
+        (KJS::DateProtoFuncSetUTCMonth::callAsFunction):
+        (KJS::DateProtoFuncSetFullYear::callAsFunction):
+        (KJS::DateProtoFuncSetUTCFullYear::callAsFunction):
+
 2008-01-06  Nikolas Zimmermann  <zimmermann@kde.org>
 
         Reviewed by Dan.
index 9634d3f..48beda5 100644 (file)
@@ -246,7 +246,7 @@ static UString formatTime(const GregorianDateTime &t, bool utc)
 // ms (representing milliseconds) and t (representing the rest of the date structure) appropriately.
 //
 // Format of member function: f([hour,] [min,] [sec,] [ms])
-static void fillStructuresUsingTimeArgs(ExecState *exec, const List &args, int maxArgs, double *ms, GregorianDateTime *t)
+static void fillStructuresUsingTimeArgs(ExecState* exec, const List& args, int maxArgs, double* ms, GregorianDateTime* t)
 {
     double milliseconds = 0;
     int idx = 0;
@@ -275,11 +275,10 @@ static void fillStructuresUsingTimeArgs(ExecState *exec, const List &args, int m
     }
     
     // milliseconds
-    if (idx < numArgs) {
+    if (idx < numArgs)
         milliseconds += args[idx]->toNumber(exec);
-    } else {
+    else
         milliseconds += *ms;
-    }
     
     *ms = milliseconds;
 }
@@ -1444,326 +1443,130 @@ JSValue* DateProtoFuncSetTime::callAsFunction(ExecState* exec, JSObject* thisObj
     return result;
 }
 
-JSValue* DateProtoFuncSetMilliSeconds::callAsFunction(ExecState* exec, JSObject* thisObj, const List& args)
+static JSValue* setNewValueFromTimeArgs(ExecState* exec, JSObject* thisObj, const List& args, int numArgsToUse, bool inputIsUTC)
 {
     if (!thisObj->inherits(&DateInstance::info))
         return throwError(exec, TypeError);
 
-    const bool utc = false;
-
-    DateInstance* thisDateObj = static_cast<DateInstance*>(thisObj); 
+    DateInstance* thisDateObj = static_cast<DateInstance*>(thisObj);
     JSValue* v = thisDateObj->internalValue();
     double milli = v->toNumber(exec);
     double secs = floor(milli / msPerSecond);
     double ms = milli - secs * msPerSecond;
 
     GregorianDateTime t;
-    msToGregorianDateTime(milli, utc, t);
+    msToGregorianDateTime(milli, inputIsUTC, t);
 
-    fillStructuresUsingTimeArgs(exec, args, 1, &ms, &t);
+    fillStructuresUsingTimeArgs(exec, args, numArgsToUse, &ms, &t);
 
-    JSValue* result = jsNumber(gregorianDateTimeToMS(t, ms, utc));
+    JSValue* result = jsNumber(gregorianDateTimeToMS(t, ms, inputIsUTC));
     thisDateObj->setInternalValue(result);
     return result;
 }
 
-JSValue* DateProtoFuncSetUTCMilliseconds::callAsFunction(ExecState* exec, JSObject* thisObj, const List& args)
+static JSValue* setNewValueFromDateArgs(ExecState* exec, JSObject* thisObj, const List& args, int numArgsToUse, bool inputIsUTC)
 {
     if (!thisObj->inherits(&DateInstance::info))
         return throwError(exec, TypeError);
 
-    const bool utc = true;
-
-    DateInstance* thisDateObj = static_cast<DateInstance*>(thisObj); 
+    DateInstance* thisDateObj = static_cast<DateInstance*>(thisObj);
     JSValue* v = thisDateObj->internalValue();
     double milli = v->toNumber(exec);
     double secs = floor(milli / msPerSecond);
     double ms = milli - secs * msPerSecond;
 
     GregorianDateTime t;
-    msToGregorianDateTime(milli, utc, t);
+    msToGregorianDateTime(milli, inputIsUTC, t);
 
-    fillStructuresUsingTimeArgs(exec, args, 1, &ms, &t);
+    fillStructuresUsingDateArgs(exec, args, numArgsToUse, &ms, &t);
 
-    JSValue* result = jsNumber(gregorianDateTimeToMS(t, ms, utc));
+    JSValue* result = jsNumber(gregorianDateTimeToMS(t, ms, inputIsUTC));
     thisDateObj->setInternalValue(result);
     return result;
 }
 
-JSValue* DateProtoFuncSetSeconds::callAsFunction(ExecState* exec, JSObject* thisObj, const List& args)
+JSValue* DateProtoFuncSetMilliSeconds::callAsFunction(ExecState* exec, JSObject* thisObj, const List& args)
 {
-    if (!thisObj->inherits(&DateInstance::info))
-        return throwError(exec, TypeError);
-
-    const bool utc = false;
-
-    DateInstance* thisDateObj = static_cast<DateInstance*>(thisObj); 
-    JSValue* v = thisDateObj->internalValue();
-    double milli = v->toNumber(exec);
-    double secs = floor(milli / msPerSecond);
-    double ms = milli - secs * msPerSecond;
-
-    GregorianDateTime t;
-    msToGregorianDateTime(milli, utc, t);
+    const bool inputIsUTC = false;
+    return setNewValueFromTimeArgs(exec, thisObj, args, 1, inputIsUTC);
+}
 
-    fillStructuresUsingTimeArgs(exec, args, 2, &ms, &t);
+JSValue* DateProtoFuncSetUTCMilliseconds::callAsFunction(ExecState* exec, JSObject* thisObj, const List& args)
+{
+    const bool inputIsUTC = true;
+    return setNewValueFromTimeArgs(exec, thisObj, args, 1, inputIsUTC);
+}
 
-    JSValue* result = jsNumber(gregorianDateTimeToMS(t, ms, utc));
-    thisDateObj->setInternalValue(result);
-    return result;
+JSValue* DateProtoFuncSetSeconds::callAsFunction(ExecState* exec, JSObject* thisObj, const List& args)
+{
+    const bool inputIsUTC = false;
+    return setNewValueFromTimeArgs(exec, thisObj, args, 2, inputIsUTC);
 }
 
 JSValue* DateProtoFuncSetUTCSeconds::callAsFunction(ExecState* exec, JSObject* thisObj, const List& args)
 {
-    if (!thisObj->inherits(&DateInstance::info))
-        return throwError(exec, TypeError);
-
-    const bool utc = true;
-
-    DateInstance* thisDateObj = static_cast<DateInstance*>(thisObj); 
-    JSValue* v = thisDateObj->internalValue();
-    double milli = v->toNumber(exec);
-    double secs = floor(milli / msPerSecond);
-    double ms = milli - secs * msPerSecond;
-
-    GregorianDateTime t;
-    msToGregorianDateTime(milli, utc, t);
-
-    fillStructuresUsingTimeArgs(exec, args, 2, &ms, &t);
-
-    JSValue* result = jsNumber(gregorianDateTimeToMS(t, ms, utc));
-    thisDateObj->setInternalValue(result);
-    return result;
+    const bool inputIsUTC = true;
+    return setNewValueFromTimeArgs(exec, thisObj, args, 2, inputIsUTC);
 }
 
 JSValue* DateProtoFuncSetMinutes::callAsFunction(ExecState* exec, JSObject* thisObj, const List& args)
 {
-    if (!thisObj->inherits(&DateInstance::info))
-        return throwError(exec, TypeError);
-
-    const bool utc = false;
-
-    DateInstance* thisDateObj = static_cast<DateInstance*>(thisObj); 
-    JSValue* v = thisDateObj->internalValue();
-    double milli = v->toNumber(exec);
-    double secs = floor(milli / msPerSecond);
-    double ms = milli - secs * msPerSecond;
-
-    GregorianDateTime t;
-    msToGregorianDateTime(milli, utc, t);
-
-    fillStructuresUsingTimeArgs(exec, args, 3, &ms, &t);
-
-    JSValue* result = jsNumber(gregorianDateTimeToMS(t, ms, utc));
-    thisDateObj->setInternalValue(result);
-    return result;
+    const bool inputIsUTC = false;
+    return setNewValueFromTimeArgs(exec, thisObj, args, 3, inputIsUTC);
 }
 
 JSValue* DateProtoFuncSetUTCMinutes::callAsFunction(ExecState* exec, JSObject* thisObj, const List& args)
 {
-    if (!thisObj->inherits(&DateInstance::info))
-        return throwError(exec, TypeError);
-
-    const bool utc = true;
-
-    DateInstance* thisDateObj = static_cast<DateInstance*>(thisObj); 
-    JSValue* v = thisDateObj->internalValue();
-    double milli = v->toNumber(exec);
-    double secs = floor(milli / msPerSecond);
-    double ms = milli - secs * msPerSecond;
-
-    GregorianDateTime t;
-    msToGregorianDateTime(milli, utc, t);
-
-    fillStructuresUsingTimeArgs(exec, args, 3, &ms, &t);
-
-    JSValue* result = jsNumber(gregorianDateTimeToMS(t, ms, utc));
-    thisDateObj->setInternalValue(result);
-    return result;
+    const bool inputIsUTC = true;
+    return setNewValueFromTimeArgs(exec, thisObj, args, 3, inputIsUTC);
 }
 
 JSValue* DateProtoFuncSetHours::callAsFunction(ExecState* exec, JSObject* thisObj, const List& args)
 {
-    if (!thisObj->inherits(&DateInstance::info))
-        return throwError(exec, TypeError);
-
-    const bool utc = false;
-
-    DateInstance* thisDateObj = static_cast<DateInstance*>(thisObj); 
-    JSValue* v = thisDateObj->internalValue();
-    double milli = v->toNumber(exec);
-    double secs = floor(milli / msPerSecond);
-    double ms = milli - secs * msPerSecond;
-
-    GregorianDateTime t;
-    msToGregorianDateTime(milli, utc, t);
-
-    fillStructuresUsingTimeArgs(exec, args, 4, &ms, &t);
-
-    JSValue* result = jsNumber(gregorianDateTimeToMS(t, ms, utc));
-    thisDateObj->setInternalValue(result);
-    return result;
+    const bool inputIsUTC = false;
+    return setNewValueFromTimeArgs(exec, thisObj, args, 4, inputIsUTC);
 }
 
 JSValue* DateProtoFuncSetUTCHours::callAsFunction(ExecState* exec, JSObject* thisObj, const List& args)
 {
-    if (!thisObj->inherits(&DateInstance::info))
-        return throwError(exec, TypeError);
-
-    const bool utc = true;
-
-    DateInstance* thisDateObj = static_cast<DateInstance*>(thisObj); 
-    JSValue* v = thisDateObj->internalValue();
-    double milli = v->toNumber(exec);
-    double secs = floor(milli / msPerSecond);
-    double ms = milli - secs * msPerSecond;
-
-    GregorianDateTime t;
-    msToGregorianDateTime(milli, utc, t);
-
-    fillStructuresUsingTimeArgs(exec, args, 4, &ms, &t);
-
-    JSValue* result = jsNumber(gregorianDateTimeToMS(t, ms, utc));
-    thisDateObj->setInternalValue(result);
-    return result;
+    const bool inputIsUTC = true;
+    return setNewValueFromTimeArgs(exec, thisObj, args, 4, inputIsUTC);
 }
 
 JSValue* DateProtoFuncSetDate::callAsFunction(ExecState* exec, JSObject* thisObj, const List& args)
 {
-    if (!thisObj->inherits(&DateInstance::info))
-        return throwError(exec, TypeError);
-
-    const bool utc = false;
-
-    DateInstance* thisDateObj = static_cast<DateInstance*>(thisObj); 
-    JSValue* v = thisDateObj->internalValue();
-    double milli = v->toNumber(exec);
-    double secs = floor(milli / msPerSecond);
-    double ms = milli - secs * msPerSecond;
-
-    GregorianDateTime t;
-    msToGregorianDateTime(milli, utc, t);
-
-    fillStructuresUsingDateArgs(exec, args, 1, &ms, &t);
-
-    JSValue* result = jsNumber(gregorianDateTimeToMS(t, ms, utc));
-    thisDateObj->setInternalValue(result);
-    return result;
+    const bool inputIsUTC = false;
+    return setNewValueFromDateArgs(exec, thisObj, args, 1, inputIsUTC);
 }
 
 JSValue* DateProtoFuncSetUTCDate::callAsFunction(ExecState* exec, JSObject* thisObj, const List& args)
 {
-    if (!thisObj->inherits(&DateInstance::info))
-        return throwError(exec, TypeError);
-
-    const bool utc = true;
-
-    DateInstance* thisDateObj = static_cast<DateInstance*>(thisObj); 
-    JSValue* v = thisDateObj->internalValue();
-    double milli = v->toNumber(exec);
-    double secs = floor(milli / msPerSecond);
-    double ms = milli - secs * msPerSecond;
-
-    GregorianDateTime t;
-    msToGregorianDateTime(milli, utc, t);
-
-    fillStructuresUsingDateArgs(exec, args, 1, &ms, &t);
-
-    JSValue* result = jsNumber(gregorianDateTimeToMS(t, ms, utc));
-    thisDateObj->setInternalValue(result);
-    return result;
+    const bool inputIsUTC = true;
+    return setNewValueFromDateArgs(exec, thisObj, args, 1, inputIsUTC);
 }
 
 JSValue* DateProtoFuncSetMonth::callAsFunction(ExecState* exec, JSObject* thisObj, const List& args)
 {
-    if (!thisObj->inherits(&DateInstance::info))
-        return throwError(exec, TypeError);
-
-    const bool utc = false;
-
-    DateInstance* thisDateObj = static_cast<DateInstance*>(thisObj); 
-    JSValue* v = thisDateObj->internalValue();
-    double milli = v->toNumber(exec);
-    double secs = floor(milli / msPerSecond);
-    double ms = milli - secs * msPerSecond;
-
-    GregorianDateTime t;
-    msToGregorianDateTime(milli, utc, t);
-
-    fillStructuresUsingDateArgs(exec, args, 2, &ms, &t);    
-
-    JSValue* result = jsNumber(gregorianDateTimeToMS(t, ms, utc));
-    thisDateObj->setInternalValue(result);
-    return result;
+    const bool inputIsUTC = false;
+    return setNewValueFromDateArgs(exec, thisObj, args, 2, inputIsUTC);
 }
 
 JSValue* DateProtoFuncSetUTCMonth::callAsFunction(ExecState* exec, JSObject* thisObj, const List& args)
 {
-    if (!thisObj->inherits(&DateInstance::info))
-        return throwError(exec, TypeError);
-
-    const bool utc = true;
-
-    DateInstance* thisDateObj = static_cast<DateInstance*>(thisObj); 
-    JSValue* v = thisDateObj->internalValue();
-    double milli = v->toNumber(exec);
-    double secs = floor(milli / msPerSecond);
-    double ms = milli - secs * msPerSecond;
-
-    GregorianDateTime t;
-    msToGregorianDateTime(milli, utc, t);
-
-    fillStructuresUsingDateArgs(exec, args, 2, &ms, &t);    
-
-    JSValue* result = jsNumber(gregorianDateTimeToMS(t, ms, utc));
-    thisDateObj->setInternalValue(result);
-    return result;
+    const bool inputIsUTC = true;
+    return setNewValueFromDateArgs(exec, thisObj, args, 2, inputIsUTC);
 }
 
 JSValue* DateProtoFuncSetFullYear::callAsFunction(ExecState* exec, JSObject* thisObj, const List& args)
 {
-    if (!thisObj->inherits(&DateInstance::info))
-        return throwError(exec, TypeError);
-
-    const bool utc = false;
-
-    DateInstance* thisDateObj = static_cast<DateInstance*>(thisObj); 
-    JSValue* v = thisDateObj->internalValue();
-    double milli = v->toNumber(exec);
-    double secs = floor(milli / msPerSecond);
-    double ms = milli - secs * msPerSecond;
-
-    GregorianDateTime t;
-    msToGregorianDateTime(milli, utc, t);
-
-    fillStructuresUsingDateArgs(exec, args, 3, &ms, &t);
-
-    JSValue* result = jsNumber(gregorianDateTimeToMS(t, ms, utc));
-    thisDateObj->setInternalValue(result);
-    return result;
+    const bool inputIsUTC = false;
+    return setNewValueFromDateArgs(exec, thisObj, args, 3, inputIsUTC);
 }
 
 JSValue* DateProtoFuncSetUTCFullYear::callAsFunction(ExecState* exec, JSObject* thisObj, const List& args)
 {
-    if (!thisObj->inherits(&DateInstance::info))
-        return throwError(exec, TypeError);
-
-    const bool utc = true;
-
-    DateInstance* thisDateObj = static_cast<DateInstance*>(thisObj); 
-    JSValue* v = thisDateObj->internalValue();
-    double milli = v->toNumber(exec);
-    double secs = floor(milli / msPerSecond);
-    double ms = milli - secs * msPerSecond;
-
-    GregorianDateTime t;
-    msToGregorianDateTime(milli, utc, t);
-
-    fillStructuresUsingDateArgs(exec, args, 3, &ms, &t);
-
-    JSValue* result = jsNumber(gregorianDateTimeToMS(t, ms, utc));
-    thisDateObj->setInternalValue(result);
-    return result;
+    const bool inputIsUTC = true;
+    return setNewValueFromDateArgs(exec, thisObj, args, 3, inputIsUTC);
 }
 
 JSValue* DateProtoFuncSetYear::callAsFunction(ExecState* exec, JSObject* thisObj, const List& args)