Reviewers: Mads Ager, Description: 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).
Please review this at http://codereview.chromium.org/501148 SVN Base: http://v8.googlecode.com/svn/branches/bleeding_edge/ Affected files: M bleeding_edge/src/contexts.cc M bleeding_edge/src/execution.cc M bleeding_edge/src/ia32/codegen-ia32.cc M bleeding_edge/src/ia32/macro-assembler-ia32.cc Index: bleeding_edge/src/ia32/codegen-ia32.cc =================================================================== --- bleeding_edge/src/ia32/codegen-ia32.cc (revision 3503) +++ bleeding_edge/src/ia32/codegen-ia32.cc (working copy) @@ -174,7 +174,7 @@ function_return_is_shadowed_ = false; // 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) { Comment cmnt(masm_, "[ allocate local context"); // Allocate local context. Index: bleeding_edge/src/ia32/macro-assembler-ia32.cc =================================================================== --- bleeding_edge/src/ia32/macro-assembler-ia32.cc (revision 3503) +++ bleeding_edge/src/ia32/macro-assembler-ia32.cc (working copy) @@ -1369,7 +1369,6 @@ JSBuiltinsObject::kJSBuiltinsOffset + (id * kPointerSize); mov(edi, FieldOperand(edx, builtins_offset)); - return Builtins::GetCode(id, resolved); } Index: bleeding_edge/src/contexts.cc =================================================================== --- bleeding_edge/src/contexts.cc (revision 3503) +++ bleeding_edge/src/contexts.cc (working copy) @@ -52,11 +52,14 @@ if (global()->IsGlobalObject()) { return global()->global_context(); } + // During bootstrapping, the global object might not be set and we // have to search the context chain to find the global context. + ASSERT(Bootstrapper::IsActive()); Context* current = this; while (!current->IsGlobalContext()) { - current = Context::cast(JSFunction::cast(current->closure())->context()); + JSFunction* closure = JSFunction::cast(current->closure()); + current = Context::cast(closure->context()); } return current; } Index: bleeding_edge/src/execution.cc =================================================================== --- bleeding_edge/src/execution.cc (revision 3503) +++ bleeding_edge/src/execution.cc (working copy) @@ -79,6 +79,10 @@ 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 // allocation of handles without explicit handle scopes. -- v8-dev mailing list [email protected] http://groups.google.com/group/v8-dev
