Changeset 156540 in webkit
- Timestamp:
- Sep 27, 2013 6:40:59 AM (11 years ago)
- Location:
- trunk/Source
- Files:
-
- 7 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/ChangeLog
r156521 r156540 1 2013-09-27 Andreas Kling <akling@apple.com> 2 3 Pass VM instead of ExecState to JSDateMath functions. 4 <https://webkit.org/b/121997> 5 6 Reviewed by Geoffrey Garen. 7 8 The JSC date math functions only need the VM, so pass that from 9 callers instead of the whole ExecState. 10 1 11 2013-09-26 Andreas Kling <akling@apple.com> 2 12 -
trunk/Source/JavaScriptCore/runtime/DateConstructor.cpp
r156498 r156540 107 107 JSValue primitive = args.at(0).toPrimitive(exec); 108 108 if (primitive.isString()) 109 value = parseDate(exec , primitive.getString(exec));109 value = parseDate(exec->vm(), primitive.getString(exec)); 110 110 else 111 111 value = primitive.toNumber(exec); … … 140 140 t.setIsDST(-1); 141 141 double ms = (numArgs >= 7) ? doubleArguments[6] : 0; 142 value = gregorianDateTimeToMS(exec , t, ms, false);142 value = gregorianDateTimeToMS(exec->vm(), t, ms, false); 143 143 } 144 144 } … … 162 162 static EncodedJSValue JSC_HOST_CALL callDate(ExecState* exec) 163 163 { 164 VM& vm = exec->vm(); 164 165 GregorianDateTime ts; 165 msToGregorianDateTime( exec, currentTimeMS(), false, ts);166 return JSValue::encode(jsNontrivialString( exec, formatDateTime(ts, DateTimeFormatDateAndTime, false)));166 msToGregorianDateTime(vm, currentTimeMS(), false, ts); 167 return JSValue::encode(jsNontrivialString(&vm, formatDateTime(ts, DateTimeFormatDateAndTime, false))); 167 168 } 168 169 … … 175 176 static EncodedJSValue JSC_HOST_CALL dateParse(ExecState* exec) 176 177 { 177 return JSValue::encode(jsNumber(parseDate(exec , exec->argument(0).toString(exec)->value(exec))));178 return JSValue::encode(jsNumber(parseDate(exec->vm(), exec->argument(0).toString(exec)->value(exec)))); 178 179 } 179 180 … … 213 214 t.setSecond(JSC::toInt32(doubleArguments[5])); 214 215 double ms = (n >= 7) ? doubleArguments[6] : 0; 215 return JSValue::encode(jsNumber(timeClip(gregorianDateTimeToMS(exec , t, ms, true))));216 return JSValue::encode(jsNumber(timeClip(gregorianDateTimeToMS(exec->vm(), t, ms, true)))); 216 217 } 217 218 -
trunk/Source/JavaScriptCore/runtime/DateInstance.cpp
r154038 r156540 65 65 return 0; 66 66 67 VM& vm = exec->vm(); 67 68 if (!m_data) 68 m_data = exec->vm().dateInstanceCache.add(milli);69 m_data = vm.dateInstanceCache.add(milli); 69 70 70 71 if (m_data->m_gregorianDateTimeCachedForMS != milli) { 71 msToGregorianDateTime( exec, milli, false, m_data->m_cachedGregorianDateTime);72 msToGregorianDateTime(vm, milli, false, m_data->m_cachedGregorianDateTime); 72 73 m_data->m_gregorianDateTimeCachedForMS = milli; 73 74 } … … 81 82 return 0; 82 83 84 VM& vm = exec->vm(); 83 85 if (!m_data) 84 m_data = exec->vm().dateInstanceCache.add(milli);86 m_data = vm.dateInstanceCache.add(milli); 85 87 86 88 if (m_data->m_gregorianDateTimeUTCCachedForMS != milli) { 87 msToGregorianDateTime( exec, milli, true, m_data->m_cachedGregorianDateTimeUTC);89 msToGregorianDateTime(vm, milli, true, m_data->m_cachedGregorianDateTimeUTC); 88 90 m_data->m_gregorianDateTimeUTCCachedForMS = milli; 89 91 } -
trunk/Source/JavaScriptCore/runtime/DatePrototype.cpp
r156498 r156540 889 889 DateInstance* thisDateObj = asDateInstance(thisValue); 890 890 double milli = thisDateObj->internalNumber(); 891 VM& vm = exec->vm(); 891 892 892 893 if (!exec->argumentCount() || std::isnan(milli)) { 893 894 JSValue result = jsNaN(); 894 thisDateObj->setInternalValue( exec->vm(), result);895 thisDateObj->setInternalValue(vm, result); 895 896 return JSValue::encode(result); 896 897 } … … 909 910 if (!fillStructuresUsingTimeArgs(exec, numArgsToUse, &ms, &gregorianDateTime)) { 910 911 JSValue result = jsNaN(); 911 thisDateObj->setInternalValue( exec->vm(), result);912 thisDateObj->setInternalValue(vm, result); 912 913 return JSValue::encode(result); 913 914 } 914 915 915 JSValue result = jsNumber(gregorianDateTimeToMS( exec, gregorianDateTime, ms, inputIsUTC));916 thisDateObj->setInternalValue( exec->vm(), result);916 JSValue result = jsNumber(gregorianDateTimeToMS(vm, gregorianDateTime, ms, inputIsUTC)); 917 thisDateObj->setInternalValue(vm, result); 917 918 return JSValue::encode(result); 918 919 } … … 929 930 thisDateObj->setInternalValue(exec->vm(), result); 930 931 return JSValue::encode(result); 931 } 932 932 } 933 934 VM& vm = exec->vm(); 933 935 double milli = thisDateObj->internalNumber(); 934 936 double ms = 0; … … 936 938 GregorianDateTime gregorianDateTime; 937 939 if (numArgsToUse == 3 && std::isnan(milli)) 938 msToGregorianDateTime( exec, 0, true, gregorianDateTime);940 msToGregorianDateTime(vm, 0, true, gregorianDateTime); 939 941 else { 940 942 ms = milli - floor(milli / msPerSecond) * msPerSecond; … … 949 951 if (!fillStructuresUsingDateArgs(exec, numArgsToUse, &ms, &gregorianDateTime)) { 950 952 JSValue result = jsNaN(); 951 thisDateObj->setInternalValue( exec->vm(), result);953 thisDateObj->setInternalValue(vm, result); 952 954 return JSValue::encode(result); 953 955 } 954 956 955 JSValue result = jsNumber(gregorianDateTimeToMS( exec, gregorianDateTime, ms, inputIsUTC));956 thisDateObj->setInternalValue( exec->vm(), result);957 JSValue result = jsNumber(gregorianDateTimeToMS(vm, gregorianDateTime, ms, inputIsUTC)); 958 thisDateObj->setInternalValue(vm, result); 957 959 return JSValue::encode(result); 958 960 } … … 1048 1050 return throwVMTypeError(exec); 1049 1051 1052 VM& vm = exec->vm(); 1050 1053 DateInstance* thisDateObj = asDateInstance(thisValue); 1051 1054 if (!exec->argumentCount()) { 1052 1055 JSValue result = jsNaN(); 1053 thisDateObj->setInternalValue( exec->vm(), result);1056 thisDateObj->setInternalValue(vm, result); 1054 1057 return JSValue::encode(result); 1055 1058 } … … 1062 1065 // Based on ECMA 262 B.2.5 (setYear) 1063 1066 // the time must be reset to +0 if it is NaN. 1064 msToGregorianDateTime( exec, 0, true, gregorianDateTime);1067 msToGregorianDateTime(vm, 0, true, gregorianDateTime); 1065 1068 else { 1066 1069 double secs = floor(milli / msPerSecond); … … 1073 1076 if (!std::isfinite(year)) { 1074 1077 JSValue result = jsNaN(); 1075 thisDateObj->setInternalValue( exec->vm(), result);1078 thisDateObj->setInternalValue(vm, result); 1076 1079 return JSValue::encode(result); 1077 1080 } 1078 1081 1079 1082 gregorianDateTime.setYear(toInt32((year >= 0 && year <= 99) ? (year + 1900) : year)); 1080 JSValue result = jsNumber(gregorianDateTimeToMS( exec, gregorianDateTime, ms, false));1081 thisDateObj->setInternalValue( exec->vm(), result);1083 JSValue result = jsNumber(gregorianDateTimeToMS(vm, gregorianDateTime, ms, false)); 1084 thisDateObj->setInternalValue(vm, result); 1082 1085 return JSValue::encode(result); 1083 1086 } -
trunk/Source/JavaScriptCore/runtime/JSDateMath.cpp
r150835 r156540 133 133 // more than one daylight savings offset change per month. 134 134 // If this function is called with NaN it returns NaN. 135 static LocalTimeOffset localTimeOffset( ExecState* exec, double ms)136 { 137 LocalTimeOffsetCache& cache = exec->vm().localTimeOffsetCache;135 static LocalTimeOffset localTimeOffset(VM& vm, double ms) 136 { 137 LocalTimeOffsetCache& cache = vm.localTimeOffsetCache; 138 138 double start = cache.start; 139 139 double end = cache.end; … … 189 189 } 190 190 191 double gregorianDateTimeToMS( ExecState* exec, const GregorianDateTime& t, double milliSeconds, bool inputIsUTC)191 double gregorianDateTimeToMS(VM& vm, const GregorianDateTime& t, double milliSeconds, bool inputIsUTC) 192 192 { 193 193 double day = dateToDaysFrom1970(t.year(), t.month(), t.monthDay()); … … 196 196 197 197 if (!inputIsUTC) 198 result -= localTimeOffset( exec, result).offset;198 result -= localTimeOffset(vm, result).offset; 199 199 200 200 return result; … … 202 202 203 203 // input is UTC 204 void msToGregorianDateTime( ExecState* exec, double ms, bool outputIsUTC, GregorianDateTime& tm)204 void msToGregorianDateTime(VM& vm, double ms, bool outputIsUTC, GregorianDateTime& tm) 205 205 { 206 206 LocalTimeOffset localTime; 207 207 if (!outputIsUTC) { 208 localTime = localTimeOffset( exec, ms);208 localTime = localTimeOffset(vm, ms); 209 209 ms += localTime.offset; 210 210 } … … 223 223 } 224 224 225 double parseDateFromNullTerminatedCharacters(ExecState* exec, const char* dateString) 226 { 227 ASSERT(exec); 225 double parseDateFromNullTerminatedCharacters(VM& vm, const char* dateString) 226 { 228 227 bool haveTZ; 229 228 int offset; … … 234 233 // fall back to local timezone 235 234 if (!haveTZ) 236 offset = localTimeOffset( exec, ms).offset / WTF::msPerMinute;235 offset = localTimeOffset(vm, ms).offset / WTF::msPerMinute; 237 236 238 237 return ms - (offset * WTF::msPerMinute); 239 238 } 240 239 241 double parseDate( ExecState* exec, const String& date)242 { 243 if (date == exec->vm().cachedDateString)244 return exec->vm().cachedDateStringValue;240 double parseDate(VM& vm, const String& date) 241 { 242 if (date == vm.cachedDateString) 243 return vm.cachedDateStringValue; 245 244 double value = parseES5DateFromNullTerminatedCharacters(date.utf8().data()); 246 245 if (std::isnan(value)) 247 value = parseDateFromNullTerminatedCharacters( exec, date.utf8().data());248 exec->vm().cachedDateString = date;249 exec->vm().cachedDateStringValue = value;246 value = parseDateFromNullTerminatedCharacters(vm, date.utf8().data()); 247 vm.cachedDateString = date; 248 vm.cachedDateStringValue = value; 250 249 return value; 251 250 } -
trunk/Source/JavaScriptCore/runtime/JSDateMath.h
r127191 r156540 49 49 namespace JSC { 50 50 51 class ExecState;51 class VM; 52 52 53 void msToGregorianDateTime( ExecState*, double, bool outputIsUTC, GregorianDateTime&);54 double gregorianDateTimeToMS( ExecState*, const GregorianDateTime&, double, bool inputIsUTC);55 double getUTCOffset( ExecState*);56 double parseDateFromNullTerminatedCharacters( ExecState*, const char* dateString);57 double parseDate( ExecState*, const WTF::String&);53 void msToGregorianDateTime(VM&, double, bool outputIsUTC, GregorianDateTime&); 54 double gregorianDateTimeToMS(VM&, const GregorianDateTime&, double, bool inputIsUTC); 55 double getUTCOffset(VM&); 56 double parseDateFromNullTerminatedCharacters(VM&, const char* dateString); 57 double parseDate(VM&, const WTF::String&); 58 58 59 59 } // namespace JSC -
trunk/Source/WebCore/bridge/qt/qt_runtime.cpp
r156503 r156540 292 292 double ms = JSValueToNumber(context, value, exception); 293 293 GregorianDateTime convertedGdt; 294 msToGregorianDateTime(exec , ms, /*utc*/ true, convertedGdt);294 msToGregorianDateTime(exec->vm(), ms, /*utc*/ true, convertedGdt); 295 295 gdt->copyFrom(convertedGdt); 296 296 }
Note: See TracChangeset
for help on using the changeset viewer.