| 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; | 
|  | 
|  |