Index: src/accessors.cc |
diff --git a/src/accessors.cc b/src/accessors.cc |
index 669c02baf36d48118cb971dfbd1ac337cf27f4a9..50232661c1976d67e61fe7855fd19e16d186197f 100644 |
--- a/src/accessors.cc |
+++ b/src/accessors.cc |
@@ -78,6 +78,61 @@ MaybeObject* Accessors::ReadOnlySetAccessor(Isolate* isolate, |
} |
+static V8_INLINE bool CheckForName(Handle<String> name, |
+ String* property_name, |
+ int offset, |
+ int* object_offset) { |
+ if (name->Equals(property_name)) { |
+ *object_offset = offset; |
+ return true; |
+ } |
+ return false; |
+} |
+ |
+ |
+bool Accessors::IsJSObjectFieldAccessor( |
+ Handle<Map> map, Handle<String> name, |
+ int* object_offset) { |
+ Isolate* isolate = map->GetIsolate(); |
+ switch (map->instance_type()) { |
+ case JS_ARRAY_TYPE: |
+ return |
+ CheckForName(name, isolate->heap()->length_string(), |
+ JSArray::kLengthOffset, object_offset); |
+ case JS_TYPED_ARRAY_TYPE: |
+ return |
+ CheckForName(name, isolate->heap()->length_string(), |
+ JSTypedArray::kLengthOffset, object_offset) || |
+ CheckForName(name, isolate->heap()->byte_length_string(), |
+ JSTypedArray::kByteLengthOffset, object_offset) || |
+ CheckForName(name, isolate->heap()->byte_offset_string(), |
+ JSTypedArray::kByteOffsetOffset, object_offset) || |
+ CheckForName(name, isolate->heap()->buffer_string(), |
+ JSTypedArray::kBufferOffset, object_offset); |
+ case JS_ARRAY_BUFFER_TYPE: |
+ return |
+ CheckForName(name, isolate->heap()->byte_length_string(), |
+ JSArrayBuffer::kByteLengthOffset, object_offset); |
+ case JS_DATA_VIEW_TYPE: |
+ return |
+ CheckForName(name, isolate->heap()->byte_length_string(), |
+ JSDataView::kByteLengthOffset, object_offset) || |
+ CheckForName(name, isolate->heap()->byte_offset_string(), |
+ JSDataView::kByteOffsetOffset, object_offset) || |
+ CheckForName(name, isolate->heap()->buffer_string(), |
+ JSDataView::kBufferOffset, object_offset); |
+ default: { |
+ if (map->instance_type() < FIRST_NONSTRING_TYPE) { |
+ return |
+ CheckForName(name, isolate->heap()->length_string(), |
+ String::kLengthOffset, object_offset); |
+ } |
+ return false; |
+ } |
+ } |
+} |
+ |
+ |
// |
// Accessors::ArrayLength |
// |