Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(9)

Side by Side Diff: src/runtime.cc

Issue 2908009: Create a separate class to encapsulate ScopeInfo serialization.... (Closed) Base URL: http://v8.googlecode.com/svn/branches/bleeding_edge/
Patch Set: '' Created 10 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « src/profile-generator.cc ('k') | src/scopeinfo.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2006-2009 the V8 project authors. All rights reserved. 1 // Copyright 2006-2009 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 6851 matching lines...) Expand 10 before | Expand all | Expand 10 after
6862 RUNTIME_ASSERT(!args[0]->IsJSFunction()); 6862 RUNTIME_ASSERT(!args[0]->IsJSFunction());
6863 return *Execution::GetConstructorDelegate(args.at<Object>(0)); 6863 return *Execution::GetConstructorDelegate(args.at<Object>(0));
6864 } 6864 }
6865 6865
6866 6866
6867 static Object* Runtime_NewContext(Arguments args) { 6867 static Object* Runtime_NewContext(Arguments args) {
6868 NoHandleAllocation ha; 6868 NoHandleAllocation ha;
6869 ASSERT(args.length() == 1); 6869 ASSERT(args.length() == 1);
6870 6870
6871 CONVERT_CHECKED(JSFunction, function, args[0]); 6871 CONVERT_CHECKED(JSFunction, function, args[0]);
6872 int length = 6872 int length = function->shared()->scope_info()->NumberOfContextSlots();
6873 ScopeInfo<>::NumberOfContextSlots(function->shared()->scope_info());
6874 Object* result = Heap::AllocateFunctionContext(length, function); 6873 Object* result = Heap::AllocateFunctionContext(length, function);
6875 if (result->IsFailure()) return result; 6874 if (result->IsFailure()) return result;
6876 6875
6877 Top::set_context(Context::cast(result)); 6876 Top::set_context(Context::cast(result));
6878 6877
6879 return result; // non-failure 6878 return result; // non-failure
6880 } 6879 }
6881 6880
6882 static Object* PushContextHelper(Object* object, bool is_catch_context) { 6881 static Object* PushContextHelper(Object* object, bool is_catch_context) {
6883 // Convert the object to a proper JavaScript object. 6882 // Convert the object to a proper JavaScript object.
(...skipping 1601 matching lines...) Expand 10 before | Expand all | Expand 10 after
8485 Handle<Object> frame_id(WrapFrameId(it.frame()->id())); 8484 Handle<Object> frame_id(WrapFrameId(it.frame()->id()));
8486 8485
8487 // Find source position. 8486 // Find source position.
8488 int position = it.frame()->code()->SourcePosition(it.frame()->pc()); 8487 int position = it.frame()->code()->SourcePosition(it.frame()->pc());
8489 8488
8490 // Check for constructor frame. 8489 // Check for constructor frame.
8491 bool constructor = it.frame()->IsConstructor(); 8490 bool constructor = it.frame()->IsConstructor();
8492 8491
8493 // Get scope info and read from it for local variable information. 8492 // Get scope info and read from it for local variable information.
8494 Handle<JSFunction> function(JSFunction::cast(it.frame()->function())); 8493 Handle<JSFunction> function(JSFunction::cast(it.frame()->function()));
8495 Handle<Object> scope_info(function->shared()->scope_info()); 8494 Handle<SerializedScopeInfo> scope_info(function->shared()->scope_info());
8496 ScopeInfo<> info(*scope_info); 8495 ScopeInfo<> info(*scope_info);
8497 8496
8498 // Get the context. 8497 // Get the context.
8499 Handle<Context> context(Context::cast(it.frame()->context())); 8498 Handle<Context> context(Context::cast(it.frame()->context()));
8500 8499
8501 // Get the locals names and values into a temporary array. 8500 // Get the locals names and values into a temporary array.
8502 // 8501 //
8503 // TODO(1240907): Hide compiler-introduced stack variables 8502 // TODO(1240907): Hide compiler-introduced stack variables
8504 // (e.g. .result)? For users of the debugger, they will probably be 8503 // (e.g. .result)? For users of the debugger, they will probably be
8505 // confusing. 8504 // confusing.
8506 Handle<FixedArray> locals = Factory::NewFixedArray(info.NumberOfLocals() * 2); 8505 Handle<FixedArray> locals = Factory::NewFixedArray(info.NumberOfLocals() * 2);
8507 for (int i = 0; i < info.NumberOfLocals(); i++) { 8506 for (int i = 0; i < info.NumberOfLocals(); i++) {
8508 // Name of the local. 8507 // Name of the local.
8509 locals->set(i * 2, *info.LocalName(i)); 8508 locals->set(i * 2, *info.LocalName(i));
8510 8509
8511 // Fetch the value of the local - either from the stack or from a 8510 // Fetch the value of the local - either from the stack or from a
8512 // heap-allocated context. 8511 // heap-allocated context.
8513 if (i < info.number_of_stack_slots()) { 8512 if (i < info.number_of_stack_slots()) {
8514 locals->set(i * 2 + 1, it.frame()->GetExpression(i)); 8513 locals->set(i * 2 + 1, it.frame()->GetExpression(i));
8515 } else { 8514 } else {
8516 Handle<String> name = info.LocalName(i); 8515 Handle<String> name = info.LocalName(i);
8517 // Traverse the context chain to the function context as all local 8516 // Traverse the context chain to the function context as all local
8518 // variables stored in the context will be on the function context. 8517 // variables stored in the context will be on the function context.
8519 while (!context->is_function_context()) { 8518 while (!context->is_function_context()) {
8520 context = Handle<Context>(context->previous()); 8519 context = Handle<Context>(context->previous());
8521 } 8520 }
8522 ASSERT(context->is_function_context()); 8521 ASSERT(context->is_function_context());
8523 locals->set(i * 2 + 1, 8522 locals->set(i * 2 + 1,
8524 context->get(ScopeInfo<>::ContextSlotIndex(*scope_info, 8523 context->get(scope_info->ContextSlotIndex(*name, NULL)));
8525 *name,
8526 NULL)));
8527 } 8524 }
8528 } 8525 }
8529 8526
8530 // Check whether this frame is positioned at return. 8527 // Check whether this frame is positioned at return.
8531 int at_return = (index == 0) ? Debug::IsBreakAtReturn(it.frame()) : false; 8528 int at_return = (index == 0) ? Debug::IsBreakAtReturn(it.frame()) : false;
8532 8529
8533 // If positioned just before return find the value to be returned and add it 8530 // If positioned just before return find the value to be returned and add it
8534 // to the frame information. 8531 // to the frame information.
8535 Handle<Object> return_value = Factory::undefined_value(); 8532 Handle<Object> return_value = Factory::undefined_value();
8536 if (at_return) { 8533 if (at_return) {
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after
8656 receiver = Factory::ToObject(receiver, calling_frames_global_context); 8653 receiver = Factory::ToObject(receiver, calling_frames_global_context);
8657 } 8654 }
8658 details->set(kFrameDetailsReceiverIndex, *receiver); 8655 details->set(kFrameDetailsReceiverIndex, *receiver);
8659 8656
8660 ASSERT_EQ(details_size, details_index); 8657 ASSERT_EQ(details_size, details_index);
8661 return *Factory::NewJSArrayWithElements(details); 8658 return *Factory::NewJSArrayWithElements(details);
8662 } 8659 }
8663 8660
8664 8661
8665 // Copy all the context locals into an object used to materialize a scope. 8662 // Copy all the context locals into an object used to materialize a scope.
8666 static void CopyContextLocalsToScopeObject(Handle<SharedFunctionInfo> shared, 8663 static void CopyContextLocalsToScopeObject(
8667 ScopeInfo<>& scope_info, 8664 Handle<SerializedScopeInfo> serialized_scope_info,
8668 Handle<Context> context, 8665 ScopeInfo<>& scope_info,
8669 Handle<JSObject> scope_object) { 8666 Handle<Context> context,
8667 Handle<JSObject> scope_object) {
8670 // Fill all context locals to the context extension. 8668 // Fill all context locals to the context extension.
8671 for (int i = Context::MIN_CONTEXT_SLOTS; 8669 for (int i = Context::MIN_CONTEXT_SLOTS;
8672 i < scope_info.number_of_context_slots(); 8670 i < scope_info.number_of_context_slots();
8673 i++) { 8671 i++) {
8674 int context_index = 8672 int context_index = serialized_scope_info->ContextSlotIndex(
8675 ScopeInfo<>::ContextSlotIndex(shared->scope_info(), 8673 *scope_info.context_slot_name(i), NULL);
8676 *scope_info.context_slot_name(i),
8677 NULL);
8678 8674
8679 // Don't include the arguments shadow (.arguments) context variable. 8675 // Don't include the arguments shadow (.arguments) context variable.
8680 if (*scope_info.context_slot_name(i) != Heap::arguments_shadow_symbol()) { 8676 if (*scope_info.context_slot_name(i) != Heap::arguments_shadow_symbol()) {
8681 SetProperty(scope_object, 8677 SetProperty(scope_object,
8682 scope_info.context_slot_name(i), 8678 scope_info.context_slot_name(i),
8683 Handle<Object>(context->get(context_index)), NONE); 8679 Handle<Object>(context->get(context_index)), NONE);
8684 } 8680 }
8685 } 8681 }
8686 } 8682 }
8687 8683
8688 8684
8689 // Create a plain JSObject which materializes the local scope for the specified 8685 // Create a plain JSObject which materializes the local scope for the specified
8690 // frame. 8686 // frame.
8691 static Handle<JSObject> MaterializeLocalScope(JavaScriptFrame* frame) { 8687 static Handle<JSObject> MaterializeLocalScope(JavaScriptFrame* frame) {
8692 Handle<JSFunction> function(JSFunction::cast(frame->function())); 8688 Handle<JSFunction> function(JSFunction::cast(frame->function()));
8693 Handle<SharedFunctionInfo> shared(function->shared()); 8689 Handle<SharedFunctionInfo> shared(function->shared());
8694 ScopeInfo<> scope_info(shared->scope_info()); 8690 Handle<SerializedScopeInfo> serialized_scope_info(shared->scope_info());
8691 ScopeInfo<> scope_info(*serialized_scope_info);
8695 8692
8696 // Allocate and initialize a JSObject with all the arguments, stack locals 8693 // Allocate and initialize a JSObject with all the arguments, stack locals
8697 // heap locals and extension properties of the debugged function. 8694 // heap locals and extension properties of the debugged function.
8698 Handle<JSObject> local_scope = Factory::NewJSObject(Top::object_function()); 8695 Handle<JSObject> local_scope = Factory::NewJSObject(Top::object_function());
8699 8696
8700 // First fill all parameters. 8697 // First fill all parameters.
8701 for (int i = 0; i < scope_info.number_of_parameters(); ++i) { 8698 for (int i = 0; i < scope_info.number_of_parameters(); ++i) {
8702 SetProperty(local_scope, 8699 SetProperty(local_scope,
8703 scope_info.parameter_name(i), 8700 scope_info.parameter_name(i),
8704 Handle<Object>(frame->GetParameter(i)), NONE); 8701 Handle<Object>(frame->GetParameter(i)), NONE);
8705 } 8702 }
8706 8703
8707 // Second fill all stack locals. 8704 // Second fill all stack locals.
8708 for (int i = 0; i < scope_info.number_of_stack_slots(); i++) { 8705 for (int i = 0; i < scope_info.number_of_stack_slots(); i++) {
8709 SetProperty(local_scope, 8706 SetProperty(local_scope,
8710 scope_info.stack_slot_name(i), 8707 scope_info.stack_slot_name(i),
8711 Handle<Object>(frame->GetExpression(i)), NONE); 8708 Handle<Object>(frame->GetExpression(i)), NONE);
8712 } 8709 }
8713 8710
8714 // Third fill all context locals. 8711 // Third fill all context locals.
8715 Handle<Context> frame_context(Context::cast(frame->context())); 8712 Handle<Context> frame_context(Context::cast(frame->context()));
8716 Handle<Context> function_context(frame_context->fcontext()); 8713 Handle<Context> function_context(frame_context->fcontext());
8717 CopyContextLocalsToScopeObject(shared, scope_info, 8714 CopyContextLocalsToScopeObject(serialized_scope_info, scope_info,
8718 function_context, local_scope); 8715 function_context, local_scope);
8719 8716
8720 // Finally copy any properties from the function context extension. This will 8717 // Finally copy any properties from the function context extension. This will
8721 // be variables introduced by eval. 8718 // be variables introduced by eval.
8722 if (function_context->closure() == *function) { 8719 if (function_context->closure() == *function) {
8723 if (function_context->has_extension() && 8720 if (function_context->has_extension() &&
8724 !function_context->IsGlobalContext()) { 8721 !function_context->IsGlobalContext()) {
8725 Handle<JSObject> ext(JSObject::cast(function_context->extension())); 8722 Handle<JSObject> ext(JSObject::cast(function_context->extension()));
8726 Handle<FixedArray> keys = GetKeysInFixedArrayFor(ext, INCLUDE_PROTOS); 8723 Handle<FixedArray> keys = GetKeysInFixedArrayFor(ext, INCLUDE_PROTOS);
8727 for (int i = 0; i < keys->length(); i++) { 8724 for (int i = 0; i < keys->length(); i++) {
8728 // Names of variables introduced by eval are strings. 8725 // Names of variables introduced by eval are strings.
8729 ASSERT(keys->get(i)->IsString()); 8726 ASSERT(keys->get(i)->IsString());
8730 Handle<String> key(String::cast(keys->get(i))); 8727 Handle<String> key(String::cast(keys->get(i)));
8731 SetProperty(local_scope, key, GetProperty(ext, key), NONE); 8728 SetProperty(local_scope, key, GetProperty(ext, key), NONE);
8732 } 8729 }
8733 } 8730 }
8734 } 8731 }
8735 return local_scope; 8732 return local_scope;
8736 } 8733 }
8737 8734
8738 8735
8739 // Create a plain JSObject which materializes the closure content for the 8736 // Create a plain JSObject which materializes the closure content for the
8740 // context. 8737 // context.
8741 static Handle<JSObject> MaterializeClosure(Handle<Context> context) { 8738 static Handle<JSObject> MaterializeClosure(Handle<Context> context) {
8742 ASSERT(context->is_function_context()); 8739 ASSERT(context->is_function_context());
8743 8740
8744 Handle<SharedFunctionInfo> shared(context->closure()->shared()); 8741 Handle<SharedFunctionInfo> shared(context->closure()->shared());
8745 ScopeInfo<> scope_info(shared->scope_info()); 8742 Handle<SerializedScopeInfo> serialized_scope_info(shared->scope_info());
8743 ScopeInfo<> scope_info(*serialized_scope_info);
8746 8744
8747 // Allocate and initialize a JSObject with all the content of theis function 8745 // Allocate and initialize a JSObject with all the content of theis function
8748 // closure. 8746 // closure.
8749 Handle<JSObject> closure_scope = Factory::NewJSObject(Top::object_function()); 8747 Handle<JSObject> closure_scope = Factory::NewJSObject(Top::object_function());
8750 8748
8751 // Check whether the arguments shadow object exists. 8749 // Check whether the arguments shadow object exists.
8752 int arguments_shadow_index = 8750 int arguments_shadow_index =
8753 ScopeInfo<>::ContextSlotIndex(shared->scope_info(), 8751 shared->scope_info()->ContextSlotIndex(Heap::arguments_shadow_symbol(),
8754 Heap::arguments_shadow_symbol(), 8752 NULL);
8755 NULL);
8756 if (arguments_shadow_index >= 0) { 8753 if (arguments_shadow_index >= 0) {
8757 // In this case all the arguments are available in the arguments shadow 8754 // In this case all the arguments are available in the arguments shadow
8758 // object. 8755 // object.
8759 Handle<JSObject> arguments_shadow( 8756 Handle<JSObject> arguments_shadow(
8760 JSObject::cast(context->get(arguments_shadow_index))); 8757 JSObject::cast(context->get(arguments_shadow_index)));
8761 for (int i = 0; i < scope_info.number_of_parameters(); ++i) { 8758 for (int i = 0; i < scope_info.number_of_parameters(); ++i) {
8762 SetProperty(closure_scope, 8759 SetProperty(closure_scope,
8763 scope_info.parameter_name(i), 8760 scope_info.parameter_name(i),
8764 Handle<Object>(arguments_shadow->GetElement(i)), NONE); 8761 Handle<Object>(arguments_shadow->GetElement(i)), NONE);
8765 } 8762 }
8766 } 8763 }
8767 8764
8768 // Fill all context locals to the context extension. 8765 // Fill all context locals to the context extension.
8769 CopyContextLocalsToScopeObject(shared, scope_info, context, closure_scope); 8766 CopyContextLocalsToScopeObject(serialized_scope_info, scope_info,
8767 context, closure_scope);
8770 8768
8771 // Finally copy any properties from the function context extension. This will 8769 // Finally copy any properties from the function context extension. This will
8772 // be variables introduced by eval. 8770 // be variables introduced by eval.
8773 if (context->has_extension()) { 8771 if (context->has_extension()) {
8774 Handle<JSObject> ext(JSObject::cast(context->extension())); 8772 Handle<JSObject> ext(JSObject::cast(context->extension()));
8775 Handle<FixedArray> keys = GetKeysInFixedArrayFor(ext, INCLUDE_PROTOS); 8773 Handle<FixedArray> keys = GetKeysInFixedArrayFor(ext, INCLUDE_PROTOS);
8776 for (int i = 0; i < keys->length(); i++) { 8774 for (int i = 0; i < keys->length(); i++) {
8777 // Names of variables introduced by eval are strings. 8775 // Names of variables introduced by eval are strings.
8778 ASSERT(keys->get(i)->IsString()); 8776 ASSERT(keys->get(i)->IsString());
8779 Handle<String> key(String::cast(keys->get(i))); 8777 Handle<String> key(String::cast(keys->get(i)));
(...skipping 28 matching lines...) Expand all
8808 context_(Context::cast(frame->context())), 8806 context_(Context::cast(frame->context())),
8809 local_done_(false), 8807 local_done_(false),
8810 at_local_(false) { 8808 at_local_(false) {
8811 8809
8812 // Check whether the first scope is actually a local scope. 8810 // Check whether the first scope is actually a local scope.
8813 if (context_->IsGlobalContext()) { 8811 if (context_->IsGlobalContext()) {
8814 // If there is a stack slot for .result then this local scope has been 8812 // If there is a stack slot for .result then this local scope has been
8815 // created for evaluating top level code and it is not a real local scope. 8813 // created for evaluating top level code and it is not a real local scope.
8816 // Checking for the existence of .result seems fragile, but the scope info 8814 // Checking for the existence of .result seems fragile, but the scope info
8817 // saved with the code object does not otherwise have that information. 8815 // saved with the code object does not otherwise have that information.
8818 int index = ScopeInfo<>::StackSlotIndex(function_->shared()->scope_info(), 8816 int index = function_->shared()->scope_info()->
8819 Heap::result_symbol()); 8817 StackSlotIndex(Heap::result_symbol());
8820 at_local_ = index < 0; 8818 at_local_ = index < 0;
8821 } else if (context_->is_function_context()) { 8819 } else if (context_->is_function_context()) {
8822 at_local_ = true; 8820 at_local_ = true;
8823 } 8821 }
8824 } 8822 }
8825 8823
8826 // More scopes? 8824 // More scopes?
8827 bool Done() { return context_.is_null(); } 8825 bool Done() { return context_.is_null(); }
8828 8826
8829 // Move to the next scope. 8827 // Move to the next scope.
(...skipping 617 matching lines...) Expand 10 before | Expand all | Expand 10 after
9447 CopyWithContextChain(function_context, previous), 9445 CopyWithContextChain(function_context, previous),
9448 extension, 9446 extension,
9449 context_chain->IsCatchContext()); 9447 context_chain->IsCatchContext());
9450 } 9448 }
9451 9449
9452 9450
9453 // Helper function to find or create the arguments object for 9451 // Helper function to find or create the arguments object for
9454 // Runtime_DebugEvaluate. 9452 // Runtime_DebugEvaluate.
9455 static Handle<Object> GetArgumentsObject(JavaScriptFrame* frame, 9453 static Handle<Object> GetArgumentsObject(JavaScriptFrame* frame,
9456 Handle<JSFunction> function, 9454 Handle<JSFunction> function,
9457 Handle<Object> scope_info, 9455 Handle<SerializedScopeInfo> scope_info,
9458 const ScopeInfo<>* sinfo, 9456 const ScopeInfo<>* sinfo,
9459 Handle<Context> function_context) { 9457 Handle<Context> function_context) {
9460 // Try to find the value of 'arguments' to pass as parameter. If it is not 9458 // Try to find the value of 'arguments' to pass as parameter. If it is not
9461 // found (that is the debugged function does not reference 'arguments' and 9459 // found (that is the debugged function does not reference 'arguments' and
9462 // does not support eval) then create an 'arguments' object. 9460 // does not support eval) then create an 'arguments' object.
9463 int index; 9461 int index;
9464 if (sinfo->number_of_stack_slots() > 0) { 9462 if (sinfo->number_of_stack_slots() > 0) {
9465 index = ScopeInfo<>::StackSlotIndex(*scope_info, Heap::arguments_symbol()); 9463 index = scope_info->StackSlotIndex(Heap::arguments_symbol());
9466 if (index != -1) { 9464 if (index != -1) {
9467 return Handle<Object>(frame->GetExpression(index)); 9465 return Handle<Object>(frame->GetExpression(index));
9468 } 9466 }
9469 } 9467 }
9470 9468
9471 if (sinfo->number_of_context_slots() > Context::MIN_CONTEXT_SLOTS) { 9469 if (sinfo->number_of_context_slots() > Context::MIN_CONTEXT_SLOTS) {
9472 index = ScopeInfo<>::ContextSlotIndex(*scope_info, Heap::arguments_symbol(), 9470 index = scope_info->ContextSlotIndex(Heap::arguments_symbol(), NULL);
9473 NULL);
9474 if (index != -1) { 9471 if (index != -1) {
9475 return Handle<Object>(function_context->get(index)); 9472 return Handle<Object>(function_context->get(index));
9476 } 9473 }
9477 } 9474 }
9478 9475
9479 const int length = frame->GetProvidedParametersCount(); 9476 const int length = frame->GetProvidedParametersCount();
9480 Handle<JSObject> arguments = Factory::NewArgumentsObject(function, length); 9477 Handle<JSObject> arguments = Factory::NewArgumentsObject(function, length);
9481 Handle<FixedArray> array = Factory::NewFixedArray(length); 9478 Handle<FixedArray> array = Factory::NewFixedArray(length);
9482 9479
9483 AssertNoAllocation no_gc; 9480 AssertNoAllocation no_gc;
(...skipping 30 matching lines...) Expand all
9514 CONVERT_BOOLEAN_CHECKED(disable_break, args[3]); 9511 CONVERT_BOOLEAN_CHECKED(disable_break, args[3]);
9515 9512
9516 // Handle the processing of break. 9513 // Handle the processing of break.
9517 DisableBreak disable_break_save(disable_break); 9514 DisableBreak disable_break_save(disable_break);
9518 9515
9519 // Get the frame where the debugging is performed. 9516 // Get the frame where the debugging is performed.
9520 StackFrame::Id id = UnwrapFrameId(wrapped_id); 9517 StackFrame::Id id = UnwrapFrameId(wrapped_id);
9521 JavaScriptFrameIterator it(id); 9518 JavaScriptFrameIterator it(id);
9522 JavaScriptFrame* frame = it.frame(); 9519 JavaScriptFrame* frame = it.frame();
9523 Handle<JSFunction> function(JSFunction::cast(frame->function())); 9520 Handle<JSFunction> function(JSFunction::cast(frame->function()));
9524 Handle<Object> scope_info(function->shared()->scope_info()); 9521 Handle<SerializedScopeInfo> scope_info(function->shared()->scope_info());
9525 ScopeInfo<> sinfo(*scope_info); 9522 ScopeInfo<> sinfo(*scope_info);
9526 9523
9527 // Traverse the saved contexts chain to find the active context for the 9524 // Traverse the saved contexts chain to find the active context for the
9528 // selected frame. 9525 // selected frame.
9529 SaveContext* save = Top::save_context(); 9526 SaveContext* save = Top::save_context();
9530 while (save != NULL && !save->below(frame)) { 9527 while (save != NULL && !save->below(frame)) {
9531 save = save->prev(); 9528 save = save->prev();
9532 } 9529 }
9533 ASSERT(save != NULL); 9530 ASSERT(save != NULL);
9534 SaveContext savex; 9531 SaveContext savex;
(...skipping 1012 matching lines...) Expand 10 before | Expand all | Expand 10 after
10547 } else { 10544 } else {
10548 // Handle last resort GC and make sure to allow future allocations 10545 // Handle last resort GC and make sure to allow future allocations
10549 // to grow the heap without causing GCs (if possible). 10546 // to grow the heap without causing GCs (if possible).
10550 Counters::gc_last_resort_from_js.Increment(); 10547 Counters::gc_last_resort_from_js.Increment();
10551 Heap::CollectAllGarbage(false); 10548 Heap::CollectAllGarbage(false);
10552 } 10549 }
10553 } 10550 }
10554 10551
10555 10552
10556 } } // namespace v8::internal 10553 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/profile-generator.cc ('k') | src/scopeinfo.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698