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;