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
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;
}
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.
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.
JSBuiltinsObject::kJSBuiltinsOffset + (id * kPointerSize);
mov(edi, FieldOperand(edx, builtins_offset));
-
return Builtins::GetCode(id, resolved);
}