De-virtualize CPDF_Object::Is*() methods
Save another 9 * 8 * 8 = 576 bytes of vtable (on 64 bits).
Change-Id: I5e35852b071d5c8a2d43b4e6905b7086a8a2609d
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/97432
Reviewed-by: Lei Zhang <thestig@chromium.org>
Commit-Queue: Tom Sepez <tsepez@chromium.org>
diff --git a/core/fpdfapi/parser/cpdf_array.cpp b/core/fpdfapi/parser/cpdf_array.cpp
index 43ae4e4..f582b75 100644
--- a/core/fpdfapi/parser/cpdf_array.cpp
+++ b/core/fpdfapi/parser/cpdf_array.cpp
@@ -38,10 +38,6 @@
return kArray;
}
-bool CPDF_Array::IsArray() const {
- return true;
-}
-
CPDF_Array* CPDF_Array::AsMutableArray() {
return this;
}
diff --git a/core/fpdfapi/parser/cpdf_array.h b/core/fpdfapi/parser/cpdf_array.h
index 9d48b61..c3ce2a1 100644
--- a/core/fpdfapi/parser/cpdf_array.h
+++ b/core/fpdfapi/parser/cpdf_array.h
@@ -33,7 +33,6 @@
// CPDF_Object:
Type GetType() const override;
RetainPtr<CPDF_Object> Clone() const override;
- bool IsArray() const override;
CPDF_Array* AsMutableArray() override;
bool WriteTo(IFX_ArchiveStream* archive,
const CPDF_Encryptor* encryptor) const override;
diff --git a/core/fpdfapi/parser/cpdf_boolean.cpp b/core/fpdfapi/parser/cpdf_boolean.cpp
index 64a8de8..694f868 100644
--- a/core/fpdfapi/parser/cpdf_boolean.cpp
+++ b/core/fpdfapi/parser/cpdf_boolean.cpp
@@ -34,10 +34,6 @@
m_bValue = (str == "true");
}
-bool CPDF_Boolean::IsBoolean() const {
- return true;
-}
-
CPDF_Boolean* CPDF_Boolean::AsMutableBoolean() {
return this;
}
diff --git a/core/fpdfapi/parser/cpdf_boolean.h b/core/fpdfapi/parser/cpdf_boolean.h
index 21c078d..8072749 100644
--- a/core/fpdfapi/parser/cpdf_boolean.h
+++ b/core/fpdfapi/parser/cpdf_boolean.h
@@ -21,7 +21,6 @@
ByteString GetString() const override;
int GetInteger() const override;
void SetString(const ByteString& str) override;
- bool IsBoolean() const override;
CPDF_Boolean* AsMutableBoolean() override;
bool WriteTo(IFX_ArchiveStream* archive,
const CPDF_Encryptor* encryptor) const override;
diff --git a/core/fpdfapi/parser/cpdf_dictionary.cpp b/core/fpdfapi/parser/cpdf_dictionary.cpp
index 1dfbf1d..8afff3b 100644
--- a/core/fpdfapi/parser/cpdf_dictionary.cpp
+++ b/core/fpdfapi/parser/cpdf_dictionary.cpp
@@ -46,10 +46,6 @@
return this;
}
-bool CPDF_Dictionary::IsDictionary() const {
- return true;
-}
-
CPDF_Dictionary* CPDF_Dictionary::AsMutableDictionary() {
return this;
}
diff --git a/core/fpdfapi/parser/cpdf_dictionary.h b/core/fpdfapi/parser/cpdf_dictionary.h
index 788f0b7..77d9e37 100644
--- a/core/fpdfapi/parser/cpdf_dictionary.h
+++ b/core/fpdfapi/parser/cpdf_dictionary.h
@@ -36,7 +36,6 @@
Type GetType() const override;
RetainPtr<CPDF_Object> Clone() const override;
const CPDF_Dictionary* GetDict() const override;
- bool IsDictionary() const override;
CPDF_Dictionary* AsMutableDictionary() override;
bool WriteTo(IFX_ArchiveStream* archive,
const CPDF_Encryptor* encryptor) const override;
diff --git a/core/fpdfapi/parser/cpdf_name.cpp b/core/fpdfapi/parser/cpdf_name.cpp
index adca78e..670127d 100644
--- a/core/fpdfapi/parser/cpdf_name.cpp
+++ b/core/fpdfapi/parser/cpdf_name.cpp
@@ -34,10 +34,6 @@
m_Name = str;
}
-bool CPDF_Name::IsName() const {
- return true;
-}
-
CPDF_Name* CPDF_Name::AsMutableName() {
return this;
}
diff --git a/core/fpdfapi/parser/cpdf_name.h b/core/fpdfapi/parser/cpdf_name.h
index ee9c9b9..8379db6 100644
--- a/core/fpdfapi/parser/cpdf_name.h
+++ b/core/fpdfapi/parser/cpdf_name.h
@@ -22,7 +22,6 @@
ByteString GetString() const override;
WideString GetUnicodeText() const override;
void SetString(const ByteString& str) override;
- bool IsName() const override;
CPDF_Name* AsMutableName() override;
bool WriteTo(IFX_ArchiveStream* archive,
const CPDF_Encryptor* encryptor) const override;
diff --git a/core/fpdfapi/parser/cpdf_null.cpp b/core/fpdfapi/parser/cpdf_null.cpp
index 4ec970f..a47c529 100644
--- a/core/fpdfapi/parser/cpdf_null.cpp
+++ b/core/fpdfapi/parser/cpdf_null.cpp
@@ -18,11 +18,11 @@
return pdfium::MakeRetain<CPDF_Null>();
}
+CPDF_Null* CPDF_Null::AsMutableNull() {
+ return this;
+}
+
bool CPDF_Null::WriteTo(IFX_ArchiveStream* archive,
const CPDF_Encryptor* encryptor) const {
return archive->WriteString(" null");
}
-
-bool CPDF_Null::IsNull() const {
- return true;
-}
diff --git a/core/fpdfapi/parser/cpdf_null.h b/core/fpdfapi/parser/cpdf_null.h
index 43be998..74e3c98 100644
--- a/core/fpdfapi/parser/cpdf_null.h
+++ b/core/fpdfapi/parser/cpdf_null.h
@@ -17,9 +17,9 @@
// CPDF_Object.
Type GetType() const override;
RetainPtr<CPDF_Object> Clone() const override;
+ CPDF_Null* AsMutableNull() override;
bool WriteTo(IFX_ArchiveStream* archive,
const CPDF_Encryptor* encryptor) const override;
- bool IsNull() const override;
private:
CPDF_Null();
diff --git a/core/fpdfapi/parser/cpdf_number.cpp b/core/fpdfapi/parser/cpdf_number.cpp
index dfb40bc..a09351a 100644
--- a/core/fpdfapi/parser/cpdf_number.cpp
+++ b/core/fpdfapi/parser/cpdf_number.cpp
@@ -36,10 +36,6 @@
return m_Number.GetSigned();
}
-bool CPDF_Number::IsNumber() const {
- return true;
-}
-
CPDF_Number* CPDF_Number::AsMutableNumber() {
return this;
}
diff --git a/core/fpdfapi/parser/cpdf_number.h b/core/fpdfapi/parser/cpdf_number.h
index 39a2a2c..c8130e2 100644
--- a/core/fpdfapi/parser/cpdf_number.h
+++ b/core/fpdfapi/parser/cpdf_number.h
@@ -23,7 +23,6 @@
float GetNumber() const override;
int GetInteger() const override;
void SetString(const ByteString& str) override;
- bool IsNumber() const override;
CPDF_Number* AsMutableNumber() override;
bool WriteTo(IFX_ArchiveStream* archive,
const CPDF_Encryptor* encryptor) const override;
diff --git a/core/fpdfapi/parser/cpdf_object.cpp b/core/fpdfapi/parser/cpdf_object.cpp
index c5fff72..92fd602 100644
--- a/core/fpdfapi/parser/cpdf_object.cpp
+++ b/core/fpdfapi/parser/cpdf_object.cpp
@@ -83,42 +83,6 @@
NOTREACHED();
}
-bool CPDF_Object::IsArray() const {
- return false;
-}
-
-bool CPDF_Object::IsBoolean() const {
- return false;
-}
-
-bool CPDF_Object::IsDictionary() const {
- return false;
-}
-
-bool CPDF_Object::IsName() const {
- return false;
-}
-
-bool CPDF_Object::IsNumber() const {
- return false;
-}
-
-bool CPDF_Object::IsReference() const {
- return false;
-}
-
-bool CPDF_Object::IsStream() const {
- return false;
-}
-
-bool CPDF_Object::IsString() const {
- return false;
-}
-
-bool CPDF_Object::IsNull() const {
- return false;
-}
-
CPDF_Array* CPDF_Object::AsMutableArray() {
return nullptr;
}
@@ -151,6 +115,14 @@
return const_cast<CPDF_Object*>(this)->AsMutableName();
}
+CPDF_Null* CPDF_Object::AsMutableNull() {
+ return nullptr;
+}
+
+const CPDF_Null* CPDF_Object::AsNull() const {
+ return const_cast<CPDF_Object*>(this)->AsMutableNull();
+}
+
CPDF_Number* CPDF_Object::AsMutableNumber() {
return nullptr;
}
diff --git a/core/fpdfapi/parser/cpdf_object.h b/core/fpdfapi/parser/cpdf_object.h
index 8a4e6db..86d7f54 100644
--- a/core/fpdfapi/parser/cpdf_object.h
+++ b/core/fpdfapi/parser/cpdf_object.h
@@ -21,6 +21,7 @@
class CPDF_Encryptor;
class CPDF_IndirectObjectHolder;
class CPDF_Name;
+class CPDF_Null;
class CPDF_Number;
class CPDF_Reference;
class CPDF_Stream;
@@ -67,20 +68,11 @@
virtual void SetString(const ByteString& str);
- virtual bool IsArray() const;
- virtual bool IsBoolean() const;
- virtual bool IsDictionary() const;
- virtual bool IsName() const;
- virtual bool IsNumber() const;
- virtual bool IsReference() const;
- virtual bool IsStream() const;
- virtual bool IsString() const;
- virtual bool IsNull() const;
-
virtual CPDF_Array* AsMutableArray();
virtual CPDF_Boolean* AsMutableBoolean();
virtual CPDF_Dictionary* AsMutableDictionary();
virtual CPDF_Name* AsMutableName();
+ virtual CPDF_Null* AsMutableNull();
virtual CPDF_Number* AsMutableNumber();
virtual CPDF_Reference* AsMutableReference();
virtual CPDF_Stream* AsMutableStream();
@@ -107,16 +99,28 @@
RetainPtr<CPDF_Object> GetMutableDirect(); // Wraps virtual method.
RetainPtr<CPDF_Dictionary> GetMutableDict(); // Wraps virtual method.
- // Const methods wrapping non-const virtual methods.
+ // Const methods wrapping non-const virtual As*() methods.
const CPDF_Array* AsArray() const;
const CPDF_Boolean* AsBoolean() const;
const CPDF_Dictionary* AsDictionary() const;
const CPDF_Name* AsName() const;
+ const CPDF_Null* AsNull() const;
const CPDF_Number* AsNumber() const;
const CPDF_Reference* AsReference() const;
const CPDF_Stream* AsStream() const;
const CPDF_String* AsString() const;
+ // Type-testing methods merely wrap As*() methods.
+ bool IsArray() const { return !!AsArray(); }
+ bool IsBoolean() const { return !!AsBoolean(); }
+ bool IsDictionary() const { return !!AsDictionary(); }
+ bool IsName() const { return !!AsName(); }
+ bool IsNull() const { return !!AsNull(); }
+ bool IsNumber() const { return !!AsNumber(); }
+ bool IsReference() const { return !!AsReference(); }
+ bool IsStream() const { return !!AsStream(); }
+ bool IsString() const { return !!AsString(); }
+
protected:
CPDF_Object() = default;
CPDF_Object(const CPDF_Object& src) = delete;
diff --git a/core/fpdfapi/parser/cpdf_reference.cpp b/core/fpdfapi/parser/cpdf_reference.cpp
index 6bcc47d..59e11b0 100644
--- a/core/fpdfapi/parser/cpdf_reference.cpp
+++ b/core/fpdfapi/parser/cpdf_reference.cpp
@@ -40,10 +40,6 @@
return obj ? obj->GetDict() : nullptr;
}
-bool CPDF_Reference::IsReference() const {
- return true;
-}
-
CPDF_Reference* CPDF_Reference::AsMutableReference() {
return this;
}
diff --git a/core/fpdfapi/parser/cpdf_reference.h b/core/fpdfapi/parser/cpdf_reference.h
index 6ea565d..6a22fec 100644
--- a/core/fpdfapi/parser/cpdf_reference.h
+++ b/core/fpdfapi/parser/cpdf_reference.h
@@ -27,7 +27,6 @@
float GetNumber() const override;
int GetInteger() const override;
const CPDF_Dictionary* GetDict() const override;
- bool IsReference() const override;
CPDF_Reference* AsMutableReference() override;
bool WriteTo(IFX_ArchiveStream* archive,
const CPDF_Encryptor* encryptor) const override;
diff --git a/core/fpdfapi/parser/cpdf_stream.cpp b/core/fpdfapi/parser/cpdf_stream.cpp
index 4865c1e..6e9d913 100644
--- a/core/fpdfapi/parser/cpdf_stream.cpp
+++ b/core/fpdfapi/parser/cpdf_stream.cpp
@@ -71,10 +71,6 @@
return m_pDict.Get();
}
-bool CPDF_Stream::IsStream() const {
- return true;
-}
-
CPDF_Stream* CPDF_Stream::AsMutableStream() {
return this;
}
diff --git a/core/fpdfapi/parser/cpdf_stream.h b/core/fpdfapi/parser/cpdf_stream.h
index 76775bd..3e31191 100644
--- a/core/fpdfapi/parser/cpdf_stream.h
+++ b/core/fpdfapi/parser/cpdf_stream.h
@@ -30,7 +30,6 @@
RetainPtr<CPDF_Object> Clone() const override;
const CPDF_Dictionary* GetDict() const override;
WideString GetUnicodeText() const override;
- bool IsStream() const override;
CPDF_Stream* AsMutableStream() override;
bool WriteTo(IFX_ArchiveStream* archive,
const CPDF_Encryptor* encryptor) const override;
diff --git a/core/fpdfapi/parser/cpdf_string.cpp b/core/fpdfapi/parser/cpdf_string.cpp
index d2ee985..ccaaec7 100644
--- a/core/fpdfapi/parser/cpdf_string.cpp
+++ b/core/fpdfapi/parser/cpdf_string.cpp
@@ -52,10 +52,6 @@
m_String = str;
}
-bool CPDF_String::IsString() const {
- return true;
-}
-
CPDF_String* CPDF_String::AsMutableString() {
return this;
}
diff --git a/core/fpdfapi/parser/cpdf_string.h b/core/fpdfapi/parser/cpdf_string.h
index f1f4f7e..f7bfd38 100644
--- a/core/fpdfapi/parser/cpdf_string.h
+++ b/core/fpdfapi/parser/cpdf_string.h
@@ -23,7 +23,6 @@
ByteString GetString() const override;
WideString GetUnicodeText() const override;
void SetString(const ByteString& str) override;
- bool IsString() const override;
CPDF_String* AsMutableString() override;
bool WriteTo(IFX_ArchiveStream* archive,
const CPDF_Encryptor* encryptor) const override;