[INTL] Implement Intl.DateTimeFormat.prototype.resolvedOptions ()
[WebKit.git] / Source / JavaScriptCore / runtime / IntlDateTimeFormatPrototype.cpp
index d5e5259..ff48ec4 100644 (file)
 
 #if ENABLE(INTL)
 
+#include "DateConstructor.h"
 #include "Error.h"
 #include "IntlDateTimeFormat.h"
+#include "IntlObject.h"
 #include "JSBoundFunction.h"
 #include "JSCJSValueInlines.h"
 #include "JSCellInlines.h"
 #include "JSObject.h"
-#include "ObjectConstructor.h"
 #include "StructureInlines.h"
 
 namespace JSC {
 
-STATIC_ASSERT_IS_TRIVIALLY_DESTRUCTIBLE(IntlDateTimeFormatPrototype);
-
 static EncodedJSValue JSC_HOST_CALL IntlDateTimeFormatPrototypeGetterFormat(ExecState*);
 static EncodedJSValue JSC_HOST_CALL IntlDateTimeFormatPrototypeFuncResolvedOptions(ExecState*);
 
@@ -86,6 +85,33 @@ bool IntlDateTimeFormatPrototype::getOwnPropertySlot(JSObject* object, ExecState
     return getStaticFunctionSlot<JSObject>(state, dateTimeFormatPrototypeTable, jsCast<IntlDateTimeFormatPrototype*>(object), propertyName, slot);
 }
 
+static EncodedJSValue JSC_HOST_CALL IntlDateTimeFormatFuncFormatDateTime(ExecState* state)
+{
+    // 12.3.4 DateTime Format Functions (ECMA-402 2.0)
+    // 1. Let dtf be the this value.
+    // 2. Assert: Type(dtf) is Object and dtf has an [[initializedDateTimeFormat]] internal slot whose value is true.
+    IntlDateTimeFormat* format = jsCast<IntlDateTimeFormat*>(state->thisValue());
+
+    JSValue date = state->argument(0);
+    double value;
+
+    // 3. If date is not provided or is undefined, then
+    if (date.isUndefined()) {
+        // a. Let x be %Date_now%().
+        value = JSValue::decode(dateNow(state)).toNumber(state);
+    } else {
+        // 4. Else
+        // a. Let x be ToNumber(date).
+        value = date.toNumber(state);
+        // b. ReturnIfAbrupt(x).
+        if (state->hadException())
+            return JSValue::encode(jsUndefined());
+    }
+
+    // 5. Return FormatDateTime(dtf, x).
+    return JSValue::encode(format->format(*state, value));
+}
+
 EncodedJSValue JSC_HOST_CALL IntlDateTimeFormatPrototypeGetterFormat(ExecState* state)
 {
     // 12.3.3 Intl.DateTimeFormat.prototype.format (ECMA-402 2.0)
@@ -94,7 +120,7 @@ EncodedJSValue JSC_HOST_CALL IntlDateTimeFormatPrototypeGetterFormat(ExecState*
     // 2. ReturnIfAbrupt(dtf).
     if (!dtf)
         return JSValue::encode(throwTypeError(state, ASCIILiteral("Intl.DateTimeFormat.prototype.format called on value that's not an object initialized as a DateTimeFormat")));
-    
+
     JSBoundFunction* boundFormat = dtf->boundFormat();
     // 3. If the [[boundFormat]] internal slot of this DateTimeFormat object is undefined,
     if (!boundFormat) {
@@ -106,7 +132,7 @@ EncodedJSValue JSC_HOST_CALL IntlDateTimeFormatPrototypeGetterFormat(ExecState*
         JSArray* boundArgs = JSArray::tryCreateUninitialized(vm, globalObject->arrayStructureForIndexingTypeDuringAllocation(ArrayWithUndecided), 0);
         if (!boundArgs)
             return JSValue::encode(throwOutOfMemoryError(state));
-        
+
         // c. Let bf be BoundFunctionCreate(F, «this value»).
         boundFormat = JSBoundFunction::create(vm, globalObject, targetObject, dtf, boundArgs, 1, ASCIILiteral("format"));
         // d. Set dtf.[[boundFormat]] to bf.
@@ -119,18 +145,11 @@ EncodedJSValue JSC_HOST_CALL IntlDateTimeFormatPrototypeGetterFormat(ExecState*
 EncodedJSValue JSC_HOST_CALL IntlDateTimeFormatPrototypeFuncResolvedOptions(ExecState* state)
 {
     // 12.3.5 Intl.DateTimeFormat.prototype.resolvedOptions() (ECMA-402 2.0)
-    IntlDateTimeFormat* dtf = jsDynamicCast<IntlDateTimeFormat*>(state->thisValue());
-    if (!dtf)
+    IntlDateTimeFormat* dateTimeFormat = jsDynamicCast<IntlDateTimeFormat*>(state->thisValue());
+    if (!dateTimeFormat)
         return JSValue::encode(throwTypeError(state, ASCIILiteral("Intl.DateTimeFormat.prototype.resolvedOptions called on value that's not an object initialized as a DateTimeFormat")));
 
-    // The function returns a new object whose properties and attributes are set as if constructed by an object literal assigning to each of the following properties the value of the corresponding internal slot of this DateTimeFormat object (see 12.4): locale, calendar, numberingSystem, timeZone, hour12, weekday, era, year, month, day, hour, minute, second, and timeZoneName. Properties whose corresponding internal slots are not present are not assigned.
-    // Note: In this version of the ECMAScript 2015 Internationalization API, the timeZone property will be the name of the default time zone if no timeZone property was provided in the options object provided to the Intl.DateTimeFormat constructor. The previous version left the timeZone property undefined in this case.
-
-    JSObject* options = constructEmptyObject(state);
-
-    // FIXME: Populate object from internal slots.
-
-    return JSValue::encode(options);
+    return JSValue::encode(dateTimeFormat->resolvedOptions(*state));
 }
 
 } // namespace JSC