Upgrade V8 to version 4.9.385.28

https://chromium.googlesource.com/v8/v8/+/4.9.385.28

FPIIM-449

Change-Id: I4b2e74289d4bf3667f2f3dc8aa2e541f63e26eb4
diff --git a/src/zone.h b/src/zone.h
index 6f552b6..753e203 100644
--- a/src/zone.h
+++ b/src/zone.h
@@ -17,35 +17,34 @@
 namespace v8 {
 namespace internal {
 
-
+// Forward declarations.
 class Segment;
-class Isolate;
+
 
 // The Zone supports very fast allocation of small chunks of
 // memory. The chunks cannot be deallocated individually, but instead
 // the Zone supports deallocating all chunks in one fast
 // operation. The Zone is used to hold temporary data structures like
 // the abstract syntax tree, which is deallocated after compilation.
-
+//
 // Note: There is no need to initialize the Zone; the first time an
 // allocation is attempted, a segment of memory will be requested
 // through a call to malloc().
-
+//
 // Note: The implementation is inherently not thread safe. Do not use
 // from multi-threaded code.
-
-class Zone {
+class Zone final {
  public:
-  explicit Zone(Isolate* isolate);
+  Zone();
   ~Zone();
+
   // Allocate 'size' bytes of memory in the Zone; expands the Zone by
   // allocating new segments of memory on demand using malloc().
-  void* New(int size);
+  void* New(size_t size);
 
   template <typename T>
-  T* NewArray(int length) {
-    CHECK(std::numeric_limits<int>::max() / static_cast<int>(sizeof(T)) >
-          length);
+  T* NewArray(size_t length) {
+    DCHECK_LT(length, std::numeric_limits<size_t>::max() / sizeof(T));
     return static_cast<T*>(New(length * sizeof(T)));
   }
 
@@ -59,59 +58,55 @@
 
   // Returns true if more memory has been allocated in zones than
   // the limit allows.
-  inline bool excess_allocation();
+  bool excess_allocation() const {
+    return segment_bytes_allocated_ > kExcessLimit;
+  }
 
-  inline void adjust_segment_bytes_allocated(int delta);
-
-  inline unsigned allocation_size() const { return allocation_size_; }
-
-  inline Isolate* isolate() const { return isolate_; }
+  size_t allocation_size() const { return allocation_size_; }
 
  private:
-  friend class Isolate;
-
   // All pointers returned from New() have this alignment.  In addition, if the
   // object being allocated has a size that is divisible by 8 then its alignment
   // will be 8. ASan requires 8-byte alignment.
 #ifdef V8_USE_ADDRESS_SANITIZER
-  static const int kAlignment = 8;
+  static const size_t kAlignment = 8;
   STATIC_ASSERT(kPointerSize <= 8);
 #else
-  static const int kAlignment = kPointerSize;
+  static const size_t kAlignment = kPointerSize;
 #endif
 
   // Never allocate segments smaller than this size in bytes.
-  static const int kMinimumSegmentSize = 8 * KB;
+  static const size_t kMinimumSegmentSize = 8 * KB;
 
   // Never allocate segments larger than this size in bytes.
-  static const int kMaximumSegmentSize = 1 * MB;
+  static const size_t kMaximumSegmentSize = 1 * MB;
 
   // Never keep segments larger than this size in bytes around.
-  static const int kMaximumKeptSegmentSize = 64 * KB;
+  static const size_t kMaximumKeptSegmentSize = 64 * KB;
 
   // Report zone excess when allocation exceeds this limit.
-  static const int kExcessLimit = 256 * MB;
+  static const size_t kExcessLimit = 256 * MB;
 
   // The number of bytes allocated in this zone so far.
-  unsigned allocation_size_;
+  size_t allocation_size_;
 
   // The number of bytes allocated in segments.  Note that this number
   // includes memory allocated from the OS but not yet allocated from
   // the zone.
-  int segment_bytes_allocated_;
+  size_t segment_bytes_allocated_;
 
   // Expand the Zone to hold at least 'size' more bytes and allocate
   // the bytes. Returns the address of the newly allocated chunk of
   // memory in the Zone. Should only be called if there isn't enough
   // room in the Zone already.
-  Address NewExpand(int size);
+  Address NewExpand(size_t size);
 
   // Creates a new segment, sets it size, and pushes it to the front
   // of the segment chain. Returns the new segment.
-  INLINE(Segment* NewSegment(int size));
+  inline Segment* NewSegment(size_t size);
 
   // Deletes the given segment. Does not touch the segment chain.
-  INLINE(void DeleteSegment(Segment* segment, int size));
+  inline void DeleteSegment(Segment* segment, size_t size);
 
   // The free region in the current (front) segment is represented as
   // the half-open interval [position, limit). The 'position' variable
@@ -120,7 +115,6 @@
   Address limit_;
 
   Segment* segment_head_;
-  Isolate* isolate_;
 };
 
 
@@ -129,7 +123,7 @@
 class ZoneObject {
  public:
   // Allocate a new ZoneObject of 'size' bytes in the Zone.
-  INLINE(void* operator new(size_t size, Zone* zone));
+  void* operator new(size_t size, Zone* zone) { return zone->New(size); }
 
   // Ideally, the delete operator should be private instead of
   // public, but unfortunately the compiler sometimes synthesizes
@@ -146,12 +140,12 @@
 
 // The ZoneScope is used to automatically call DeleteAll() on a
 // Zone when the ZoneScope is destroyed (i.e. goes out of scope)
-struct ZoneScope {
+class ZoneScope final {
  public:
   explicit ZoneScope(Zone* zone) : zone_(zone) { }
   ~ZoneScope() { zone_->DeleteAll(); }
 
-  Zone* zone() { return zone_; }
+  Zone* zone() const { return zone_; }
 
  private:
   Zone* zone_;
@@ -160,12 +154,12 @@
 
 // The ZoneAllocationPolicy is used to specialize generic data
 // structures to allocate themselves and their elements in the Zone.
-struct ZoneAllocationPolicy {
+class ZoneAllocationPolicy final {
  public:
   explicit ZoneAllocationPolicy(Zone* zone) : zone_(zone) { }
-  INLINE(void* New(size_t size));
-  INLINE(static void Delete(void *pointer)) { }
-  Zone* zone() { return zone_; }
+  void* New(size_t size) { return zone()->New(size); }
+  static void Delete(void* pointer) {}
+  Zone* zone() const { return zone_; }
 
  private:
   Zone* zone_;
@@ -176,15 +170,15 @@
 // elements. The list itself and all its elements are allocated in the
 // Zone. ZoneLists cannot be deleted individually; you can delete all
 // objects in the Zone by calling Zone::DeleteAll().
-template<typename T>
-class ZoneList: public List<T, ZoneAllocationPolicy> {
+template <typename T>
+class ZoneList final : public List<T, ZoneAllocationPolicy> {
  public:
   // Construct a new ZoneList with the given capacity; the length is
   // always zero. The capacity must be non-negative.
   ZoneList(int capacity, Zone* zone)
       : List<T, ZoneAllocationPolicy>(capacity, ZoneAllocationPolicy(zone)) { }
 
-  INLINE(void* operator new(size_t size, Zone* zone));
+  void* operator new(size_t size, Zone* zone) { return zone->New(size); }
 
   // Construct a new ZoneList by copying the elements of the given ZoneList.
   ZoneList(const ZoneList<T>& other, Zone* zone)
@@ -195,27 +189,27 @@
 
   // We add some convenience wrappers so that we can pass in a Zone
   // instead of a (less convenient) ZoneAllocationPolicy.
-  INLINE(void Add(const T& element, Zone* zone)) {
+  void Add(const T& element, Zone* zone) {
     List<T, ZoneAllocationPolicy>::Add(element, ZoneAllocationPolicy(zone));
   }
-  INLINE(void AddAll(const List<T, ZoneAllocationPolicy>& other, Zone* zone)) {
+  void AddAll(const List<T, ZoneAllocationPolicy>& other, Zone* zone) {
     List<T, ZoneAllocationPolicy>::AddAll(other, ZoneAllocationPolicy(zone));
   }
-  INLINE(void AddAll(const Vector<T>& other, Zone* zone)) {
+  void AddAll(const Vector<T>& other, Zone* zone) {
     List<T, ZoneAllocationPolicy>::AddAll(other, ZoneAllocationPolicy(zone));
   }
-  INLINE(void InsertAt(int index, const T& element, Zone* zone)) {
+  void InsertAt(int index, const T& element, Zone* zone) {
     List<T, ZoneAllocationPolicy>::InsertAt(index, element,
                                             ZoneAllocationPolicy(zone));
   }
-  INLINE(Vector<T> AddBlock(T value, int count, Zone* zone)) {
+  Vector<T> AddBlock(T value, int count, Zone* zone) {
     return List<T, ZoneAllocationPolicy>::AddBlock(value, count,
                                                    ZoneAllocationPolicy(zone));
   }
-  INLINE(void Allocate(int length, Zone* zone)) {
+  void Allocate(int length, Zone* zone) {
     List<T, ZoneAllocationPolicy>::Allocate(length, ZoneAllocationPolicy(zone));
   }
-  INLINE(void Initialize(int capacity, Zone* zone)) {
+  void Initialize(int capacity, Zone* zone) {
     List<T, ZoneAllocationPolicy>::Initialize(capacity,
                                               ZoneAllocationPolicy(zone));
   }
@@ -229,13 +223,18 @@
 // different configurations of a concrete splay tree (see splay-tree.h).
 // The tree itself and all its elements are allocated in the Zone.
 template <typename Config>
-class ZoneSplayTree: public SplayTree<Config, ZoneAllocationPolicy> {
+class ZoneSplayTree final : public SplayTree<Config, ZoneAllocationPolicy> {
  public:
   explicit ZoneSplayTree(Zone* zone)
       : SplayTree<Config, ZoneAllocationPolicy>(ZoneAllocationPolicy(zone)) {}
-  ~ZoneSplayTree();
+  ~ZoneSplayTree() {
+    // Reset the root to avoid unneeded iteration over all tree nodes
+    // in the destructor.  For a zone-allocated tree, nodes will be
+    // freed by the Zone.
+    SplayTree<Config, ZoneAllocationPolicy>::ResetRoot();
+  }
 
-  INLINE(void* operator new(size_t size, Zone* zone));
+  void* operator new(size_t size, Zone* zone) { return zone->New(size); }
 
   void operator delete(void* pointer) { UNREACHABLE(); }
   void operator delete(void* pointer, Zone* zone) { UNREACHABLE(); }
@@ -244,6 +243,7 @@
 
 typedef TemplateHashMapImpl<ZoneAllocationPolicy> ZoneHashMap;
 
-} }  // namespace v8::internal
+}  // namespace internal
+}  // namespace v8
 
 #endif  // V8_ZONE_H_