Commit 6619fa52 authored by André Bargull's avatar André Bargull
Browse files

Bug 1535804 - Part 3: Add iterator_traits to ListNode iterator. r=jorendorff

This allows to convert two loops to use `std::count_if` and will also be used
in later patches.

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

--HG--
extra : moz-landing-system : lando
parent 25c712d6
Loading
Loading
Loading
Loading
+14 −15
Original line number Diff line number Diff line
@@ -8676,12 +8676,13 @@ bool BytecodeEmitter::emitObjLiteralValue(ObjLiteralCreationData* data,

mozilla::Maybe<FieldInitializers> BytecodeEmitter::setupFieldInitializers(
    ListNode* classMembers) {
  size_t numFields = 0;
  for (ParseNode* propdef : classMembers->contents()) {
    if (propdef->is<ClassField>()) {
      numFields++;
    }
  }
  auto isClassField = [](ParseNode* propdef) {
    return propdef->is<ClassField>();
  };

  size_t numFields =
      std::count_if(classMembers->contents().begin(),
                    classMembers->contents().end(), isClassField);
  // If there are more initializers than can be represented, return invalid.
  if (numFields > FieldInitializers::MaxInitializers) {
    return Nothing();
@@ -8714,16 +8715,14 @@ mozilla::Maybe<FieldInitializers> BytecodeEmitter::setupFieldInitializers(
// BytecodeEmitter::emitPropertyList fills in the elements of the array.
// See GeneralParser::fieldInitializer for the `this[.fieldKeys[0]]` part.
bool BytecodeEmitter::emitCreateFieldKeys(ListNode* obj) {
  size_t numFieldKeys = 0;
  for (ParseNode* propdef : obj->contents()) {
    if (propdef->is<ClassField>()) {
      ClassField* field = &propdef->as<ClassField>();
      if (field->name().getKind() == ParseNodeKind::ComputedName) {
        numFieldKeys++;
      }
    }
  }
  auto isFieldWithComputedName = [](ParseNode* propdef) {
    return propdef->is<ClassField>() &&
           propdef->as<ClassField>().name().getKind() ==
               ParseNodeKind::ComputedName;
  };

  size_t numFieldKeys = std::count_if(
      obj->contents().begin(), obj->contents().end(), isFieldWithComputedName);
  if (numFieldKeys == 0) {
    return true;
  }
+9 −0
Original line number Diff line number Diff line
@@ -10,6 +10,8 @@
#include "mozilla/Attributes.h"
#include "mozilla/Variant.h"

#include <iterator>

#include "frontend/Stencil.h"
#include "frontend/Token.h"
#include "util/Text.h"
@@ -1342,6 +1344,13 @@ class ListNode : public ParseNode {
    explicit iterator(ParseNode* node) : node_(node) {}

   public:
    // Implement std::iterator_traits.
    using iterator_category = std::input_iterator_tag;
    using value_type = ParseNode*;
    using difference_type = ptrdiff_t;
    using pointer = ParseNode**;
    using reference = ParseNode*&;

    bool operator==(const iterator& other) const {
      return node_ == other.node_;
    }