Commit b62de7c0 authored by yangguo@chromium.org's avatar yangguo@chromium.org

Debugger: ScopeMirror has N^2 algorithm when building closure mirrors.

R=yangguo@chromium.org
BUG=

Review URL: https://chromiumcodereview.appspot.com/12326009
Patch from Pavel Feldman <pfeldman@chromium.org>.

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@13699 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
parent b5a64451
......@@ -3559,6 +3559,13 @@ class ScopeInfo : public FixedArray {
// must be a symbol (canonicalized).
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);
// Serializes empty scope info.
......
......@@ -10766,34 +10766,6 @@ 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
// frame.
static Handle<JSObject> MaterializeLocalScopeWithFrameInspector(
......@@ -10843,8 +10815,8 @@ static Handle<JSObject> MaterializeLocalScopeWithFrameInspector(
// Third fill all context locals.
Handle<Context> frame_context(Context::cast(frame->context()));
Handle<Context> function_context(frame_context->declaration_context());
if (!CopyContextLocalsToScopeObject(
isolate, scope_info, function_context, local_scope)) {
if (!scope_info->CopyContextLocalsToScopeObject(
isolate, function_context, local_scope)) {
return Handle<JSObject>();
}
......@@ -10996,8 +10968,8 @@ static Handle<JSObject> MaterializeClosure(Isolate* isolate,
isolate->factory()->NewJSObject(isolate->object_function());
// Fill all context locals to the context extension.
if (!CopyContextLocalsToScopeObject(
isolate, scope_info, context, closure_scope)) {
if (!scope_info->CopyContextLocalsToScopeObject(
isolate, context, closure_scope)) {
return Handle<JSObject>();
}
......@@ -11116,8 +11088,8 @@ static Handle<JSObject> MaterializeBlockScope(
isolate->factory()->NewJSObject(isolate->object_function());
// Fill all context locals.
if (!CopyContextLocalsToScopeObject(
isolate, scope_info, context, block_scope)) {
if (!scope_info->CopyContextLocalsToScopeObject(
isolate, context, block_scope)) {
return Handle<JSObject>();
}
......@@ -11139,8 +11111,8 @@ static Handle<JSObject> MaterializeModuleScope(
isolate->factory()->NewJSObject(isolate->object_function());
// Fill all context locals.
if (!CopyContextLocalsToScopeObject(
isolate, scope_info, context, module_scope)) {
if (!scope_info->CopyContextLocalsToScopeObject(
isolate, context, module_scope)) {
return Handle<JSObject>();
}
......
......@@ -362,6 +362,29 @@ 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() {
ASSERT(length() > 0);
return kVariablePartIndex;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment