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

Side by Side Diff: src/runtime.cc

Issue 6794019: Simplify isolates access during stack iteration (WAS: Move SafeStackFrameIterator::active_count_...) (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: A couple more changes Created 9 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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 663 matching lines...) Expand 10 before | Expand all | Expand 10 after
674 new_map->set_prototype(proto); 674 new_map->set_prototype(proto);
675 jsobject->set_map(new_map); 675 jsobject->set_map(new_map);
676 676
677 return isolate->heap()->undefined_value(); 677 return isolate->heap()->undefined_value();
678 } 678 }
679 679
680 680
681 RUNTIME_FUNCTION(MaybeObject*, Runtime_IsConstructCall) { 681 RUNTIME_FUNCTION(MaybeObject*, Runtime_IsConstructCall) {
682 NoHandleAllocation ha; 682 NoHandleAllocation ha;
683 ASSERT(args.length() == 0); 683 ASSERT(args.length() == 0);
684 JavaScriptFrameIterator it; 684 JavaScriptFrameIterator it(isolate);
685 return isolate->heap()->ToBoolean(it.frame()->IsConstructor()); 685 return isolate->heap()->ToBoolean(it.frame()->IsConstructor());
686 } 686 }
687 687
688 688
689 // Recursively traverses hidden prototypes if property is not found 689 // Recursively traverses hidden prototypes if property is not found
690 static void GetOwnPropertyImplementation(JSObject* obj, 690 static void GetOwnPropertyImplementation(JSObject* obj,
691 String* name, 691 String* name,
692 LookupResult* result) { 692 LookupResult* result) {
693 obj->LocalLookupRealNamedProperty(name, result); 693 obj->LocalLookupRealNamedProperty(name, result);
694 694
(...skipping 3782 matching lines...) Expand 10 before | Expand all | Expand 10 after
4477 } 4477 }
4478 return *isolate->factory()->NewJSArrayWithElements(copy); 4478 return *isolate->factory()->NewJSArrayWithElements(copy);
4479 } 4479 }
4480 4480
4481 4481
4482 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetArgumentsProperty) { 4482 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetArgumentsProperty) {
4483 NoHandleAllocation ha; 4483 NoHandleAllocation ha;
4484 ASSERT(args.length() == 1); 4484 ASSERT(args.length() == 1);
4485 4485
4486 // Compute the frame holding the arguments. 4486 // Compute the frame holding the arguments.
4487 JavaScriptFrameIterator it; 4487 JavaScriptFrameIterator it(isolate);
4488 it.AdvanceToArgumentsFrame(); 4488 it.AdvanceToArgumentsFrame();
4489 JavaScriptFrame* frame = it.frame(); 4489 JavaScriptFrame* frame = it.frame();
4490 4490
4491 // Get the actual number of provided arguments. 4491 // Get the actual number of provided arguments.
4492 const uint32_t n = frame->ComputeParametersCount(); 4492 const uint32_t n = frame->ComputeParametersCount();
4493 4493
4494 // Try to convert the key to an index. If successful and within 4494 // Try to convert the key to an index. If successful and within
4495 // index return the the argument from the frame. 4495 // index return the the argument from the frame.
4496 uint32_t index; 4496 uint32_t index;
4497 if (args[0]->ToArrayIndex(&index) && index < n) { 4497 if (args[0]->ToArrayIndex(&index) && index < n) {
(...skipping 2818 matching lines...) Expand 10 before | Expand all | Expand 10 after
7316 RUNTIME_FUNCTION(MaybeObject*, Runtime_NotifyDeoptimized) { 7316 RUNTIME_FUNCTION(MaybeObject*, Runtime_NotifyDeoptimized) {
7317 HandleScope scope(isolate); 7317 HandleScope scope(isolate);
7318 ASSERT(args.length() == 1); 7318 ASSERT(args.length() == 1);
7319 RUNTIME_ASSERT(args[0]->IsSmi()); 7319 RUNTIME_ASSERT(args[0]->IsSmi());
7320 Deoptimizer::BailoutType type = 7320 Deoptimizer::BailoutType type =
7321 static_cast<Deoptimizer::BailoutType>(Smi::cast(args[0])->value()); 7321 static_cast<Deoptimizer::BailoutType>(Smi::cast(args[0])->value());
7322 Deoptimizer* deoptimizer = Deoptimizer::Grab(isolate); 7322 Deoptimizer* deoptimizer = Deoptimizer::Grab(isolate);
7323 ASSERT(isolate->heap()->IsAllocationAllowed()); 7323 ASSERT(isolate->heap()->IsAllocationAllowed());
7324 int frames = deoptimizer->output_count(); 7324 int frames = deoptimizer->output_count();
7325 7325
7326 JavaScriptFrameIterator it; 7326 JavaScriptFrameIterator it(isolate);
7327 JavaScriptFrame* frame = NULL; 7327 JavaScriptFrame* frame = NULL;
7328 for (int i = 0; i < frames; i++) { 7328 for (int i = 0; i < frames; i++) {
7329 if (i != 0) it.Advance(); 7329 if (i != 0) it.Advance();
7330 frame = it.frame(); 7330 frame = it.frame();
7331 deoptimizer->InsertHeapNumberValues(frames - i - 1, frame); 7331 deoptimizer->InsertHeapNumberValues(frames - i - 1, frame);
7332 } 7332 }
7333 delete deoptimizer; 7333 delete deoptimizer;
7334 7334
7335 RUNTIME_ASSERT(frame->function()->IsJSFunction()); 7335 RUNTIME_ASSERT(frame->function()->IsJSFunction());
7336 Handle<JSFunction> function(JSFunction::cast(frame->function()), isolate); 7336 Handle<JSFunction> function(JSFunction::cast(frame->function()), isolate);
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after
7418 // selected for on-stack replacement. Find the unoptimized code object. 7418 // selected for on-stack replacement. Find the unoptimized code object.
7419 Handle<Code> unoptimized(function->shared()->code(), isolate); 7419 Handle<Code> unoptimized(function->shared()->code(), isolate);
7420 // Keep track of whether we've succeeded in optimizing. 7420 // Keep track of whether we've succeeded in optimizing.
7421 bool succeeded = unoptimized->optimizable(); 7421 bool succeeded = unoptimized->optimizable();
7422 if (succeeded) { 7422 if (succeeded) {
7423 // If we are trying to do OSR when there are already optimized 7423 // If we are trying to do OSR when there are already optimized
7424 // activations of the function, it means (a) the function is directly or 7424 // activations of the function, it means (a) the function is directly or
7425 // indirectly recursive and (b) an optimized invocation has been 7425 // indirectly recursive and (b) an optimized invocation has been
7426 // deoptimized so that we are currently in an unoptimized activation. 7426 // deoptimized so that we are currently in an unoptimized activation.
7427 // Check for optimized activations of this function. 7427 // Check for optimized activations of this function.
7428 JavaScriptFrameIterator it; 7428 JavaScriptFrameIterator it(isolate);
7429 while (succeeded && !it.done()) { 7429 while (succeeded && !it.done()) {
7430 JavaScriptFrame* frame = it.frame(); 7430 JavaScriptFrame* frame = it.frame();
7431 succeeded = !frame->is_optimized() || frame->function() != *function; 7431 succeeded = !frame->is_optimized() || frame->function() != *function;
7432 it.Advance(); 7432 it.Advance();
7433 } 7433 }
7434 } 7434 }
7435 7435
7436 int ast_id = AstNode::kNoNumber; 7436 int ast_id = AstNode::kNoNumber;
7437 if (succeeded) { 7437 if (succeeded) {
7438 // The top JS function is this one, the PC is somewhere in the 7438 // The top JS function is this one, the PC is somewhere in the
7439 // unoptimized code. 7439 // unoptimized code.
7440 JavaScriptFrameIterator it; 7440 JavaScriptFrameIterator it(isolate);
7441 JavaScriptFrame* frame = it.frame(); 7441 JavaScriptFrame* frame = it.frame();
7442 ASSERT(frame->function() == *function); 7442 ASSERT(frame->function() == *function);
7443 ASSERT(frame->LookupCode(isolate) == *unoptimized); 7443 ASSERT(frame->LookupCode() == *unoptimized);
7444 ASSERT(unoptimized->contains(frame->pc())); 7444 ASSERT(unoptimized->contains(frame->pc()));
7445 7445
7446 // Use linear search of the unoptimized code's stack check table to find 7446 // Use linear search of the unoptimized code's stack check table to find
7447 // the AST id matching the PC. 7447 // the AST id matching the PC.
7448 Address start = unoptimized->instruction_start(); 7448 Address start = unoptimized->instruction_start();
7449 unsigned target_pc_offset = static_cast<unsigned>(frame->pc() - start); 7449 unsigned target_pc_offset = static_cast<unsigned>(frame->pc() - start);
7450 Address table_cursor = start + unoptimized->stack_check_table_offset(); 7450 Address table_cursor = start + unoptimized->stack_check_table_offset();
7451 uint32_t table_length = Memory::uint32_at(table_cursor); 7451 uint32_t table_length = Memory::uint32_at(table_cursor);
7452 table_cursor += kIntSize; 7452 table_cursor += kIntSize;
7453 for (unsigned i = 0; i < table_length; ++i) { 7453 for (unsigned i = 0; i < table_length; ++i) {
(...skipping 540 matching lines...) Expand 10 before | Expand all | Expand 10 after
7994 7994
7995 7995
7996 RUNTIME_FUNCTION(MaybeObject*, Runtime_DebugPrint) { 7996 RUNTIME_FUNCTION(MaybeObject*, Runtime_DebugPrint) {
7997 NoHandleAllocation ha; 7997 NoHandleAllocation ha;
7998 ASSERT(args.length() == 1); 7998 ASSERT(args.length() == 1);
7999 7999
8000 #ifdef DEBUG 8000 #ifdef DEBUG
8001 if (args[0]->IsString()) { 8001 if (args[0]->IsString()) {
8002 // If we have a string, assume it's a code "marker" 8002 // If we have a string, assume it's a code "marker"
8003 // and print some interesting cpu debugging info. 8003 // and print some interesting cpu debugging info.
8004 JavaScriptFrameIterator it; 8004 JavaScriptFrameIterator it(isolate);
8005 JavaScriptFrame* frame = it.frame(); 8005 JavaScriptFrame* frame = it.frame();
8006 PrintF("fp = %p, sp = %p, caller_sp = %p: ", 8006 PrintF("fp = %p, sp = %p, caller_sp = %p: ",
8007 frame->fp(), frame->sp(), frame->caller_sp()); 8007 frame->fp(), frame->sp(), frame->caller_sp());
8008 } else { 8008 } else {
8009 PrintF("DebugPrint: "); 8009 PrintF("DebugPrint: ");
8010 } 8010 }
8011 args[0]->Print(); 8011 args[0]->Print();
8012 if (args[0]->IsHeapObject()) { 8012 if (args[0]->IsHeapObject()) {
8013 PrintF("\n"); 8013 PrintF("\n");
8014 HeapObject::cast(args[0])->map()->Print(); 8014 HeapObject::cast(args[0])->map()->Print();
(...skipping 1315 matching lines...) Expand 10 before | Expand all | Expand 10 after
9330 if (!maybe_result->ToObject(&result)) return maybe_result; 9330 if (!maybe_result->ToObject(&result)) return maybe_result;
9331 } 9331 }
9332 9332
9333 // Count all frames which are relevant to debugging stack trace. 9333 // Count all frames which are relevant to debugging stack trace.
9334 int n = 0; 9334 int n = 0;
9335 StackFrame::Id id = isolate->debug()->break_frame_id(); 9335 StackFrame::Id id = isolate->debug()->break_frame_id();
9336 if (id == StackFrame::NO_ID) { 9336 if (id == StackFrame::NO_ID) {
9337 // If there is no JavaScript stack frame count is 0. 9337 // If there is no JavaScript stack frame count is 0.
9338 return Smi::FromInt(0); 9338 return Smi::FromInt(0);
9339 } 9339 }
9340 for (JavaScriptFrameIterator it(id); !it.done(); it.Advance()) n++; 9340 for (JavaScriptFrameIterator it(isolate, id); !it.done(); it.Advance()) n++;
9341 return Smi::FromInt(n); 9341 return Smi::FromInt(n);
9342 } 9342 }
9343 9343
9344 9344
9345 static const int kFrameDetailsFrameIdIndex = 0; 9345 static const int kFrameDetailsFrameIdIndex = 0;
9346 static const int kFrameDetailsReceiverIndex = 1; 9346 static const int kFrameDetailsReceiverIndex = 1;
9347 static const int kFrameDetailsFunctionIndex = 2; 9347 static const int kFrameDetailsFunctionIndex = 2;
9348 static const int kFrameDetailsArgumentCountIndex = 3; 9348 static const int kFrameDetailsArgumentCountIndex = 3;
9349 static const int kFrameDetailsLocalCountIndex = 4; 9349 static const int kFrameDetailsLocalCountIndex = 4;
9350 static const int kFrameDetailsSourcePositionIndex = 5; 9350 static const int kFrameDetailsSourcePositionIndex = 5;
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
9383 CONVERT_NUMBER_CHECKED(int, index, Int32, args[1]); 9383 CONVERT_NUMBER_CHECKED(int, index, Int32, args[1]);
9384 Heap* heap = isolate->heap(); 9384 Heap* heap = isolate->heap();
9385 9385
9386 // Find the relevant frame with the requested index. 9386 // Find the relevant frame with the requested index.
9387 StackFrame::Id id = isolate->debug()->break_frame_id(); 9387 StackFrame::Id id = isolate->debug()->break_frame_id();
9388 if (id == StackFrame::NO_ID) { 9388 if (id == StackFrame::NO_ID) {
9389 // If there are no JavaScript stack frames return undefined. 9389 // If there are no JavaScript stack frames return undefined.
9390 return heap->undefined_value(); 9390 return heap->undefined_value();
9391 } 9391 }
9392 int count = 0; 9392 int count = 0;
9393 JavaScriptFrameIterator it(id); 9393 JavaScriptFrameIterator it(isolate, id);
9394 for (; !it.done(); it.Advance()) { 9394 for (; !it.done(); it.Advance()) {
9395 if (count == index) break; 9395 if (count == index) break;
9396 count++; 9396 count++;
9397 } 9397 }
9398 if (it.done()) return heap->undefined_value(); 9398 if (it.done()) return heap->undefined_value();
9399 9399
9400 bool is_optimized_frame = 9400 bool is_optimized_frame =
9401 it.frame()->LookupCode(isolate)->kind() == Code::OPTIMIZED_FUNCTION; 9401 it.frame()->LookupCode()->kind() == Code::OPTIMIZED_FUNCTION;
9402 9402
9403 // Traverse the saved contexts chain to find the active context for the 9403 // Traverse the saved contexts chain to find the active context for the
9404 // selected frame. 9404 // selected frame.
9405 SaveContext* save = isolate->save_context(); 9405 SaveContext* save = isolate->save_context();
9406 while (save != NULL && !save->below(it.frame())) { 9406 while (save != NULL && !save->below(it.frame())) {
9407 save = save->prev(); 9407 save = save->prev();
9408 } 9408 }
9409 ASSERT(save != NULL); 9409 ASSERT(save != NULL);
9410 9410
9411 // Get the frame id. 9411 // Get the frame id.
9412 Handle<Object> frame_id(WrapFrameId(it.frame()->id()), isolate); 9412 Handle<Object> frame_id(WrapFrameId(it.frame()->id()), isolate);
9413 9413
9414 // Find source position. 9414 // Find source position.
9415 int position = 9415 int position =
9416 it.frame()->LookupCode(isolate)->SourcePosition(it.frame()->pc()); 9416 it.frame()->LookupCode()->SourcePosition(it.frame()->pc());
9417 9417
9418 // Check for constructor frame. 9418 // Check for constructor frame.
9419 bool constructor = it.frame()->IsConstructor(); 9419 bool constructor = it.frame()->IsConstructor();
9420 9420
9421 // Get scope info and read from it for local variable information. 9421 // Get scope info and read from it for local variable information.
9422 Handle<JSFunction> function(JSFunction::cast(it.frame()->function())); 9422 Handle<JSFunction> function(JSFunction::cast(it.frame()->function()));
9423 Handle<SerializedScopeInfo> scope_info(function->shared()->scope_info()); 9423 Handle<SerializedScopeInfo> scope_info(function->shared()->scope_info());
9424 ScopeInfo<> info(*scope_info); 9424 ScopeInfo<> info(*scope_info);
9425 9425
9426 // Get the context. 9426 // Get the context.
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
9468 // frame or if the frame is optimized it cannot be at a return. 9468 // frame or if the frame is optimized it cannot be at a return.
9469 bool at_return = false; 9469 bool at_return = false;
9470 if (!is_optimized_frame && index == 0) { 9470 if (!is_optimized_frame && index == 0) {
9471 at_return = isolate->debug()->IsBreakAtReturn(it.frame()); 9471 at_return = isolate->debug()->IsBreakAtReturn(it.frame());
9472 } 9472 }
9473 9473
9474 // If positioned just before return find the value to be returned and add it 9474 // If positioned just before return find the value to be returned and add it
9475 // to the frame information. 9475 // to the frame information.
9476 Handle<Object> return_value = isolate->factory()->undefined_value(); 9476 Handle<Object> return_value = isolate->factory()->undefined_value();
9477 if (at_return) { 9477 if (at_return) {
9478 StackFrameIterator it2; 9478 StackFrameIterator it2(isolate);
9479 Address internal_frame_sp = NULL; 9479 Address internal_frame_sp = NULL;
9480 while (!it2.done()) { 9480 while (!it2.done()) {
9481 if (it2.frame()->is_internal()) { 9481 if (it2.frame()->is_internal()) {
9482 internal_frame_sp = it2.frame()->sp(); 9482 internal_frame_sp = it2.frame()->sp();
9483 } else { 9483 } else {
9484 if (it2.frame()->is_java_script()) { 9484 if (it2.frame()->is_java_script()) {
9485 if (it2.frame()->id() == it.frame()->id()) { 9485 if (it2.frame()->id() == it.frame()->id()) {
9486 // The internal frame just before the JavaScript frame contains the 9486 // The internal frame just before the JavaScript frame contains the
9487 // value to return on top. A debug break at return will create an 9487 // value to return on top. A debug break at return will create an
9488 // internal frame to store the return value (eax/rax/r0) before 9488 // internal frame to store the return value (eax/rax/r0) before
(...skipping 512 matching lines...) Expand 10 before | Expand all | Expand 10 after
10001 // Check arguments. 10001 // Check arguments.
10002 Object* check; 10002 Object* check;
10003 { MaybeObject* maybe_check = Runtime_CheckExecutionState( 10003 { MaybeObject* maybe_check = Runtime_CheckExecutionState(
10004 RUNTIME_ARGUMENTS(isolate, args)); 10004 RUNTIME_ARGUMENTS(isolate, args));
10005 if (!maybe_check->ToObject(&check)) return maybe_check; 10005 if (!maybe_check->ToObject(&check)) return maybe_check;
10006 } 10006 }
10007 CONVERT_CHECKED(Smi, wrapped_id, args[1]); 10007 CONVERT_CHECKED(Smi, wrapped_id, args[1]);
10008 10008
10009 // Get the frame where the debugging is performed. 10009 // Get the frame where the debugging is performed.
10010 StackFrame::Id id = UnwrapFrameId(wrapped_id); 10010 StackFrame::Id id = UnwrapFrameId(wrapped_id);
10011 JavaScriptFrameIterator it(id); 10011 JavaScriptFrameIterator it(isolate, id);
10012 JavaScriptFrame* frame = it.frame(); 10012 JavaScriptFrame* frame = it.frame();
10013 10013
10014 // Count the visible scopes. 10014 // Count the visible scopes.
10015 int n = 0; 10015 int n = 0;
10016 for (ScopeIterator it(isolate, frame); !it.Done(); it.Next()) { 10016 for (ScopeIterator it(isolate, frame); !it.Done(); it.Next()) {
10017 n++; 10017 n++;
10018 } 10018 }
10019 10019
10020 return Smi::FromInt(n); 10020 return Smi::FromInt(n);
10021 } 10021 }
(...skipping 19 matching lines...) Expand all
10041 Object* check; 10041 Object* check;
10042 { MaybeObject* maybe_check = Runtime_CheckExecutionState( 10042 { MaybeObject* maybe_check = Runtime_CheckExecutionState(
10043 RUNTIME_ARGUMENTS(isolate, args)); 10043 RUNTIME_ARGUMENTS(isolate, args));
10044 if (!maybe_check->ToObject(&check)) return maybe_check; 10044 if (!maybe_check->ToObject(&check)) return maybe_check;
10045 } 10045 }
10046 CONVERT_CHECKED(Smi, wrapped_id, args[1]); 10046 CONVERT_CHECKED(Smi, wrapped_id, args[1]);
10047 CONVERT_NUMBER_CHECKED(int, index, Int32, args[2]); 10047 CONVERT_NUMBER_CHECKED(int, index, Int32, args[2]);
10048 10048
10049 // Get the frame where the debugging is performed. 10049 // Get the frame where the debugging is performed.
10050 StackFrame::Id id = UnwrapFrameId(wrapped_id); 10050 StackFrame::Id id = UnwrapFrameId(wrapped_id);
10051 JavaScriptFrameIterator frame_it(id); 10051 JavaScriptFrameIterator frame_it(isolate, id);
10052 JavaScriptFrame* frame = frame_it.frame(); 10052 JavaScriptFrame* frame = frame_it.frame();
10053 10053
10054 // Find the requested scope. 10054 // Find the requested scope.
10055 int n = 0; 10055 int n = 0;
10056 ScopeIterator it(isolate, frame); 10056 ScopeIterator it(isolate, frame);
10057 for (; !it.Done() && n < index; it.Next()) { 10057 for (; !it.Done() && n < index; it.Next()) {
10058 n++; 10058 n++;
10059 } 10059 }
10060 if (it.Done()) { 10060 if (it.Done()) {
10061 return isolate->heap()->undefined_value(); 10061 return isolate->heap()->undefined_value();
(...skipping 467 matching lines...) Expand 10 before | Expand all | Expand 10 after
10529 CONVERT_CHECKED(Smi, wrapped_id, args[1]); 10529 CONVERT_CHECKED(Smi, wrapped_id, args[1]);
10530 CONVERT_ARG_CHECKED(String, source, 2); 10530 CONVERT_ARG_CHECKED(String, source, 2);
10531 CONVERT_BOOLEAN_CHECKED(disable_break, args[3]); 10531 CONVERT_BOOLEAN_CHECKED(disable_break, args[3]);
10532 Handle<Object> additional_context(args[4]); 10532 Handle<Object> additional_context(args[4]);
10533 10533
10534 // Handle the processing of break. 10534 // Handle the processing of break.
10535 DisableBreak disable_break_save(disable_break); 10535 DisableBreak disable_break_save(disable_break);
10536 10536
10537 // Get the frame where the debugging is performed. 10537 // Get the frame where the debugging is performed.
10538 StackFrame::Id id = UnwrapFrameId(wrapped_id); 10538 StackFrame::Id id = UnwrapFrameId(wrapped_id);
10539 JavaScriptFrameIterator it(id); 10539 JavaScriptFrameIterator it(isolate, id);
10540 JavaScriptFrame* frame = it.frame(); 10540 JavaScriptFrame* frame = it.frame();
10541 Handle<JSFunction> function(JSFunction::cast(frame->function())); 10541 Handle<JSFunction> function(JSFunction::cast(frame->function()));
10542 Handle<SerializedScopeInfo> scope_info(function->shared()->scope_info()); 10542 Handle<SerializedScopeInfo> scope_info(function->shared()->scope_info());
10543 ScopeInfo<> sinfo(*scope_info); 10543 ScopeInfo<> sinfo(*scope_info);
10544 10544
10545 // Traverse the saved contexts chain to find the active context for the 10545 // Traverse the saved contexts chain to find the active context for the
10546 // selected frame. 10546 // selected frame.
10547 SaveContext* save = isolate->save_context(); 10547 SaveContext* save = isolate->save_context();
10548 while (save != NULL && !save->below(frame)) { 10548 while (save != NULL && !save->below(frame)) {
10549 save = save->prev(); 10549 save = save->prev();
(...skipping 1047 matching lines...) Expand 10 before | Expand all | Expand 10 after
11597 CONVERT_NUMBER_CHECKED(int32_t, limit, Int32, args[1]); 11597 CONVERT_NUMBER_CHECKED(int32_t, limit, Int32, args[1]);
11598 11598
11599 HandleScope scope(isolate); 11599 HandleScope scope(isolate);
11600 Factory* factory = isolate->factory(); 11600 Factory* factory = isolate->factory();
11601 11601
11602 limit = Max(limit, 0); // Ensure that limit is not negative. 11602 limit = Max(limit, 0); // Ensure that limit is not negative.
11603 int initial_size = Min(limit, 10); 11603 int initial_size = Min(limit, 10);
11604 Handle<FixedArray> elements = 11604 Handle<FixedArray> elements =
11605 factory->NewFixedArrayWithHoles(initial_size * 4); 11605 factory->NewFixedArrayWithHoles(initial_size * 4);
11606 11606
11607 StackFrameIterator iter; 11607 StackFrameIterator iter(isolate);
11608 // If the caller parameter is a function we skip frames until we're 11608 // If the caller parameter is a function we skip frames until we're
11609 // under it before starting to collect. 11609 // under it before starting to collect.
11610 bool seen_caller = !caller->IsJSFunction(); 11610 bool seen_caller = !caller->IsJSFunction();
11611 int cursor = 0; 11611 int cursor = 0;
11612 int frames_seen = 0; 11612 int frames_seen = 0;
11613 while (!iter.done() && frames_seen < limit) { 11613 while (!iter.done() && frames_seen < limit) {
11614 StackFrame* raw_frame = iter.frame(); 11614 StackFrame* raw_frame = iter.frame();
11615 if (ShowFrameInStackTrace(raw_frame, *caller, &seen_caller)) { 11615 if (ShowFrameInStackTrace(raw_frame, *caller, &seen_caller)) {
11616 frames_seen++; 11616 frames_seen++;
11617 JavaScriptFrame* frame = JavaScriptFrame::cast(raw_frame); 11617 JavaScriptFrame* frame = JavaScriptFrame::cast(raw_frame);
(...skipping 320 matching lines...) Expand 10 before | Expand all | Expand 10 after
11938 } else { 11938 } else {
11939 // Handle last resort GC and make sure to allow future allocations 11939 // Handle last resort GC and make sure to allow future allocations
11940 // to grow the heap without causing GCs (if possible). 11940 // to grow the heap without causing GCs (if possible).
11941 isolate->counters()->gc_last_resort_from_js()->Increment(); 11941 isolate->counters()->gc_last_resort_from_js()->Increment();
11942 isolate->heap()->CollectAllGarbage(false); 11942 isolate->heap()->CollectAllGarbage(false);
11943 } 11943 }
11944 } 11944 }
11945 11945
11946 11946
11947 } } // namespace v8::internal 11947 } } // namespace v8::internal
OLDNEW
« src/frames-inl.h ('K') | « src/mark-compact.cc ('k') | src/runtime-profiler.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698