| 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 | 
|---|