Commit d0d03d99 authored by whesse@chromium.org's avatar whesse@chromium.org

Avoid map transitions and multiple backing arrays for builtin prototypes

while adding functions and other properties.  This gives around 2% on
context-create, more if we don't GC on every new context.  Also fix
accounting bug in cell space.
Review URL: http://codereview.chromium.org/165449

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@2681 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
parent 5a3998c1
...@@ -277,7 +277,9 @@ void Heap::GarbageCollectionPrologue() { ...@@ -277,7 +277,9 @@ void Heap::GarbageCollectionPrologue() {
int Heap::SizeOfObjects() { int Heap::SizeOfObjects() {
int total = 0; int total = 0;
AllSpaces spaces; AllSpaces spaces;
while (Space* space = spaces.next()) total += space->Size(); while (Space* space = spaces.next()) {
total += space->Size();
}
return total; return total;
} }
......
...@@ -184,6 +184,7 @@ function MathTan(x) { ...@@ -184,6 +184,7 @@ function MathTan(x) {
function SetupMath() { function SetupMath() {
// Setup math constants. // Setup math constants.
// ECMA-262, section 15.8.1.1. // ECMA-262, section 15.8.1.1.
%OptimizeObjectForAddingMultipleProperties($Math, 26);
%SetProperty($Math, %SetProperty($Math,
"E", "E",
2.7182818284590452354, 2.7182818284590452354,
......
...@@ -1022,6 +1022,30 @@ static Object* Runtime_InitializeConstContextSlot(Arguments args) { ...@@ -1022,6 +1022,30 @@ static Object* Runtime_InitializeConstContextSlot(Arguments args) {
} }
static Object* Runtime_OptimizeObjectForAddingMultipleProperties(
Arguments args) {
HandleScope scope;
ASSERT(args.length() == 2);
CONVERT_ARG_CHECKED(JSObject, object, 0);
CONVERT_SMI_CHECKED(properties, args[1]);
if (object->HasFastProperties()) {
NormalizeProperties(object, KEEP_INOBJECT_PROPERTIES, properties);
}
return *object;
}
static Object* Runtime_TransformToFastProperties(Arguments args) {
HandleScope scope;
ASSERT(args.length() == 1);
CONVERT_ARG_CHECKED(JSObject, object, 0);
if (!object->HasFastProperties() && !object->IsGlobalObject()) {
TransformToFastProperties(object, 0);
}
return *object;
}
static Object* Runtime_RegExpExec(Arguments args) { static Object* Runtime_RegExpExec(Arguments args) {
HandleScope scope; HandleScope scope;
ASSERT(args.length() == 4); ASSERT(args.length() == 4);
......
...@@ -247,6 +247,8 @@ namespace internal { ...@@ -247,6 +247,8 @@ namespace internal {
F(InitializeVarGlobal, -1 /* 1 or 2 */) \ F(InitializeVarGlobal, -1 /* 1 or 2 */) \
F(InitializeConstGlobal, 2) \ F(InitializeConstGlobal, 2) \
F(InitializeConstContextSlot, 3) \ F(InitializeConstContextSlot, 3) \
F(OptimizeObjectForAddingMultipleProperties, 2) \
F(TransformToFastProperties, 1) \
\ \
/* Debugging */ \ /* Debugging */ \
F(DebugPrint, 1) \ F(DebugPrint, 1) \
......
...@@ -1574,7 +1574,7 @@ class FixedSpace : public PagedSpace { ...@@ -1574,7 +1574,7 @@ class FixedSpace : public PagedSpace {
// Give a fixed sized block of memory to the space's free list. // Give a fixed sized block of memory to the space's free list.
void Free(Address start) { void Free(Address start) {
free_list_.Free(start); free_list_.Free(start);
accounting_stats_.DeallocateBytes(Map::kSize); accounting_stats_.DeallocateBytes(object_size_in_bytes_);
} }
// Prepares for a mark-compact GC. // Prepares for a mark-compact GC.
......
...@@ -46,12 +46,16 @@ const $isFinite = GlobalIsFinite; ...@@ -46,12 +46,16 @@ const $isFinite = GlobalIsFinite;
// Helper function used to install functions on objects. // Helper function used to install functions on objects.
function InstallFunctions(object, attributes, functions) { function InstallFunctions(object, attributes, functions) {
if (functions.length >= 8) {
%OptimizeObjectForAddingMultipleProperties(object, functions.length >> 1);
}
for (var i = 0; i < functions.length; i += 2) { for (var i = 0; i < functions.length; i += 2) {
var key = functions[i]; var key = functions[i];
var f = functions[i + 1]; var f = functions[i + 1];
%FunctionSetName(f, key); %FunctionSetName(f, key);
%SetProperty(object, key, f, attributes); %SetProperty(object, key, f, attributes);
} }
%TransformToFastProperties(object);
} }
// Emulates JSC by installing functions on a hidden prototype that // Emulates JSC by installing functions on a hidden prototype that
...@@ -454,8 +458,10 @@ function NumberToJSON(key) { ...@@ -454,8 +458,10 @@ function NumberToJSON(key) {
function SetupNumber() { function SetupNumber() {
// Setup the constructor property on the Number prototype object. // Setup the constructor property on the Number prototype object.
%OptimizeObjectForAddingMultipleProperties($Number.prototype, 8);
%SetProperty($Number.prototype, "constructor", $Number, DONT_ENUM); %SetProperty($Number.prototype, "constructor", $Number, DONT_ENUM);
%OptimizeObjectForAddingMultipleProperties($Number, 5);
// ECMA-262 section 15.7.3.1. // ECMA-262 section 15.7.3.1.
%SetProperty($Number, %SetProperty($Number,
"MAX_VALUE", "MAX_VALUE",
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment