Commit e6a17a63 authored by Ted Campbell's avatar Ted Campbell
Browse files

Bug 1605207 - Fixup XDR of FieldInitializers. r=jandem

Move the transcoding from XDRLazyScript and XDRRelazificationInfo into
LazyScript::XDRScriptData to avoid duplication. Add similar code for non-lazy
scripts for consistency.

Depends on D57919

Differential Revision: https://phabricator.services.mozilla.com/D57920

--HG--
extra : moz-landing-system : lando
parent 1c36041c
Loading
Loading
Loading
Loading
+34 −29
Original line number Diff line number Diff line
@@ -244,12 +244,24 @@ template <XDRMode mode>
/* static */
XDRResult LazyScript::XDRScriptData(XDRState<mode>* xdr,
                                    HandleScriptSourceObject sourceObject,
                                    Handle<LazyScript*> lazy) {
                                    Handle<LazyScript*> lazy,
                                    bool hasFieldInitializers) {
  JSContext* cx = xdr->cx();

  RootedAtom atom(cx);
  RootedFunction func(cx);

  if (hasFieldInitializers) {
    uint32_t numFieldInitializers;
    if (mode == XDR_ENCODE) {
      numFieldInitializers = lazy->getFieldInitializers().numFieldInitializers;
    }
    MOZ_TRY(xdr->codeUint32(&numFieldInitializers));
    if (mode == XDR_DECODE) {
      lazy->setFieldInitializers(FieldInitializers(numFieldInitializers));
    }
  }

  mozilla::Span<JS::GCCellPtr> gcThings =
      lazy->data_ ? lazy->data_->gcthings() : mozilla::Span<JS::GCCellPtr>();

@@ -325,7 +337,6 @@ static XDRResult XDRRelazificationInfo(XDRState<mode>* xdr, HandleFunction fun,
    uint32_t toStringEnd = script->toStringEnd();
    uint32_t lineno = script->lineno();
    uint32_t column = script->column();
    uint32_t numFieldInitializers;

    if (mode == XDR_ENCODE) {
      immutableFlags = lazy->immutableFlags();
@@ -336,16 +347,9 @@ static XDRResult XDRRelazificationInfo(XDRState<mode>* xdr, HandleFunction fun,
      MOZ_ASSERT(toStringEnd == lazy->toStringEnd());
      MOZ_ASSERT(lineno == lazy->lineno());
      MOZ_ASSERT(column == lazy->column());
      if (fun->isClassConstructor()) {
        numFieldInitializers =
            (uint32_t)lazy->getFieldInitializers().numFieldInitializers;
      } else {
        numFieldInitializers = UINT32_MAX;
      }
    }

    MOZ_TRY(xdr->codeUint32(&immutableFlags));
    MOZ_TRY(xdr->codeUint32(&numFieldInitializers));
    MOZ_TRY(xdr->codeUint32(&ngcthings));

    if (mode == XDR_DECODE) {
@@ -356,11 +360,6 @@ static XDRResult XDRRelazificationInfo(XDRState<mode>* xdr, HandleFunction fun,
      if (!lazy) {
        return xdr->fail(JS::TranscodeResult_Throw);
      }

      if (numFieldInitializers != UINT32_MAX) {
        lazy->setFieldInitializers(
            FieldInitializers((size_t)numFieldInitializers));
      }
    }
  }

@@ -368,7 +367,10 @@ static XDRResult XDRRelazificationInfo(XDRState<mode>* xdr, HandleFunction fun,
  // with inner functions. See JSFunction::delazifyLazilyInterpretedFunction.
  MOZ_ASSERT(!lazy->hasInnerFunctions());

  MOZ_TRY(LazyScript::XDRScriptData(xdr, sourceObject, lazy));
  bool hasFieldInitializers = fun->isClassConstructor();

  MOZ_TRY(
      LazyScript::XDRScriptData(xdr, sourceObject, lazy, hasFieldInitializers));

  return Ok();
}
@@ -714,6 +716,19 @@ XDRResult js::PrivateScriptData::XDR(XDRState<mode>* xdr, HandleScript script,
    data = script->data_;
  }

  // Code the field initilizer data.
  if (funOrMod && funOrMod->is<JSFunction>() &&
      funOrMod->as<JSFunction>().isClassConstructor()) {
    uint32_t numFieldInitializers;
    if (mode == XDR_ENCODE) {
      numFieldInitializers = data->getFieldInitializers().numFieldInitializers;
    }
    MOZ_TRY(xdr->codeUint32(&numFieldInitializers));
    if (mode == XDR_DECODE) {
      data->setFieldInitializers(FieldInitializers(numFieldInitializers));
    }
  }

  bool isFirstScope = true;
  for (JS::GCCellPtr& gcThing : data->gcthings()) {
    MOZ_TRY(XDRScriptGCThing(xdr, data, sourceObject, scriptEnclosingScope,
@@ -1291,7 +1306,6 @@ XDRResult js::XDRLazyScript(XDRState<mode>* xdr, HandleScope enclosingScope,
    uint32_t lineno;
    uint32_t column;
    uint32_t immutableFlags;
    uint32_t numFieldInitializers;
    uint32_t ngcthings;

    if (mode == XDR_ENCODE) {
@@ -1308,12 +1322,6 @@ XDRResult js::XDRLazyScript(XDRState<mode>* xdr, HandleScope enclosingScope,
      lineno = lazy->lineno();
      column = lazy->column();
      immutableFlags = lazy->immutableFlags();
      if (fun->isClassConstructor()) {
        numFieldInitializers =
            (uint32_t)lazy->getFieldInitializers().numFieldInitializers;
      } else {
        numFieldInitializers = UINT32_MAX;
      }
      ngcthings = lazy->gcthings().size();
    }

@@ -1324,7 +1332,6 @@ XDRResult js::XDRLazyScript(XDRState<mode>* xdr, HandleScope enclosingScope,
    MOZ_TRY(xdr->codeUint32(&lineno));
    MOZ_TRY(xdr->codeUint32(&column));
    MOZ_TRY(xdr->codeUint32(&immutableFlags));
    MOZ_TRY(xdr->codeUint32(&numFieldInitializers));
    MOZ_TRY(xdr->codeUint32(&ngcthings));

    if (mode == XDR_DECODE) {
@@ -1336,16 +1343,14 @@ XDRResult js::XDRLazyScript(XDRState<mode>* xdr, HandleScope enclosingScope,
        return xdr->fail(JS::TranscodeResult_Throw);
      }

      if (numFieldInitializers != UINT32_MAX) {
        lazy->setFieldInitializers(
            FieldInitializers((size_t)numFieldInitializers));
      }

      fun->initLazyScript(lazy);
    }
  }

  MOZ_TRY(LazyScript::XDRScriptData(xdr, sourceObject, lazy));
  bool hasFieldInitializers = fun->isClassConstructor();

  MOZ_TRY(
      LazyScript::XDRScriptData(xdr, sourceObject, lazy, hasFieldInitializers));

  return Ok();
}
+2 −1
Original line number Diff line number Diff line
@@ -3390,7 +3390,8 @@ class LazyScript : public BaseScript {
  template <XDRMode mode>
  static XDRResult XDRScriptData(XDRState<mode>* xdr,
                                 HandleScriptSourceObject sourceObject,
                                 Handle<LazyScript*> lazy);
                                 Handle<LazyScript*> lazy,
                                 bool hasFieldInitializer);

  void initScript(JSScript* script);