18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/*
28e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *  Copyright (C) 1999-2000 Harri Porten (porten@kde.org)
38e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *  Copyright (C) 2008 Apple Inc. All rights reserved.
48e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *  This library is free software; you can redistribute it and/or
68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *  modify it under the terms of the GNU Lesser General Public
78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *  License as published by the Free Software Foundation; either
88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *  version 2 of the License, or (at your option) any later version.
98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *  This library is distributed in the hope that it will be useful,
118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *  but WITHOUT ANY WARRANTY; without even the implied warranty of
128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *  Lesser General Public License for more details.
148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *  You should have received a copy of the GNU Lesser General Public
168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *  License along with this library; if not, write to the Free Software
178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifndef DateInstance_h
228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define DateInstance_h
238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "JSWrapperObject.h"
258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
265f1ab04193ad0130ca8204aadaceae083aca9881Feng Qiannamespace WTF {
278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    struct GregorianDateTime;
285f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian}
295f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
305f1ab04193ad0130ca8204aadaceae083aca9881Feng Qiannamespace JSC {
318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    class DateInstance : public JSWrapperObject {
338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    public:
342daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        DateInstance(ExecState*, Structure*, double);
352daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        explicit DateInstance(ExecState*, Structure*);
368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
37635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        double internalNumber() const { return internalValue().uncheckedGetNumber(); }
388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        static JS_EXPORTDATA const ClassInfo s_info;
408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
41643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        const GregorianDateTime* gregorianDateTime(ExecState* exec) const
42643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        {
43643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            if (m_data && m_data->m_gregorianDateTimeCachedForMS == internalNumber())
44643ca7872b450ea4efacab6188849e5aac2ba161Steve Block                return &m_data->m_cachedGregorianDateTime;
45643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            return calculateGregorianDateTime(exec);
46643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        }
47643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
48643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        const GregorianDateTime* gregorianDateTimeUTC(ExecState* exec) const
49643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        {
50643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            if (m_data && m_data->m_gregorianDateTimeUTCCachedForMS == internalNumber())
51643ca7872b450ea4efacab6188849e5aac2ba161Steve Block                return &m_data->m_cachedGregorianDateTimeUTC;
52643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            return calculateGregorianDateTimeUTC(exec);
53643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        }
54cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
552daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        static Structure* createStructure(JSGlobalData& globalData, JSValue prototype)
56cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        {
572bde8e466a4451c7319e3a072d118917957d6554Steve Block            return Structure::create(globalData, prototype, TypeInfo(ObjectType, StructureFlags), AnonymousSlotCount, &s_info);
58cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        }
59cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    private:
61643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        const GregorianDateTime* calculateGregorianDateTime(ExecState*) const;
62643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        const GregorianDateTime* calculateGregorianDateTimeUTC(ExecState*) const;
638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
64cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        mutable RefPtr<DateInstanceData> m_data;
658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    };
668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
675f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    DateInstance* asDateInstance(JSValue);
688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
695f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    inline DateInstance* asDateInstance(JSValue value)
708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    {
7181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        ASSERT(asObject(value)->inherits(&DateInstance::s_info));
728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return static_cast<DateInstance*>(asObject(value));
738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} // namespace JSC
768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif // DateInstance_h
78