From 4e85fbbd8b1c05b58f67759226b8cfe2b72377f8 Mon Sep 17 00:00:00 2001
From: Tooru Fujisawa <arai_a@mac.com>
Date: Tue, 21 Sep 2021 18:45:19 +0000
Subject: [PATCH] Bug 1688791 - Part 8: Remove virtual from XDRState and cast
 to XDRStencilDecoder when getting options. r=tcampbell

Differential Revision: https://phabricator.services.mozilla.com/D121274
---
 js/src/frontend/StencilXdr.cpp | 24 ++++++++++++++----------
 js/src/vm/Xdr.h                | 10 ++--------
 2 files changed, 16 insertions(+), 18 deletions(-)

diff --git a/js/src/frontend/StencilXdr.cpp b/js/src/frontend/StencilXdr.cpp
index 50574b2e7c6c8..0116833b075a2 100644
--- a/js/src/frontend/StencilXdr.cpp
+++ b/js/src/frontend/StencilXdr.cpp
@@ -134,11 +134,12 @@ static XDRResult XDRSpanContent(XDRState<mode>* xdr, LifoAlloc& alloc,
     MOZ_TRY(xdr->align32());
 
     T* data;
-    if (mode == XDR_ENCODE) {
+    if constexpr (mode == XDR_ENCODE) {
       data = span.data();
       MOZ_TRY(xdr->codeBytes(data, sizeof(T) * size));
     } else {
-      if (xdr->hasOptions() && xdr->options().borrowBuffer) {
+      const auto& options = static_cast<XDRStencilDecoder*>(xdr)->options();
+      if (options.borrowBuffer) {
         MOZ_TRY(xdr->borrowedData(&data, sizeof(T) * size));
       } else {
         data = alloc.template newArrayUninitialized<T>(size);
@@ -250,10 +251,11 @@ template <XDRMode mode>
   // for the specialized scope-data type without needing to encode
   // a distinguishing prefix.
   uint32_t totalLength = SizeOfParserScopeData(stencil.kind_, length);
-  if (mode == XDR_ENCODE) {
+  if constexpr (mode == XDR_ENCODE) {
     MOZ_TRY(xdr->codeBytes(baseScopeData, totalLength));
   } else {
-    if (xdr->hasOptions() && xdr->options().borrowBuffer) {
+    const auto& options = static_cast<XDRStencilDecoder*>(xdr)->options();
+    if (options.borrowBuffer) {
       MOZ_TRY(xdr->borrowedData(&baseScopeData, totalLength));
     } else {
       baseScopeData =
@@ -307,7 +309,7 @@ XDRResult StencilXDR::codeSharedData(XDRState<mode>* xdr,
   MOZ_TRY(xdr->align32());
   static_assert(alignof(ImmutableScriptData) <= alignof(uint32_t));
 
-  if (mode == XDR_ENCODE) {
+  if constexpr (mode == XDR_ENCODE) {
     uint8_t* data = const_cast<uint8_t*>(sisd->get()->immutableData().data());
     MOZ_ASSERT(data == reinterpret_cast<const uint8_t*>(sisd->get()),
                "Decode below relies on the data placement");
@@ -318,8 +320,9 @@ XDRResult StencilXDR::codeSharedData(XDRState<mode>* xdr,
       return xdr->fail(JS::TranscodeResult::Throw);
     }
 
-    if (xdr->hasOptions() && xdr->options().usePinnedBytecode) {
-      MOZ_ASSERT(xdr->options().borrowBuffer);
+    const auto& options = static_cast<XDRStencilDecoder*>(xdr)->options();
+    if (options.usePinnedBytecode) {
+      MOZ_ASSERT(options.borrowBuffer);
       ImmutableScriptData* isd;
       MOZ_TRY(xdr->borrowedData(&isd, size));
       sisd->setExternal(isd);
@@ -482,10 +485,11 @@ template <XDRMode mode>
       header->hasLatin1Chars() ? sizeof(JS::Latin1Char) : sizeof(char16_t);
   uint32_t totalLength = sizeof(ParserAtom) + (CharSize * header->length());
 
-  if (mode == XDR_ENCODE) {
+  if constexpr (mode == XDR_ENCODE) {
     MOZ_TRY(xdr->codeBytes(*atomp, totalLength));
   } else {
-    if (xdr->hasOptions() && xdr->options().borrowBuffer) {
+    const auto& options = static_cast<XDRStencilDecoder*>(xdr)->options();
+    if (options.borrowBuffer) {
       MOZ_TRY(xdr->borrowedData(atomp, totalLength));
     } else {
       *atomp = reinterpret_cast<ParserAtom*>(alloc.alloc(totalLength));
@@ -720,7 +724,7 @@ template <XDRMode mode>
   if (mode == XDR_DECODE) {
     stencil.canLazilyParse = canLazilyParse;
     // NOTE: stencil.canLazilyParse can be different than
-    //       CanLazilyParse(xdr->options()).
+    //       CanLazilyParse(static_cast<XDRStencilDecoder*>(xdr)->options()).
     //       See bug 1726498 for removing the redundancy.
   }
 
diff --git a/js/src/vm/Xdr.h b/js/src/vm/Xdr.h
index 27ab8c6b3486a..2985b17976a4c 100644
--- a/js/src/vm/Xdr.h
+++ b/js/src/vm/Xdr.h
@@ -222,15 +222,10 @@ class XDRState : public XDRCoderBase {
   XDRState(const XDRState&) = delete;
   XDRState& operator=(const XDRState&) = delete;
 
-  virtual ~XDRState() = default;
+  ~XDRState() = default;
 
   JSContext* cx() const { return mainBuf.cx(); }
 
-  virtual bool hasOptions() const { return false; }
-  virtual const JS::ReadOnlyCompileOptions& options() {
-    MOZ_CRASH("does not have options");
-  }
-
   template <typename T = mozilla::Ok>
   XDRResultT<T> fail(JS::TranscodeResult code) {
 #ifdef DEBUG
@@ -473,8 +468,7 @@ class XDRStencilDecoder : public XDRDecoderBase {
   XDRResult codeStencil(const JS::ReadOnlyCompileOptions& options,
                         frontend::CompilationStencil& stencil);
 
-  bool hasOptions() const override { return !!options_; }
-  const JS::ReadOnlyCompileOptions& options() override {
+  const JS::ReadOnlyCompileOptions& options() {
     MOZ_ASSERT(options_);
     return *options_;
   }
-- 
GitLab