elements.h revision 69a99ed0b2b2ef69d393c371b03db3a98aaf880e
169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch// Copyright 2011 the V8 project authors. All rights reserved.
269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch// Redistribution and use in source and binary forms, with or without
369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch// modification, are permitted provided that the following conditions are
469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch// met:
569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch//
669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch//     * Redistributions of source code must retain the above copyright
769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch//       notice, this list of conditions and the following disclaimer.
869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch//     * Redistributions in binary form must reproduce the above
969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch//       copyright notice, this list of conditions and the following
1069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch//       disclaimer in the documentation and/or other materials provided
1169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch//       with the distribution.
1269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch//     * Neither the name of Google Inc. nor the names of its
1369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch//       contributors may be used to endorse or promote products derived
1469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch//       from this software without specific prior written permission.
1569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch//
1669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
1769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
1869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
1969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
2269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
2869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch#ifndef V8_ELEMENTS_H_
2969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch#define V8_ELEMENTS_H_
3069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
3169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch#include "objects.h"
3269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
3369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdochnamespace v8 {
3469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdochnamespace internal {
3569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
3669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch// Abstract base class for handles that can operate on objects with differing
3769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch// ElementsKinds.
3869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdochclass ElementsAccessor {
3969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch public:
4069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  ElementsAccessor() { }
4169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  virtual ~ElementsAccessor() { }
4269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  virtual MaybeObject* Get(FixedArrayBase* backing_store,
4369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch                           uint32_t key,
4469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch                           JSObject* holder,
4569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch                           Object* receiver) = 0;
4669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
4769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  virtual MaybeObject* Delete(JSObject* holder,
4869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch                              uint32_t key,
4969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch                              JSReceiver::DeleteMode mode) = 0;
5069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
5169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  virtual MaybeObject* AddElementsToFixedArray(FixedArrayBase* from,
5269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch                                               FixedArray* to,
5369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch                                               JSObject* holder,
5469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch                                               Object* receiver) = 0;
5569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
5669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  // Returns a shared ElementsAccessor for the specified ElementsKind.
5769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  static ElementsAccessor* ForKind(JSObject::ElementsKind elements_kind) {
5869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch    ASSERT(elements_kind < JSObject::kElementsKindCount);
5969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch    return elements_accessors_[elements_kind];
6069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  }
6169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
6269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  static ElementsAccessor* ForArray(FixedArrayBase* array);
6369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
6469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  static void InitializeOncePerProcess();
6569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
6669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch protected:
6769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  friend class NonStrictArgumentsElementsAccessor;
6869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
6969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  virtual uint32_t GetCapacity(FixedArrayBase* backing_store) = 0;
7069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
7169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  virtual bool HasElementAtIndex(FixedArrayBase* backing_store,
7269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch                                 uint32_t index,
7369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch                                 JSObject* holder,
7469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch                                 Object* receiver) = 0;
7569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
7669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  // Element handlers distinguish between indexes and keys when the manipulate
7769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  // elements.  Indexes refer to elements in terms of their location in the
7869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  // underlying storage's backing store representation, and are between 0
7969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  // GetCapacity.  Keys refer to elements in terms of the value that would be
8069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  // specific in JavaScript to access the element. In most implementations, keys
8169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  // are equivalent to indexes, and GetKeyForIndex returns the same value it is
8269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  // passed. In the NumberDictionary ElementsAccessor, GetKeyForIndex maps the
8369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  // index to a key using the KeyAt method on the NumberDictionary.
8469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  virtual uint32_t GetKeyForIndex(FixedArrayBase* backing_store,
8569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch                                  uint32_t index) = 0;
8669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
8769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch private:
8869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  static ElementsAccessor** elements_accessors_;
8969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
9069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  DISALLOW_COPY_AND_ASSIGN(ElementsAccessor);
9169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch};
9269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
9369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch} }  // namespace v8::internal
9469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
9569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch#endif  // V8_ELEMENTS_H_
96