Chromium Code Reviews| Index: src/accessors.h |
| diff --git a/src/accessors.h b/src/accessors.h |
| index dedde32ef92567dca47db5e2e413b430a1d8c1b3..a4e4096fc36919b08337cf79a0ad24ae3505a7e1 100644 |
| --- a/src/accessors.h |
| +++ b/src/accessors.h |
| @@ -29,6 +29,7 @@ |
| #define V8_ACCESSORS_H_ |
| #include "allocation.h" |
| +#include "types.h" |
| #include "v8globals.h" |
| namespace v8 { |
| @@ -86,11 +87,64 @@ class Accessors : public AllStatic { |
| static Handle<AccessorInfo> MakeModuleExport( |
| Handle<String> name, int index, PropertyAttributes attributes); |
| + 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; |
| + } |
| + |
| // Returns true for properties that are accessors to object fields. |
| // If true, *object_offset contains offset of object field. |
| - static bool IsJSObjectFieldAccessor( |
| - Handle<HeapType> map, Handle<String> name, int* object_offset); |
| + template <class T> |
|
rossberg
2014/02/03 16:54:05
You don't necessarily need to move this to the hea
|
| + static bool IsJSObjectFieldAccessor(typename T::TypeHandle type, |
| + Handle<String> name, |
| + int* object_offset) { |
| + Isolate* isolate = name->GetIsolate(); |
| + |
| + if (type->Is(T::String())) { |
| + return CheckForName(name, isolate->heap()->length_string(), |
| + String::kLengthOffset, object_offset); |
| + } |
| + |
| + if (!type->IsClass()) return false; |
| + Handle<Map> map = type->AsClass(); |
| + 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: |
| + return false; |
| + } |
| + } |
| private: |
| // Accessor functions only used through the descriptor. |