Index: src/objects.h |
diff --git a/src/objects.h b/src/objects.h |
index 92d134f518e82233440d799ced586131ab1f4bf4..dacbd837fce1cfca04e6065b1518f6d34e5804fd 100644 |
--- a/src/objects.h |
+++ b/src/objects.h |
@@ -88,6 +88,7 @@ |
// - ScopeInfo |
// - TransitionArray |
// - ScriptContextTable |
+// - WeakFixedArray |
// - FixedDoubleArray |
// - ExternalArray |
// - ExternalUint8ClampedArray |
@@ -943,6 +944,7 @@ template <class C> inline bool Is(Object* obj); |
V(DependentCode) \ |
V(FixedArray) \ |
V(FixedDoubleArray) \ |
+ V(WeakFixedArray) \ |
V(ConstantPoolArray) \ |
V(Context) \ |
V(ScriptContextTable) \ |
@@ -1821,6 +1823,10 @@ class JSObject: public JSReceiver { |
static void OptimizeAsPrototype(Handle<JSObject> object, |
PrototypeOptimizationMode mode); |
static void ReoptimizeIfPrototype(Handle<JSObject> object); |
+ static void RegisterPrototypeUser(Handle<JSObject> prototype, |
+ Handle<HeapObject> user); |
+ static void UnregisterPrototypeUser(Handle<JSObject> prototype, |
+ Handle<HeapObject> user); |
// Retrieve interceptors. |
InterceptorInfo* GetNamedInterceptor(); |
@@ -2608,6 +2614,45 @@ class FixedDoubleArray: public FixedArrayBase { |
}; |
+class WeakFixedArray : public FixedArray { |
+ public: |
+ enum SearchForDuplicates { kAlwaysAdd, kAddIfNotFound }; |
+ |
+ // If |maybe_array| is not a WeakFixedArray, a fresh one will be allocated. |
+ static Handle<WeakFixedArray> Add( |
+ Handle<Object> maybe_array, Handle<HeapObject> value, |
+ SearchForDuplicates search_for_duplicates = kAlwaysAdd); |
+ |
+ void Remove(Handle<HeapObject> value); |
+ |
+ inline Object* Get(int index) const; |
+ inline int Length() const; |
+ |
+ DECLARE_CAST(WeakFixedArray) |
+ |
+ private: |
+ static const int kLastUsedIndexIndex = 0; |
+ static const int kFirstIndex = 1; |
+ |
+ static Handle<WeakFixedArray> Allocate( |
+ Isolate* isolate, int size, Handle<WeakFixedArray> initialize_from); |
+ |
+ static void Set(Handle<WeakFixedArray> array, int index, |
+ Handle<HeapObject> value); |
+ inline void clear(int index); |
+ inline bool IsEmptySlot(int index) const; |
+ |
+ inline int last_used_index() const; |
+ inline void set_last_used_index(int index); |
+ |
+ // Disallow inherited setters. |
+ void set(int index, Smi* value); |
+ void set(int index, Object* value); |
+ void set(int index, Object* value, WriteBarrierMode mode); |
+ DISALLOW_IMPLICIT_CONSTRUCTORS(WeakFixedArray); |
+}; |
+ |
+ |
// ConstantPoolArray describes a fixed-sized array containing constant pool |
// entries. |
// |
@@ -5926,6 +5971,11 @@ class Map: public HeapObject { |
// [prototype]: implicit prototype object. |
DECL_ACCESSORS(prototype, Object) |
+ // TODO(jkummerow): make set_prototype private. |
+ void SetPrototype(Handle<Object> prototype, |
+ PrototypeOptimizationMode proto_mode = FAST_PROTOTYPE); |
+ bool ShouldRegisterAsPrototypeUser(Handle<JSObject> prototype); |
+ bool CanUseOptimizationsBasedOnPrototypeRegistry(); |
// [constructor]: points back to the function responsible for this map. |
DECL_ACCESSORS(constructor, Object) |
@@ -6257,10 +6307,11 @@ class Map: public HeapObject { |
// the original map. That way we can transition to the same map if the same |
// prototype is set, rather than creating a new map every time. The |
// transitions are in the form of a map where the keys are prototype objects |
- // and the values are the maps the are transitioned to. |
+ // and the values are the maps they transition to. |
static const int kMaxCachedPrototypeTransitions = 256; |
static Handle<Map> TransitionToPrototype(Handle<Map> map, |
- Handle<Object> prototype); |
+ Handle<Object> prototype, |
+ PrototypeOptimizationMode mode); |
static const int kMaxPreAllocatedPropertyFields = 255; |