Revert r13699 "Debugger: ScopeMirror has N^2 algorithm when building closure mirrors." because of WebKit crashes.

BUG=v8:2554
R=verwaest@chromium.org

Review URL: https://chromiumcodereview.appspot.com/12321108

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@13714 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
This commit is contained in:
ulan@chromium.org 2013-02-25 11:56:37 +00:00
parent 5c7bff3ed8
commit 82a7ce63dc
3 changed files with 36 additions and 38 deletions

View File

@ -3559,13 +3559,6 @@ class ScopeInfo : public FixedArray {
// must be a symbol (canonicalized). // must be a symbol (canonicalized).
int FunctionContextSlotIndex(String* name, VariableMode* mode); int FunctionContextSlotIndex(String* name, VariableMode* mode);
// Copies all the context locals into an object used to materialize a scope.
bool CopyContextLocalsToScopeObject(Isolate* isolate,
Handle<Context> context,
Handle<JSObject> scope_object);
static Handle<ScopeInfo> Create(Scope* scope, Zone* zone); static Handle<ScopeInfo> Create(Scope* scope, Zone* zone);
// Serializes empty scope info. // Serializes empty scope info.

View File

@ -10588,6 +10588,34 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_GetFrameDetails) {
} }
// Copy all the context locals into an object used to materialize a scope.
static bool CopyContextLocalsToScopeObject(
Isolate* isolate,
Handle<ScopeInfo> scope_info,
Handle<Context> context,
Handle<JSObject> scope_object) {
// Fill all context locals to the context extension.
for (int i = 0; i < scope_info->ContextLocalCount(); i++) {
VariableMode mode;
InitializationFlag init_flag;
int context_index = scope_info->ContextSlotIndex(
scope_info->ContextLocalName(i), &mode, &init_flag);
RETURN_IF_EMPTY_HANDLE_VALUE(
isolate,
SetProperty(isolate,
scope_object,
Handle<String>(scope_info->ContextLocalName(i)),
Handle<Object>(context->get(context_index), isolate),
NONE,
kNonStrictMode),
false);
}
return true;
}
// Create a plain JSObject which materializes the local scope for the specified // Create a plain JSObject which materializes the local scope for the specified
// frame. // frame.
static Handle<JSObject> MaterializeLocalScopeWithFrameInspector( static Handle<JSObject> MaterializeLocalScopeWithFrameInspector(
@ -10637,8 +10665,8 @@ static Handle<JSObject> MaterializeLocalScopeWithFrameInspector(
// Third fill all context locals. // Third fill all context locals.
Handle<Context> frame_context(Context::cast(frame->context())); Handle<Context> frame_context(Context::cast(frame->context()));
Handle<Context> function_context(frame_context->declaration_context()); Handle<Context> function_context(frame_context->declaration_context());
if (!scope_info->CopyContextLocalsToScopeObject( if (!CopyContextLocalsToScopeObject(
isolate, function_context, local_scope)) { isolate, scope_info, function_context, local_scope)) {
return Handle<JSObject>(); return Handle<JSObject>();
} }
@ -10790,8 +10818,8 @@ static Handle<JSObject> MaterializeClosure(Isolate* isolate,
isolate->factory()->NewJSObject(isolate->object_function()); isolate->factory()->NewJSObject(isolate->object_function());
// Fill all context locals to the context extension. // Fill all context locals to the context extension.
if (!scope_info->CopyContextLocalsToScopeObject( if (!CopyContextLocalsToScopeObject(
isolate, context, closure_scope)) { isolate, scope_info, context, closure_scope)) {
return Handle<JSObject>(); return Handle<JSObject>();
} }
@ -10910,8 +10938,8 @@ static Handle<JSObject> MaterializeBlockScope(
isolate->factory()->NewJSObject(isolate->object_function()); isolate->factory()->NewJSObject(isolate->object_function());
// Fill all context locals. // Fill all context locals.
if (!scope_info->CopyContextLocalsToScopeObject( if (!CopyContextLocalsToScopeObject(
isolate, context, block_scope)) { isolate, scope_info, context, block_scope)) {
return Handle<JSObject>(); return Handle<JSObject>();
} }
@ -10933,8 +10961,8 @@ static Handle<JSObject> MaterializeModuleScope(
isolate->factory()->NewJSObject(isolate->object_function()); isolate->factory()->NewJSObject(isolate->object_function());
// Fill all context locals. // Fill all context locals.
if (!scope_info->CopyContextLocalsToScopeObject( if (!CopyContextLocalsToScopeObject(
isolate, context, module_scope)) { isolate, scope_info, context, module_scope)) {
return Handle<JSObject>(); return Handle<JSObject>();
} }

View File

@ -362,29 +362,6 @@ int ScopeInfo::FunctionContextSlotIndex(String* name, VariableMode* mode) {
} }
bool ScopeInfo::CopyContextLocalsToScopeObject(
Isolate* isolate,
Handle<Context> context,
Handle<JSObject> scope_object) {
// Fill all context locals to the context extension.
int start = ContextLocalNameEntriesIndex();
int end = start + ContextLocalCount();
for (int i = start; i < end; ++i) {
int context_index = Context::MIN_CONTEXT_SLOTS + i - start;
RETURN_IF_EMPTY_HANDLE_VALUE(
isolate,
SetProperty(isolate,
scope_object,
Handle<String>(String::cast(get(i))),
Handle<Object>(context->get(context_index), isolate),
::NONE,
kNonStrictMode),
false);
}
return true;
}
int ScopeInfo::ParameterEntriesIndex() { int ScopeInfo::ParameterEntriesIndex() {
ASSERT(length() > 0); ASSERT(length() > 0);
return kVariablePartIndex; return kVariablePartIndex;