| OLD | NEW |
| 1 // Copyright 2010 the V8 project authors. All rights reserved. | 1 // Copyright 2010 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 4326 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4337 static MaybeObject* Runtime_GetArgumentsProperty(Arguments args) { | 4337 static MaybeObject* Runtime_GetArgumentsProperty(Arguments args) { |
| 4338 NoHandleAllocation ha; | 4338 NoHandleAllocation ha; |
| 4339 ASSERT(args.length() == 1); | 4339 ASSERT(args.length() == 1); |
| 4340 | 4340 |
| 4341 // Compute the frame holding the arguments. | 4341 // Compute the frame holding the arguments. |
| 4342 JavaScriptFrameIterator it; | 4342 JavaScriptFrameIterator it; |
| 4343 it.AdvanceToArgumentsFrame(); | 4343 it.AdvanceToArgumentsFrame(); |
| 4344 JavaScriptFrame* frame = it.frame(); | 4344 JavaScriptFrame* frame = it.frame(); |
| 4345 | 4345 |
| 4346 // Get the actual number of provided arguments. | 4346 // Get the actual number of provided arguments. |
| 4347 const uint32_t n = frame->GetProvidedParametersCount(); | 4347 const uint32_t n = frame->ComputeParametersCount(); |
| 4348 | 4348 |
| 4349 // Try to convert the key to an index. If successful and within | 4349 // Try to convert the key to an index. If successful and within |
| 4350 // index return the the argument from the frame. | 4350 // index return the the argument from the frame. |
| 4351 uint32_t index; | 4351 uint32_t index; |
| 4352 if (args[0]->ToArrayIndex(&index) && index < n) { | 4352 if (args[0]->ToArrayIndex(&index) && index < n) { |
| 4353 return frame->GetParameter(index); | 4353 return frame->GetParameter(index); |
| 4354 } | 4354 } |
| 4355 | 4355 |
| 4356 // Convert the key to a string. | 4356 // Convert the key to a string. |
| 4357 HandleScope scope; | 4357 HandleScope scope; |
| (...skipping 2534 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6892 bound_args = FixedArray::cast(params->elements()); | 6892 bound_args = FixedArray::cast(params->elements()); |
| 6893 bound_argc = Smi::cast(params->length())->value(); | 6893 bound_argc = Smi::cast(params->length())->value(); |
| 6894 } | 6894 } |
| 6895 | 6895 |
| 6896 // Find frame containing arguments passed to the caller. | 6896 // Find frame containing arguments passed to the caller. |
| 6897 JavaScriptFrameIterator it; | 6897 JavaScriptFrameIterator it; |
| 6898 JavaScriptFrame* frame = it.frame(); | 6898 JavaScriptFrame* frame = it.frame(); |
| 6899 ASSERT(!frame->is_optimized()); | 6899 ASSERT(!frame->is_optimized()); |
| 6900 it.AdvanceToArgumentsFrame(); | 6900 it.AdvanceToArgumentsFrame(); |
| 6901 frame = it.frame(); | 6901 frame = it.frame(); |
| 6902 int argc = frame->GetProvidedParametersCount(); | 6902 int argc = frame->ComputeParametersCount(); |
| 6903 | 6903 |
| 6904 // Prepend bound arguments to caller's arguments. | 6904 // Prepend bound arguments to caller's arguments. |
| 6905 int total_argc = bound_argc + argc; | 6905 int total_argc = bound_argc + argc; |
| 6906 SmartPointer<Object**> param_data(NewArray<Object**>(total_argc)); | 6906 SmartPointer<Object**> param_data(NewArray<Object**>(total_argc)); |
| 6907 for (int i = 0; i < bound_argc; i++) { | 6907 for (int i = 0; i < bound_argc; i++) { |
| 6908 Handle<Object> val = Handle<Object>(bound_args->get(i)); | 6908 Handle<Object> val = Handle<Object>(bound_args->get(i)); |
| 6909 param_data[i] = val.location(); | 6909 param_data[i] = val.location(); |
| 6910 } | 6910 } |
| 6911 for (int i = 0; i < argc; i++) { | 6911 for (int i = 0; i < argc; i++) { |
| 6912 Handle<Object> val = Handle<Object>(frame->GetParameter(i)); | 6912 Handle<Object> val = Handle<Object>(frame->GetParameter(i)); |
| (...skipping 818 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7731 if (fun->IsJSFunction()) { | 7731 if (fun->IsJSFunction()) { |
| 7732 PrintObject(JSFunction::cast(fun)->shared()->name()); | 7732 PrintObject(JSFunction::cast(fun)->shared()->name()); |
| 7733 } else { | 7733 } else { |
| 7734 PrintObject(fun); | 7734 PrintObject(fun); |
| 7735 } | 7735 } |
| 7736 // function arguments | 7736 // function arguments |
| 7737 // (we are intentionally only printing the actually | 7737 // (we are intentionally only printing the actually |
| 7738 // supplied parameters, not all parameters required) | 7738 // supplied parameters, not all parameters required) |
| 7739 PrintF("(this="); | 7739 PrintF("(this="); |
| 7740 PrintObject(frame->receiver()); | 7740 PrintObject(frame->receiver()); |
| 7741 const int length = frame->GetProvidedParametersCount(); | 7741 const int length = frame->ComputeParametersCount(); |
| 7742 for (int i = 0; i < length; i++) { | 7742 for (int i = 0; i < length; i++) { |
| 7743 PrintF(", "); | 7743 PrintF(", "); |
| 7744 PrintObject(frame->GetParameter(i)); | 7744 PrintObject(frame->GetParameter(i)); |
| 7745 } | 7745 } |
| 7746 PrintF(") {\n"); | 7746 PrintF(") {\n"); |
| 7747 | 7747 |
| 7748 } else { | 7748 } else { |
| 7749 // function result | 7749 // function result |
| 7750 PrintF("} -> "); | 7750 PrintF("} -> "); |
| 7751 PrintObject(result); | 7751 PrintObject(result); |
| (...skipping 1492 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 9244 | 9244 |
| 9245 // Now advance to the arguments adapter frame (if any). It contains all | 9245 // Now advance to the arguments adapter frame (if any). It contains all |
| 9246 // the provided parameters whereas the function frame always have the number | 9246 // the provided parameters whereas the function frame always have the number |
| 9247 // of arguments matching the functions parameters. The rest of the | 9247 // of arguments matching the functions parameters. The rest of the |
| 9248 // information (except for what is collected above) is the same. | 9248 // information (except for what is collected above) is the same. |
| 9249 it.AdvanceToArgumentsFrame(); | 9249 it.AdvanceToArgumentsFrame(); |
| 9250 | 9250 |
| 9251 // Find the number of arguments to fill. At least fill the number of | 9251 // Find the number of arguments to fill. At least fill the number of |
| 9252 // parameters for the function and fill more if more parameters are provided. | 9252 // parameters for the function and fill more if more parameters are provided. |
| 9253 int argument_count = info.number_of_parameters(); | 9253 int argument_count = info.number_of_parameters(); |
| 9254 if (argument_count < it.frame()->GetProvidedParametersCount()) { | 9254 if (argument_count < it.frame()->ComputeParametersCount()) { |
| 9255 argument_count = it.frame()->GetProvidedParametersCount(); | 9255 argument_count = it.frame()->ComputeParametersCount(); |
| 9256 } | 9256 } |
| 9257 | 9257 |
| 9258 // Calculate the size of the result. | 9258 // Calculate the size of the result. |
| 9259 int details_size = kFrameDetailsFirstDynamicIndex + | 9259 int details_size = kFrameDetailsFirstDynamicIndex + |
| 9260 2 * (argument_count + info.NumberOfLocals()) + | 9260 2 * (argument_count + info.NumberOfLocals()) + |
| 9261 (at_return ? 1 : 0); | 9261 (at_return ? 1 : 0); |
| 9262 Handle<FixedArray> details = Factory::NewFixedArray(details_size); | 9262 Handle<FixedArray> details = Factory::NewFixedArray(details_size); |
| 9263 | 9263 |
| 9264 // Add the frame id. | 9264 // Add the frame id. |
| 9265 details->set(kFrameDetailsFrameIdIndex, *frame_id); | 9265 details->set(kFrameDetailsFrameIdIndex, *frame_id); |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 9302 } else { | 9302 } else { |
| 9303 details->set(details_index++, Heap::undefined_value()); | 9303 details->set(details_index++, Heap::undefined_value()); |
| 9304 } | 9304 } |
| 9305 | 9305 |
| 9306 // Parameter value. If we are inspecting an optimized frame, use | 9306 // Parameter value. If we are inspecting an optimized frame, use |
| 9307 // undefined as the value. | 9307 // undefined as the value. |
| 9308 // | 9308 // |
| 9309 // TODO(3141533): We should be able to get the actual parameter | 9309 // TODO(3141533): We should be able to get the actual parameter |
| 9310 // value for optimized frames. | 9310 // value for optimized frames. |
| 9311 if (!is_optimized_frame && | 9311 if (!is_optimized_frame && |
| 9312 (i < it.frame()->GetProvidedParametersCount())) { | 9312 (i < it.frame()->ComputeParametersCount())) { |
| 9313 details->set(details_index++, it.frame()->GetParameter(i)); | 9313 details->set(details_index++, it.frame()->GetParameter(i)); |
| 9314 } else { | 9314 } else { |
| 9315 details->set(details_index++, Heap::undefined_value()); | 9315 details->set(details_index++, Heap::undefined_value()); |
| 9316 } | 9316 } |
| 9317 } | 9317 } |
| 9318 | 9318 |
| 9319 // Add locals name and value from the temporary copy from the function frame. | 9319 // Add locals name and value from the temporary copy from the function frame. |
| 9320 for (int i = 0; i < info.NumberOfLocals() * 2; i++) { | 9320 for (int i = 0; i < info.NumberOfLocals() * 2; i++) { |
| 9321 details->set(details_index++, locals->get(i)); | 9321 details->set(details_index++, locals->get(i)); |
| 9322 } | 9322 } |
| (...skipping 859 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 10182 } | 10182 } |
| 10183 } | 10183 } |
| 10184 | 10184 |
| 10185 if (sinfo->number_of_context_slots() > Context::MIN_CONTEXT_SLOTS) { | 10185 if (sinfo->number_of_context_slots() > Context::MIN_CONTEXT_SLOTS) { |
| 10186 index = scope_info->ContextSlotIndex(Heap::arguments_symbol(), NULL); | 10186 index = scope_info->ContextSlotIndex(Heap::arguments_symbol(), NULL); |
| 10187 if (index != -1) { | 10187 if (index != -1) { |
| 10188 return Handle<Object>(function_context->get(index)); | 10188 return Handle<Object>(function_context->get(index)); |
| 10189 } | 10189 } |
| 10190 } | 10190 } |
| 10191 | 10191 |
| 10192 const int length = frame->GetProvidedParametersCount(); | 10192 const int length = frame->ComputeParametersCount(); |
| 10193 Handle<JSObject> arguments = Factory::NewArgumentsObject(function, length); | 10193 Handle<JSObject> arguments = Factory::NewArgumentsObject(function, length); |
| 10194 Handle<FixedArray> array = Factory::NewFixedArray(length); | 10194 Handle<FixedArray> array = Factory::NewFixedArray(length); |
| 10195 | 10195 |
| 10196 AssertNoAllocation no_gc; | 10196 AssertNoAllocation no_gc; |
| 10197 WriteBarrierMode mode = array->GetWriteBarrierMode(no_gc); | 10197 WriteBarrierMode mode = array->GetWriteBarrierMode(no_gc); |
| 10198 for (int i = 0; i < length; i++) { | 10198 for (int i = 0; i < length; i++) { |
| 10199 array->set(i, frame->GetParameter(i), mode); | 10199 array->set(i, frame->GetParameter(i), mode); |
| 10200 } | 10200 } |
| 10201 arguments->set_elements(*array); | 10201 arguments->set_elements(*array); |
| 10202 return arguments; | 10202 return arguments; |
| (...skipping 1421 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 11624 } else { | 11624 } else { |
| 11625 // Handle last resort GC and make sure to allow future allocations | 11625 // Handle last resort GC and make sure to allow future allocations |
| 11626 // to grow the heap without causing GCs (if possible). | 11626 // to grow the heap without causing GCs (if possible). |
| 11627 Counters::gc_last_resort_from_js.Increment(); | 11627 Counters::gc_last_resort_from_js.Increment(); |
| 11628 Heap::CollectAllGarbage(false); | 11628 Heap::CollectAllGarbage(false); |
| 11629 } | 11629 } |
| 11630 } | 11630 } |
| 11631 | 11631 |
| 11632 | 11632 |
| 11633 } } // namespace v8::internal | 11633 } } // namespace v8::internal |
| OLD | NEW |