Changeset 50174 in webkit for trunk/JavaScriptCore/runtime
- Timestamp:
- Oct 27, 2009, 3:01:41 PM (16 years ago)
- Location:
- trunk/JavaScriptCore/runtime
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/JavaScriptCore/runtime/DateInstance.cpp
r49886 r50174 33 33 namespace JSC { 34 34 35 struct DateInstance::Cache {36 double m_gregorianDateTimeCachedForMS;37 GregorianDateTime m_cachedGregorianDateTime;38 double m_gregorianDateTimeUTCCachedForMS;39 GregorianDateTime m_cachedGregorianDateTimeUTC;40 };41 42 35 const ClassInfo DateInstance::info = {"Date", 0, 0, 0}; 43 36 44 37 DateInstance::DateInstance(NonNullPassRefPtr<Structure> structure) 45 38 : JSWrapperObject(structure) 46 , m_cache(0)47 39 { 48 40 } … … 50 42 DateInstance::DateInstance(ExecState* exec, double time) 51 43 : JSWrapperObject(exec->lexicalGlobalObject()->dateStructure()) 52 , m_cache(0)53 44 { 54 45 setInternalValue(jsNumber(exec, timeClip(time))); 55 46 } 56 47 57 DateInstance::~DateInstance() 48 bool DateInstance::getGregorianDateTime(ExecState* exec, bool outputIsUTC, GregorianDateTime& t) const 58 49 { 59 delete m_cache;60 }61 62 bool DateInstance::getGregorianDateTime(bool outputIsUTC, GregorianDateTime& t) const63 {64 if (!m_cache) {65 m_cache = new Cache;66 m_cache->m_gregorianDateTimeCachedForMS = NaN;67 m_cache->m_gregorianDateTimeUTCCachedForMS = NaN;68 }69 70 50 double milli = internalNumber(); 71 51 if (isnan(milli)) 72 52 return false; 73 53 54 if (!m_data) 55 m_data = exec->globalData().dateInstanceCache.add(milli); 56 74 57 if (outputIsUTC) { 75 if (m_ cache->m_gregorianDateTimeUTCCachedForMS != milli) {76 WTF::msToGregorianDateTime(internalNumber(), true, m_ cache->m_cachedGregorianDateTimeUTC);77 m_ cache->m_gregorianDateTimeUTCCachedForMS = milli;58 if (m_data->m_gregorianDateTimeUTCCachedForMS != milli) { 59 WTF::msToGregorianDateTime(internalNumber(), true, m_data->m_cachedGregorianDateTimeUTC); 60 m_data->m_gregorianDateTimeUTCCachedForMS = milli; 78 61 } 79 t.copyFrom(m_ cache->m_cachedGregorianDateTimeUTC);62 t.copyFrom(m_data->m_cachedGregorianDateTimeUTC); 80 63 } else { 81 if (m_ cache->m_gregorianDateTimeCachedForMS != milli) {82 WTF::msToGregorianDateTime(internalNumber(), false, m_ cache->m_cachedGregorianDateTime);83 m_ cache->m_gregorianDateTimeCachedForMS = milli;64 if (m_data->m_gregorianDateTimeCachedForMS != milli) { 65 WTF::msToGregorianDateTime(internalNumber(), false, m_data->m_cachedGregorianDateTime); 66 m_data->m_gregorianDateTimeCachedForMS = milli; 84 67 } 85 t.copyFrom(m_ cache->m_cachedGregorianDateTime);68 t.copyFrom(m_data->m_cachedGregorianDateTime); 86 69 } 87 70 88 71 return true; 89 72 } -
trunk/JavaScriptCore/runtime/DateInstance.h
r49886 r50174 34 34 DateInstance(ExecState*, double); 35 35 explicit DateInstance(NonNullPassRefPtr<Structure>); 36 virtual ~DateInstance();37 36 38 37 double internalNumber() const { return internalValue().uncheckedGetNumber(); } … … 45 44 static JS_EXPORTDATA const ClassInfo info; 46 45 47 bool getGregorianDateTime( bool outputIsUTC, WTF::GregorianDateTime&) const;46 bool getGregorianDateTime(ExecState*, bool outputIsUTC, WTF::GregorianDateTime&) const; 48 47 49 48 static PassRefPtr<Structure> createStructure(JSValue prototype) … … 58 57 virtual const ClassInfo* classInfo() const { return &info; } 59 58 60 61 struct Cache; 62 mutable Cache* m_cache; 59 mutable RefPtr<DateInstanceData> m_data; 63 60 }; 64 61 -
trunk/JavaScriptCore/runtime/DatePrototype.cpp
r49889 r50174 256 256 GregorianDateTime gregorianDateTime; 257 257 const bool outputIsUTC = false; 258 if (!dateObject->getGregorianDateTime( outputIsUTC, gregorianDateTime))258 if (!dateObject->getGregorianDateTime(exec, outputIsUTC, gregorianDateTime)) 259 259 return jsNontrivialString(exec, "Invalid Date"); 260 260 return formatLocaleDate(exec, gregorianDateTime, format); … … 427 427 428 428 GregorianDateTime t; 429 if (!thisDateObj->getGregorianDateTime( outputIsUTC, t))429 if (!thisDateObj->getGregorianDateTime(exec, outputIsUTC, t)) 430 430 return jsNontrivialString(exec, "Invalid Date"); 431 431 return jsNontrivialString(exec, formatDate(t) + " " + formatTime(t, outputIsUTC)); … … 442 442 443 443 GregorianDateTime t; 444 if (!thisDateObj->getGregorianDateTime( outputIsUTC, t))444 if (!thisDateObj->getGregorianDateTime(exec, outputIsUTC, t)) 445 445 return jsNontrivialString(exec, "Invalid Date"); 446 446 return jsNontrivialString(exec, formatDateUTCVariant(t) + " " + formatTime(t, outputIsUTC)); … … 457 457 458 458 GregorianDateTime t; 459 if (!thisDateObj->getGregorianDateTime( outputIsUTC, t))459 if (!thisDateObj->getGregorianDateTime(exec, outputIsUTC, t)) 460 460 return jsNontrivialString(exec, "Invalid Date"); 461 461 // Maximum amount of space we need in buffer: 6 (max. digits in year) + 2 * 5 (2 characters each for month, day, hour, minute, second) + 4 (. + 3 digits for milliseconds) … … 477 477 478 478 GregorianDateTime t; 479 if (!thisDateObj->getGregorianDateTime( outputIsUTC, t))479 if (!thisDateObj->getGregorianDateTime(exec, outputIsUTC, t)) 480 480 return jsNontrivialString(exec, "Invalid Date"); 481 481 return jsNontrivialString(exec, formatDate(t)); … … 492 492 493 493 GregorianDateTime t; 494 if (!thisDateObj->getGregorianDateTime( outputIsUTC, t))494 if (!thisDateObj->getGregorianDateTime(exec, outputIsUTC, t)) 495 495 return jsNontrivialString(exec, "Invalid Date"); 496 496 return jsNontrivialString(exec, formatTime(t, outputIsUTC)); … … 542 542 543 543 GregorianDateTime t; 544 if (!thisDateObj->getGregorianDateTime( outputIsUTC, t))544 if (!thisDateObj->getGregorianDateTime(exec, outputIsUTC, t)) 545 545 return jsNaN(exec); 546 546 return jsNumber(exec, 1900 + t.year); … … 557 557 558 558 GregorianDateTime t; 559 if (!thisDateObj->getGregorianDateTime( outputIsUTC, t))559 if (!thisDateObj->getGregorianDateTime(exec, outputIsUTC, t)) 560 560 return jsNaN(exec); 561 561 return jsNumber(exec, 1900 + t.year); … … 572 572 573 573 GregorianDateTime t; 574 if (!thisDateObj->getGregorianDateTime( outputIsUTC, t))574 if (!thisDateObj->getGregorianDateTime(exec, outputIsUTC, t)) 575 575 return jsNontrivialString(exec, "Invalid Date"); 576 576 return jsNontrivialString(exec, formatDateUTCVariant(t) + " " + formatTime(t, outputIsUTC)); … … 587 587 588 588 GregorianDateTime t; 589 if (!thisDateObj->getGregorianDateTime( outputIsUTC, t))589 if (!thisDateObj->getGregorianDateTime(exec, outputIsUTC, t)) 590 590 return jsNaN(exec); 591 591 return jsNumber(exec, t.month); … … 602 602 603 603 GregorianDateTime t; 604 if (!thisDateObj->getGregorianDateTime( outputIsUTC, t))604 if (!thisDateObj->getGregorianDateTime(exec, outputIsUTC, t)) 605 605 return jsNaN(exec); 606 606 return jsNumber(exec, t.month); … … 617 617 618 618 GregorianDateTime t; 619 if (!thisDateObj->getGregorianDateTime( outputIsUTC, t))619 if (!thisDateObj->getGregorianDateTime(exec, outputIsUTC, t)) 620 620 return jsNaN(exec); 621 621 return jsNumber(exec, t.monthDay); … … 632 632 633 633 GregorianDateTime t; 634 if (!thisDateObj->getGregorianDateTime( outputIsUTC, t))634 if (!thisDateObj->getGregorianDateTime(exec, outputIsUTC, t)) 635 635 return jsNaN(exec); 636 636 return jsNumber(exec, t.monthDay); … … 647 647 648 648 GregorianDateTime t; 649 if (!thisDateObj->getGregorianDateTime( outputIsUTC, t))649 if (!thisDateObj->getGregorianDateTime(exec, outputIsUTC, t)) 650 650 return jsNaN(exec); 651 651 return jsNumber(exec, t.weekDay); … … 662 662 663 663 GregorianDateTime t; 664 if (!thisDateObj->getGregorianDateTime( outputIsUTC, t))664 if (!thisDateObj->getGregorianDateTime(exec, outputIsUTC, t)) 665 665 return jsNaN(exec); 666 666 return jsNumber(exec, t.weekDay); … … 677 677 678 678 GregorianDateTime t; 679 if (!thisDateObj->getGregorianDateTime( outputIsUTC, t))679 if (!thisDateObj->getGregorianDateTime(exec, outputIsUTC, t)) 680 680 return jsNaN(exec); 681 681 return jsNumber(exec, t.hour); … … 692 692 693 693 GregorianDateTime t; 694 if (!thisDateObj->getGregorianDateTime( outputIsUTC, t))694 if (!thisDateObj->getGregorianDateTime(exec, outputIsUTC, t)) 695 695 return jsNaN(exec); 696 696 return jsNumber(exec, t.hour); … … 707 707 708 708 GregorianDateTime t; 709 if (!thisDateObj->getGregorianDateTime( outputIsUTC, t))709 if (!thisDateObj->getGregorianDateTime(exec, outputIsUTC, t)) 710 710 return jsNaN(exec); 711 711 return jsNumber(exec, t.minute); … … 722 722 723 723 GregorianDateTime t; 724 if (!thisDateObj->getGregorianDateTime( outputIsUTC, t))724 if (!thisDateObj->getGregorianDateTime(exec, outputIsUTC, t)) 725 725 return jsNaN(exec); 726 726 return jsNumber(exec, t.minute); … … 737 737 738 738 GregorianDateTime t; 739 if (!thisDateObj->getGregorianDateTime( outputIsUTC, t))739 if (!thisDateObj->getGregorianDateTime(exec, outputIsUTC, t)) 740 740 return jsNaN(exec); 741 741 return jsNumber(exec, t.second); … … 752 752 753 753 GregorianDateTime t; 754 if (!thisDateObj->getGregorianDateTime( outputIsUTC, t))754 if (!thisDateObj->getGregorianDateTime(exec, outputIsUTC, t)) 755 755 return jsNaN(exec); 756 756 return jsNumber(exec, t.second); … … 797 797 798 798 GregorianDateTime t; 799 if (!thisDateObj->getGregorianDateTime( outputIsUTC, t))799 if (!thisDateObj->getGregorianDateTime(exec, outputIsUTC, t)) 800 800 return jsNaN(exec); 801 801 return jsNumber(exec, -gmtoffset(t) / minutesPerHour); … … 833 833 834 834 GregorianDateTime t; 835 thisDateObj->getGregorianDateTime( inputIsUTC, t);835 thisDateObj->getGregorianDateTime(exec, inputIsUTC, t); 836 836 837 837 if (!fillStructuresUsingTimeArgs(exec, args, numArgsToUse, &ms, &t)) { … … 869 869 double secs = floor(milli / msPerSecond); 870 870 ms = milli - secs * msPerSecond; 871 thisDateObj->getGregorianDateTime( inputIsUTC, t);871 thisDateObj->getGregorianDateTime(exec, inputIsUTC, t); 872 872 } 873 873 … … 992 992 double secs = floor(milli / msPerSecond); 993 993 ms = milli - secs * msPerSecond; 994 thisDateObj->getGregorianDateTime( outputIsUTC, t);994 thisDateObj->getGregorianDateTime(exec, outputIsUTC, t); 995 995 } 996 996 … … 1019 1019 1020 1020 GregorianDateTime t; 1021 if (!thisDateObj->getGregorianDateTime( outputIsUTC, t))1021 if (!thisDateObj->getGregorianDateTime(exec, outputIsUTC, t)) 1022 1022 return jsNaN(exec); 1023 1023 -
trunk/JavaScriptCore/runtime/JSGlobalData.h
r49328 r50174 31 31 32 32 #include "Collector.h" 33 #include "DateInstanceCache.h" 33 34 #include "ExecutableAllocator.h" 34 35 #include "JITStubs.h" … … 117 118 SmallStrings smallStrings; 118 119 NumericStrings numericStrings; 119 120 DateInstanceCache dateInstanceCache; 121 120 122 #if ENABLE(ASSEMBLER) 121 123 ExecutableAllocator executableAllocator;
Note:
See TracChangeset
for help on using the changeset viewer.