Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1003)

Unified Diff: src/runtime.cc

Issue 8103: - Fixed performance regression caused by ComputeContextSlotReceiver.... (Closed) Base URL: http://v8.googlecode.com/svn/branches/bleeding_edge/
Patch Set: '' Created 12 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« src/objects.h ('K') | « src/objects-inl.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/runtime.cc
===================================================================
--- src/runtime.cc (revision 572)
+++ src/runtime.cc (working copy)
@@ -928,7 +928,7 @@
literals->set(JSFunction::kLiteralGlobalContextIndex,
context->global_context());
}
- target->set_literals(*literals);
+ target->set_literals(*literals, SKIP_WRITE_BARRIER);
}
target->set_context(*context);
@@ -3134,11 +3134,16 @@
const int length = frame->GetProvidedParametersCount();
Object* result = Heap::AllocateArgumentsObject(callee, length);
if (result->IsFailure()) return result;
- FixedArray* array = FixedArray::cast(JSObject::cast(result)->elements());
- ASSERT(array->length() == length);
- WriteBarrierMode mode = array->GetWriteBarrierMode();
- for (int i = 0; i < length; i++) {
- array->set(i, frame->GetParameter(i), mode);
+ if (length > 0) {
+ Object* obj = Heap::AllocateFixedArray(length);
+ if (obj->IsFailure()) return obj;
+ FixedArray* array = FixedArray::cast(obj);
+ ASSERT(array->length() == length);
+ WriteBarrierMode mode = array->GetWriteBarrierMode();
+ for (int i = 0; i < length; i++) {
+ array->set(i, frame->GetParameter(i), mode);
+ }
+ JSObject::cast(result)->set_elements(array);
}
return result;
}
@@ -3154,11 +3159,22 @@
Object* result = Heap::AllocateArgumentsObject(callee, length);
if (result->IsFailure()) return result;
- FixedArray* array = FixedArray::cast(JSObject::cast(result)->elements());
- ASSERT(array->length() == length);
- WriteBarrierMode mode = array->GetWriteBarrierMode();
- for (int i = 0; i < length; i++) {
- array->set(i, *--parameters, mode);
+ ASSERT(Heap::InNewSpace(result));
+
+ // Allocate the elements if needed.
+ if (length > 0) {
+ // Allocate the fixed array.
+ Object* obj = Heap::AllocateRawFixedArray(length);
+ if (obj->IsFailure()) return obj;
+ reinterpret_cast<Array*>(obj)->set_map(Heap::fixed_array_map());
+ FixedArray* array = FixedArray::cast(obj);
+ array->set_length(length);
+ WriteBarrierMode mode = array->GetWriteBarrierMode();
+ for (int i = 0; i < length; i++) {
+ array->set(i, *--parameters, mode);
+ }
+ JSObject::cast(result)->set_elements(FixedArray::cast(obj),
+ SKIP_WRITE_BARRIER);
}
return result;
}
@@ -3366,10 +3382,18 @@
// If the "property" we were looking for is a local variable or an
// argument in a context, the receiver is the global object; see
// ECMA-262, 3rd., 10.1.6 and 10.2.3.
+ // Contexts and Globals are most common.
Kasper Lund 2008/10/23 14:51:33 I would change Globals to 'global objects', but th
HeapObject* object = HeapObject::cast(holder);
Kasper Lund 2008/10/23 14:51:33 You should be able to get rid of the 'object' vari
+ if (holder->IsContext()) {
+ return Context::cast(holder)->global()->global_receiver();
+ }
+ if (object->IsGlobalObject()) {
+ // If the holder is a global object, we have to be careful to wrap
+ // it in its proxy if necessary.
+ return GlobalObject::cast(object)->global_receiver();
+ }
+
Context* top = Top::context();
- if (holder->IsContext()) return top->global()->global_receiver();
-
// TODO(125): Find a better - and faster way - of checking for
// arguments and context extension objects. This kinda sucks.
JSFunction* context_extension_function =
@@ -3386,13 +3410,7 @@
return Top::context()->global()->global_receiver();
}
- // If the holder is a global object, we have to be careful to wrap
- // it in its proxy if necessary.
- if (object->IsGlobalObject()) {
- return GlobalObject::cast(object)->global_receiver();
- } else {
- return object;
- }
+ return object;
}
@@ -4900,13 +4918,13 @@
}
const int length = frame->GetProvidedParametersCount();
- Handle<Object> arguments = Factory::NewArgumentsObject(function, length);
- FixedArray* array = FixedArray::cast(JSObject::cast(*arguments)->elements());
- ASSERT(array->length() == length);
+ Handle<JSObject> arguments = Factory::NewArgumentsObject(function, length);
+ Handle<FixedArray> array = Factory::NewFixedArray(length);
WriteBarrierMode mode = array->GetWriteBarrierMode();
for (int i = 0; i < length; i++) {
array->set(i, frame->GetParameter(i), mode);
}
+ arguments->set_elements(*array);
return arguments;
}
« src/objects.h ('K') | « src/objects-inl.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698