summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Sepez <tsepez@chromium.org>2018-07-23 18:03:44 +0000
committerChromium commit bot <commit-bot@chromium.org>2018-07-23 18:03:44 +0000
commit721f5fa5061f2dec8282b7bde48c9d4721208b7a (patch)
treeef73827b16830ae0fe3f535783aa34b194f8257a
parent3ba611a551efb23518ac16f8bb23ab5ac4ca2c59 (diff)
downloadpdfium-721f5fa5061f2dec8282b7bde48c9d4721208b7a.tar.xz
Replace CFXJSE_HostObject::type_ with polymorphic conversion methods
More foolproof technique, and saves one word in every instance at a cost of two pointers in every subclass vtable. Change-Id: Ied4f91d4d203b5e6d83abe751159eb7e55489bb5 Reviewed-on: https://pdfium-review.googlesource.com/38530 Commit-Queue: Tom Sepez <tsepez@chromium.org> Reviewed-by: Lei Zhang <thestig@chromium.org>
-rw-r--r--BUILD.gn1
-rw-r--r--fxjs/cfxjse_engine.cpp20
-rw-r--r--fxjs/cfxjse_formcalc_context.cpp14
-rw-r--r--fxjs/cfxjse_formcalc_context.h3
-rw-r--r--fxjs/fxjse.cpp19
-rw-r--r--fxjs/fxjse.h15
-rw-r--r--xfa/fxfa/parser/cxfa_object.cpp9
-rw-r--r--xfa/fxfa/parser/cxfa_object.h3
8 files changed, 52 insertions, 32 deletions
diff --git a/BUILD.gn b/BUILD.gn
index 135d392e0c..576fe2a414 100644
--- a/BUILD.gn
+++ b/BUILD.gn
@@ -1323,6 +1323,7 @@ jumbo_static_library("fxjs") {
"fxjs/cfxjse_runtimedata.h",
"fxjs/cfxjse_value.cpp",
"fxjs/cfxjse_value.h",
+ "fxjs/fxjse.cpp",
"fxjs/fxjse.h",
"fxjs/xfa/cjx_arc.cpp",
"fxjs/xfa/cjx_arc.h",
diff --git a/fxjs/cfxjse_engine.cpp b/fxjs/cfxjse_engine.cpp
index 9b54555a21..62376dd822 100644
--- a/fxjs/cfxjse_engine.cpp
+++ b/fxjs/cfxjse_engine.cpp
@@ -77,20 +77,16 @@ CXFA_Object* CFXJSE_Engine::ToObject(
if (!info.Holder()->IsObject())
return nullptr;
- CFXJSE_HostObject* hostObj =
+ CFXJSE_HostObject* pHostObj =
FXJSE_RetrieveObjectBinding(info.Holder().As<v8::Object>(), nullptr);
- if (!hostObj || hostObj->type() != CFXJSE_HostObject::kXFA)
- return nullptr;
- return static_cast<CXFA_Object*>(hostObj);
+ return pHostObj ? pHostObj->AsCXFAObject() : nullptr;
}
// static.
CXFA_Object* CFXJSE_Engine::ToObject(CFXJSE_Value* pValue,
CFXJSE_Class* pClass) {
CFXJSE_HostObject* pHostObj = pValue->ToHostObject(pClass);
- if (!pHostObj || pHostObj->type() != CFXJSE_HostObject::kXFA)
- return nullptr;
- return static_cast<CXFA_Object*>(pHostObj);
+ return pHostObj ? pHostObj->AsCXFAObject() : nullptr;
}
CFXJSE_Engine::CFXJSE_Engine(CXFA_Document* pDocument,
@@ -791,16 +787,12 @@ void CFXJSE_Engine::AddNodesOfRunScript(CXFA_Node* pNode) {
}
CXFA_Object* CFXJSE_Engine::ToXFAObject(v8::Local<v8::Value> obj) {
- ASSERT(!obj.IsEmpty());
-
- if (!obj->IsObject())
+ if (obj.IsEmpty() || !obj->IsObject())
return nullptr;
- CFXJSE_HostObject* hostObj =
+ CFXJSE_HostObject* pHostObj =
FXJSE_RetrieveObjectBinding(obj.As<v8::Object>(), nullptr);
- if (!hostObj || hostObj->type() != CFXJSE_HostObject::kXFA)
- return nullptr;
- return static_cast<CXFA_Object*>(hostObj);
+ return pHostObj ? pHostObj->AsCXFAObject() : nullptr;
}
v8::Local<v8::Value> CFXJSE_Engine::NewXFAObject(
diff --git a/fxjs/cfxjse_formcalc_context.cpp b/fxjs/cfxjse_formcalc_context.cpp
index c7433b4b2b..b0a26d86a4 100644
--- a/fxjs/cfxjse_formcalc_context.cpp
+++ b/fxjs/cfxjse_formcalc_context.cpp
@@ -450,9 +450,7 @@ bool PatternStringType(const ByteStringView& szPattern, uint32_t& patternType) {
CFXJSE_FormCalcContext* ToFormCalcContext(CFXJSE_Value* pValue) {
CFXJSE_HostObject* pHostObj = pValue->ToHostObject(nullptr);
- if (!pHostObj || pHostObj->type() != CFXJSE_HostObject::kFM2JS)
- return nullptr;
- return static_cast<CFXJSE_FormCalcContext*>(pHostObj);
+ return pHostObj ? pHostObj->AsFormCalcContext() : nullptr;
}
bool IsWhitespace(char c) {
@@ -6177,15 +6175,13 @@ bool CFXJSE_FormCalcContext::Translate(const WideStringView& wsFormcalc,
return false;
wsJavascript->AppendChar(0);
-
return !CXFA_IsTooBig(wsJavascript);
}
CFXJSE_FormCalcContext::CFXJSE_FormCalcContext(v8::Isolate* pScriptIsolate,
CFXJSE_Context* pScriptContext,
CXFA_Document* pDoc)
- : CFXJSE_HostObject(kFM2JS),
- m_pIsolate(pScriptIsolate),
+ : m_pIsolate(pScriptIsolate),
m_pFMClass(CFXJSE_Class::Create(pScriptContext,
&kFormCalcFM2JSDescriptor,
false)),
@@ -6194,7 +6190,11 @@ CFXJSE_FormCalcContext::CFXJSE_FormCalcContext(v8::Isolate* pScriptIsolate,
m_pValue.get()->SetObject(this, m_pFMClass);
}
-CFXJSE_FormCalcContext::~CFXJSE_FormCalcContext() {}
+CFXJSE_FormCalcContext::~CFXJSE_FormCalcContext() = default;
+
+CFXJSE_FormCalcContext* CFXJSE_FormCalcContext::AsFormCalcContext() {
+ return this;
+}
void CFXJSE_FormCalcContext::GlobalPropertyGetter(CFXJSE_Value* pValue) {
pValue->Assign(m_pValue.get());
diff --git a/fxjs/cfxjse_formcalc_context.h b/fxjs/cfxjse_formcalc_context.h
index 052bba394a..8a92d9b0f1 100644
--- a/fxjs/cfxjse_formcalc_context.h
+++ b/fxjs/cfxjse_formcalc_context.h
@@ -25,6 +25,9 @@ class CFXJSE_FormCalcContext : public CFXJSE_HostObject {
CXFA_Document* pDoc);
~CFXJSE_FormCalcContext() override;
+ // CFXJSE_HostObject:
+ CFXJSE_FormCalcContext* AsFormCalcContext() override;
+
static void Abs(CFXJSE_Value* pThis,
const ByteStringView& szFuncName,
CFXJSE_Arguments& args);
diff --git a/fxjs/fxjse.cpp b/fxjs/fxjse.cpp
new file mode 100644
index 0000000000..68adaa5dd3
--- /dev/null
+++ b/fxjs/fxjse.cpp
@@ -0,0 +1,19 @@
+// 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
+
+#include "fxjs/fxjse.h"
+
+CFXJSE_HostObject::CFXJSE_HostObject() = default;
+
+CFXJSE_HostObject::~CFXJSE_HostObject() = default;
+
+CFXJSE_FormCalcContext* CFXJSE_HostObject::AsFormCalcContext() {
+ return nullptr;
+}
+
+CXFA_Object* CFXJSE_HostObject::AsCXFAObject() {
+ return nullptr;
+}
diff --git a/fxjs/fxjse.h b/fxjs/fxjse.h
index addd148117..3f2eb1d836 100644
--- a/fxjs/fxjse.h
+++ b/fxjs/fxjse.h
@@ -12,23 +12,22 @@
#include "v8/include/v8.h"
class CFXJSE_Arguments;
+class CFXJSE_FormCalcContext;
class CFXJSE_Value;
class CJS_Return;
+class CXFA_Object;
// C++ object which is retrieved from v8 object's slot.
class CFXJSE_HostObject {
public:
- virtual ~CFXJSE_HostObject() {}
+ virtual ~CFXJSE_HostObject();
- // Small layering violation here, but we need to distinguish between the
- // two kinds of subclasses.
- enum Type { kXFA, kFM2JS };
- Type type() const { return type_; }
+ // Two subclasses.
+ virtual CFXJSE_FormCalcContext* AsFormCalcContext();
+ virtual CXFA_Object* AsCXFAObject();
protected:
- explicit CFXJSE_HostObject(Type type) { type_ = type; }
-
- Type type_;
+ CFXJSE_HostObject();
};
typedef CJS_Return (*FXJSE_MethodCallback)(
diff --git a/xfa/fxfa/parser/cxfa_object.cpp b/xfa/fxfa/parser/cxfa_object.cpp
index a716c651f5..920e33860e 100644
--- a/xfa/fxfa/parser/cxfa_object.cpp
+++ b/xfa/fxfa/parser/cxfa_object.cpp
@@ -22,15 +22,18 @@ CXFA_Object::CXFA_Object(CXFA_Document* pDocument,
XFA_Element elementType,
const WideStringView& elementName,
std::unique_ptr<CJX_Object> jsObject)
- : CFXJSE_HostObject(kXFA),
- m_pDocument(pDocument),
+ : m_pDocument(pDocument),
m_objectType(objectType),
m_elementType(elementType),
m_elementNameHash(FX_HashCode_GetW(elementName, false)),
m_elementName(elementName),
m_pJSObject(std::move(jsObject)) {}
-CXFA_Object::~CXFA_Object() {}
+CXFA_Object::~CXFA_Object() = default;
+
+CXFA_Object* CXFA_Object::AsCXFAObject() {
+ return this;
+}
WideString CXFA_Object::GetSOMExpression() {
CFXJSE_Engine* pScriptContext = m_pDocument->GetScriptContext();
diff --git a/xfa/fxfa/parser/cxfa_object.h b/xfa/fxfa/parser/cxfa_object.h
index 20412dcbf7..023516a05e 100644
--- a/xfa/fxfa/parser/cxfa_object.h
+++ b/xfa/fxfa/parser/cxfa_object.h
@@ -36,6 +36,9 @@ class CXFA_Object : public CFXJSE_HostObject {
public:
~CXFA_Object() override;
+ // CFXJSE_HostObject:
+ CXFA_Object* AsCXFAObject() override;
+
CXFA_Document* GetDocument() const { return m_pDocument.Get(); }
XFA_ObjectType GetObjectType() const { return m_objectType; }