Revision: 9393
Author: [email protected]
Date: Thu Sep 22 05:57:54 2011
Log: 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
Review URL: http://codereview.chromium.org/7994001
http://code.google.com/p/v8/source/detail?r=9393
Modified:
/branches/bleeding_edge/src/heap.cc
/branches/bleeding_edge/src/objects.cc
=======================================
--- /branches/bleeding_edge/src/heap.cc Thu Sep 22 04:30:04 2011
+++ /branches/bleeding_edge/src/heap.cc Thu Sep 22 05:57:54 2011
@@ -3265,8 +3265,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
=======================================
--- /branches/bleeding_edge/src/objects.cc Thu Sep 22 04:30:04 2011
+++ /branches/bleeding_edge/src/objects.cc Thu Sep 22 05:57:54 2011
@@ -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