Home | History | Annotate | Download | only in interpreter
      1 // Copyright 2015 the V8 project authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #ifndef V8_INTERPRETER_CONSTANT_ARRAY_BUILDER_H_
      6 #define V8_INTERPRETER_CONSTANT_ARRAY_BUILDER_H_
      7 
      8 #include "src/identity-map.h"
      9 #include "src/interpreter/bytecodes.h"
     10 #include "src/zone-containers.h"
     11 
     12 namespace v8 {
     13 namespace internal {
     14 
     15 class Isolate;
     16 
     17 namespace interpreter {
     18 
     19 // A helper class for constructing constant arrays for the
     20 // interpreter. Each instance of this class is intended to be used to
     21 // generate exactly one FixedArray of constants via the ToFixedArray
     22 // method.
     23 class ConstantArrayBuilder final BASE_EMBEDDED {
     24  public:
     25   // Capacity of the 8-bit operand slice.
     26   static const size_t k8BitCapacity = 1u << kBitsPerByte;
     27 
     28   // Capacity of the 16-bit operand slice.
     29   static const size_t k16BitCapacity = (1u << 2 * kBitsPerByte) - k8BitCapacity;
     30 
     31   // Capacity of the 32-bit operand slice.
     32   static const size_t k32BitCapacity =
     33       kMaxUInt32 - k16BitCapacity - k8BitCapacity + 1;
     34 
     35   ConstantArrayBuilder(Isolate* isolate, Zone* zone);
     36 
     37   // Generate a fixed array of constants based on inserted objects.
     38   Handle<FixedArray> ToFixedArray();
     39 
     40   // Returns the object in the constant pool array that at index
     41   // |index|.
     42   Handle<Object> At(size_t index) const;
     43 
     44   // Returns the number of elements in the array.
     45   size_t size() const;
     46 
     47   // Insert an object into the constants array if it is not already
     48   // present. Returns the array index associated with the object.
     49   size_t Insert(Handle<Object> object);
     50 
     51   // Creates a reserved entry in the constant pool and returns
     52   // the size of the operand that'll be required to hold the entry
     53   // when committed.
     54   OperandSize CreateReservedEntry();
     55 
     56   // Commit reserved entry and returns the constant pool index for the
     57   // object.
     58   size_t CommitReservedEntry(OperandSize operand_size, Handle<Object> object);
     59 
     60   // Discards constant pool reservation.
     61   void DiscardReservedEntry(OperandSize operand_size);
     62 
     63  private:
     64   typedef uint32_t index_t;
     65 
     66   index_t AllocateEntry(Handle<Object> object);
     67 
     68   struct ConstantArraySlice final : public ZoneObject {
     69     ConstantArraySlice(Zone* zone, size_t start_index, size_t capacity,
     70                        OperandSize operand_size);
     71     void Reserve();
     72     void Unreserve();
     73     size_t Allocate(Handle<Object> object);
     74     Handle<Object> At(size_t index) const;
     75 
     76     inline size_t available() const { return capacity() - reserved() - size(); }
     77     inline size_t reserved() const { return reserved_; }
     78     inline size_t capacity() const { return capacity_; }
     79     inline size_t size() const { return constants_.size(); }
     80     inline size_t start_index() const { return start_index_; }
     81     inline size_t max_index() const { return start_index_ + capacity() - 1; }
     82     inline OperandSize operand_size() const { return operand_size_; }
     83 
     84    private:
     85     const size_t start_index_;
     86     const size_t capacity_;
     87     size_t reserved_;
     88     OperandSize operand_size_;
     89     ZoneVector<Handle<Object>> constants_;
     90 
     91     DISALLOW_COPY_AND_ASSIGN(ConstantArraySlice);
     92   };
     93 
     94   const ConstantArraySlice* IndexToSlice(size_t index) const;
     95   ConstantArraySlice* OperandSizeToSlice(OperandSize operand_size) const;
     96 
     97   IdentityMap<index_t>* constants_map() { return &constants_map_; }
     98 
     99   Isolate* isolate_;
    100   ConstantArraySlice* idx_slice_[3];
    101   IdentityMap<index_t> constants_map_;
    102 };
    103 
    104 }  // namespace interpreter
    105 }  // namespace internal
    106 }  // namespace v8
    107 
    108 #endif  // V8_INTERPRETER_CONSTANT_ARRAY_BUILDER_H_
    109