The number of heap slots stored in a scope includes the

fixed contexts slots. Take this into account when using
the new, fast context creation path to avoid allocating
too many slots (wasteful).
Review URL: http://codereview.chromium.org/501148

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@3505 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
This commit is contained in:
kasperl@chromium.org 2009-12-21 10:24:11 +00:00
parent 73fcafd650
commit 9c627d6ba3
4 changed files with 9 additions and 3 deletions

View File

@ -52,11 +52,14 @@ Context* Context::global_context() {
if (global()->IsGlobalObject()) { if (global()->IsGlobalObject()) {
return global()->global_context(); return global()->global_context();
} }
// During bootstrapping, the global object might not be set and we // During bootstrapping, the global object might not be set and we
// have to search the context chain to find the global context. // have to search the context chain to find the global context.
ASSERT(Bootstrapper::IsActive());
Context* current = this; Context* current = this;
while (!current->IsGlobalContext()) { while (!current->IsGlobalContext()) {
current = Context::cast(JSFunction::cast(current->closure())->context()); JSFunction* closure = JSFunction::cast(current->closure());
current = Context::cast(closure->context());
} }
return current; return current;
} }

View File

@ -79,6 +79,10 @@ static Handle<Object> Invoke(bool construct,
receiver = Handle<JSObject>(global->global_receiver()); receiver = Handle<JSObject>(global->global_receiver());
} }
// Make sure that the global object of the context we're about to
// make the current one is indeed a global object.
ASSERT(func->context()->global()->IsGlobalObject());
{ {
// Save and restore context around invocation and block the // Save and restore context around invocation and block the
// allocation of handles without explicit handle scopes. // allocation of handles without explicit handle scopes.

View File

@ -174,7 +174,7 @@ void CodeGenerator::GenCode(FunctionLiteral* fun) {
function_return_is_shadowed_ = false; function_return_is_shadowed_ = false;
// Allocate the local context if needed. // Allocate the local context if needed.
int heap_slots = scope_->num_heap_slots(); int heap_slots = scope_->num_heap_slots() - Context::MIN_CONTEXT_SLOTS;
if (heap_slots > 0) { if (heap_slots > 0) {
Comment cmnt(masm_, "[ allocate local context"); Comment cmnt(masm_, "[ allocate local context");
// Allocate local context. // Allocate local context.

View File

@ -1369,7 +1369,6 @@ Handle<Code> MacroAssembler::ResolveBuiltin(Builtins::JavaScript id,
JSBuiltinsObject::kJSBuiltinsOffset + (id * kPointerSize); JSBuiltinsObject::kJSBuiltinsOffset + (id * kPointerSize);
mov(edi, FieldOperand(edx, builtins_offset)); mov(edi, FieldOperand(edx, builtins_offset));
return Builtins::GetCode(id, resolved); return Builtins::GetCode(id, resolved);
} }