Reviewers: Lasse Reichstein, Description: Give each function prototype a fresh copy of the object function map.
This avoid unwanted sharing between different function prototypes and in general should help inlining because constant function properties on one prototype don't affect other prototypes anymore. BUG=v8:1716 Please review this at http://codereview.chromium.org/7994001/ SVN Base: http://v8.googlecode.com/svn/branches/bleeding_edge/ Affected files: M src/heap.cc M src/objects.cc Index: src/heap.cc =================================================================== --- src/heap.cc (revision 9391) +++ src/heap.cc (working copy) @@ -3257,8 +3257,18 @@ // different context. JSFunction* object_function = function->context()->global_context()->object_function(); + + // Each function prototype gets a copy of the object function map. + // This avoid unwanted sharing of maps between prototypes of different + // constructors. + Map* new_map; + ASSERT(object_function->has_initial_map()); + { MaybeObject* maybe_map = + object_function->initial_map()->CopyDropTransitions(); + if (!maybe_map->To<Map>(&new_map)) return maybe_map; + } Object* prototype; - { MaybeObject* maybe_prototype = AllocateJSObject(object_function); + { MaybeObject* maybe_prototype = AllocateJSObjectFromMap(new_map); if (!maybe_prototype->ToObject(&prototype)) return maybe_prototype; } // When creating the prototype for the function we must set its Index: src/objects.cc =================================================================== --- src/objects.cc (revision 9391) +++ src/objects.cc (working copy) @@ -1070,7 +1070,6 @@ void HeapObject::HeapObjectShortPrint(StringStream* accumulator) { - // if (!HEAP->InNewSpace(this)) PrintF("*", this); Heap* heap = GetHeap(); if (!heap->Contains(this)) { accumulator->Add("!!!INVALID POINTER!!!"); -- v8-dev mailing list [email protected] http://groups.google.com/group/v8-dev
