| Index: src/objects.h
|
| ===================================================================
|
| --- src/objects.h (revision 2285)
|
| +++ src/objects.h (working copy)
|
| @@ -153,20 +153,23 @@
|
|
|
| int index() { return IndexField::decode(value_); }
|
|
|
| + inline PropertyDetails AsDeleted();
|
| +
|
| static bool IsValidIndex(int index) { return IndexField::is_valid(index); }
|
|
|
| bool IsReadOnly() { return (attributes() & READ_ONLY) != 0; }
|
| bool IsDontDelete() { return (attributes() & DONT_DELETE) != 0; }
|
| bool IsDontEnum() { return (attributes() & DONT_ENUM) != 0; }
|
| + bool IsDeleted() { return DeletedField::decode(value_) != 0;}
|
|
|
| // Bit fields in value_ (type, shift, size). Must be public so the
|
| // constants can be embedded in generated code.
|
| class TypeField: public BitField<PropertyType, 0, 3> {};
|
| class AttributesField: public BitField<PropertyAttributes, 3, 3> {};
|
| - class IndexField: public BitField<uint32_t, 6, 32-6> {};
|
| + class DeletedField: public BitField<uint32_t, 6, 1> {};
|
| + class IndexField: public BitField<uint32_t, 7, 31-7> {};
|
|
|
| static const int kInitialIndex = 1;
|
| -
|
| private:
|
| uint32_t value_;
|
| };
|
| @@ -263,6 +266,7 @@
|
| V(HEAP_NUMBER_TYPE) \
|
| V(FIXED_ARRAY_TYPE) \
|
| V(CODE_TYPE) \
|
| + V(JS_GLOBAL_PROPERTY_CELL_TYPE) \
|
| V(ODDBALL_TYPE) \
|
| V(PROXY_TYPE) \
|
| V(BYTE_ARRAY_TYPE) \
|
| @@ -547,6 +551,7 @@
|
| FIXED_ARRAY_TYPE,
|
| CODE_TYPE,
|
| ODDBALL_TYPE,
|
| + JS_GLOBAL_PROPERTY_CELL_TYPE,
|
| PROXY_TYPE,
|
| BYTE_ARRAY_TYPE,
|
| FILLER_TYPE,
|
| @@ -684,6 +689,7 @@
|
| inline bool IsJSGlobalProxy();
|
| inline bool IsUndetectableObject();
|
| inline bool IsAccessCheckNeeded();
|
| + inline bool IsJSGlobalPropertyCell();
|
|
|
| // Returns true if this object is an instance of the specified
|
| // function template.
|
| @@ -1193,6 +1199,8 @@
|
| // caching.
|
| class JSObject: public HeapObject {
|
| public:
|
| + enum DeleteMode { NORMAL_DELETION, FORCE_DELETION };
|
| +
|
| // [properties]: Backing storage for properties.
|
| // properties is a FixedArray in the fast case, and a Dictionary in the
|
| // slow case.
|
| @@ -1243,6 +1251,23 @@
|
| Object* value,
|
| PropertyAttributes attributes);
|
|
|
| + // Retrieve a value in a normalized object given a lookup result.
|
| + // Handles the special representation of JS global objects.
|
| + Object* GetNormalizedProperty(LookupResult* result);
|
| +
|
| + // Sets the property value in a normalized object given a lookup result.
|
| + // Handles the special representation of JS global objects.
|
| + Object* SetNormalizedProperty(LookupResult* result, Object* value);
|
| +
|
| + // Sets the property value in a normalized object given (key, value, details).
|
| + // Handles the special representation of JS global objects.
|
| + Object* SetNormalizedProperty(String* name,
|
| + Object* value,
|
| + PropertyDetails details);
|
| +
|
| + // Deletes the named property in a normalized object.
|
| + Object* DeleteNormalizedProperty(String* name, DeleteMode mode);
|
| +
|
| // Sets a property that currently has lazy loading.
|
| Object* SetLazyProperty(LookupResult* result,
|
| String* name,
|
| @@ -1293,7 +1318,6 @@
|
| return GetLocalPropertyAttribute(name) != ABSENT;
|
| }
|
|
|
| - enum DeleteMode { NORMAL_DELETION, FORCE_DELETION };
|
| Object* DeleteProperty(String* name, DeleteMode mode);
|
| Object* DeleteElement(uint32_t index, DeleteMode mode);
|
| Object* DeleteLazyProperty(LookupResult* result,
|
| @@ -1930,6 +1954,9 @@
|
| static const int kElementsStartOffset =
|
| kHeaderSize + kElementsStartIndex * kPointerSize;
|
|
|
| + // Constant used for denoting a absent entry.
|
| + static const int kNotFound = -1;
|
| +
|
| protected:
|
| // Find entry for key otherwise return -1.
|
| int FindEntry(HashTableKey* key);
|
| @@ -2027,7 +2054,9 @@
|
| class Dictionary: public DictionaryBase {
|
| public:
|
| // Returns the value at entry.
|
| - Object* ValueAt(int entry) { return get(EntryToIndex(entry)+1); }
|
| + Object* ValueAt(int entry) {
|
| + return get(EntryToIndex(entry)+1);
|
| + }
|
|
|
| // Set the value for entry.
|
| void ValueAtPut(int entry, Object* value) {
|
| @@ -2064,16 +2093,16 @@
|
| Object* DeleteProperty(int entry, JSObject::DeleteMode mode);
|
|
|
| // Type specific at put (default NONE attributes is used when adding).
|
| - Object* AtStringPut(String* key, Object* value);
|
| Object* AtNumberPut(uint32_t key, Object* value);
|
|
|
| Object* AddStringEntry(String* key, Object* value, PropertyDetails details);
|
| Object* AddNumberEntry(uint32_t key, Object* value, PropertyDetails details);
|
|
|
| // Set an existing entry or add a new one if needed.
|
| - Object* SetOrAddStringEntry(String* key,
|
| - Object* value,
|
| - PropertyDetails details);
|
| + Object* SetStringEntry(int entry,
|
| + String* key,
|
| + Object* value,
|
| + PropertyDetails details);
|
|
|
| Object* SetOrAddNumberEntry(uint32_t key,
|
| Object* value,
|
| @@ -2252,6 +2281,7 @@
|
| // Printing
|
| static const char* Kind2String(Kind kind);
|
| static const char* ICState2String(InlineCacheState state);
|
| + static const char* PropertyType2String(PropertyType type);
|
| void Disassemble(const char* name);
|
| #endif // ENABLE_DISASSEMBLER
|
|
|
| @@ -2274,7 +2304,7 @@
|
| // [flags]: Access to specific code flags.
|
| inline Kind kind();
|
| inline InlineCacheState ic_state(); // Only valid for IC stubs.
|
| - inline InLoopFlag ic_in_loop(); // Only valid for IC stubs..
|
| + inline InLoopFlag ic_in_loop(); // Only valid for IC stubs.
|
| inline PropertyType type(); // Only valid for monomorphic IC stubs.
|
| inline int arguments_count(); // Only valid for call IC stubs.
|
|
|
| @@ -3048,6 +3078,10 @@
|
| // JavaScript global object.
|
| class JSGlobalObject: public GlobalObject {
|
| public:
|
| +
|
| + // Retrieve the property cell used to store a property.
|
| + Object* GetPropertyCell(LookupResult* result);
|
| +
|
| // Casting.
|
| static inline JSGlobalObject* cast(Object* obj);
|
|
|
| @@ -3936,6 +3970,31 @@
|
| };
|
|
|
|
|
| +class JSGlobalPropertyCell: public HeapObject {
|
| + public:
|
| + // [value]: value of the global property.
|
| + DECL_ACCESSORS(value, Object)
|
| +
|
| + // Casting.
|
| + static inline JSGlobalPropertyCell* cast(Object* obj);
|
| +
|
| + // Dispatched behavior.
|
| + void JSGlobalPropertyCellIterateBody(ObjectVisitor* v);
|
| +#ifdef DEBUG
|
| + void JSGlobalPropertyCellVerify();
|
| + void JSGlobalPropertyCellPrint();
|
| +#endif
|
| +
|
| + // Layout description.
|
| + static const int kValueOffset = HeapObject::kHeaderSize;
|
| + static const int kSize = kValueOffset + kPointerSize;
|
| +
|
| + private:
|
| + DISALLOW_IMPLICIT_CONSTRUCTORS(JSGlobalPropertyCell);
|
| +};
|
| +
|
| +
|
| +
|
| // Proxy describes objects pointing from JavaScript to C structures.
|
| // Since they cannot contain references to JS HeapObjects they can be
|
| // placed in old_data_space.
|
|
|