De-virtualize CXFA_FFWidget::PreFinalize(). PDFium's use of virtual pre-finalizers was an artifact of converting virtual dtors mostly as-is into pre-finalizers. Improve performance by only implementing these on the sub-classes that actually require them. Bug: chromium:1252634 Change-Id: Ib0926716cb305ed3206d6696f1b5c78e03135b4f Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/85491 Commit-Queue: Tom Sepez <tsepez@chromium.org> Reviewed-by: Lei Zhang <thestig@chromium.org>
diff --git a/xfa/fxfa/cxfa_ffimage.cpp b/xfa/fxfa/cxfa_ffimage.cpp index f3cdb3f..0bbb8f4 100644 --- a/xfa/fxfa/cxfa_ffimage.cpp +++ b/xfa/fxfa/cxfa_ffimage.cpp
@@ -21,7 +21,6 @@ void CXFA_FFImage::PreFinalize() { GetNode()->SetImageImage(nullptr); - CXFA_FFWidget::PreFinalize(); } bool CXFA_FFImage::IsLoaded() {
diff --git a/xfa/fxfa/cxfa_ffimage.h b/xfa/fxfa/cxfa_ffimage.h index 5e192fa..1fe358e 100644 --- a/xfa/fxfa/cxfa_ffimage.h +++ b/xfa/fxfa/cxfa_ffimage.h
@@ -7,15 +7,19 @@ #ifndef XFA_FXFA_CXFA_FFIMAGE_H_ #define XFA_FXFA_CXFA_FFIMAGE_H_ +#include "v8/include/cppgc/prefinalizer.h" #include "xfa/fxfa/cxfa_ffwidget.h" class CXFA_FFImage final : public CXFA_FFWidget { + CPPGC_USING_PRE_FINALIZER(CXFA_FFImage, PreFinalize); + public: CONSTRUCT_VIA_MAKE_GARBAGE_COLLECTED; ~CXFA_FFImage() override; + void PreFinalize(); + // CXFA_FFWidget: - void PreFinalize() override; void RenderWidget(CFGAS_GEGraphics* pGS, const CFX_Matrix& matrix, HighlightOption highlight) override;
diff --git a/xfa/fxfa/cxfa_ffimageedit.cpp b/xfa/fxfa/cxfa_ffimageedit.cpp index 41a3017..61df5ce 100644 --- a/xfa/fxfa/cxfa_ffimageedit.cpp +++ b/xfa/fxfa/cxfa_ffimageedit.cpp
@@ -29,7 +29,6 @@ void CXFA_FFImageEdit::PreFinalize() { m_pNode->SetImageEditImage(nullptr); - CXFA_FFField::PreFinalize(); } void CXFA_FFImageEdit::Trace(cppgc::Visitor* visitor) const {
diff --git a/xfa/fxfa/cxfa_ffimageedit.h b/xfa/fxfa/cxfa_ffimageedit.h index df5bc6b..9bffd3a 100644 --- a/xfa/fxfa/cxfa_ffimageedit.h +++ b/xfa/fxfa/cxfa_ffimageedit.h
@@ -8,15 +8,19 @@ #define XFA_FXFA_CXFA_FFIMAGEEDIT_H_ #include "v8/include/cppgc/member.h" +#include "v8/include/cppgc/prefinalizer.h" #include "xfa/fxfa/cxfa_fffield.h" class CXFA_FFImageEdit final : public CXFA_FFField { + CPPGC_USING_PRE_FINALIZER(CXFA_FFImageEdit, PreFinalize); + public: CONSTRUCT_VIA_MAKE_GARBAGE_COLLECTED; ~CXFA_FFImageEdit() override; + void PreFinalize(); + // CXFA_FFField: - void PreFinalize() override; void Trace(cppgc::Visitor* visitor) const override; void RenderWidget(CFGAS_GEGraphics* pGS, const CFX_Matrix& matrix,
diff --git a/xfa/fxfa/cxfa_fflistbox.cpp b/xfa/fxfa/cxfa_fflistbox.cpp index 5d985f1..e0d9a53 100644 --- a/xfa/fxfa/cxfa_fflistbox.cpp +++ b/xfa/fxfa/cxfa_fflistbox.cpp
@@ -37,7 +37,6 @@ GetNormalWidget()->GetFWLApp()->GetNoteDriver(); pNoteDriver->UnregisterEventTarget(GetNormalWidget()); } - CXFA_FFDropDown::PreFinalize(); } void CXFA_FFListBox::Trace(cppgc::Visitor* visitor) const {
diff --git a/xfa/fxfa/cxfa_fflistbox.h b/xfa/fxfa/cxfa_fflistbox.h index ae8bca9..88a335f 100644 --- a/xfa/fxfa/cxfa_fflistbox.h +++ b/xfa/fxfa/cxfa_fflistbox.h
@@ -8,15 +8,19 @@ #define XFA_FXFA_CXFA_FFLISTBOX_H_ #include "v8/include/cppgc/member.h" +#include "v8/include/cppgc/prefinalizer.h" #include "xfa/fxfa/cxfa_ffdropdown.h" class CXFA_FFListBox final : public CXFA_FFDropDown { + CPPGC_USING_PRE_FINALIZER(CXFA_FFListBox, PreFinalize); + public: CONSTRUCT_VIA_MAKE_GARBAGE_COLLECTED; ~CXFA_FFListBox() override; + void PreFinalize(); + // CXFA_FFField: - void PreFinalize() override; void Trace(cppgc::Visitor* visitor) const override; bool LoadWidget() override; bool OnKillFocus(CXFA_FFWidget* pNewWidget) override WARN_UNUSED_RESULT; @@ -26,7 +30,7 @@ const CFX_Matrix& matrix) override; FormFieldType GetFormFieldType() override; - // CXFA_FFDropDown + // CXFA_FFDropDown: void InsertItem(const WideString& wsLabel, int32_t nIndex) override; void DeleteItem(int32_t nIndex) override;
diff --git a/xfa/fxfa/cxfa_fftextedit.cpp b/xfa/fxfa/cxfa_fftextedit.cpp index 9a83b6f..a60cd29 100644 --- a/xfa/fxfa/cxfa_fftextedit.cpp +++ b/xfa/fxfa/cxfa_fftextedit.cpp
@@ -42,7 +42,6 @@ GetNormalWidget()->GetFWLApp()->GetNoteDriver(); pNoteDriver->UnregisterEventTarget(GetNormalWidget()); } - CXFA_FFField::PreFinalize(); } void CXFA_FFTextEdit::Trace(cppgc::Visitor* visitor) const {
diff --git a/xfa/fxfa/cxfa_fftextedit.h b/xfa/fxfa/cxfa_fftextedit.h index 9513f28..2fb39ed 100644 --- a/xfa/fxfa/cxfa_fftextedit.h +++ b/xfa/fxfa/cxfa_fftextedit.h
@@ -9,6 +9,7 @@ #include "core/fxcrt/fx_coordinates.h" #include "core/fxcrt/fx_string.h" +#include "v8/include/cppgc/prefinalizer.h" #include "xfa/fxfa/cxfa_fffield.h" class CFWL_Event; @@ -19,11 +20,14 @@ class IFWL_WidgetDelegate; class CXFA_FFTextEdit : public CXFA_FFField { + CPPGC_USING_PRE_FINALIZER(CXFA_FFTextEdit, PreFinalize); + public: CONSTRUCT_VIA_MAKE_GARBAGE_COLLECTED; ~CXFA_FFTextEdit() override; - void PreFinalize() override; + void PreFinalize(); + void Trace(cppgc::Visitor* visitor) const override; // CXFA_FFField
diff --git a/xfa/fxfa/cxfa_ffwidget.cpp b/xfa/fxfa/cxfa_ffwidget.cpp index 8aa5c2e..2928913 100644 --- a/xfa/fxfa/cxfa_ffwidget.cpp +++ b/xfa/fxfa/cxfa_ffwidget.cpp
@@ -222,8 +222,6 @@ CXFA_FFWidget::~CXFA_FFWidget() = default; -void CXFA_FFWidget::PreFinalize() {} - void CXFA_FFWidget::Trace(cppgc::Visitor* visitor) const { visitor->Trace(m_pLayoutItem); visitor->Trace(m_pDocView);
diff --git a/xfa/fxfa/cxfa_ffwidget.h b/xfa/fxfa/cxfa_ffwidget.h index bddabe5..5df2c70 100644 --- a/xfa/fxfa/cxfa_ffwidget.h +++ b/xfa/fxfa/cxfa_ffwidget.h
@@ -16,7 +16,6 @@ #include "core/fxge/cfx_graphstatedata.h" #include "fxjs/gc/heap.h" #include "v8/include/cppgc/garbage-collected.h" -#include "v8/include/cppgc/prefinalizer.h" #include "v8/include/cppgc/visitor.h" #include "xfa/fwl/cfwl_app.h" #include "xfa/fwl/cfwl_messagemouse.h" @@ -65,8 +64,6 @@ class CXFA_FFWidget : public cppgc::GarbageCollected<CXFA_FFWidget>, public CFWL_Widget::AdapterIface { - CPPGC_USING_PRE_FINALIZER(CXFA_FFWidget, PreFinalize); - public: enum FocusOption { kDoNotDrawFocus = 0, kDrawFocus }; enum HighlightOption { kNoHighlight = 0, kHighlight }; @@ -88,7 +85,6 @@ CONSTRUCT_VIA_MAKE_GARBAGE_COLLECTED; ~CXFA_FFWidget() override; - virtual void PreFinalize(); void Trace(cppgc::Visitor* visitor) const override; // CFWL_Widget::AdapterIface: