OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 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 8108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8119 // prefixed by a number of empty handles). | 8119 // prefixed by a number of empty handles). |
8120 static SmartArrayPointer<Handle<Object> > GetCallerArguments( | 8120 static SmartArrayPointer<Handle<Object> > GetCallerArguments( |
8121 int prefix_argc, | 8121 int prefix_argc, |
8122 int* total_argc) { | 8122 int* total_argc) { |
8123 // Find frame containing arguments passed to the caller. | 8123 // Find frame containing arguments passed to the caller. |
8124 JavaScriptFrameIterator it; | 8124 JavaScriptFrameIterator it; |
8125 JavaScriptFrame* frame = it.frame(); | 8125 JavaScriptFrame* frame = it.frame(); |
8126 List<JSFunction*> functions(2); | 8126 List<JSFunction*> functions(2); |
8127 frame->GetFunctions(&functions); | 8127 frame->GetFunctions(&functions); |
8128 if (functions.length() > 1) { | 8128 if (functions.length() > 1) { |
8129 int inlined_frame_index = functions.length() - 1; | 8129 int inlined_jsframe_index = functions.length() - 1; |
8130 JSFunction* inlined_function = functions[inlined_frame_index]; | 8130 JSFunction* inlined_function = functions[inlined_jsframe_index]; |
8131 int args_count = inlined_function->shared()->formal_parameter_count(); | 8131 Vector<SlotRef> args_slots = |
8132 ScopedVector<SlotRef> args_slots(args_count); | 8132 SlotRef::ComputeSlotMappingForArguments( |
8133 SlotRef::ComputeSlotMappingForArguments(frame, | 8133 frame, |
8134 inlined_frame_index, | 8134 inlined_jsframe_index, |
8135 &args_slots); | 8135 inlined_function->shared()->formal_parameter_count()); |
| 8136 |
| 8137 int args_count = args_slots.length(); |
8136 | 8138 |
8137 *total_argc = prefix_argc + args_count; | 8139 *total_argc = prefix_argc + args_count; |
8138 SmartArrayPointer<Handle<Object> > param_data( | 8140 SmartArrayPointer<Handle<Object> > param_data( |
8139 NewArray<Handle<Object> >(*total_argc)); | 8141 NewArray<Handle<Object> >(*total_argc)); |
8140 for (int i = 0; i < args_count; i++) { | 8142 for (int i = 0; i < args_count; i++) { |
8141 Handle<Object> val = args_slots[i].GetValue(); | 8143 Handle<Object> val = args_slots[i].GetValue(); |
8142 param_data[prefix_argc + i] = val; | 8144 param_data[prefix_argc + i] = val; |
8143 } | 8145 } |
| 8146 |
| 8147 args_slots.Dispose(); |
| 8148 |
8144 return param_data; | 8149 return param_data; |
8145 } else { | 8150 } else { |
8146 it.AdvanceToArgumentsFrame(); | 8151 it.AdvanceToArgumentsFrame(); |
8147 frame = it.frame(); | 8152 frame = it.frame(); |
8148 int args_count = frame->ComputeParametersCount(); | 8153 int args_count = frame->ComputeParametersCount(); |
8149 | 8154 |
8150 *total_argc = prefix_argc + args_count; | 8155 *total_argc = prefix_argc + args_count; |
8151 SmartArrayPointer<Handle<Object> > param_data( | 8156 SmartArrayPointer<Handle<Object> > param_data( |
8152 NewArray<Handle<Object> >(*total_argc)); | 8157 NewArray<Handle<Object> >(*total_argc)); |
8153 for (int i = 0; i < args_count; i++) { | 8158 for (int i = 0; i < args_count; i++) { |
(...skipping 325 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8479 | 8484 |
8480 | 8485 |
8481 RUNTIME_FUNCTION(MaybeObject*, Runtime_NotifyDeoptimized) { | 8486 RUNTIME_FUNCTION(MaybeObject*, Runtime_NotifyDeoptimized) { |
8482 HandleScope scope(isolate); | 8487 HandleScope scope(isolate); |
8483 ASSERT(args.length() == 1); | 8488 ASSERT(args.length() == 1); |
8484 RUNTIME_ASSERT(args[0]->IsSmi()); | 8489 RUNTIME_ASSERT(args[0]->IsSmi()); |
8485 Deoptimizer::BailoutType type = | 8490 Deoptimizer::BailoutType type = |
8486 static_cast<Deoptimizer::BailoutType>(args.smi_at(0)); | 8491 static_cast<Deoptimizer::BailoutType>(args.smi_at(0)); |
8487 Deoptimizer* deoptimizer = Deoptimizer::Grab(isolate); | 8492 Deoptimizer* deoptimizer = Deoptimizer::Grab(isolate); |
8488 ASSERT(isolate->heap()->IsAllocationAllowed()); | 8493 ASSERT(isolate->heap()->IsAllocationAllowed()); |
8489 int frames = deoptimizer->output_count(); | 8494 int jsframes = deoptimizer->jsframe_count(); |
8490 | 8495 |
8491 deoptimizer->MaterializeHeapNumbers(); | 8496 deoptimizer->MaterializeHeapNumbers(); |
8492 delete deoptimizer; | 8497 delete deoptimizer; |
8493 | 8498 |
8494 JavaScriptFrameIterator it(isolate); | 8499 JavaScriptFrameIterator it(isolate); |
8495 JavaScriptFrame* frame = NULL; | 8500 JavaScriptFrame* frame = NULL; |
8496 for (int i = 0; i < frames - 1; i++) it.Advance(); | 8501 for (int i = 0; i < jsframes - 1; i++) it.Advance(); |
8497 frame = it.frame(); | 8502 frame = it.frame(); |
8498 | 8503 |
8499 RUNTIME_ASSERT(frame->function()->IsJSFunction()); | 8504 RUNTIME_ASSERT(frame->function()->IsJSFunction()); |
8500 Handle<JSFunction> function(JSFunction::cast(frame->function()), isolate); | 8505 Handle<JSFunction> function(JSFunction::cast(frame->function()), isolate); |
8501 Handle<Object> arguments; | 8506 Handle<Object> arguments; |
8502 for (int i = frame->ComputeExpressionsCount() - 1; i >= 0; --i) { | 8507 for (int i = frame->ComputeExpressionsCount() - 1; i >= 0; --i) { |
8503 if (frame->GetExpression(i) == isolate->heap()->arguments_marker()) { | 8508 if (frame->GetExpression(i) == isolate->heap()->arguments_marker()) { |
8504 if (arguments.is_null()) { | 8509 if (arguments.is_null()) { |
8505 // FunctionGetArguments can't throw an exception, so cast away the | 8510 // FunctionGetArguments can't throw an exception, so cast away the |
8506 // doubt with an assert. | 8511 // doubt with an assert. |
(...skipping 2189 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
10696 for (JavaScriptFrameIterator it(isolate, id); !it.done(); it.Advance()) { | 10701 for (JavaScriptFrameIterator it(isolate, id); !it.done(); it.Advance()) { |
10697 n += it.frame()->GetInlineCount(); | 10702 n += it.frame()->GetInlineCount(); |
10698 } | 10703 } |
10699 return Smi::FromInt(n); | 10704 return Smi::FromInt(n); |
10700 } | 10705 } |
10701 | 10706 |
10702 | 10707 |
10703 class FrameInspector { | 10708 class FrameInspector { |
10704 public: | 10709 public: |
10705 FrameInspector(JavaScriptFrame* frame, | 10710 FrameInspector(JavaScriptFrame* frame, |
10706 int inlined_frame_index, | 10711 int inlined_jsframe_index, |
10707 Isolate* isolate) | 10712 Isolate* isolate) |
10708 : frame_(frame), deoptimized_frame_(NULL), isolate_(isolate) { | 10713 : frame_(frame), deoptimized_frame_(NULL), isolate_(isolate) { |
10709 // Calculate the deoptimized frame. | 10714 // Calculate the deoptimized frame. |
10710 if (frame->is_optimized()) { | 10715 if (frame->is_optimized()) { |
10711 deoptimized_frame_ = Deoptimizer::DebuggerInspectableFrame( | 10716 deoptimized_frame_ = Deoptimizer::DebuggerInspectableFrame( |
10712 frame, inlined_frame_index, isolate); | 10717 frame, inlined_jsframe_index, isolate); |
10713 } | 10718 } |
10714 has_adapted_arguments_ = frame_->has_adapted_arguments(); | 10719 has_adapted_arguments_ = frame_->has_adapted_arguments(); |
10715 is_optimized_ = frame_->is_optimized(); | 10720 is_optimized_ = frame_->is_optimized(); |
10716 } | 10721 } |
10717 | 10722 |
10718 ~FrameInspector() { | 10723 ~FrameInspector() { |
10719 // Get rid of the calculated deoptimized frame if any. | 10724 // Get rid of the calculated deoptimized frame if any. |
10720 if (deoptimized_frame_ != NULL) { | 10725 if (deoptimized_frame_ != NULL) { |
10721 Deoptimizer::DeleteDebuggerInspectableFrame(deoptimized_frame_, | 10726 Deoptimizer::DeleteDebuggerInspectableFrame(deoptimized_frame_, |
10722 isolate_); | 10727 isolate_); |
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
10818 CONVERT_NUMBER_CHECKED(int, index, Int32, args[1]); | 10823 CONVERT_NUMBER_CHECKED(int, index, Int32, args[1]); |
10819 Heap* heap = isolate->heap(); | 10824 Heap* heap = isolate->heap(); |
10820 | 10825 |
10821 // Find the relevant frame with the requested index. | 10826 // Find the relevant frame with the requested index. |
10822 StackFrame::Id id = isolate->debug()->break_frame_id(); | 10827 StackFrame::Id id = isolate->debug()->break_frame_id(); |
10823 if (id == StackFrame::NO_ID) { | 10828 if (id == StackFrame::NO_ID) { |
10824 // If there are no JavaScript stack frames return undefined. | 10829 // If there are no JavaScript stack frames return undefined. |
10825 return heap->undefined_value(); | 10830 return heap->undefined_value(); |
10826 } | 10831 } |
10827 | 10832 |
10828 int inlined_frame_index = 0; // Inlined frame index in optimized frame. | |
10829 | |
10830 int count = 0; | 10833 int count = 0; |
10831 JavaScriptFrameIterator it(isolate, id); | 10834 JavaScriptFrameIterator it(isolate, id); |
10832 for (; !it.done(); it.Advance()) { | 10835 for (; !it.done(); it.Advance()) { |
10833 if (index < count + it.frame()->GetInlineCount()) break; | 10836 if (index < count + it.frame()->GetInlineCount()) break; |
10834 count += it.frame()->GetInlineCount(); | 10837 count += it.frame()->GetInlineCount(); |
10835 } | 10838 } |
10836 if (it.done()) return heap->undefined_value(); | 10839 if (it.done()) return heap->undefined_value(); |
10837 | 10840 |
10838 if (it.frame()->is_optimized()) { | 10841 bool is_optimized = it.frame()->is_optimized(); |
10839 inlined_frame_index = | 10842 |
| 10843 int inlined_jsframe_index = 0; // Inlined frame index in optimized frame. |
| 10844 if (is_optimized) { |
| 10845 inlined_jsframe_index = |
10840 it.frame()->GetInlineCount() - (index - count) - 1; | 10846 it.frame()->GetInlineCount() - (index - count) - 1; |
10841 } | 10847 } |
10842 FrameInspector frame_inspector(it.frame(), inlined_frame_index, isolate); | 10848 FrameInspector frame_inspector(it.frame(), inlined_jsframe_index, isolate); |
10843 | 10849 |
10844 // Traverse the saved contexts chain to find the active context for the | 10850 // Traverse the saved contexts chain to find the active context for the |
10845 // selected frame. | 10851 // selected frame. |
10846 SaveContext* save = FindSavedContextForFrame(isolate, it.frame()); | 10852 SaveContext* save = FindSavedContextForFrame(isolate, it.frame()); |
10847 | 10853 |
10848 // Get the frame id. | 10854 // Get the frame id. |
10849 Handle<Object> frame_id(WrapFrameId(it.frame()->id()), isolate); | 10855 Handle<Object> frame_id(WrapFrameId(it.frame()->id()), isolate); |
10850 | 10856 |
10851 // Find source position. | 10857 // Find source position. |
10852 int position = | 10858 int position = |
10853 it.frame()->LookupCode()->SourcePosition(it.frame()->pc()); | 10859 it.frame()->LookupCode()->SourcePosition(it.frame()->pc()); |
10854 | 10860 |
10855 // Check for constructor frame. Inlined frames cannot be construct calls. | 10861 // Check for constructor frame. Inlined frames cannot be construct calls. |
10856 bool inlined_frame = | 10862 bool inlined_frame = is_optimized && inlined_jsframe_index != 0; |
10857 it.frame()->is_optimized() && inlined_frame_index != 0; | |
10858 bool constructor = !inlined_frame && it.frame()->IsConstructor(); | 10863 bool constructor = !inlined_frame && it.frame()->IsConstructor(); |
10859 | 10864 |
10860 // Get scope info and read from it for local variable information. | 10865 // Get scope info and read from it for local variable information. |
10861 Handle<JSFunction> function(JSFunction::cast(it.frame()->function())); | 10866 Handle<JSFunction> function(JSFunction::cast(frame_inspector.GetFunction())); |
10862 Handle<SharedFunctionInfo> shared(function->shared()); | 10867 Handle<SharedFunctionInfo> shared(function->shared()); |
10863 Handle<ScopeInfo> scope_info(shared->scope_info()); | 10868 Handle<ScopeInfo> scope_info(shared->scope_info()); |
10864 ASSERT(*scope_info != ScopeInfo::Empty()); | 10869 ASSERT(*scope_info != ScopeInfo::Empty()); |
10865 | 10870 |
10866 // Get the locals names and values into a temporary array. | 10871 // Get the locals names and values into a temporary array. |
10867 // | 10872 // |
10868 // TODO(1240907): Hide compiler-introduced stack variables | 10873 // TODO(1240907): Hide compiler-introduced stack variables |
10869 // (e.g. .result)? For users of the debugger, they will probably be | 10874 // (e.g. .result)? For users of the debugger, they will probably be |
10870 // confusing. | 10875 // confusing. |
10871 Handle<FixedArray> locals = | 10876 Handle<FixedArray> locals = |
(...skipping 16 matching lines...) Expand all Loading... |
10888 InitializationFlag init_flag; | 10893 InitializationFlag init_flag; |
10889 locals->set(i * 2, *name); | 10894 locals->set(i * 2, *name); |
10890 locals->set(i * 2 + 1, context->get( | 10895 locals->set(i * 2 + 1, context->get( |
10891 scope_info->ContextSlotIndex(*name, &mode, &init_flag))); | 10896 scope_info->ContextSlotIndex(*name, &mode, &init_flag))); |
10892 } | 10897 } |
10893 } | 10898 } |
10894 | 10899 |
10895 // Check whether this frame is positioned at return. If not top | 10900 // Check whether this frame is positioned at return. If not top |
10896 // frame or if the frame is optimized it cannot be at a return. | 10901 // frame or if the frame is optimized it cannot be at a return. |
10897 bool at_return = false; | 10902 bool at_return = false; |
10898 if (!it.frame()->is_optimized() && index == 0) { | 10903 if (!is_optimized && index == 0) { |
10899 at_return = isolate->debug()->IsBreakAtReturn(it.frame()); | 10904 at_return = isolate->debug()->IsBreakAtReturn(it.frame()); |
10900 } | 10905 } |
10901 | 10906 |
10902 // If positioned just before return find the value to be returned and add it | 10907 // If positioned just before return find the value to be returned and add it |
10903 // to the frame information. | 10908 // to the frame information. |
10904 Handle<Object> return_value = isolate->factory()->undefined_value(); | 10909 Handle<Object> return_value = isolate->factory()->undefined_value(); |
10905 if (at_return) { | 10910 if (at_return) { |
10906 StackFrameIterator it2(isolate); | 10911 StackFrameIterator it2(isolate); |
10907 Address internal_frame_sp = NULL; | 10912 Address internal_frame_sp = NULL; |
10908 while (!it2.done()) { | 10913 while (!it2.done()) { |
(...skipping 19 matching lines...) Expand all Loading... |
10928 internal_frame_sp = NULL; | 10933 internal_frame_sp = NULL; |
10929 } | 10934 } |
10930 it2.Advance(); | 10935 it2.Advance(); |
10931 } | 10936 } |
10932 } | 10937 } |
10933 | 10938 |
10934 // Now advance to the arguments adapter frame (if any). It contains all | 10939 // Now advance to the arguments adapter frame (if any). It contains all |
10935 // the provided parameters whereas the function frame always have the number | 10940 // the provided parameters whereas the function frame always have the number |
10936 // of arguments matching the functions parameters. The rest of the | 10941 // of arguments matching the functions parameters. The rest of the |
10937 // information (except for what is collected above) is the same. | 10942 // information (except for what is collected above) is the same. |
10938 if (it.frame()->has_adapted_arguments()) { | 10943 if ((inlined_jsframe_index == 0) && it.frame()->has_adapted_arguments()) { |
10939 it.AdvanceToArgumentsFrame(); | 10944 it.AdvanceToArgumentsFrame(); |
10940 frame_inspector.SetArgumentsFrame(it.frame()); | 10945 frame_inspector.SetArgumentsFrame(it.frame()); |
10941 } | 10946 } |
10942 | 10947 |
10943 // Find the number of arguments to fill. At least fill the number of | 10948 // Find the number of arguments to fill. At least fill the number of |
10944 // parameters for the function and fill more if more parameters are provided. | 10949 // parameters for the function and fill more if more parameters are provided. |
10945 int argument_count = scope_info->ParameterCount(); | 10950 int argument_count = scope_info->ParameterCount(); |
10946 if (argument_count < frame_inspector.GetParametersCount()) { | 10951 if (argument_count < frame_inspector.GetParametersCount()) { |
10947 argument_count = frame_inspector.GetParametersCount(); | 10952 argument_count = frame_inspector.GetParametersCount(); |
10948 } | 10953 } |
10949 #ifdef DEBUG | |
10950 if (it.frame()->is_optimized()) { | |
10951 ASSERT_EQ(argument_count, frame_inspector.GetParametersCount()); | |
10952 } | |
10953 #endif | |
10954 | 10954 |
10955 // Calculate the size of the result. | 10955 // Calculate the size of the result. |
10956 int details_size = kFrameDetailsFirstDynamicIndex + | 10956 int details_size = kFrameDetailsFirstDynamicIndex + |
10957 2 * (argument_count + scope_info->LocalCount()) + | 10957 2 * (argument_count + scope_info->LocalCount()) + |
10958 (at_return ? 1 : 0); | 10958 (at_return ? 1 : 0); |
10959 Handle<FixedArray> details = isolate->factory()->NewFixedArray(details_size); | 10959 Handle<FixedArray> details = isolate->factory()->NewFixedArray(details_size); |
10960 | 10960 |
10961 // Add the frame id. | 10961 // Add the frame id. |
10962 details->set(kFrameDetailsFrameIdIndex, *frame_id); | 10962 details->set(kFrameDetailsFrameIdIndex, *frame_id); |
10963 | 10963 |
(...skipping 21 matching lines...) Expand all Loading... |
10985 details->set(kFrameDetailsAtReturnIndex, heap->ToBoolean(at_return)); | 10985 details->set(kFrameDetailsAtReturnIndex, heap->ToBoolean(at_return)); |
10986 | 10986 |
10987 // Add flags to indicate information on whether this frame is | 10987 // Add flags to indicate information on whether this frame is |
10988 // bit 0: invoked in the debugger context. | 10988 // bit 0: invoked in the debugger context. |
10989 // bit 1: optimized frame. | 10989 // bit 1: optimized frame. |
10990 // bit 2: inlined in optimized frame | 10990 // bit 2: inlined in optimized frame |
10991 int flags = 0; | 10991 int flags = 0; |
10992 if (*save->context() == *isolate->debug()->debug_context()) { | 10992 if (*save->context() == *isolate->debug()->debug_context()) { |
10993 flags |= 1 << 0; | 10993 flags |= 1 << 0; |
10994 } | 10994 } |
10995 if (it.frame()->is_optimized()) { | 10995 if (is_optimized) { |
10996 flags |= 1 << 1; | 10996 flags |= 1 << 1; |
10997 flags |= inlined_frame_index << 2; | 10997 flags |= inlined_jsframe_index << 2; |
10998 } | 10998 } |
10999 details->set(kFrameDetailsFlagsIndex, Smi::FromInt(flags)); | 10999 details->set(kFrameDetailsFlagsIndex, Smi::FromInt(flags)); |
11000 | 11000 |
11001 // Fill the dynamic part. | 11001 // Fill the dynamic part. |
11002 int details_index = kFrameDetailsFirstDynamicIndex; | 11002 int details_index = kFrameDetailsFirstDynamicIndex; |
11003 | 11003 |
11004 // Add arguments name and value. | 11004 // Add arguments name and value. |
11005 for (int i = 0; i < argument_count; i++) { | 11005 for (int i = 0; i < argument_count; i++) { |
11006 // Name of the argument. | 11006 // Name of the argument. |
11007 if (i < scope_info->ParameterCount()) { | 11007 if (i < scope_info->ParameterCount()) { |
11008 details->set(details_index++, scope_info->ParameterName(i)); | 11008 details->set(details_index++, scope_info->ParameterName(i)); |
11009 } else { | 11009 } else { |
11010 details->set(details_index++, heap->undefined_value()); | 11010 details->set(details_index++, heap->undefined_value()); |
11011 } | 11011 } |
11012 | 11012 |
11013 // Parameter value. | 11013 // Parameter value. |
11014 if (i < it.frame()->ComputeParametersCount()) { | 11014 if (i < frame_inspector.GetParametersCount()) { |
11015 // Get the value from the stack. | 11015 // Get the value from the stack. |
11016 details->set(details_index++, frame_inspector.GetParameter(i)); | 11016 details->set(details_index++, frame_inspector.GetParameter(i)); |
11017 } else { | 11017 } else { |
11018 details->set(details_index++, heap->undefined_value()); | 11018 details->set(details_index++, heap->undefined_value()); |
11019 } | 11019 } |
11020 } | 11020 } |
11021 | 11021 |
11022 // Add locals name and value from the temporary copy from the function frame. | 11022 // Add locals name and value from the temporary copy from the function frame. |
11023 for (int i = 0; i < scope_info->LocalCount() * 2; i++) { | 11023 for (int i = 0; i < scope_info->LocalCount() * 2; i++) { |
11024 details->set(details_index++, locals->get(i)); | 11024 details->set(details_index++, locals->get(i)); |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
11077 kNonStrictMode), | 11077 kNonStrictMode), |
11078 false); | 11078 false); |
11079 } | 11079 } |
11080 | 11080 |
11081 return true; | 11081 return true; |
11082 } | 11082 } |
11083 | 11083 |
11084 | 11084 |
11085 // Create a plain JSObject which materializes the local scope for the specified | 11085 // Create a plain JSObject which materializes the local scope for the specified |
11086 // frame. | 11086 // frame. |
11087 static Handle<JSObject> MaterializeLocalScope( | 11087 static Handle<JSObject> MaterializeLocalScopeWithFrameInspector( |
11088 Isolate* isolate, | 11088 Isolate* isolate, |
11089 JavaScriptFrame* frame, | 11089 JavaScriptFrame* frame, |
11090 int inlined_frame_index) { | 11090 FrameInspector* frame_inspector) { |
11091 Handle<JSFunction> function(JSFunction::cast(frame->function())); | 11091 Handle<JSFunction> function(JSFunction::cast(frame_inspector->GetFunction())); |
11092 Handle<SharedFunctionInfo> shared(function->shared()); | 11092 Handle<SharedFunctionInfo> shared(function->shared()); |
11093 Handle<ScopeInfo> scope_info(shared->scope_info()); | 11093 Handle<ScopeInfo> scope_info(shared->scope_info()); |
11094 FrameInspector frame_inspector(frame, inlined_frame_index, isolate); | |
11095 | 11094 |
11096 // Allocate and initialize a JSObject with all the arguments, stack locals | 11095 // Allocate and initialize a JSObject with all the arguments, stack locals |
11097 // heap locals and extension properties of the debugged function. | 11096 // heap locals and extension properties of the debugged function. |
11098 Handle<JSObject> local_scope = | 11097 Handle<JSObject> local_scope = |
11099 isolate->factory()->NewJSObject(isolate->object_function()); | 11098 isolate->factory()->NewJSObject(isolate->object_function()); |
11100 | 11099 |
11101 // First fill all parameters. | 11100 // First fill all parameters. |
11102 for (int i = 0; i < scope_info->ParameterCount(); ++i) { | 11101 for (int i = 0; i < scope_info->ParameterCount(); ++i) { |
| 11102 Handle<Object> value( |
| 11103 i < frame_inspector->GetParametersCount() ? |
| 11104 frame_inspector->GetParameter(i) : isolate->heap()->undefined_value()); |
| 11105 |
11103 RETURN_IF_EMPTY_HANDLE_VALUE( | 11106 RETURN_IF_EMPTY_HANDLE_VALUE( |
11104 isolate, | 11107 isolate, |
11105 SetProperty(local_scope, | 11108 SetProperty(local_scope, |
11106 Handle<String>(scope_info->ParameterName(i)), | 11109 Handle<String>(scope_info->ParameterName(i)), |
11107 Handle<Object>(frame_inspector.GetParameter(i)), | 11110 value, |
11108 NONE, | 11111 NONE, |
11109 kNonStrictMode), | 11112 kNonStrictMode), |
11110 Handle<JSObject>()); | 11113 Handle<JSObject>()); |
11111 } | 11114 } |
11112 | 11115 |
11113 // Second fill all stack locals. | 11116 // Second fill all stack locals. |
11114 for (int i = 0; i < scope_info->StackLocalCount(); ++i) { | 11117 for (int i = 0; i < scope_info->StackLocalCount(); ++i) { |
11115 RETURN_IF_EMPTY_HANDLE_VALUE( | 11118 RETURN_IF_EMPTY_HANDLE_VALUE( |
11116 isolate, | 11119 isolate, |
11117 SetProperty(local_scope, | 11120 SetProperty(local_scope, |
11118 Handle<String>(scope_info->StackLocalName(i)), | 11121 Handle<String>(scope_info->StackLocalName(i)), |
11119 Handle<Object>(frame_inspector.GetExpression(i)), | 11122 Handle<Object>(frame_inspector->GetExpression(i)), |
11120 NONE, | 11123 NONE, |
11121 kNonStrictMode), | 11124 kNonStrictMode), |
11122 Handle<JSObject>()); | 11125 Handle<JSObject>()); |
11123 } | 11126 } |
11124 | 11127 |
11125 if (scope_info->HasContext()) { | 11128 if (scope_info->HasContext()) { |
11126 // Third fill all context locals. | 11129 // Third fill all context locals. |
11127 Handle<Context> frame_context(Context::cast(frame->context())); | 11130 Handle<Context> frame_context(Context::cast(frame->context())); |
11128 Handle<Context> function_context(frame_context->declaration_context()); | 11131 Handle<Context> function_context(frame_context->declaration_context()); |
11129 if (!CopyContextLocalsToScopeObject( | 11132 if (!CopyContextLocalsToScopeObject( |
(...skipping 26 matching lines...) Expand all Loading... |
11156 Handle<JSObject>()); | 11159 Handle<JSObject>()); |
11157 } | 11160 } |
11158 } | 11161 } |
11159 } | 11162 } |
11160 } | 11163 } |
11161 | 11164 |
11162 return local_scope; | 11165 return local_scope; |
11163 } | 11166 } |
11164 | 11167 |
11165 | 11168 |
| 11169 static Handle<JSObject> MaterializeLocalScope( |
| 11170 Isolate* isolate, |
| 11171 JavaScriptFrame* frame, |
| 11172 int inlined_jsframe_index) { |
| 11173 FrameInspector frame_inspector(frame, inlined_jsframe_index, isolate); |
| 11174 return MaterializeLocalScopeWithFrameInspector(isolate, |
| 11175 frame, |
| 11176 &frame_inspector); |
| 11177 } |
| 11178 |
| 11179 |
11166 // Create a plain JSObject which materializes the closure content for the | 11180 // Create a plain JSObject which materializes the closure content for the |
11167 // context. | 11181 // context. |
11168 static Handle<JSObject> MaterializeClosure(Isolate* isolate, | 11182 static Handle<JSObject> MaterializeClosure(Isolate* isolate, |
11169 Handle<Context> context) { | 11183 Handle<Context> context) { |
11170 ASSERT(context->IsFunctionContext()); | 11184 ASSERT(context->IsFunctionContext()); |
11171 | 11185 |
11172 Handle<SharedFunctionInfo> shared(context->closure()->shared()); | 11186 Handle<SharedFunctionInfo> shared(context->closure()->shared()); |
11173 Handle<ScopeInfo> scope_info(shared->scope_info()); | 11187 Handle<ScopeInfo> scope_info(shared->scope_info()); |
11174 | 11188 |
11175 // Allocate and initialize a JSObject with all the content of this function | 11189 // Allocate and initialize a JSObject with all the content of this function |
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
11261 ScopeTypeGlobal = 0, | 11275 ScopeTypeGlobal = 0, |
11262 ScopeTypeLocal, | 11276 ScopeTypeLocal, |
11263 ScopeTypeWith, | 11277 ScopeTypeWith, |
11264 ScopeTypeClosure, | 11278 ScopeTypeClosure, |
11265 ScopeTypeCatch, | 11279 ScopeTypeCatch, |
11266 ScopeTypeBlock | 11280 ScopeTypeBlock |
11267 }; | 11281 }; |
11268 | 11282 |
11269 ScopeIterator(Isolate* isolate, | 11283 ScopeIterator(Isolate* isolate, |
11270 JavaScriptFrame* frame, | 11284 JavaScriptFrame* frame, |
11271 int inlined_frame_index) | 11285 int inlined_jsframe_index) |
11272 : isolate_(isolate), | 11286 : isolate_(isolate), |
11273 frame_(frame), | 11287 frame_(frame), |
11274 inlined_frame_index_(inlined_frame_index), | 11288 inlined_jsframe_index_(inlined_jsframe_index), |
11275 function_(JSFunction::cast(frame->function())), | 11289 function_(JSFunction::cast(frame->function())), |
11276 context_(Context::cast(frame->context())), | 11290 context_(Context::cast(frame->context())), |
11277 nested_scope_chain_(4) { | 11291 nested_scope_chain_(4) { |
11278 | 11292 |
11279 // Catch the case when the debugger stops in an internal function. | 11293 // Catch the case when the debugger stops in an internal function. |
11280 Handle<SharedFunctionInfo> shared_info(function_->shared()); | 11294 Handle<SharedFunctionInfo> shared_info(function_->shared()); |
11281 Handle<ScopeInfo> scope_info(shared_info->scope_info()); | 11295 Handle<ScopeInfo> scope_info(shared_info->scope_info()); |
11282 if (shared_info->script() == isolate->heap()->undefined_value()) { | 11296 if (shared_info->script() == isolate->heap()->undefined_value()) { |
11283 while (context_->closure() == *function_) { | 11297 while (context_->closure() == *function_) { |
11284 context_ = Handle<Context>(context_->previous(), isolate_); | 11298 context_ = Handle<Context>(context_->previous(), isolate_); |
(...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
11421 } | 11435 } |
11422 | 11436 |
11423 // Return the JavaScript object with the content of the current scope. | 11437 // Return the JavaScript object with the content of the current scope. |
11424 Handle<JSObject> ScopeObject() { | 11438 Handle<JSObject> ScopeObject() { |
11425 switch (Type()) { | 11439 switch (Type()) { |
11426 case ScopeIterator::ScopeTypeGlobal: | 11440 case ScopeIterator::ScopeTypeGlobal: |
11427 return Handle<JSObject>(CurrentContext()->global()); | 11441 return Handle<JSObject>(CurrentContext()->global()); |
11428 case ScopeIterator::ScopeTypeLocal: | 11442 case ScopeIterator::ScopeTypeLocal: |
11429 // Materialize the content of the local scope into a JSObject. | 11443 // Materialize the content of the local scope into a JSObject. |
11430 ASSERT(nested_scope_chain_.length() == 1); | 11444 ASSERT(nested_scope_chain_.length() == 1); |
11431 return MaterializeLocalScope(isolate_, frame_, inlined_frame_index_); | 11445 return MaterializeLocalScope(isolate_, frame_, inlined_jsframe_index_); |
11432 case ScopeIterator::ScopeTypeWith: | 11446 case ScopeIterator::ScopeTypeWith: |
11433 // Return the with object. | 11447 // Return the with object. |
11434 return Handle<JSObject>(JSObject::cast(CurrentContext()->extension())); | 11448 return Handle<JSObject>(JSObject::cast(CurrentContext()->extension())); |
11435 case ScopeIterator::ScopeTypeCatch: | 11449 case ScopeIterator::ScopeTypeCatch: |
11436 return MaterializeCatchScope(isolate_, CurrentContext()); | 11450 return MaterializeCatchScope(isolate_, CurrentContext()); |
11437 case ScopeIterator::ScopeTypeClosure: | 11451 case ScopeIterator::ScopeTypeClosure: |
11438 // Materialize the content of the closure scope into a JSObject. | 11452 // Materialize the content of the closure scope into a JSObject. |
11439 return MaterializeClosure(isolate_, CurrentContext()); | 11453 return MaterializeClosure(isolate_, CurrentContext()); |
11440 case ScopeIterator::ScopeTypeBlock: | 11454 case ScopeIterator::ScopeTypeBlock: |
11441 return MaterializeBlockScope(isolate_, CurrentContext()); | 11455 return MaterializeBlockScope(isolate_, CurrentContext()); |
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
11517 default: | 11531 default: |
11518 UNREACHABLE(); | 11532 UNREACHABLE(); |
11519 } | 11533 } |
11520 PrintF("\n"); | 11534 PrintF("\n"); |
11521 } | 11535 } |
11522 #endif | 11536 #endif |
11523 | 11537 |
11524 private: | 11538 private: |
11525 Isolate* isolate_; | 11539 Isolate* isolate_; |
11526 JavaScriptFrame* frame_; | 11540 JavaScriptFrame* frame_; |
11527 int inlined_frame_index_; | 11541 int inlined_jsframe_index_; |
11528 Handle<JSFunction> function_; | 11542 Handle<JSFunction> function_; |
11529 Handle<Context> context_; | 11543 Handle<Context> context_; |
11530 List<Handle<ScopeInfo> > nested_scope_chain_; | 11544 List<Handle<ScopeInfo> > nested_scope_chain_; |
11531 | 11545 |
11532 DISALLOW_IMPLICIT_CONSTRUCTORS(ScopeIterator); | 11546 DISALLOW_IMPLICIT_CONSTRUCTORS(ScopeIterator); |
11533 }; | 11547 }; |
11534 | 11548 |
11535 | 11549 |
11536 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetScopeCount) { | 11550 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetScopeCount) { |
11537 HandleScope scope(isolate); | 11551 HandleScope scope(isolate); |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
11579 HandleScope scope(isolate); | 11593 HandleScope scope(isolate); |
11580 ASSERT(args.length() == 4); | 11594 ASSERT(args.length() == 4); |
11581 | 11595 |
11582 // Check arguments. | 11596 // Check arguments. |
11583 Object* check; | 11597 Object* check; |
11584 { MaybeObject* maybe_check = Runtime_CheckExecutionState( | 11598 { MaybeObject* maybe_check = Runtime_CheckExecutionState( |
11585 RUNTIME_ARGUMENTS(isolate, args)); | 11599 RUNTIME_ARGUMENTS(isolate, args)); |
11586 if (!maybe_check->ToObject(&check)) return maybe_check; | 11600 if (!maybe_check->ToObject(&check)) return maybe_check; |
11587 } | 11601 } |
11588 CONVERT_CHECKED(Smi, wrapped_id, args[1]); | 11602 CONVERT_CHECKED(Smi, wrapped_id, args[1]); |
11589 CONVERT_NUMBER_CHECKED(int, inlined_frame_index, Int32, args[2]); | 11603 CONVERT_NUMBER_CHECKED(int, inlined_jsframe_index, Int32, args[2]); |
11590 CONVERT_NUMBER_CHECKED(int, index, Int32, args[3]); | 11604 CONVERT_NUMBER_CHECKED(int, index, Int32, args[3]); |
11591 | 11605 |
11592 // Get the frame where the debugging is performed. | 11606 // Get the frame where the debugging is performed. |
11593 StackFrame::Id id = UnwrapFrameId(wrapped_id); | 11607 StackFrame::Id id = UnwrapFrameId(wrapped_id); |
11594 JavaScriptFrameIterator frame_it(isolate, id); | 11608 JavaScriptFrameIterator frame_it(isolate, id); |
11595 JavaScriptFrame* frame = frame_it.frame(); | 11609 JavaScriptFrame* frame = frame_it.frame(); |
11596 | 11610 |
11597 // Find the requested scope. | 11611 // Find the requested scope. |
11598 int n = 0; | 11612 int n = 0; |
11599 ScopeIterator it(isolate, frame, inlined_frame_index); | 11613 ScopeIterator it(isolate, frame, inlined_jsframe_index); |
11600 for (; !it.Done() && n < index; it.Next()) { | 11614 for (; !it.Done() && n < index; it.Next()) { |
11601 n++; | 11615 n++; |
11602 } | 11616 } |
11603 if (it.Done()) { | 11617 if (it.Done()) { |
11604 return isolate->heap()->undefined_value(); | 11618 return isolate->heap()->undefined_value(); |
11605 } | 11619 } |
11606 | 11620 |
11607 // Calculate the size of the result. | 11621 // Calculate the size of the result. |
11608 int details_size = kScopeDetailsSize; | 11622 int details_size = kScopeDetailsSize; |
11609 Handle<FixedArray> details = isolate->factory()->NewFixedArray(details_size); | 11623 Handle<FixedArray> details = isolate->factory()->NewFixedArray(details_size); |
(...skipping 377 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
11987 return isolate->heap()->undefined_value(); | 12001 return isolate->heap()->undefined_value(); |
11988 } | 12002 } |
11989 | 12003 |
11990 | 12004 |
11991 // Creates a copy of the with context chain. The copy of the context chain is | 12005 // Creates a copy of the with context chain. The copy of the context chain is |
11992 // is linked to the function context supplied. | 12006 // is linked to the function context supplied. |
11993 static Handle<Context> CopyNestedScopeContextChain(Isolate* isolate, | 12007 static Handle<Context> CopyNestedScopeContextChain(Isolate* isolate, |
11994 Handle<JSFunction> function, | 12008 Handle<JSFunction> function, |
11995 Handle<Context> base, | 12009 Handle<Context> base, |
11996 JavaScriptFrame* frame, | 12010 JavaScriptFrame* frame, |
11997 int inlined_frame_index) { | 12011 int inlined_jsframe_index) { |
11998 HandleScope scope(isolate); | 12012 HandleScope scope(isolate); |
11999 List<Handle<ScopeInfo> > scope_chain; | 12013 List<Handle<ScopeInfo> > scope_chain; |
12000 List<Handle<Context> > context_chain; | 12014 List<Handle<Context> > context_chain; |
12001 | 12015 |
12002 ScopeIterator it(isolate, frame, inlined_frame_index); | 12016 ScopeIterator it(isolate, frame, inlined_jsframe_index); |
12003 for (; it.Type() != ScopeIterator::ScopeTypeGlobal && | 12017 for (; it.Type() != ScopeIterator::ScopeTypeGlobal && |
12004 it.Type() != ScopeIterator::ScopeTypeLocal ; it.Next()) { | 12018 it.Type() != ScopeIterator::ScopeTypeLocal ; it.Next()) { |
12005 ASSERT(!it.Done()); | 12019 ASSERT(!it.Done()); |
12006 scope_chain.Add(it.CurrentScopeInfo()); | 12020 scope_chain.Add(it.CurrentScopeInfo()); |
12007 context_chain.Add(it.CurrentContext()); | 12021 context_chain.Add(it.CurrentContext()); |
12008 } | 12022 } |
12009 | 12023 |
12010 // At the end of the chain. Return the base context to link to. | 12024 // At the end of the chain. Return the base context to link to. |
12011 Handle<Context> context = base; | 12025 Handle<Context> context = base; |
12012 | 12026 |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
12049 } | 12063 } |
12050 | 12064 |
12051 return scope.CloseAndEscape(context); | 12065 return scope.CloseAndEscape(context); |
12052 } | 12066 } |
12053 | 12067 |
12054 | 12068 |
12055 // Helper function to find or create the arguments object for | 12069 // Helper function to find or create the arguments object for |
12056 // Runtime_DebugEvaluate. | 12070 // Runtime_DebugEvaluate. |
12057 static Handle<Object> GetArgumentsObject(Isolate* isolate, | 12071 static Handle<Object> GetArgumentsObject(Isolate* isolate, |
12058 JavaScriptFrame* frame, | 12072 JavaScriptFrame* frame, |
12059 int inlined_frame_index, | 12073 FrameInspector* frame_inspector, |
12060 Handle<JSFunction> function, | |
12061 Handle<ScopeInfo> scope_info, | 12074 Handle<ScopeInfo> scope_info, |
12062 Handle<Context> function_context) { | 12075 Handle<Context> function_context) { |
12063 // Try to find the value of 'arguments' to pass as parameter. If it is not | 12076 // Try to find the value of 'arguments' to pass as parameter. If it is not |
12064 // found (that is the debugged function does not reference 'arguments' and | 12077 // found (that is the debugged function does not reference 'arguments' and |
12065 // does not support eval) then create an 'arguments' object. | 12078 // does not support eval) then create an 'arguments' object. |
12066 int index; | 12079 int index; |
12067 if (scope_info->StackLocalCount() > 0) { | 12080 if (scope_info->StackLocalCount() > 0) { |
12068 index = scope_info->StackSlotIndex(isolate->heap()->arguments_symbol()); | 12081 index = scope_info->StackSlotIndex(isolate->heap()->arguments_symbol()); |
12069 if (index != -1) { | 12082 if (index != -1) { |
12070 return Handle<Object>(frame->GetExpression(index), isolate); | 12083 return Handle<Object>(frame->GetExpression(index), isolate); |
12071 } | 12084 } |
12072 } | 12085 } |
12073 | 12086 |
12074 if (scope_info->HasHeapAllocatedLocals()) { | 12087 if (scope_info->HasHeapAllocatedLocals()) { |
12075 VariableMode mode; | 12088 VariableMode mode; |
12076 InitializationFlag init_flag; | 12089 InitializationFlag init_flag; |
12077 index = scope_info->ContextSlotIndex( | 12090 index = scope_info->ContextSlotIndex( |
12078 isolate->heap()->arguments_symbol(), &mode, &init_flag); | 12091 isolate->heap()->arguments_symbol(), &mode, &init_flag); |
12079 if (index != -1) { | 12092 if (index != -1) { |
12080 return Handle<Object>(function_context->get(index), isolate); | 12093 return Handle<Object>(function_context->get(index), isolate); |
12081 } | 12094 } |
12082 } | 12095 } |
12083 | 12096 |
12084 FrameInspector frame_inspector(frame, inlined_frame_index, isolate); | 12097 Handle<JSFunction> function(JSFunction::cast(frame_inspector->GetFunction())); |
12085 | 12098 int length = frame_inspector->GetParametersCount(); |
12086 int length = frame_inspector.GetParametersCount(); | |
12087 Handle<JSObject> arguments = | 12099 Handle<JSObject> arguments = |
12088 isolate->factory()->NewArgumentsObject(function, length); | 12100 isolate->factory()->NewArgumentsObject(function, length); |
12089 Handle<FixedArray> array = isolate->factory()->NewFixedArray(length); | 12101 Handle<FixedArray> array = isolate->factory()->NewFixedArray(length); |
12090 | 12102 |
12091 AssertNoAllocation no_gc; | 12103 AssertNoAllocation no_gc; |
12092 WriteBarrierMode mode = array->GetWriteBarrierMode(no_gc); | 12104 WriteBarrierMode mode = array->GetWriteBarrierMode(no_gc); |
12093 for (int i = 0; i < length; i++) { | 12105 for (int i = 0; i < length; i++) { |
12094 array->set(i, frame_inspector.GetParameter(i), mode); | 12106 array->set(i, frame_inspector->GetParameter(i), mode); |
12095 } | 12107 } |
12096 arguments->set_elements(*array); | 12108 arguments->set_elements(*array); |
12097 return arguments; | 12109 return arguments; |
12098 } | 12110 } |
12099 | 12111 |
12100 | 12112 |
12101 static const char kSourceStr[] = | 12113 static const char kSourceStr[] = |
12102 "(function(arguments,__source__){return eval(__source__);})"; | 12114 "(function(arguments,__source__){return eval(__source__);})"; |
12103 | 12115 |
12104 | 12116 |
(...skipping 15 matching lines...) Expand all Loading... |
12120 // evaluated. | 12132 // evaluated. |
12121 ASSERT(args.length() == 6); | 12133 ASSERT(args.length() == 6); |
12122 Object* check_result; | 12134 Object* check_result; |
12123 { MaybeObject* maybe_check_result = Runtime_CheckExecutionState( | 12135 { MaybeObject* maybe_check_result = Runtime_CheckExecutionState( |
12124 RUNTIME_ARGUMENTS(isolate, args)); | 12136 RUNTIME_ARGUMENTS(isolate, args)); |
12125 if (!maybe_check_result->ToObject(&check_result)) { | 12137 if (!maybe_check_result->ToObject(&check_result)) { |
12126 return maybe_check_result; | 12138 return maybe_check_result; |
12127 } | 12139 } |
12128 } | 12140 } |
12129 CONVERT_CHECKED(Smi, wrapped_id, args[1]); | 12141 CONVERT_CHECKED(Smi, wrapped_id, args[1]); |
12130 CONVERT_NUMBER_CHECKED(int, inlined_frame_index, Int32, args[2]); | 12142 CONVERT_NUMBER_CHECKED(int, inlined_jsframe_index, Int32, args[2]); |
12131 CONVERT_ARG_CHECKED(String, source, 3); | 12143 CONVERT_ARG_CHECKED(String, source, 3); |
12132 CONVERT_BOOLEAN_CHECKED(disable_break, args[4]); | 12144 CONVERT_BOOLEAN_CHECKED(disable_break, args[4]); |
12133 Handle<Object> additional_context(args[5]); | 12145 Handle<Object> additional_context(args[5]); |
12134 | 12146 |
12135 // Handle the processing of break. | 12147 // Handle the processing of break. |
12136 DisableBreak disable_break_save(disable_break); | 12148 DisableBreak disable_break_save(disable_break); |
12137 | 12149 |
12138 // Get the frame where the debugging is performed. | 12150 // Get the frame where the debugging is performed. |
12139 StackFrame::Id id = UnwrapFrameId(wrapped_id); | 12151 StackFrame::Id id = UnwrapFrameId(wrapped_id); |
12140 JavaScriptFrameIterator it(isolate, id); | 12152 JavaScriptFrameIterator it(isolate, id); |
12141 JavaScriptFrame* frame = it.frame(); | 12153 JavaScriptFrame* frame = it.frame(); |
12142 Handle<JSFunction> function(JSFunction::cast(frame->function())); | 12154 FrameInspector frame_inspector(frame, inlined_jsframe_index, isolate); |
| 12155 Handle<JSFunction> function(JSFunction::cast(frame_inspector.GetFunction())); |
12143 Handle<ScopeInfo> scope_info(function->shared()->scope_info()); | 12156 Handle<ScopeInfo> scope_info(function->shared()->scope_info()); |
12144 | 12157 |
12145 // Traverse the saved contexts chain to find the active context for the | 12158 // Traverse the saved contexts chain to find the active context for the |
12146 // selected frame. | 12159 // selected frame. |
12147 SaveContext* save = FindSavedContextForFrame(isolate, frame); | 12160 SaveContext* save = FindSavedContextForFrame(isolate, frame); |
12148 | 12161 |
12149 SaveContext savex(isolate); | 12162 SaveContext savex(isolate); |
12150 isolate->set_context(*(save->context())); | 12163 isolate->set_context(*(save->context())); |
12151 | 12164 |
12152 // Create the (empty) function replacing the function on the stack frame for | 12165 // Create the (empty) function replacing the function on the stack frame for |
12153 // the purpose of evaluating in the context created below. It is important | 12166 // the purpose of evaluating in the context created below. It is important |
12154 // that this function does not describe any parameters and local variables | 12167 // that this function does not describe any parameters and local variables |
12155 // in the context. If it does then this will cause problems with the lookup | 12168 // in the context. If it does then this will cause problems with the lookup |
12156 // in Context::Lookup, where context slots for parameters and local variables | 12169 // in Context::Lookup, where context slots for parameters and local variables |
12157 // are looked at before the extension object. | 12170 // are looked at before the extension object. |
12158 Handle<JSFunction> go_between = | 12171 Handle<JSFunction> go_between = |
12159 isolate->factory()->NewFunction(isolate->factory()->empty_string(), | 12172 isolate->factory()->NewFunction(isolate->factory()->empty_string(), |
12160 isolate->factory()->undefined_value()); | 12173 isolate->factory()->undefined_value()); |
12161 go_between->set_context(function->context()); | 12174 go_between->set_context(function->context()); |
12162 #ifdef DEBUG | 12175 #ifdef DEBUG |
12163 Handle<ScopeInfo> go_between_scope_info(go_between->shared()->scope_info()); | 12176 Handle<ScopeInfo> go_between_scope_info(go_between->shared()->scope_info()); |
12164 ASSERT(go_between_scope_info->ParameterCount() == 0); | 12177 ASSERT(go_between_scope_info->ParameterCount() == 0); |
12165 ASSERT(go_between_scope_info->ContextLocalCount() == 0); | 12178 ASSERT(go_between_scope_info->ContextLocalCount() == 0); |
12166 #endif | 12179 #endif |
12167 | 12180 |
12168 // Materialize the content of the local scope into a JSObject. | 12181 // Materialize the content of the local scope into a JSObject. |
12169 Handle<JSObject> local_scope = MaterializeLocalScope( | 12182 Handle<JSObject> local_scope = MaterializeLocalScopeWithFrameInspector( |
12170 isolate, frame, inlined_frame_index); | 12183 isolate, frame, &frame_inspector); |
12171 RETURN_IF_EMPTY_HANDLE(isolate, local_scope); | 12184 RETURN_IF_EMPTY_HANDLE(isolate, local_scope); |
12172 | 12185 |
12173 // Allocate a new context for the debug evaluation and set the extension | 12186 // Allocate a new context for the debug evaluation and set the extension |
12174 // object build. | 12187 // object build. |
12175 Handle<Context> context = | 12188 Handle<Context> context = |
12176 isolate->factory()->NewFunctionContext(Context::MIN_CONTEXT_SLOTS, | 12189 isolate->factory()->NewFunctionContext(Context::MIN_CONTEXT_SLOTS, |
12177 go_between); | 12190 go_between); |
12178 context->set_extension(*local_scope); | 12191 context->set_extension(*local_scope); |
12179 // Copy any with contexts present and chain them in front of this context. | 12192 // Copy any with contexts present and chain them in front of this context. |
12180 Handle<Context> frame_context(Context::cast(frame->context())); | 12193 Handle<Context> frame_context(Context::cast(frame->context())); |
12181 Handle<Context> function_context; | 12194 Handle<Context> function_context; |
12182 // Get the function's context if it has one. | 12195 // Get the function's context if it has one. |
12183 if (scope_info->HasContext()) { | 12196 if (scope_info->HasContext()) { |
12184 function_context = Handle<Context>(frame_context->declaration_context()); | 12197 function_context = Handle<Context>(frame_context->declaration_context()); |
12185 } | 12198 } |
12186 context = CopyNestedScopeContextChain(isolate, | 12199 context = CopyNestedScopeContextChain(isolate, |
12187 go_between, | 12200 go_between, |
12188 context, | 12201 context, |
12189 frame, | 12202 frame, |
12190 inlined_frame_index); | 12203 inlined_jsframe_index); |
12191 | 12204 |
12192 if (additional_context->IsJSObject()) { | 12205 if (additional_context->IsJSObject()) { |
12193 Handle<JSObject> extension = Handle<JSObject>::cast(additional_context); | 12206 Handle<JSObject> extension = Handle<JSObject>::cast(additional_context); |
12194 context = | 12207 context = |
12195 isolate->factory()->NewWithContext(go_between, context, extension); | 12208 isolate->factory()->NewWithContext(go_between, context, extension); |
12196 } | 12209 } |
12197 | 12210 |
12198 // Wrap the evaluation statement in a new function compiled in the newly | 12211 // Wrap the evaluation statement in a new function compiled in the newly |
12199 // created context. The function has one parameter which has to be called | 12212 // created context. The function has one parameter which has to be called |
12200 // 'arguments'. This it to have access to what would have been 'arguments' in | 12213 // 'arguments'. This it to have access to what would have been 'arguments' in |
(...skipping 19 matching lines...) Expand all Loading... |
12220 // Invoke the result of the compilation to get the evaluation function. | 12233 // Invoke the result of the compilation to get the evaluation function. |
12221 bool has_pending_exception; | 12234 bool has_pending_exception; |
12222 Handle<Object> receiver(frame->receiver(), isolate); | 12235 Handle<Object> receiver(frame->receiver(), isolate); |
12223 Handle<Object> evaluation_function = | 12236 Handle<Object> evaluation_function = |
12224 Execution::Call(compiled_function, receiver, 0, NULL, | 12237 Execution::Call(compiled_function, receiver, 0, NULL, |
12225 &has_pending_exception); | 12238 &has_pending_exception); |
12226 if (has_pending_exception) return Failure::Exception(); | 12239 if (has_pending_exception) return Failure::Exception(); |
12227 | 12240 |
12228 Handle<Object> arguments = GetArgumentsObject(isolate, | 12241 Handle<Object> arguments = GetArgumentsObject(isolate, |
12229 frame, | 12242 frame, |
12230 inlined_frame_index, | 12243 &frame_inspector, |
12231 function, | |
12232 scope_info, | 12244 scope_info, |
12233 function_context); | 12245 function_context); |
12234 | 12246 |
12235 // Invoke the evaluation function and return the result. | 12247 // Invoke the evaluation function and return the result. |
12236 Handle<Object> argv[] = { arguments, source }; | 12248 Handle<Object> argv[] = { arguments, source }; |
12237 Handle<Object> result = | 12249 Handle<Object> result = |
12238 Execution::Call(Handle<JSFunction>::cast(evaluation_function), | 12250 Execution::Call(Handle<JSFunction>::cast(evaluation_function), |
12239 receiver, | 12251 receiver, |
12240 ARRAY_SIZE(argv), | 12252 ARRAY_SIZE(argv), |
12241 argv, | 12253 argv, |
(...skipping 1393 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
13635 } else { | 13647 } else { |
13636 // Handle last resort GC and make sure to allow future allocations | 13648 // Handle last resort GC and make sure to allow future allocations |
13637 // to grow the heap without causing GCs (if possible). | 13649 // to grow the heap without causing GCs (if possible). |
13638 isolate->counters()->gc_last_resort_from_js()->Increment(); | 13650 isolate->counters()->gc_last_resort_from_js()->Increment(); |
13639 isolate->heap()->CollectAllGarbage(Heap::kNoGCFlags); | 13651 isolate->heap()->CollectAllGarbage(Heap::kNoGCFlags); |
13640 } | 13652 } |
13641 } | 13653 } |
13642 | 13654 |
13643 | 13655 |
13644 } } // namespace v8::internal | 13656 } } // namespace v8::internal |
OLD | NEW |