| Index: src/objects.h
|
| ===================================================================
|
| --- src/objects.h (revision 7683)
|
| +++ src/objects.h (working copy)
|
| @@ -523,6 +523,7 @@
|
| EXTERNAL_INT_ARRAY_TYPE,
|
| EXTERNAL_UNSIGNED_INT_ARRAY_TYPE,
|
| EXTERNAL_FLOAT_ARRAY_TYPE,
|
| + EXTERNAL_DOUBLE_ARRAY_TYPE,
|
| EXTERNAL_PIXEL_ARRAY_TYPE, // LAST_EXTERNAL_ARRAY_TYPE
|
| FILLER_TYPE, // LAST_DATA_TYPE
|
|
|
| @@ -648,6 +649,13 @@
|
| return reinterpret_cast<Object*>(this);
|
| }
|
|
|
| + template<typename T>
|
| + inline bool To(T** obj) {
|
| + if (IsFailure()) return false;
|
| + *obj = T::cast(reinterpret_cast<Object*>(this));
|
| + return true;
|
| + }
|
| +
|
| #ifdef OBJECT_PRINT
|
| // Prints this object with details.
|
| inline void Print() {
|
| @@ -691,6 +699,7 @@
|
| V(ExternalIntArray) \
|
| V(ExternalUnsignedIntArray) \
|
| V(ExternalFloatArray) \
|
| + V(ExternalDoubleArray) \
|
| V(ExternalPixelArray) \
|
| V(ByteArray) \
|
| V(JSObject) \
|
| @@ -1336,6 +1345,7 @@
|
| EXTERNAL_INT_ELEMENTS,
|
| EXTERNAL_UNSIGNED_INT_ELEMENTS,
|
| EXTERNAL_FLOAT_ELEMENTS,
|
| + EXTERNAL_DOUBLE_ELEMENTS,
|
| EXTERNAL_PIXEL_ELEMENTS
|
| };
|
|
|
| @@ -1377,6 +1387,7 @@
|
| inline bool HasExternalIntElements();
|
| inline bool HasExternalUnsignedIntElements();
|
| inline bool HasExternalFloatElements();
|
| + inline bool HasExternalDoubleElements();
|
| inline bool AllowsSetElementsLength();
|
| inline NumberDictionary* element_dictionary(); // Gets slow elements.
|
| // Requires: this->HasFastElements().
|
| @@ -3093,6 +3104,34 @@
|
| };
|
|
|
|
|
| +class ExternalDoubleArray: public ExternalArray {
|
| + public:
|
| + // Setter and getter.
|
| + inline double get(int index);
|
| + inline void set(int index, double value);
|
| +
|
| + // This accessor applies the correct conversion from Smi, HeapNumber
|
| + // and undefined.
|
| + MaybeObject* SetValue(uint32_t index, Object* value);
|
| +
|
| + // Casting.
|
| + static inline ExternalDoubleArray* cast(Object* obj);
|
| +
|
| +#ifdef OBJECT_PRINT
|
| + inline void ExternalDoubleArrayPrint() {
|
| + ExternalDoubleArrayPrint(stdout);
|
| + }
|
| + void ExternalDoubleArrayPrint(FILE* out);
|
| +#endif // OBJECT_PRINT
|
| +#ifdef DEBUG
|
| + void ExternalDoubleArrayVerify();
|
| +#endif // DEBUG
|
| +
|
| + private:
|
| + DISALLOW_IMPLICIT_CONSTRUCTORS(ExternalDoubleArray);
|
| +};
|
| +
|
| +
|
| // DeoptimizationInputData is a fixed array used to hold the deoptimization
|
| // data for code generated by the Hydrogen/Lithium compiler. It also
|
| // contains information about functions that were inlined. If N different
|
| @@ -3712,6 +3751,16 @@
|
| // [stub cache]: contains stubs compiled for this map.
|
| DECL_ACCESSORS(code_cache, Object)
|
|
|
| + // [prototype transitions]: cache of prototype transitions.
|
| + // Prototype transition is a transition that happens
|
| + // when we change object's prototype to a new one.
|
| + // Cache format:
|
| + // 0: finger - index of the first free cell in the cache
|
| + // 1 + 2 * i: prototype
|
| + // 2 + 2 * i: target map
|
| + DECL_ACCESSORS(prototype_transitions, FixedArray)
|
| + inline FixedArray* unchecked_prototype_transitions();
|
| +
|
| // Lookup in the map's instance descriptors and fill out the result
|
| // with the given holder if the name is found. The holder may be
|
| // NULL when this function is used from the compiler.
|
| @@ -3811,6 +3860,12 @@
|
|
|
| void TraverseTransitionTree(TraverseCallback callback, void* data);
|
|
|
| + static const int kMaxCachedPrototypeTransitions = 256;
|
| +
|
| + Object* GetPrototypeTransition(Object* prototype);
|
| +
|
| + MaybeObject* PutPrototypeTransition(Object* prototype, Map* map);
|
| +
|
| static const int kMaxPreAllocatedPropertyFields = 255;
|
|
|
| // Layout description.
|
| @@ -3821,14 +3876,16 @@
|
| static const int kInstanceDescriptorsOffset =
|
| kConstructorOffset + kPointerSize;
|
| static const int kCodeCacheOffset = kInstanceDescriptorsOffset + kPointerSize;
|
| - static const int kPadStart = kCodeCacheOffset + kPointerSize;
|
| + static const int kPrototypeTransitionsOffset =
|
| + kCodeCacheOffset + kPointerSize;
|
| + static const int kPadStart = kPrototypeTransitionsOffset + kPointerSize;
|
| static const int kSize = MAP_POINTER_ALIGN(kPadStart);
|
|
|
| // Layout of pointer fields. Heap iteration code relies on them
|
| // being continiously allocated.
|
| static const int kPointerFieldsBeginOffset = Map::kPrototypeOffset;
|
| static const int kPointerFieldsEndOffset =
|
| - Map::kCodeCacheOffset + kPointerSize;
|
| + Map::kPrototypeTransitionsOffset + kPointerSize;
|
|
|
| // Byte offsets within kInstanceSizesOffset.
|
| static const int kInstanceSizeOffset = kInstanceSizesOffset + 0;
|
|
|
|
|