Chromium Code Reviews| 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 24 matching lines...) Expand all Loading... | |
| 35 #include "codegen.h" | 35 #include "codegen.h" |
| 36 #include "compilation-cache.h" | 36 #include "compilation-cache.h" |
| 37 #include "compiler.h" | 37 #include "compiler.h" |
| 38 #include "cpu.h" | 38 #include "cpu.h" |
| 39 #include "dateparser-inl.h" | 39 #include "dateparser-inl.h" |
| 40 #include "debug.h" | 40 #include "debug.h" |
| 41 #include "deoptimizer.h" | 41 #include "deoptimizer.h" |
| 42 #include "execution.h" | 42 #include "execution.h" |
| 43 #include "jsregexp.h" | 43 #include "jsregexp.h" |
| 44 #include "liveedit.h" | 44 #include "liveedit.h" |
| 45 #include "liveobjectlist.h" | |
|
Søren Thygesen Gjesse
2011/01/19 08:36:40
This suggests that the actual lol implementation l
marklam
2011/01/19 09:04:02
Mikhail's suggested division of the commits was to
| |
| 45 #include "parser.h" | 46 #include "parser.h" |
| 46 #include "platform.h" | 47 #include "platform.h" |
| 47 #include "runtime.h" | 48 #include "runtime.h" |
| 48 #include "runtime-profiler.h" | 49 #include "runtime-profiler.h" |
| 49 #include "scopeinfo.h" | 50 #include "scopeinfo.h" |
| 50 #include "smart-pointer.h" | 51 #include "smart-pointer.h" |
| 51 #include "stub-cache.h" | 52 #include "stub-cache.h" |
| 52 #include "v8threads.h" | 53 #include "v8threads.h" |
| 53 #include "string-search.h" | 54 #include "string-search.h" |
| 54 | 55 |
| (...skipping 10411 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 10466 | 10467 |
| 10467 | 10468 |
| 10468 // Gets the current heap usage. | 10469 // Gets the current heap usage. |
| 10469 static MaybeObject* Runtime_GetHeapUsage(Arguments args) { | 10470 static MaybeObject* Runtime_GetHeapUsage(Arguments args) { |
| 10470 int usage = static_cast<int>(Heap::SizeOfObjects()); | 10471 int usage = static_cast<int>(Heap::SizeOfObjects()); |
| 10471 if (!Smi::IsValid(usage)) { | 10472 if (!Smi::IsValid(usage)) { |
| 10472 return *Factory::NewNumberFromInt(usage); | 10473 return *Factory::NewNumberFromInt(usage); |
| 10473 } | 10474 } |
| 10474 return Smi::FromInt(usage); | 10475 return Smi::FromInt(usage); |
| 10475 } | 10476 } |
| 10477 | |
| 10478 | |
| 10479 // Captures a live object list from the present heap. | |
| 10480 static MaybeObject* Runtime_HasLOLEnabled(Arguments args) { | |
| 10481 #ifdef LIVE_OBJECT_LIST | |
| 10482 return Heap::true_value(); | |
| 10483 #else | |
| 10484 return Heap::false_value(); | |
| 10485 #endif | |
| 10486 } | |
| 10487 | |
| 10488 | |
| 10489 // Captures a live object list from the present heap. | |
| 10490 static MaybeObject* Runtime_CaptureLOL(Arguments args) { | |
| 10491 #ifdef LIVE_OBJECT_LIST | |
| 10492 return LiveObjectList::Capture(); | |
| 10493 #else | |
| 10494 return Heap::undefined_value(); | |
| 10495 #endif | |
| 10496 } | |
| 10497 | |
| 10498 | |
| 10499 // Deletes the specified live object list. | |
| 10500 static MaybeObject* Runtime_DeleteLOL(Arguments args) { | |
| 10501 #ifdef LIVE_OBJECT_LIST | |
| 10502 CONVERT_SMI_CHECKED(id, args[0]); | |
| 10503 bool success = LiveObjectList::Delete(id); | |
| 10504 return success ? Heap::true_value() : Heap::false_value(); | |
| 10505 #else | |
| 10506 return Heap::undefined_value(); | |
| 10507 #endif | |
| 10508 } | |
| 10509 | |
| 10510 | |
| 10511 // Generates the response to a debugger request for a dump of the objects | |
| 10512 // contained in the difference between the captured live object lists | |
| 10513 // specified by id1 and id2. | |
| 10514 // If id1 is 0 (i.e. not a valid lol), then the whole of lol id2 will be | |
| 10515 // dumped. | |
| 10516 static MaybeObject* Runtime_DumpLOL(Arguments args) { | |
| 10517 #ifdef LIVE_OBJECT_LIST | |
| 10518 HandleScope scope; | |
| 10519 CONVERT_SMI_CHECKED(id1, args[0]); | |
| 10520 CONVERT_SMI_CHECKED(id2, args[1]); | |
| 10521 CONVERT_SMI_CHECKED(start, args[2]); | |
| 10522 CONVERT_SMI_CHECKED(count, args[3]); | |
| 10523 CONVERT_ARG_CHECKED(JSObject, filter_obj, 4); | |
| 10524 EnterDebugger enter_debugger; | |
| 10525 return LiveObjectList::Dump(id1, id2, start, count, filter_obj); | |
| 10526 #else | |
| 10527 return Heap::undefined_value(); | |
| 10528 #endif | |
| 10529 } | |
| 10530 | |
| 10531 | |
| 10532 // Gets the specified object as requested by the debugger. | |
| 10533 // This is only used for obj ids shown in live object lists. | |
| 10534 static MaybeObject* Runtime_GetLOLObj(Arguments args) { | |
| 10535 #ifdef LIVE_OBJECT_LIST | |
| 10536 CONVERT_SMI_CHECKED(obj_id, args[0]); | |
| 10537 Object* result = LiveObjectList::GetObj(obj_id); | |
| 10538 return result; | |
| 10539 #else | |
| 10540 return Heap::undefined_value(); | |
| 10541 #endif | |
| 10542 } | |
| 10543 | |
| 10544 | |
| 10545 // Gets the obj id for the specified address if valid. | |
| 10546 // This is only used for obj ids shown in live object lists. | |
| 10547 static MaybeObject* Runtime_GetLOLObjId(Arguments args) { | |
| 10548 #ifdef LIVE_OBJECT_LIST | |
| 10549 HandleScope scope; | |
| 10550 CONVERT_ARG_CHECKED(String, address, 0); | |
| 10551 Object* result = LiveObjectList::GetObjId(address); | |
| 10552 return result; | |
| 10553 #else | |
| 10554 return Heap::undefined_value(); | |
| 10555 #endif | |
| 10556 } | |
| 10557 | |
| 10558 | |
| 10559 // Gets the retainers that references the specified object alive. | |
| 10560 static MaybeObject* Runtime_GetLOLObjRetainers(Arguments args) { | |
| 10561 #ifdef LIVE_OBJECT_LIST | |
| 10562 HandleScope scope; | |
| 10563 CONVERT_SMI_CHECKED(obj_id, args[0]); | |
| 10564 RUNTIME_ASSERT(args[1]->IsUndefined() || args[1]->IsJSObject()); | |
| 10565 RUNTIME_ASSERT(args[2]->IsUndefined() || args[2]->IsBoolean()); | |
| 10566 RUNTIME_ASSERT(args[3]->IsUndefined() || args[3]->IsSmi()); | |
| 10567 RUNTIME_ASSERT(args[4]->IsUndefined() || args[4]->IsSmi()); | |
| 10568 CONVERT_ARG_CHECKED(JSObject, filter_obj, 5); | |
| 10569 | |
| 10570 Handle<JSObject> instance_filter; | |
| 10571 if (args[1]->IsJSObject()) { | |
| 10572 instance_filter = args.at<JSObject>(1); | |
| 10573 } | |
| 10574 bool verbose = false; | |
| 10575 if (args[2]->IsBoolean()) { | |
| 10576 verbose = args[2]->IsTrue(); | |
| 10577 } | |
| 10578 int start = 0; | |
| 10579 if (args[3]->IsSmi()) { | |
| 10580 start = Smi::cast(args[3])->value(); | |
| 10581 } | |
| 10582 int limit = Smi::kMaxValue; | |
| 10583 if (args[4]->IsSmi()) { | |
| 10584 limit = Smi::cast(args[4])->value(); | |
| 10585 } | |
| 10586 | |
| 10587 return LiveObjectList::GetObjRetainers(obj_id, | |
| 10588 instance_filter, | |
| 10589 verbose, | |
| 10590 start, | |
| 10591 limit, | |
| 10592 filter_obj); | |
| 10593 #else | |
| 10594 return Heap::undefined_value(); | |
| 10595 #endif | |
| 10596 } | |
| 10597 | |
| 10598 | |
| 10599 // Gets the reference path between 2 objects. | |
| 10600 static MaybeObject* Runtime_GetLOLPath(Arguments args) { | |
| 10601 #ifdef LIVE_OBJECT_LIST | |
| 10602 HandleScope scope; | |
| 10603 CONVERT_SMI_CHECKED(obj_id1, args[0]); | |
| 10604 CONVERT_SMI_CHECKED(obj_id2, args[1]); | |
| 10605 RUNTIME_ASSERT(args[2]->IsUndefined() || args[2]->IsJSObject()); | |
| 10606 | |
| 10607 Handle<JSObject> instance_filter; | |
| 10608 if (args[2]->IsJSObject()) { | |
| 10609 instance_filter = args.at<JSObject>(2); | |
| 10610 } | |
| 10611 | |
| 10612 Object* result = | |
| 10613 LiveObjectList::GetPath(obj_id1, obj_id2, instance_filter); | |
| 10614 return result; | |
| 10615 #else | |
| 10616 return Heap::undefined_value(); | |
| 10617 #endif | |
| 10618 } | |
| 10619 | |
| 10620 | |
| 10621 // Generates the response to a debugger request for a list of all | |
| 10622 // previously captured live object lists. | |
| 10623 static MaybeObject* Runtime_InfoLOL(Arguments args) { | |
| 10624 #ifdef LIVE_OBJECT_LIST | |
| 10625 CONVERT_SMI_CHECKED(start, args[0]); | |
| 10626 CONVERT_SMI_CHECKED(count, args[1]); | |
| 10627 return LiveObjectList::Info(start, count); | |
| 10628 #else | |
| 10629 return Heap::undefined_value(); | |
| 10630 #endif | |
| 10631 } | |
| 10632 | |
| 10633 | |
| 10634 // Gets a dump of the specified object as requested by the debugger. | |
| 10635 // This is only used for obj ids shown in live object lists. | |
| 10636 static MaybeObject* Runtime_PrintLOLObj(Arguments args) { | |
| 10637 #ifdef LIVE_OBJECT_LIST | |
| 10638 HandleScope scope; | |
| 10639 CONVERT_SMI_CHECKED(obj_id, args[0]); | |
| 10640 Object* result = LiveObjectList::PrintObj(obj_id); | |
| 10641 return result; | |
| 10642 #else | |
| 10643 return Heap::undefined_value(); | |
| 10644 #endif | |
| 10645 } | |
| 10646 | |
| 10647 | |
| 10648 // Resets and releases all previously captured live object lists. | |
| 10649 static MaybeObject* Runtime_ResetLOL(Arguments args) { | |
| 10650 #ifdef LIVE_OBJECT_LIST | |
| 10651 LiveObjectList::Reset(); | |
| 10652 return Heap::undefined_value(); | |
| 10653 #else | |
| 10654 return Heap::undefined_value(); | |
| 10655 #endif | |
| 10656 } | |
| 10657 | |
| 10658 | |
| 10659 // Generates the response to a debugger request for a summary of the types | |
| 10660 // of objects in the difference between the captured live object lists | |
| 10661 // specified by id1 and id2. | |
| 10662 // If id1 is 0 (i.e. not a valid lol), then the whole of lol id2 will be | |
| 10663 // summarized. | |
| 10664 static MaybeObject* Runtime_SummarizeLOL(Arguments args) { | |
| 10665 #ifdef LIVE_OBJECT_LIST | |
| 10666 HandleScope scope; | |
| 10667 CONVERT_SMI_CHECKED(id1, args[0]); | |
| 10668 CONVERT_SMI_CHECKED(id2, args[1]); | |
| 10669 CONVERT_ARG_CHECKED(JSObject, filter_obj, 2); | |
| 10670 | |
| 10671 EnterDebugger enter_debugger; | |
| 10672 return LiveObjectList::Summarize(id1, id2, filter_obj); | |
| 10673 #else | |
| 10674 return Heap::undefined_value(); | |
| 10675 #endif | |
| 10676 } | |
| 10677 | |
| 10476 #endif // ENABLE_DEBUGGER_SUPPORT | 10678 #endif // ENABLE_DEBUGGER_SUPPORT |
| 10477 | 10679 |
| 10478 | 10680 |
| 10479 #ifdef ENABLE_LOGGING_AND_PROFILING | 10681 #ifdef ENABLE_LOGGING_AND_PROFILING |
| 10480 static MaybeObject* Runtime_ProfilerResume(Arguments args) { | 10682 static MaybeObject* Runtime_ProfilerResume(Arguments args) { |
| 10481 NoHandleAllocation ha; | 10683 NoHandleAllocation ha; |
| 10482 ASSERT(args.length() == 2); | 10684 ASSERT(args.length() == 2); |
| 10483 | 10685 |
| 10484 CONVERT_CHECKED(Smi, smi_modules, args[0]); | 10686 CONVERT_CHECKED(Smi, smi_modules, args[0]); |
| 10485 CONVERT_CHECKED(Smi, smi_tag, args[1]); | 10687 CONVERT_CHECKED(Smi, smi_tag, args[1]); |
| (...skipping 381 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 10867 } else { | 11069 } else { |
| 10868 // Handle last resort GC and make sure to allow future allocations | 11070 // Handle last resort GC and make sure to allow future allocations |
| 10869 // to grow the heap without causing GCs (if possible). | 11071 // to grow the heap without causing GCs (if possible). |
| 10870 Counters::gc_last_resort_from_js.Increment(); | 11072 Counters::gc_last_resort_from_js.Increment(); |
| 10871 Heap::CollectAllGarbage(false); | 11073 Heap::CollectAllGarbage(false); |
| 10872 } | 11074 } |
| 10873 } | 11075 } |
| 10874 | 11076 |
| 10875 | 11077 |
| 10876 } } // namespace v8::internal | 11078 } } // namespace v8::internal |
| OLD | NEW |