| OLD | NEW |
| 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 1588 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1599 | 1599 |
| 1600 if (!code->IsNull()) { | 1600 if (!code->IsNull()) { |
| 1601 RUNTIME_ASSERT(code->IsJSFunction()); | 1601 RUNTIME_ASSERT(code->IsJSFunction()); |
| 1602 Handle<JSFunction> fun = Handle<JSFunction>::cast(code); | 1602 Handle<JSFunction> fun = Handle<JSFunction>::cast(code); |
| 1603 Handle<SharedFunctionInfo> shared(fun->shared()); | 1603 Handle<SharedFunctionInfo> shared(fun->shared()); |
| 1604 SetExpectedNofProperties(target, shared->expected_nof_properties()); | 1604 SetExpectedNofProperties(target, shared->expected_nof_properties()); |
| 1605 | 1605 |
| 1606 if (!EnsureCompiled(shared, KEEP_EXCEPTION)) { | 1606 if (!EnsureCompiled(shared, KEEP_EXCEPTION)) { |
| 1607 return Failure::Exception(); | 1607 return Failure::Exception(); |
| 1608 } | 1608 } |
| 1609 // Set the code, formal parameter count, and the length of the target | 1609 // Set the code, scope info, formal parameter count, |
| 1610 // function. | 1610 // and the length of the target function. |
| 1611 target->set_code(fun->code()); | 1611 target->set_code(fun->code()); |
| 1612 target->shared()->set_scope_info(shared->scope_info()); |
| 1612 target->shared()->set_length(shared->length()); | 1613 target->shared()->set_length(shared->length()); |
| 1613 target->shared()->set_formal_parameter_count( | 1614 target->shared()->set_formal_parameter_count( |
| 1614 shared->formal_parameter_count()); | 1615 shared->formal_parameter_count()); |
| 1615 // Set the source code of the target function to undefined. | 1616 // Set the source code of the target function to undefined. |
| 1616 // SetCode is only used for built-in constructors like String, | 1617 // SetCode is only used for built-in constructors like String, |
| 1617 // Array, and Object, and some web code | 1618 // Array, and Object, and some web code |
| 1618 // doesn't like seeing source code for constructors. | 1619 // doesn't like seeing source code for constructors. |
| 1619 target->shared()->set_script(Heap::undefined_value()); | 1620 target->shared()->set_script(Heap::undefined_value()); |
| 1620 // Clear the optimization hints related to the compiled code as these are no | 1621 // Clear the optimization hints related to the compiled code as these are no |
| 1621 // longer valid when the code is overwritten. | 1622 // longer valid when the code is overwritten. |
| (...skipping 5239 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6861 RUNTIME_ASSERT(!args[0]->IsJSFunction()); | 6862 RUNTIME_ASSERT(!args[0]->IsJSFunction()); |
| 6862 return *Execution::GetConstructorDelegate(args.at<Object>(0)); | 6863 return *Execution::GetConstructorDelegate(args.at<Object>(0)); |
| 6863 } | 6864 } |
| 6864 | 6865 |
| 6865 | 6866 |
| 6866 static Object* Runtime_NewContext(Arguments args) { | 6867 static Object* Runtime_NewContext(Arguments args) { |
| 6867 NoHandleAllocation ha; | 6868 NoHandleAllocation ha; |
| 6868 ASSERT(args.length() == 1); | 6869 ASSERT(args.length() == 1); |
| 6869 | 6870 |
| 6870 CONVERT_CHECKED(JSFunction, function, args[0]); | 6871 CONVERT_CHECKED(JSFunction, function, args[0]); |
| 6871 int length = ScopeInfo<>::NumberOfContextSlots(function->code()); | 6872 int length = |
| 6873 ScopeInfo<>::NumberOfContextSlots(function->shared()->scope_info()); |
| 6872 Object* result = Heap::AllocateFunctionContext(length, function); | 6874 Object* result = Heap::AllocateFunctionContext(length, function); |
| 6873 if (result->IsFailure()) return result; | 6875 if (result->IsFailure()) return result; |
| 6874 | 6876 |
| 6875 Top::set_context(Context::cast(result)); | 6877 Top::set_context(Context::cast(result)); |
| 6876 | 6878 |
| 6877 return result; // non-failure | 6879 return result; // non-failure |
| 6878 } | 6880 } |
| 6879 | 6881 |
| 6880 static Object* PushContextHelper(Object* object, bool is_catch_context) { | 6882 static Object* PushContextHelper(Object* object, bool is_catch_context) { |
| 6881 // Convert the object to a proper JavaScript object. | 6883 // Convert the object to a proper JavaScript object. |
| (...skipping 1599 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 8481 | 8483 |
| 8482 // Get the frame id. | 8484 // Get the frame id. |
| 8483 Handle<Object> frame_id(WrapFrameId(it.frame()->id())); | 8485 Handle<Object> frame_id(WrapFrameId(it.frame()->id())); |
| 8484 | 8486 |
| 8485 // Find source position. | 8487 // Find source position. |
| 8486 int position = it.frame()->code()->SourcePosition(it.frame()->pc()); | 8488 int position = it.frame()->code()->SourcePosition(it.frame()->pc()); |
| 8487 | 8489 |
| 8488 // Check for constructor frame. | 8490 // Check for constructor frame. |
| 8489 bool constructor = it.frame()->IsConstructor(); | 8491 bool constructor = it.frame()->IsConstructor(); |
| 8490 | 8492 |
| 8491 // Get code and read scope info from it for local variable information. | 8493 // Get scope info and read from it for local variable information. |
| 8492 Handle<Code> code(it.frame()->code()); | 8494 Handle<JSFunction> function(JSFunction::cast(it.frame()->function())); |
| 8493 ScopeInfo<> info(*code); | 8495 Handle<Object> scope_info(function->shared()->scope_info()); |
| 8496 ScopeInfo<> info(*scope_info); |
| 8494 | 8497 |
| 8495 // Get the context. | 8498 // Get the context. |
| 8496 Handle<Context> context(Context::cast(it.frame()->context())); | 8499 Handle<Context> context(Context::cast(it.frame()->context())); |
| 8497 | 8500 |
| 8498 // Get the locals names and values into a temporary array. | 8501 // Get the locals names and values into a temporary array. |
| 8499 // | 8502 // |
| 8500 // TODO(1240907): Hide compiler-introduced stack variables | 8503 // TODO(1240907): Hide compiler-introduced stack variables |
| 8501 // (e.g. .result)? For users of the debugger, they will probably be | 8504 // (e.g. .result)? For users of the debugger, they will probably be |
| 8502 // confusing. | 8505 // confusing. |
| 8503 Handle<FixedArray> locals = Factory::NewFixedArray(info.NumberOfLocals() * 2); | 8506 Handle<FixedArray> locals = Factory::NewFixedArray(info.NumberOfLocals() * 2); |
| 8504 for (int i = 0; i < info.NumberOfLocals(); i++) { | 8507 for (int i = 0; i < info.NumberOfLocals(); i++) { |
| 8505 // Name of the local. | 8508 // Name of the local. |
| 8506 locals->set(i * 2, *info.LocalName(i)); | 8509 locals->set(i * 2, *info.LocalName(i)); |
| 8507 | 8510 |
| 8508 // Fetch the value of the local - either from the stack or from a | 8511 // Fetch the value of the local - either from the stack or from a |
| 8509 // heap-allocated context. | 8512 // heap-allocated context. |
| 8510 if (i < info.number_of_stack_slots()) { | 8513 if (i < info.number_of_stack_slots()) { |
| 8511 locals->set(i * 2 + 1, it.frame()->GetExpression(i)); | 8514 locals->set(i * 2 + 1, it.frame()->GetExpression(i)); |
| 8512 } else { | 8515 } else { |
| 8513 Handle<String> name = info.LocalName(i); | 8516 Handle<String> name = info.LocalName(i); |
| 8514 // Traverse the context chain to the function context as all local | 8517 // Traverse the context chain to the function context as all local |
| 8515 // variables stored in the context will be on the function context. | 8518 // variables stored in the context will be on the function context. |
| 8516 while (!context->is_function_context()) { | 8519 while (!context->is_function_context()) { |
| 8517 context = Handle<Context>(context->previous()); | 8520 context = Handle<Context>(context->previous()); |
| 8518 } | 8521 } |
| 8519 ASSERT(context->is_function_context()); | 8522 ASSERT(context->is_function_context()); |
| 8520 locals->set(i * 2 + 1, | 8523 locals->set(i * 2 + 1, |
| 8521 context->get(ScopeInfo<>::ContextSlotIndex(*code, *name, | 8524 context->get(ScopeInfo<>::ContextSlotIndex(*scope_info, |
| 8525 *name, |
| 8522 NULL))); | 8526 NULL))); |
| 8523 } | 8527 } |
| 8524 } | 8528 } |
| 8525 | 8529 |
| 8526 // Check whether this frame is positioned at return. | 8530 // Check whether this frame is positioned at return. |
| 8527 int at_return = (index == 0) ? Debug::IsBreakAtReturn(it.frame()) : false; | 8531 int at_return = (index == 0) ? Debug::IsBreakAtReturn(it.frame()) : false; |
| 8528 | 8532 |
| 8529 // If positioned just before return find the value to be returned and add it | 8533 // If positioned just before return find the value to be returned and add it |
| 8530 // to the frame information. | 8534 // to the frame information. |
| 8531 Handle<Object> return_value = Factory::undefined_value(); | 8535 Handle<Object> return_value = Factory::undefined_value(); |
| (...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 8652 receiver = Factory::ToObject(receiver, calling_frames_global_context); | 8656 receiver = Factory::ToObject(receiver, calling_frames_global_context); |
| 8653 } | 8657 } |
| 8654 details->set(kFrameDetailsReceiverIndex, *receiver); | 8658 details->set(kFrameDetailsReceiverIndex, *receiver); |
| 8655 | 8659 |
| 8656 ASSERT_EQ(details_size, details_index); | 8660 ASSERT_EQ(details_size, details_index); |
| 8657 return *Factory::NewJSArrayWithElements(details); | 8661 return *Factory::NewJSArrayWithElements(details); |
| 8658 } | 8662 } |
| 8659 | 8663 |
| 8660 | 8664 |
| 8661 // Copy all the context locals into an object used to materialize a scope. | 8665 // Copy all the context locals into an object used to materialize a scope. |
| 8662 static void CopyContextLocalsToScopeObject(Handle<Code> code, | 8666 static void CopyContextLocalsToScopeObject(Handle<SharedFunctionInfo> shared, |
| 8663 ScopeInfo<>& scope_info, | 8667 ScopeInfo<>& scope_info, |
| 8664 Handle<Context> context, | 8668 Handle<Context> context, |
| 8665 Handle<JSObject> scope_object) { | 8669 Handle<JSObject> scope_object) { |
| 8666 // Fill all context locals to the context extension. | 8670 // Fill all context locals to the context extension. |
| 8667 for (int i = Context::MIN_CONTEXT_SLOTS; | 8671 for (int i = Context::MIN_CONTEXT_SLOTS; |
| 8668 i < scope_info.number_of_context_slots(); | 8672 i < scope_info.number_of_context_slots(); |
| 8669 i++) { | 8673 i++) { |
| 8670 int context_index = | 8674 int context_index = |
| 8671 ScopeInfo<>::ContextSlotIndex(*code, | 8675 ScopeInfo<>::ContextSlotIndex(shared->scope_info(), |
| 8672 *scope_info.context_slot_name(i), | 8676 *scope_info.context_slot_name(i), |
| 8673 NULL); | 8677 NULL); |
| 8674 | 8678 |
| 8675 // Don't include the arguments shadow (.arguments) context variable. | 8679 // Don't include the arguments shadow (.arguments) context variable. |
| 8676 if (*scope_info.context_slot_name(i) != Heap::arguments_shadow_symbol()) { | 8680 if (*scope_info.context_slot_name(i) != Heap::arguments_shadow_symbol()) { |
| 8677 SetProperty(scope_object, | 8681 SetProperty(scope_object, |
| 8678 scope_info.context_slot_name(i), | 8682 scope_info.context_slot_name(i), |
| 8679 Handle<Object>(context->get(context_index)), NONE); | 8683 Handle<Object>(context->get(context_index)), NONE); |
| 8680 } | 8684 } |
| 8681 } | 8685 } |
| 8682 } | 8686 } |
| 8683 | 8687 |
| 8684 | 8688 |
| 8685 // Create a plain JSObject which materializes the local scope for the specified | 8689 // Create a plain JSObject which materializes the local scope for the specified |
| 8686 // frame. | 8690 // frame. |
| 8687 static Handle<JSObject> MaterializeLocalScope(JavaScriptFrame* frame) { | 8691 static Handle<JSObject> MaterializeLocalScope(JavaScriptFrame* frame) { |
| 8688 Handle<JSFunction> function(JSFunction::cast(frame->function())); | 8692 Handle<JSFunction> function(JSFunction::cast(frame->function())); |
| 8689 Handle<Code> code(function->code()); | 8693 Handle<SharedFunctionInfo> shared(function->shared()); |
| 8690 ScopeInfo<> scope_info(*code); | 8694 ScopeInfo<> scope_info(shared->scope_info()); |
| 8691 | 8695 |
| 8692 // Allocate and initialize a JSObject with all the arguments, stack locals | 8696 // Allocate and initialize a JSObject with all the arguments, stack locals |
| 8693 // heap locals and extension properties of the debugged function. | 8697 // heap locals and extension properties of the debugged function. |
| 8694 Handle<JSObject> local_scope = Factory::NewJSObject(Top::object_function()); | 8698 Handle<JSObject> local_scope = Factory::NewJSObject(Top::object_function()); |
| 8695 | 8699 |
| 8696 // First fill all parameters. | 8700 // First fill all parameters. |
| 8697 for (int i = 0; i < scope_info.number_of_parameters(); ++i) { | 8701 for (int i = 0; i < scope_info.number_of_parameters(); ++i) { |
| 8698 SetProperty(local_scope, | 8702 SetProperty(local_scope, |
| 8699 scope_info.parameter_name(i), | 8703 scope_info.parameter_name(i), |
| 8700 Handle<Object>(frame->GetParameter(i)), NONE); | 8704 Handle<Object>(frame->GetParameter(i)), NONE); |
| 8701 } | 8705 } |
| 8702 | 8706 |
| 8703 // Second fill all stack locals. | 8707 // Second fill all stack locals. |
| 8704 for (int i = 0; i < scope_info.number_of_stack_slots(); i++) { | 8708 for (int i = 0; i < scope_info.number_of_stack_slots(); i++) { |
| 8705 SetProperty(local_scope, | 8709 SetProperty(local_scope, |
| 8706 scope_info.stack_slot_name(i), | 8710 scope_info.stack_slot_name(i), |
| 8707 Handle<Object>(frame->GetExpression(i)), NONE); | 8711 Handle<Object>(frame->GetExpression(i)), NONE); |
| 8708 } | 8712 } |
| 8709 | 8713 |
| 8710 // Third fill all context locals. | 8714 // Third fill all context locals. |
| 8711 Handle<Context> frame_context(Context::cast(frame->context())); | 8715 Handle<Context> frame_context(Context::cast(frame->context())); |
| 8712 Handle<Context> function_context(frame_context->fcontext()); | 8716 Handle<Context> function_context(frame_context->fcontext()); |
| 8713 CopyContextLocalsToScopeObject(code, scope_info, | 8717 CopyContextLocalsToScopeObject(shared, scope_info, |
| 8714 function_context, local_scope); | 8718 function_context, local_scope); |
| 8715 | 8719 |
| 8716 // Finally copy any properties from the function context extension. This will | 8720 // Finally copy any properties from the function context extension. This will |
| 8717 // be variables introduced by eval. | 8721 // be variables introduced by eval. |
| 8718 if (function_context->closure() == *function) { | 8722 if (function_context->closure() == *function) { |
| 8719 if (function_context->has_extension() && | 8723 if (function_context->has_extension() && |
| 8720 !function_context->IsGlobalContext()) { | 8724 !function_context->IsGlobalContext()) { |
| 8721 Handle<JSObject> ext(JSObject::cast(function_context->extension())); | 8725 Handle<JSObject> ext(JSObject::cast(function_context->extension())); |
| 8722 Handle<FixedArray> keys = GetKeysInFixedArrayFor(ext, INCLUDE_PROTOS); | 8726 Handle<FixedArray> keys = GetKeysInFixedArrayFor(ext, INCLUDE_PROTOS); |
| 8723 for (int i = 0; i < keys->length(); i++) { | 8727 for (int i = 0; i < keys->length(); i++) { |
| 8724 // Names of variables introduced by eval are strings. | 8728 // Names of variables introduced by eval are strings. |
| 8725 ASSERT(keys->get(i)->IsString()); | 8729 ASSERT(keys->get(i)->IsString()); |
| 8726 Handle<String> key(String::cast(keys->get(i))); | 8730 Handle<String> key(String::cast(keys->get(i))); |
| 8727 SetProperty(local_scope, key, GetProperty(ext, key), NONE); | 8731 SetProperty(local_scope, key, GetProperty(ext, key), NONE); |
| 8728 } | 8732 } |
| 8729 } | 8733 } |
| 8730 } | 8734 } |
| 8731 return local_scope; | 8735 return local_scope; |
| 8732 } | 8736 } |
| 8733 | 8737 |
| 8734 | 8738 |
| 8735 // Create a plain JSObject which materializes the closure content for the | 8739 // Create a plain JSObject which materializes the closure content for the |
| 8736 // context. | 8740 // context. |
| 8737 static Handle<JSObject> MaterializeClosure(Handle<Context> context) { | 8741 static Handle<JSObject> MaterializeClosure(Handle<Context> context) { |
| 8738 ASSERT(context->is_function_context()); | 8742 ASSERT(context->is_function_context()); |
| 8739 | 8743 |
| 8740 Handle<Code> code(context->closure()->code()); | 8744 Handle<SharedFunctionInfo> shared(context->closure()->shared()); |
| 8741 ScopeInfo<> scope_info(*code); | 8745 ScopeInfo<> scope_info(shared->scope_info()); |
| 8742 | 8746 |
| 8743 // Allocate and initialize a JSObject with all the content of theis function | 8747 // Allocate and initialize a JSObject with all the content of theis function |
| 8744 // closure. | 8748 // closure. |
| 8745 Handle<JSObject> closure_scope = Factory::NewJSObject(Top::object_function()); | 8749 Handle<JSObject> closure_scope = Factory::NewJSObject(Top::object_function()); |
| 8746 | 8750 |
| 8747 // Check whether the arguments shadow object exists. | 8751 // Check whether the arguments shadow object exists. |
| 8748 int arguments_shadow_index = | 8752 int arguments_shadow_index = |
| 8749 ScopeInfo<>::ContextSlotIndex(*code, | 8753 ScopeInfo<>::ContextSlotIndex(shared->scope_info(), |
| 8750 Heap::arguments_shadow_symbol(), | 8754 Heap::arguments_shadow_symbol(), |
| 8751 NULL); | 8755 NULL); |
| 8752 if (arguments_shadow_index >= 0) { | 8756 if (arguments_shadow_index >= 0) { |
| 8753 // In this case all the arguments are available in the arguments shadow | 8757 // In this case all the arguments are available in the arguments shadow |
| 8754 // object. | 8758 // object. |
| 8755 Handle<JSObject> arguments_shadow( | 8759 Handle<JSObject> arguments_shadow( |
| 8756 JSObject::cast(context->get(arguments_shadow_index))); | 8760 JSObject::cast(context->get(arguments_shadow_index))); |
| 8757 for (int i = 0; i < scope_info.number_of_parameters(); ++i) { | 8761 for (int i = 0; i < scope_info.number_of_parameters(); ++i) { |
| 8758 SetProperty(closure_scope, | 8762 SetProperty(closure_scope, |
| 8759 scope_info.parameter_name(i), | 8763 scope_info.parameter_name(i), |
| 8760 Handle<Object>(arguments_shadow->GetElement(i)), NONE); | 8764 Handle<Object>(arguments_shadow->GetElement(i)), NONE); |
| 8761 } | 8765 } |
| 8762 } | 8766 } |
| 8763 | 8767 |
| 8764 // Fill all context locals to the context extension. | 8768 // Fill all context locals to the context extension. |
| 8765 CopyContextLocalsToScopeObject(code, scope_info, context, closure_scope); | 8769 CopyContextLocalsToScopeObject(shared, scope_info, context, closure_scope); |
| 8766 | 8770 |
| 8767 // Finally copy any properties from the function context extension. This will | 8771 // Finally copy any properties from the function context extension. This will |
| 8768 // be variables introduced by eval. | 8772 // be variables introduced by eval. |
| 8769 if (context->has_extension()) { | 8773 if (context->has_extension()) { |
| 8770 Handle<JSObject> ext(JSObject::cast(context->extension())); | 8774 Handle<JSObject> ext(JSObject::cast(context->extension())); |
| 8771 Handle<FixedArray> keys = GetKeysInFixedArrayFor(ext, INCLUDE_PROTOS); | 8775 Handle<FixedArray> keys = GetKeysInFixedArrayFor(ext, INCLUDE_PROTOS); |
| 8772 for (int i = 0; i < keys->length(); i++) { | 8776 for (int i = 0; i < keys->length(); i++) { |
| 8773 // Names of variables introduced by eval are strings. | 8777 // Names of variables introduced by eval are strings. |
| 8774 ASSERT(keys->get(i)->IsString()); | 8778 ASSERT(keys->get(i)->IsString()); |
| 8775 Handle<String> key(String::cast(keys->get(i))); | 8779 Handle<String> key(String::cast(keys->get(i))); |
| (...skipping 28 matching lines...) Expand all Loading... |
| 8804 context_(Context::cast(frame->context())), | 8808 context_(Context::cast(frame->context())), |
| 8805 local_done_(false), | 8809 local_done_(false), |
| 8806 at_local_(false) { | 8810 at_local_(false) { |
| 8807 | 8811 |
| 8808 // Check whether the first scope is actually a local scope. | 8812 // Check whether the first scope is actually a local scope. |
| 8809 if (context_->IsGlobalContext()) { | 8813 if (context_->IsGlobalContext()) { |
| 8810 // If there is a stack slot for .result then this local scope has been | 8814 // If there is a stack slot for .result then this local scope has been |
| 8811 // created for evaluating top level code and it is not a real local scope. | 8815 // created for evaluating top level code and it is not a real local scope. |
| 8812 // Checking for the existence of .result seems fragile, but the scope info | 8816 // Checking for the existence of .result seems fragile, but the scope info |
| 8813 // saved with the code object does not otherwise have that information. | 8817 // saved with the code object does not otherwise have that information. |
| 8814 Handle<Code> code(function_->code()); | 8818 int index = ScopeInfo<>::StackSlotIndex(function_->shared()->scope_info(), |
| 8815 int index = ScopeInfo<>::StackSlotIndex(*code, Heap::result_symbol()); | 8819 Heap::result_symbol()); |
| 8816 at_local_ = index < 0; | 8820 at_local_ = index < 0; |
| 8817 } else if (context_->is_function_context()) { | 8821 } else if (context_->is_function_context()) { |
| 8818 at_local_ = true; | 8822 at_local_ = true; |
| 8819 } | 8823 } |
| 8820 } | 8824 } |
| 8821 | 8825 |
| 8822 // More scopes? | 8826 // More scopes? |
| 8823 bool Done() { return context_.is_null(); } | 8827 bool Done() { return context_.is_null(); } |
| 8824 | 8828 |
| 8825 // Move to the next scope. | 8829 // Move to the next scope. |
| (...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 8919 // Debug print of the content of the current scope. | 8923 // Debug print of the content of the current scope. |
| 8920 void DebugPrint() { | 8924 void DebugPrint() { |
| 8921 switch (Type()) { | 8925 switch (Type()) { |
| 8922 case ScopeIterator::ScopeTypeGlobal: | 8926 case ScopeIterator::ScopeTypeGlobal: |
| 8923 PrintF("Global:\n"); | 8927 PrintF("Global:\n"); |
| 8924 CurrentContext()->Print(); | 8928 CurrentContext()->Print(); |
| 8925 break; | 8929 break; |
| 8926 | 8930 |
| 8927 case ScopeIterator::ScopeTypeLocal: { | 8931 case ScopeIterator::ScopeTypeLocal: { |
| 8928 PrintF("Local:\n"); | 8932 PrintF("Local:\n"); |
| 8929 Handle<Code> code(function_->code()); | 8933 ScopeInfo<> scope_info(function_->shared()->scope_info()); |
| 8930 ScopeInfo<> scope_info(*code); | |
| 8931 scope_info.Print(); | 8934 scope_info.Print(); |
| 8932 if (!CurrentContext().is_null()) { | 8935 if (!CurrentContext().is_null()) { |
| 8933 CurrentContext()->Print(); | 8936 CurrentContext()->Print(); |
| 8934 if (CurrentContext()->has_extension()) { | 8937 if (CurrentContext()->has_extension()) { |
| 8935 Handle<JSObject> extension = | 8938 Handle<JSObject> extension = |
| 8936 Handle<JSObject>(CurrentContext()->extension()); | 8939 Handle<JSObject>(CurrentContext()->extension()); |
| 8937 if (extension->IsJSContextExtensionObject()) { | 8940 if (extension->IsJSContextExtensionObject()) { |
| 8938 extension->Print(); | 8941 extension->Print(); |
| 8939 } | 8942 } |
| 8940 } | 8943 } |
| (...skipping 503 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 9444 CopyWithContextChain(function_context, previous), | 9447 CopyWithContextChain(function_context, previous), |
| 9445 extension, | 9448 extension, |
| 9446 context_chain->IsCatchContext()); | 9449 context_chain->IsCatchContext()); |
| 9447 } | 9450 } |
| 9448 | 9451 |
| 9449 | 9452 |
| 9450 // Helper function to find or create the arguments object for | 9453 // Helper function to find or create the arguments object for |
| 9451 // Runtime_DebugEvaluate. | 9454 // Runtime_DebugEvaluate. |
| 9452 static Handle<Object> GetArgumentsObject(JavaScriptFrame* frame, | 9455 static Handle<Object> GetArgumentsObject(JavaScriptFrame* frame, |
| 9453 Handle<JSFunction> function, | 9456 Handle<JSFunction> function, |
| 9454 Handle<Code> code, | 9457 Handle<Object> scope_info, |
| 9455 const ScopeInfo<>* sinfo, | 9458 const ScopeInfo<>* sinfo, |
| 9456 Handle<Context> function_context) { | 9459 Handle<Context> function_context) { |
| 9457 // Try to find the value of 'arguments' to pass as parameter. If it is not | 9460 // Try to find the value of 'arguments' to pass as parameter. If it is not |
| 9458 // found (that is the debugged function does not reference 'arguments' and | 9461 // found (that is the debugged function does not reference 'arguments' and |
| 9459 // does not support eval) then create an 'arguments' object. | 9462 // does not support eval) then create an 'arguments' object. |
| 9460 int index; | 9463 int index; |
| 9461 if (sinfo->number_of_stack_slots() > 0) { | 9464 if (sinfo->number_of_stack_slots() > 0) { |
| 9462 index = ScopeInfo<>::StackSlotIndex(*code, Heap::arguments_symbol()); | 9465 index = ScopeInfo<>::StackSlotIndex(*scope_info, Heap::arguments_symbol()); |
| 9463 if (index != -1) { | 9466 if (index != -1) { |
| 9464 return Handle<Object>(frame->GetExpression(index)); | 9467 return Handle<Object>(frame->GetExpression(index)); |
| 9465 } | 9468 } |
| 9466 } | 9469 } |
| 9467 | 9470 |
| 9468 if (sinfo->number_of_context_slots() > Context::MIN_CONTEXT_SLOTS) { | 9471 if (sinfo->number_of_context_slots() > Context::MIN_CONTEXT_SLOTS) { |
| 9469 index = ScopeInfo<>::ContextSlotIndex(*code, Heap::arguments_symbol(), | 9472 index = ScopeInfo<>::ContextSlotIndex(*scope_info, Heap::arguments_symbol(), |
| 9470 NULL); | 9473 NULL); |
| 9471 if (index != -1) { | 9474 if (index != -1) { |
| 9472 return Handle<Object>(function_context->get(index)); | 9475 return Handle<Object>(function_context->get(index)); |
| 9473 } | 9476 } |
| 9474 } | 9477 } |
| 9475 | 9478 |
| 9476 const int length = frame->GetProvidedParametersCount(); | 9479 const int length = frame->GetProvidedParametersCount(); |
| 9477 Handle<JSObject> arguments = Factory::NewArgumentsObject(function, length); | 9480 Handle<JSObject> arguments = Factory::NewArgumentsObject(function, length); |
| 9478 Handle<FixedArray> array = Factory::NewFixedArray(length); | 9481 Handle<FixedArray> array = Factory::NewFixedArray(length); |
| 9479 | 9482 |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 9511 CONVERT_BOOLEAN_CHECKED(disable_break, args[3]); | 9514 CONVERT_BOOLEAN_CHECKED(disable_break, args[3]); |
| 9512 | 9515 |
| 9513 // Handle the processing of break. | 9516 // Handle the processing of break. |
| 9514 DisableBreak disable_break_save(disable_break); | 9517 DisableBreak disable_break_save(disable_break); |
| 9515 | 9518 |
| 9516 // Get the frame where the debugging is performed. | 9519 // Get the frame where the debugging is performed. |
| 9517 StackFrame::Id id = UnwrapFrameId(wrapped_id); | 9520 StackFrame::Id id = UnwrapFrameId(wrapped_id); |
| 9518 JavaScriptFrameIterator it(id); | 9521 JavaScriptFrameIterator it(id); |
| 9519 JavaScriptFrame* frame = it.frame(); | 9522 JavaScriptFrame* frame = it.frame(); |
| 9520 Handle<JSFunction> function(JSFunction::cast(frame->function())); | 9523 Handle<JSFunction> function(JSFunction::cast(frame->function())); |
| 9521 Handle<Code> code(function->code()); | 9524 Handle<Object> scope_info(function->shared()->scope_info()); |
| 9522 ScopeInfo<> sinfo(*code); | 9525 ScopeInfo<> sinfo(*scope_info); |
| 9523 | 9526 |
| 9524 // Traverse the saved contexts chain to find the active context for the | 9527 // Traverse the saved contexts chain to find the active context for the |
| 9525 // selected frame. | 9528 // selected frame. |
| 9526 SaveContext* save = Top::save_context(); | 9529 SaveContext* save = Top::save_context(); |
| 9527 while (save != NULL && !save->below(frame)) { | 9530 while (save != NULL && !save->below(frame)) { |
| 9528 save = save->prev(); | 9531 save = save->prev(); |
| 9529 } | 9532 } |
| 9530 ASSERT(save != NULL); | 9533 ASSERT(save != NULL); |
| 9531 SaveContext savex; | 9534 SaveContext savex; |
| 9532 Top::set_context(*(save->context())); | 9535 Top::set_context(*(save->context())); |
| 9533 | 9536 |
| 9534 // Create the (empty) function replacing the function on the stack frame for | 9537 // Create the (empty) function replacing the function on the stack frame for |
| 9535 // the purpose of evaluating in the context created below. It is important | 9538 // the purpose of evaluating in the context created below. It is important |
| 9536 // that this function does not describe any parameters and local variables | 9539 // that this function does not describe any parameters and local variables |
| 9537 // in the context. If it does then this will cause problems with the lookup | 9540 // in the context. If it does then this will cause problems with the lookup |
| 9538 // in Context::Lookup, where context slots for parameters and local variables | 9541 // in Context::Lookup, where context slots for parameters and local variables |
| 9539 // are looked at before the extension object. | 9542 // are looked at before the extension object. |
| 9540 Handle<JSFunction> go_between = | 9543 Handle<JSFunction> go_between = |
| 9541 Factory::NewFunction(Factory::empty_string(), Factory::undefined_value()); | 9544 Factory::NewFunction(Factory::empty_string(), Factory::undefined_value()); |
| 9542 go_between->set_context(function->context()); | 9545 go_between->set_context(function->context()); |
| 9543 #ifdef DEBUG | 9546 #ifdef DEBUG |
| 9544 ScopeInfo<> go_between_sinfo(go_between->shared()->code()); | 9547 ScopeInfo<> go_between_sinfo(go_between->shared()->scope_info()); |
| 9545 ASSERT(go_between_sinfo.number_of_parameters() == 0); | 9548 ASSERT(go_between_sinfo.number_of_parameters() == 0); |
| 9546 ASSERT(go_between_sinfo.number_of_context_slots() == 0); | 9549 ASSERT(go_between_sinfo.number_of_context_slots() == 0); |
| 9547 #endif | 9550 #endif |
| 9548 | 9551 |
| 9549 // Materialize the content of the local scope into a JSObject. | 9552 // Materialize the content of the local scope into a JSObject. |
| 9550 Handle<JSObject> local_scope = MaterializeLocalScope(frame); | 9553 Handle<JSObject> local_scope = MaterializeLocalScope(frame); |
| 9551 | 9554 |
| 9552 // Allocate a new context for the debug evaluation and set the extension | 9555 // Allocate a new context for the debug evaluation and set the extension |
| 9553 // object build. | 9556 // object build. |
| 9554 Handle<Context> context = | 9557 Handle<Context> context = |
| (...skipping 25 matching lines...) Expand all Loading... |
| 9580 Factory::NewFunctionFromSharedFunctionInfo(shared, context); | 9583 Factory::NewFunctionFromSharedFunctionInfo(shared, context); |
| 9581 | 9584 |
| 9582 // Invoke the result of the compilation to get the evaluation function. | 9585 // Invoke the result of the compilation to get the evaluation function. |
| 9583 bool has_pending_exception; | 9586 bool has_pending_exception; |
| 9584 Handle<Object> receiver(frame->receiver()); | 9587 Handle<Object> receiver(frame->receiver()); |
| 9585 Handle<Object> evaluation_function = | 9588 Handle<Object> evaluation_function = |
| 9586 Execution::Call(compiled_function, receiver, 0, NULL, | 9589 Execution::Call(compiled_function, receiver, 0, NULL, |
| 9587 &has_pending_exception); | 9590 &has_pending_exception); |
| 9588 if (has_pending_exception) return Failure::Exception(); | 9591 if (has_pending_exception) return Failure::Exception(); |
| 9589 | 9592 |
| 9590 Handle<Object> arguments = GetArgumentsObject(frame, function, code, &sinfo, | 9593 Handle<Object> arguments = GetArgumentsObject(frame, function, scope_info, |
| 9591 function_context); | 9594 &sinfo, function_context); |
| 9592 | 9595 |
| 9593 // Invoke the evaluation function and return the result. | 9596 // Invoke the evaluation function and return the result. |
| 9594 const int argc = 2; | 9597 const int argc = 2; |
| 9595 Object** argv[argc] = { arguments.location(), | 9598 Object** argv[argc] = { arguments.location(), |
| 9596 Handle<Object>::cast(source).location() }; | 9599 Handle<Object>::cast(source).location() }; |
| 9597 Handle<Object> result = | 9600 Handle<Object> result = |
| 9598 Execution::Call(Handle<JSFunction>::cast(evaluation_function), receiver, | 9601 Execution::Call(Handle<JSFunction>::cast(evaluation_function), receiver, |
| 9599 argc, argv, &has_pending_exception); | 9602 argc, argv, &has_pending_exception); |
| 9600 if (has_pending_exception) return Failure::Exception(); | 9603 if (has_pending_exception) return Failure::Exception(); |
| 9601 | 9604 |
| (...skipping 942 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 10544 } else { | 10547 } else { |
| 10545 // Handle last resort GC and make sure to allow future allocations | 10548 // Handle last resort GC and make sure to allow future allocations |
| 10546 // to grow the heap without causing GCs (if possible). | 10549 // to grow the heap without causing GCs (if possible). |
| 10547 Counters::gc_last_resort_from_js.Increment(); | 10550 Counters::gc_last_resort_from_js.Increment(); |
| 10548 Heap::CollectAllGarbage(false); | 10551 Heap::CollectAllGarbage(false); |
| 10549 } | 10552 } |
| 10550 } | 10553 } |
| 10551 | 10554 |
| 10552 | 10555 |
| 10553 } } // namespace v8::internal | 10556 } } // namespace v8::internal |
| OLD | NEW |