Get rid of fifteen copies of m_sTimeMap and their initializers.
authorBruce Dawson <brucedawson@google.com>
Mon, 5 Jan 2015 21:21:46 +0000 (13:21 -0800)
committerBruce Dawson <brucedawson@google.com>
Mon, 5 Jan 2015 21:21:46 +0000 (13:21 -0800)
m_sTimeMap is a global variable with a constructor and destructor, which
is not allowed. This change moves it to a function with a static pointer
so that it is constructed on demand and then leaked, thus avoiding
having startup and shutdown code.

This also fixes a worrisome bug caused by having m_sTimeMap defined in
a header file. Because m_sTimeMap was defined (and marked as static) in
a header file there were fifteen separate copies of it, one for each
source file which included the header file. This could easily lead to
bugs because a timer that was added from one source file would be
invisible to other source files.

Each instance of m_sTimeMap added four entries to the
dump-static-initializers.py report, for a total of sixty, so this fix
significantly cleans up that report.

BUG=441899
R=tsepez@chromium.org

Review URL: https://codereview.chromium.org/831903002

fpdfsdk/include/javascript/JS_Object.h
fpdfsdk/src/javascript/JS_Object.cpp

index a6dac5d..2351b09 100644 (file)
@@ -157,7 +157,7 @@ public:
        CTimerMapArray          m_Array;
 };
 
-static JS_TIMER_MAPARRAY       m_sTimeMap;
+JS_TIMER_MAPARRAY& GetTimeMap();
 
 class CJS_Runtime;
 
@@ -188,7 +188,7 @@ public:
                if (m_nTimerID)KillJSTimer();
                IFX_SystemHandler* pHandler = m_pApp->GetSysHandler();
                m_nTimerID = pHandler->SetTimer(nElapse,TimerProc);
-               m_sTimeMap.SetAt(m_nTimerID,this);
+               GetTimeMap().SetAt(m_nTimerID,this);
                m_dwElapse = nElapse;
                return m_nTimerID;
        };
@@ -199,7 +199,7 @@ public:
                {
                        IFX_SystemHandler* pHandler = m_pApp->GetSysHandler();
                        pHandler->KillTimer(m_nTimerID);
-                       m_sTimeMap.RemoveAt(m_nTimerID);
+                       GetTimeMap().RemoveAt(m_nTimerID);
                        m_nTimerID = 0;
                }
        };
@@ -256,7 +256,7 @@ public:
 
        static void TimerProc(int idEvent)
        {
-               if (CJS_Timer * pTimer = m_sTimeMap.GetAt(idEvent))
+               if (CJS_Timer * pTimer = GetTimeMap().GetAt(idEvent))
                {
                        if (!pTimer->m_bProcessing)
                        {
index 3b7774d..8a019d4 100644 (file)
 // #include "../../include/javascript/JS_ResMgr.h"
 #include "../../include/javascript/JS_Context.h"
 
+JS_TIMER_MAPARRAY& GetTimeMap()
+{
+  // Leak the timer array at shutdown.
+  static auto* timeMap = new JS_TIMER_MAPARRAY;
+  return *timeMap;
+}
+
 int FXJS_MsgBox(CPDFDoc_Environment* pApp, CPDFSDK_PageView* pPageView, FX_LPCWSTR swMsg, FX_LPCWSTR swTitle, FX_UINT nType, FX_UINT nIcon)
 {
        int nRet = 0;