Commit 1f9f8fe9 authored by ishell@chromium.org's avatar ishell@chromium.org

ElementsAccessor's public interface handlification.

R=yangguo@chromium.org

Review URL: https://codereview.chromium.org/225933002

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@20514 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
parent dd891816
...@@ -643,25 +643,11 @@ class ElementsAccessorBase : public ElementsAccessor { ...@@ -643,25 +643,11 @@ class ElementsAccessorBase : public ElementsAccessor {
Object); Object);
} }
// TODO(ishell): Temporary wrapper until handlified.
MUST_USE_RESULT virtual Handle<Object> Get(
Handle<Object> receiver,
Handle<JSObject> holder,
uint32_t key) V8_FINAL V8_OVERRIDE {
CALL_HEAP_FUNCTION(holder->GetIsolate(),
Get(*receiver, *holder, key, NULL),
Object);
}
MUST_USE_RESULT virtual MaybeObject* Get( MUST_USE_RESULT virtual MaybeObject* Get(
Object* receiver, Object* receiver,
JSObject* holder, JSObject* holder,
uint32_t key, uint32_t key,
FixedArrayBase* backing_store) V8_FINAL V8_OVERRIDE { FixedArrayBase* backing_store) V8_FINAL V8_OVERRIDE {
if (backing_store == NULL) {
backing_store = holder->elements();
}
if (!IsExternalArrayElementsKind(ElementsTraits::Kind) && if (!IsExternalArrayElementsKind(ElementsTraits::Kind) &&
FLAG_trace_js_array_abuse) { FLAG_trace_js_array_abuse) {
CheckArrayAbuse(holder, "elements read", key); CheckArrayAbuse(holder, "elements read", key);
...@@ -685,14 +671,21 @@ class ElementsAccessorBase : public ElementsAccessor { ...@@ -685,14 +671,21 @@ class ElementsAccessorBase : public ElementsAccessor {
: backing_store->GetHeap()->the_hole_value(); : backing_store->GetHeap()->the_hole_value();
} }
MUST_USE_RESULT virtual PropertyAttributes GetAttributes(
Handle<Object> receiver,
Handle<JSObject> holder,
uint32_t key,
Handle<FixedArrayBase> backing_store) V8_FINAL V8_OVERRIDE {
return ElementsAccessorSubclass::GetAttributesImpl(
*receiver, *holder, key, *backing_store);
}
// TODO(ishell): To be removed once elements.cc is handlified.
MUST_USE_RESULT virtual PropertyAttributes GetAttributes( MUST_USE_RESULT virtual PropertyAttributes GetAttributes(
Object* receiver, Object* receiver,
JSObject* holder, JSObject* holder,
uint32_t key, uint32_t key,
FixedArrayBase* backing_store) V8_FINAL V8_OVERRIDE { FixedArrayBase* backing_store) V8_FINAL V8_OVERRIDE {
if (backing_store == NULL) {
backing_store = holder->elements();
}
return ElementsAccessorSubclass::GetAttributesImpl( return ElementsAccessorSubclass::GetAttributesImpl(
receiver, holder, key, backing_store); receiver, holder, key, backing_store);
} }
...@@ -708,14 +701,21 @@ class ElementsAccessorBase : public ElementsAccessor { ...@@ -708,14 +701,21 @@ class ElementsAccessorBase : public ElementsAccessor {
return BackingStore::cast(backing_store)->is_the_hole(key) ? ABSENT : NONE; return BackingStore::cast(backing_store)->is_the_hole(key) ? ABSENT : NONE;
} }
MUST_USE_RESULT virtual PropertyType GetType(
Handle<Object> receiver,
Handle<JSObject> holder,
uint32_t key,
Handle<FixedArrayBase> backing_store) V8_FINAL V8_OVERRIDE {
return ElementsAccessorSubclass::GetTypeImpl(
*receiver, *holder, key, *backing_store);
}
// TODO(ishell): To be removed once elements.cc is handlified.
MUST_USE_RESULT virtual PropertyType GetType( MUST_USE_RESULT virtual PropertyType GetType(
Object* receiver, Object* receiver,
JSObject* holder, JSObject* holder,
uint32_t key, uint32_t key,
FixedArrayBase* backing_store) V8_FINAL V8_OVERRIDE { FixedArrayBase* backing_store) V8_FINAL V8_OVERRIDE {
if (backing_store == NULL) {
backing_store = holder->elements();
}
return ElementsAccessorSubclass::GetTypeImpl( return ElementsAccessorSubclass::GetTypeImpl(
receiver, holder, key, backing_store); receiver, holder, key, backing_store);
} }
......
...@@ -79,16 +79,12 @@ class ElementsAccessor { ...@@ -79,16 +79,12 @@ class ElementsAccessor {
uint32_t key, uint32_t key,
Handle<FixedArrayBase> backing_store) = 0; Handle<FixedArrayBase> backing_store) = 0;
MUST_USE_RESULT virtual Handle<Object> Get( MUST_USE_RESULT inline Handle<Object> Get(
Handle<Object> receiver, Handle<Object> receiver,
Handle<JSObject> holder, Handle<JSObject> holder,
uint32_t key) = 0; uint32_t key) {
return Get(receiver, holder, key, handle(holder->elements()));
MUST_USE_RESULT virtual MaybeObject* Get( }
Object* receiver,
JSObject* holder,
uint32_t key,
FixedArrayBase* backing_store = NULL) = 0;
// Returns an element's attributes, or ABSENT if there is no such // Returns an element's attributes, or ABSENT if there is no such
// element. This method doesn't iterate up the prototype chain. The caller // element. This method doesn't iterate up the prototype chain. The caller
...@@ -96,10 +92,17 @@ class ElementsAccessor { ...@@ -96,10 +92,17 @@ class ElementsAccessor {
// be compatible with the ElementsKind of the ElementsAccessor. If // be compatible with the ElementsKind of the ElementsAccessor. If
// backing_store is NULL, the holder->elements() is used as the backing store. // backing_store is NULL, the holder->elements() is used as the backing store.
MUST_USE_RESULT virtual PropertyAttributes GetAttributes( MUST_USE_RESULT virtual PropertyAttributes GetAttributes(
Object* receiver, Handle<Object> receiver,
JSObject* holder, Handle<JSObject> holder,
uint32_t key, uint32_t key,
FixedArrayBase* backing_store = NULL) = 0; Handle<FixedArrayBase> backing_store) = 0;
MUST_USE_RESULT inline PropertyAttributes GetAttributes(
Handle<Object> receiver,
Handle<JSObject> holder,
uint32_t key) {
return GetAttributes(receiver, holder, key, handle(holder->elements()));
}
// Returns an element's type, or NONEXISTENT if there is no such // Returns an element's type, or NONEXISTENT if there is no such
// element. This method doesn't iterate up the prototype chain. The caller // element. This method doesn't iterate up the prototype chain. The caller
...@@ -107,10 +110,17 @@ class ElementsAccessor { ...@@ -107,10 +110,17 @@ class ElementsAccessor {
// be compatible with the ElementsKind of the ElementsAccessor. If // be compatible with the ElementsKind of the ElementsAccessor. If
// backing_store is NULL, the holder->elements() is used as the backing store. // backing_store is NULL, the holder->elements() is used as the backing store.
MUST_USE_RESULT virtual PropertyType GetType( MUST_USE_RESULT virtual PropertyType GetType(
Object* receiver, Handle<Object> receiver,
JSObject* holder, Handle<JSObject> holder,
uint32_t key, uint32_t key,
FixedArrayBase* backing_store = NULL) = 0; Handle<FixedArrayBase> backing_store) = 0;
MUST_USE_RESULT inline PropertyType GetType(
Handle<Object> receiver,
Handle<JSObject> holder,
uint32_t key) {
return GetType(receiver, holder, key, handle(holder->elements()));
}
// Returns an element's accessors, or NULL if the element does not exist or // Returns an element's accessors, or NULL if the element does not exist or
// is plain. This method doesn't iterate up the prototype chain. The caller // is plain. This method doesn't iterate up the prototype chain. The caller
...@@ -234,6 +244,26 @@ class ElementsAccessor { ...@@ -234,6 +244,26 @@ class ElementsAccessor {
virtual uint32_t GetKeyForIndex(Handle<FixedArrayBase> backing_store, virtual uint32_t GetKeyForIndex(Handle<FixedArrayBase> backing_store,
uint32_t index) = 0; uint32_t index) = 0;
// TODO(ishell): Non-handlified versions, used only by accessors'
// implementations. To be removed once elements.cc is handlified.
MUST_USE_RESULT virtual MaybeObject* Get(
Object* receiver,
JSObject* holder,
uint32_t key,
FixedArrayBase* backing_store) = 0;
MUST_USE_RESULT virtual PropertyAttributes GetAttributes(
Object* receiver,
JSObject* holder,
uint32_t key,
FixedArrayBase* backing_store) = 0;
MUST_USE_RESULT virtual PropertyType GetType(
Object* receiver,
JSObject* holder,
uint32_t key,
FixedArrayBase* backing_store) = 0;
private: private:
static ElementsAccessor** elements_accessors_; static ElementsAccessor** elements_accessors_;
const char* name_; const char* name_;
......
...@@ -4498,7 +4498,7 @@ PropertyAttributes JSObject::GetElementAttributeWithoutInterceptor( ...@@ -4498,7 +4498,7 @@ PropertyAttributes JSObject::GetElementAttributeWithoutInterceptor(
uint32_t index, uint32_t index,
bool continue_search) { bool continue_search) {
PropertyAttributes attr = object->GetElementsAccessor()->GetAttributes( PropertyAttributes attr = object->GetElementsAccessor()->GetAttributes(
*receiver, *object, index); receiver, object, index);
if (attr != ABSENT) return attr; if (attr != ABSENT) return attr;
// Handle [] on String objects. // Handle [] on String objects.
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment