Move Non-JS date functions to fx_date_helpers.cpp These will never re-enter JS, so remove the JS prefix from the name to indicate they are "safe" from this issue. A subsequent CL will allow fuzzing without having to boot up V8. Add fxjs namespace and using to prevent the possibility of link-time collisions with these new (not all that unique) names. Change-Id: I09ae077bc74011e953cf6e278399ffbce8fb6673 Reviewed-on: https://pdfium-review.googlesource.com/c/45090 Reviewed-by: Lei Zhang <thestig@chromium.org> Commit-Queue: Tom Sepez <tsepez@chromium.org>
diff --git a/fxjs/BUILD.gn b/fxjs/BUILD.gn index e937126..32c435f 100644 --- a/fxjs/BUILD.gn +++ b/fxjs/BUILD.gn
@@ -92,6 +92,8 @@ "cjs_util.h", "cjs_zoomtype.cpp", "cjs_zoomtype.h", + "fx_date_helpers.cpp", + "fx_date_helpers.h", "global_timer.cpp", "global_timer.h", "js_define.cpp",
diff --git a/fxjs/cjs_publicmethods.cpp b/fxjs/cjs_publicmethods.cpp index 261e464..b7790be 100644 --- a/fxjs/cjs_publicmethods.cpp +++ b/fxjs/cjs_publicmethods.cpp
@@ -30,6 +30,7 @@ #include "fxjs/cjs_object.h" #include "fxjs/cjs_runtime.h" #include "fxjs/cjs_util.h" +#include "fxjs/fx_date_helpers.h" #include "fxjs/js_define.h" #include "fxjs/js_resources.h" @@ -414,14 +415,13 @@ double CJS_PublicMethods::ParseDate(const WideString& value, bool* bWrongFormat) { - double dt = JS_GetDateTime(); - - int nYear = JS_GetYearFromTime(dt); - int nMonth = JS_GetMonthFromTime(dt) + 1; - int nDay = JS_GetDayFromTime(dt); - int nHour = JS_GetHourFromTime(dt); - int nMin = JS_GetMinFromTime(dt); - int nSec = JS_GetSecFromTime(dt); + double dt = FX_GetDateTime(); + int nYear = FX_GetYearFromTime(dt); + int nMonth = FX_GetMonthFromTime(dt) + 1; + int nDay = FX_GetDayFromTime(dt); + int nHour = FX_GetHourFromTime(dt); + int nMin = FX_GetMinFromTime(dt); + int nSec = FX_GetSecFromTime(dt); int number[3]; @@ -493,17 +493,17 @@ double CJS_PublicMethods::ParseDateUsingFormat(const WideString& value, const WideString& format, bool* bWrongFormat) { - double dt = JS_GetDateTime(); + double dt = FX_GetDateTime(); if (format.IsEmpty() || value.IsEmpty()) return dt; - int nYear = JS_GetYearFromTime(dt); - int nMonth = JS_GetMonthFromTime(dt) + 1; - int nDay = JS_GetDayFromTime(dt); - int nHour = JS_GetHourFromTime(dt); - int nMin = JS_GetMinFromTime(dt); - int nSec = JS_GetSecFromTime(dt); + int nYear = FX_GetYearFromTime(dt); + int nMonth = FX_GetMonthFromTime(dt) + 1; + int nDay = FX_GetDayFromTime(dt); + int nHour = FX_GetHourFromTime(dt); + int nMin = FX_GetMinFromTime(dt); + int nSec = FX_GetSecFromTime(dt); int nYearSub = 99; // nYear - 2000; @@ -738,8 +738,8 @@ if (bBadFormat) { dRet = ParseDate(value, &bBadFormat); } else { - dRet = JS_MakeDate(JS_MakeDay(nYear, nMonth - 1, nDay), - JS_MakeTime(nHour, nMin, nSec, 0)); + dRet = FX_MakeDate(FX_MakeDay(nYear, nMonth - 1, nDay), + FX_MakeTime(nHour, nMin, nSec, 0)); if (std::isnan(dRet)) dRet = JS_DateParse(value); } @@ -758,12 +758,12 @@ WideString sRet; WideString sPart; - int nYear = JS_GetYearFromTime(dDate); - int nMonth = JS_GetMonthFromTime(dDate) + 1; - int nDay = JS_GetDayFromTime(dDate); - int nHour = JS_GetHourFromTime(dDate); - int nMin = JS_GetMinFromTime(dDate); - int nSec = JS_GetSecFromTime(dDate); + int nYear = FX_GetYearFromTime(dDate); + int nMonth = FX_GetMonthFromTime(dDate) + 1; + int nDay = FX_GetDayFromTime(dDate); + int nHour = FX_GetHourFromTime(dDate); + int nMin = FX_GetMinFromTime(dDate); + int nSec = FX_GetSecFromTime(dDate); size_t i = 0; while (i < format.GetLength()) { @@ -1236,8 +1236,8 @@ int nMin = FX_atof(wsArray[4].AsStringView()); int nSec = FX_atof(wsArray[5].AsStringView()); int nYear = FX_atof(wsArray[7].AsStringView()); - double dRet = JS_MakeDate(JS_MakeDay(nYear, nMonth - 1, nDay), - JS_MakeTime(nHour, nMin, nSec, 0)); + double dRet = FX_MakeDate(FX_MakeDay(nYear, nMonth - 1, nDay), + FX_MakeTime(nHour, nMin, nSec, 0)); if (std::isnan(dRet)) dRet = JS_DateParse(strValue);
diff --git a/fxjs/cjs_util.cpp b/fxjs/cjs_util.cpp index 2e77732..b30c535 100644 --- a/fxjs/cjs_util.cpp +++ b/fxjs/cjs_util.cpp
@@ -20,6 +20,7 @@ #include "fxjs/cjs_object.h" #include "fxjs/cjs_publicmethods.h" #include "fxjs/cjs_runtime.h" +#include "fxjs/fx_date_helpers.h" #include "fxjs/js_define.h" #include "fxjs/js_resources.h" @@ -169,13 +170,13 @@ if (v8_date.IsEmpty() || std::isnan(pRuntime->ToDouble(v8_date))) return CJS_Result::Failure(JSMessage::kSecondParamInvalidDateError); - double date = JS_LocalTime(pRuntime->ToDouble(v8_date)); - int year = JS_GetYearFromTime(date); - int month = JS_GetMonthFromTime(date) + 1; // One-based. - int day = JS_GetDayFromTime(date); - int hour = JS_GetHourFromTime(date); - int min = JS_GetMinFromTime(date); - int sec = JS_GetSecFromTime(date); + double date = FX_LocalTime(pRuntime->ToDouble(v8_date)); + int year = FX_GetYearFromTime(date); + int month = FX_GetMonthFromTime(date) + 1; // One-based. + int day = FX_GetDayFromTime(date); + int hour = FX_GetHourFromTime(date); + int min = FX_GetMinFromTime(date); + int sec = FX_GetSecFromTime(date); if (params[0]->IsNumber()) { WideString swResult; @@ -368,7 +369,7 @@ WideString sFormat = pRuntime->ToWideString(params[0]); WideString sDate = pRuntime->ToWideString(params[1]); - double dDate = JS_GetDateTime(); + double dDate = FX_GetDateTime(); if (sDate.GetLength() > 0) dDate = CJS_PublicMethods::ParseDateUsingFormat(sDate, sFormat, nullptr); if (std::isnan(dDate))
diff --git a/fxjs/fx_date_helpers.cpp b/fxjs/fx_date_helpers.cpp new file mode 100644 index 0000000..dbcdcf7 --- /dev/null +++ b/fxjs/fx_date_helpers.cpp
@@ -0,0 +1,234 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "fxjs/fx_date_helpers.h" + +#include <time.h> + +#include "core/fxcrt/fx_extension.h" +#include "core/fxcrt/fx_system.h" +#include "fpdfsdk/cpdfsdk_helpers.h" + +namespace fxjs { +namespace { + +constexpr uint16_t daysMonth[12] = {0, 31, 59, 90, 120, 151, + 181, 212, 243, 273, 304, 334}; +constexpr uint16_t leapDaysMonth[12] = {0, 31, 60, 91, 121, 152, + 182, 213, 244, 274, 305, 335}; + +double Mod(double x, double y) { + double r = fmod(x, y); + if (r < 0) + r += y; + return r; +} + +double GetLocalTZA() { + if (!FSDK_IsSandBoxPolicyEnabled(FPDF_POLICY_MACHINETIME_ACCESS)) + return 0; + time_t t = 0; + FXSYS_time(&t); + FXSYS_localtime(&t); +#if _FX_PLATFORM_ == _FX_PLATFORM_WINDOWS_ + // In gcc 'timezone' is a global variable declared in time.h. In VC++, that + // variable was removed in VC++ 2015, with _get_timezone replacing it. + long timezone = 0; + _get_timezone(&timezone); +#endif // _FX_PLATFORM_ == _FX_PLATFORM_WINDOWS_ + return (double)(-(timezone * 1000)); +} + +int GetDaylightSavingTA(double d) { + if (!FSDK_IsSandBoxPolicyEnabled(FPDF_POLICY_MACHINETIME_ACCESS)) + return 0; + time_t t = (time_t)(d / 1000); + struct tm* tmp = FXSYS_localtime(&t); + if (!tmp) + return 0; + if (tmp->tm_isdst > 0) + // One hour. + return (int)60 * 60 * 1000; + return 0; +} + +bool IsLeapYear(int year) { + return (year % 4 == 0) && ((year % 100 != 0) || (year % 400 != 0)); +} + +int DayFromYear(int y) { + return (int)(365 * (y - 1970.0) + floor((y - 1969.0) / 4) - + floor((y - 1901.0) / 100) + floor((y - 1601.0) / 400)); +} + +double TimeFromYear(int y) { + return 86400000.0 * DayFromYear(y); +} + +double TimeFromYearMonth(int y, int m) { + const uint16_t* pMonth = IsLeapYear(y) ? leapDaysMonth : daysMonth; + return TimeFromYear(y) + ((double)pMonth[m]) * 86400000; +} + +int Day(double t) { + return static_cast<int>(floor(t / 86400000.0)); +} + +int YearFromTime(double t) { + // estimate the time. + int y = 1970 + static_cast<int>(t / (365.2425 * 86400000.0)); + if (TimeFromYear(y) <= t) { + while (TimeFromYear(y + 1) <= t) + y++; + } else { + while (TimeFromYear(y) > t) + y--; + } + return y; +} + +int DayWithinYear(double t) { + int year = YearFromTime(t); + int day = Day(t); + return day - DayFromYear(year); +} + +int MonthFromTime(double t) { + int day = DayWithinYear(t); + int year = YearFromTime(t); + if (0 <= day && day < 31) + return 0; + if (31 <= day && day < 59 + IsLeapYear(year)) + return 1; + if ((59 + IsLeapYear(year)) <= day && day < (90 + IsLeapYear(year))) + return 2; + if ((90 + IsLeapYear(year)) <= day && day < (120 + IsLeapYear(year))) + return 3; + if ((120 + IsLeapYear(year)) <= day && day < (151 + IsLeapYear(year))) + return 4; + if ((151 + IsLeapYear(year)) <= day && day < (181 + IsLeapYear(year))) + return 5; + if ((181 + IsLeapYear(year)) <= day && day < (212 + IsLeapYear(year))) + return 6; + if ((212 + IsLeapYear(year)) <= day && day < (243 + IsLeapYear(year))) + return 7; + if ((243 + IsLeapYear(year)) <= day && day < (273 + IsLeapYear(year))) + return 8; + if ((273 + IsLeapYear(year)) <= day && day < (304 + IsLeapYear(year))) + return 9; + if ((304 + IsLeapYear(year)) <= day && day < (334 + IsLeapYear(year))) + return 10; + if ((334 + IsLeapYear(year)) <= day && day < (365 + IsLeapYear(year))) + return 11; + + return -1; +} + +int DateFromTime(double t) { + int day = DayWithinYear(t); + int year = YearFromTime(t); + int leap = IsLeapYear(year); + int month = MonthFromTime(t); + switch (month) { + case 0: + return day + 1; + case 1: + return day - 30; + case 2: + return day - 58 - leap; + case 3: + return day - 89 - leap; + case 4: + return day - 119 - leap; + case 5: + return day - 150 - leap; + case 6: + return day - 180 - leap; + case 7: + return day - 211 - leap; + case 8: + return day - 242 - leap; + case 9: + return day - 272 - leap; + case 10: + return day - 303 - leap; + case 11: + return day - 333 - leap; + default: + return 0; + } +} + +} // namespace + +double FX_GetDateTime() { + if (!FSDK_IsSandBoxPolicyEnabled(FPDF_POLICY_MACHINETIME_ACCESS)) + return 0; + + time_t t = FXSYS_time(nullptr); + struct tm* pTm = FXSYS_localtime(&t); + double t1 = TimeFromYear(pTm->tm_year + 1900); + return t1 + pTm->tm_yday * 86400000.0 + pTm->tm_hour * 3600000.0 + + pTm->tm_min * 60000.0 + pTm->tm_sec * 1000.0; +} + +int FX_GetYearFromTime(double dt) { + return YearFromTime(dt); +} + +int FX_GetMonthFromTime(double dt) { + return MonthFromTime(dt); +} + +int FX_GetDayFromTime(double dt) { + return DateFromTime(dt); +} + +int FX_GetHourFromTime(double dt) { + return (int)Mod(floor(dt / (60 * 60 * 1000)), 24); +} + +int FX_GetMinFromTime(double dt) { + return (int)Mod(floor(dt / (60 * 1000)), 60); +} + +int FX_GetSecFromTime(double dt) { + return (int)Mod(floor(dt / 1000), 60); +} + +double FX_LocalTime(double d) { + return d + GetLocalTZA() + GetDaylightSavingTA(d); +} + +double FX_MakeDay(int nYear, int nMonth, int nDate) { + double y = static_cast<double>(nYear); + double m = static_cast<double>(nMonth); + double dt = static_cast<double>(nDate); + double ym = y + floor(m / 12); + double mn = Mod(m, 12); + double t = TimeFromYearMonth(static_cast<int>(ym), static_cast<int>(mn)); + if (YearFromTime(t) != ym || MonthFromTime(t) != mn || DateFromTime(t) != 1) + return std::nan(""); + + return Day(t) + dt - 1; +} + +double FX_MakeTime(int nHour, int nMin, int nSec, int nMs) { + double h = static_cast<double>(nHour); + double m = static_cast<double>(nMin); + double s = static_cast<double>(nSec); + double milli = static_cast<double>(nMs); + return h * 3600000 + m * 60000 + s * 1000 + milli; +} + +double FX_MakeDate(double day, double time) { + if (!std::isfinite(day) || !std::isfinite(time)) + return std::nan(""); + + return day * 86400000 + time; +} + +} // namespace fxjs
diff --git a/fxjs/fx_date_helpers.h b/fxjs/fx_date_helpers.h new file mode 100644 index 0000000..dbcc94a --- /dev/null +++ b/fxjs/fx_date_helpers.h
@@ -0,0 +1,38 @@ +// Copyright 2018 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef FXJS_FX_DATE_HELPERS_H_ +#define FXJS_FX_DATE_HELPERS_H_ + +namespace fxjs { + +double FX_GetDateTime(); +int FX_GetYearFromTime(double dt); +int FX_GetMonthFromTime(double dt); +int FX_GetDayFromTime(double dt); +int FX_GetHourFromTime(double dt); +int FX_GetMinFromTime(double dt); +int FX_GetSecFromTime(double dt); +double FX_LocalTime(double d); +double FX_MakeDay(int nYear, int nMonth, int nDay); +double FX_MakeTime(int nHour, int nMin, int nSec, int nMs); +double FX_MakeDate(double day, double time); + +} // namespace fxjs + +using fxjs::FX_GetDateTime; +using fxjs::FX_GetYearFromTime; +using fxjs::FX_GetMonthFromTime; +using fxjs::FX_GetDayFromTime; +using fxjs::FX_GetHourFromTime; +using fxjs::FX_GetMinFromTime; +using fxjs::FX_GetSecFromTime; +using fxjs::FX_LocalTime; +using fxjs::FX_MakeDay; +using fxjs::FX_MakeTime; +using fxjs::FX_MakeDate; + +#endif // FXJS_FX_DATE_HELPERS_H_
diff --git a/fxjs/js_define.cpp b/fxjs/js_define.cpp index b4e0197..6089132 100644 --- a/fxjs/js_define.cpp +++ b/fxjs/js_define.cpp
@@ -6,8 +6,6 @@ #include "fxjs/js_define.h" -#include <time.h> - #include <algorithm> #include <cmath> #include <limits> @@ -16,201 +14,12 @@ #include "core/fxcrt/fx_extension.h" #include "fxjs/cjs_document.h" #include "fxjs/cjs_object.h" - -namespace { - -double GetLocalTZA() { - if (!FSDK_IsSandBoxPolicyEnabled(FPDF_POLICY_MACHINETIME_ACCESS)) - return 0; - time_t t = 0; - FXSYS_time(&t); - FXSYS_localtime(&t); -#if _FX_PLATFORM_ == _FX_PLATFORM_WINDOWS_ - // In gcc 'timezone' is a global variable declared in time.h. In VC++, that - // variable was removed in VC++ 2015, with _get_timezone replacing it. - long timezone = 0; - _get_timezone(&timezone); -#endif // _FX_PLATFORM_ == _FX_PLATFORM_WINDOWS_ - return (double)(-(timezone * 1000)); -} - -int GetDaylightSavingTA(double d) { - if (!FSDK_IsSandBoxPolicyEnabled(FPDF_POLICY_MACHINETIME_ACCESS)) - return 0; - time_t t = (time_t)(d / 1000); - struct tm* tmp = FXSYS_localtime(&t); - if (!tmp) - return 0; - if (tmp->tm_isdst > 0) - // One hour. - return (int)60 * 60 * 1000; - return 0; -} - -double Mod(double x, double y) { - double r = fmod(x, y); - if (r < 0) - r += y; - return r; -} - -bool IsLeapYear(int year) { - return (year % 4 == 0) && ((year % 100 != 0) || (year % 400 != 0)); -} - -int DayFromYear(int y) { - return (int)(365 * (y - 1970.0) + floor((y - 1969.0) / 4) - - floor((y - 1901.0) / 100) + floor((y - 1601.0) / 400)); -} - -double TimeFromYear(int y) { - return 86400000.0 * DayFromYear(y); -} - -static const uint16_t daysMonth[12] = {0, 31, 59, 90, 120, 151, - 181, 212, 243, 273, 304, 334}; -static const uint16_t leapDaysMonth[12] = {0, 31, 60, 91, 121, 152, - 182, 213, 244, 274, 305, 335}; - -double TimeFromYearMonth(int y, int m) { - const uint16_t* pMonth = IsLeapYear(y) ? leapDaysMonth : daysMonth; - return TimeFromYear(y) + ((double)pMonth[m]) * 86400000; -} - -int Day(double t) { - return static_cast<int>(floor(t / 86400000.0)); -} - -int YearFromTime(double t) { - // estimate the time. - int y = 1970 + static_cast<int>(t / (365.2425 * 86400000.0)); - if (TimeFromYear(y) <= t) { - while (TimeFromYear(y + 1) <= t) - y++; - } else { - while (TimeFromYear(y) > t) - y--; - } - return y; -} - -int DayWithinYear(double t) { - int year = YearFromTime(t); - int day = Day(t); - return day - DayFromYear(year); -} - -int MonthFromTime(double t) { - int day = DayWithinYear(t); - int year = YearFromTime(t); - if (0 <= day && day < 31) - return 0; - if (31 <= day && day < 59 + IsLeapYear(year)) - return 1; - if ((59 + IsLeapYear(year)) <= day && day < (90 + IsLeapYear(year))) - return 2; - if ((90 + IsLeapYear(year)) <= day && day < (120 + IsLeapYear(year))) - return 3; - if ((120 + IsLeapYear(year)) <= day && day < (151 + IsLeapYear(year))) - return 4; - if ((151 + IsLeapYear(year)) <= day && day < (181 + IsLeapYear(year))) - return 5; - if ((181 + IsLeapYear(year)) <= day && day < (212 + IsLeapYear(year))) - return 6; - if ((212 + IsLeapYear(year)) <= day && day < (243 + IsLeapYear(year))) - return 7; - if ((243 + IsLeapYear(year)) <= day && day < (273 + IsLeapYear(year))) - return 8; - if ((273 + IsLeapYear(year)) <= day && day < (304 + IsLeapYear(year))) - return 9; - if ((304 + IsLeapYear(year)) <= day && day < (334 + IsLeapYear(year))) - return 10; - if ((334 + IsLeapYear(year)) <= day && day < (365 + IsLeapYear(year))) - return 11; - - return -1; -} - -int DateFromTime(double t) { - int day = DayWithinYear(t); - int year = YearFromTime(t); - int leap = IsLeapYear(year); - int month = MonthFromTime(t); - switch (month) { - case 0: - return day + 1; - case 1: - return day - 30; - case 2: - return day - 58 - leap; - case 3: - return day - 89 - leap; - case 4: - return day - 119 - leap; - case 5: - return day - 150 - leap; - case 6: - return day - 180 - leap; - case 7: - return day - 211 - leap; - case 8: - return day - 242 - leap; - case 9: - return day - 272 - leap; - case 10: - return day - 303 - leap; - case 11: - return day - 333 - leap; - default: - return 0; - } -} - -} // namespace +#include "fxjs/fx_date_helpers.h" void JSDestructor(v8::Local<v8::Object> obj) { CFXJS_Engine::SetObjectPrivate(obj, nullptr); } -double JS_GetDateTime() { - if (!FSDK_IsSandBoxPolicyEnabled(FPDF_POLICY_MACHINETIME_ACCESS)) - return 0; - - time_t t = FXSYS_time(nullptr); - struct tm* pTm = FXSYS_localtime(&t); - double t1 = TimeFromYear(pTm->tm_year + 1900); - return t1 + pTm->tm_yday * 86400000.0 + pTm->tm_hour * 3600000.0 + - pTm->tm_min * 60000.0 + pTm->tm_sec * 1000.0; -} - -int JS_GetYearFromTime(double dt) { - return YearFromTime(dt); -} - -int JS_GetMonthFromTime(double dt) { - return MonthFromTime(dt); -} - -int JS_GetDayFromTime(double dt) { - return DateFromTime(dt); -} - -int JS_GetHourFromTime(double dt) { - return (int)Mod(floor(dt / (60 * 60 * 1000)), 24); -} - -int JS_GetMinFromTime(double dt) { - return (int)Mod(floor(dt / (60 * 1000)), 60); -} - -int JS_GetSecFromTime(double dt) { - return (int)Mod(floor(dt / 1000), 60); -} - -double JS_LocalTime(double d) { - return d + GetLocalTZA() + GetDaylightSavingTA(d); -} - double JS_DateParse(const WideString& str) { v8::Isolate* pIsolate = v8::Isolate::GetCurrent(); v8::Isolate::Scope isolate_scope(pIsolate); @@ -245,41 +54,13 @@ double date = v->ToNumber(context).ToLocalChecked()->Value(); if (!std::isfinite(date)) return date; - return JS_LocalTime(date); + return FX_LocalTime(date); } } } return 0; } -double JS_MakeDay(int nYear, int nMonth, int nDate) { - double y = static_cast<double>(nYear); - double m = static_cast<double>(nMonth); - double dt = static_cast<double>(nDate); - double ym = y + floor(m / 12); - double mn = Mod(m, 12); - double t = TimeFromYearMonth(static_cast<int>(ym), static_cast<int>(mn)); - if (YearFromTime(t) != ym || MonthFromTime(t) != mn || DateFromTime(t) != 1) - return std::nan(""); - - return Day(t) + dt - 1; -} - -double JS_MakeTime(int nHour, int nMin, int nSec, int nMs) { - double h = static_cast<double>(nHour); - double m = static_cast<double>(nMin); - double s = static_cast<double>(nSec); - double milli = static_cast<double>(nMs); - return h * 3600000 + m * 60000 + s * 1000 + milli; -} - -double JS_MakeDate(double day, double time) { - if (!std::isfinite(day) || !std::isfinite(time)) - return std::nan(""); - - return day * 86400000 + time; -} - std::vector<v8::Local<v8::Value>> ExpandKeywordParams( CJS_Runtime* pRuntime, const std::vector<v8::Local<v8::Value>>& originals,
diff --git a/fxjs/js_define.h b/fxjs/js_define.h index 0705dfe..2c15c9f 100644 --- a/fxjs/js_define.h +++ b/fxjs/js_define.h
@@ -18,18 +18,7 @@ class CJS_Object; -double JS_GetDateTime(); -int JS_GetYearFromTime(double dt); -int JS_GetMonthFromTime(double dt); -int JS_GetDayFromTime(double dt); -int JS_GetHourFromTime(double dt); -int JS_GetMinFromTime(double dt); -int JS_GetSecFromTime(double dt); -double JS_LocalTime(double d); double JS_DateParse(const WideString& str); -double JS_MakeDay(int nYear, int nMonth, int nDay); -double JS_MakeTime(int nHour, int nMin, int nSec, int nMs); -double JS_MakeDate(double day, double time); // Some JS methods have the bizarre convention that they may also be called // with a single argument which is an object containing the actual arguments