Chromium Code Reviews| Index: src/runtime.cc |
| =================================================================== |
| --- src/runtime.cc (revision 6377) |
| +++ src/runtime.cc (working copy) |
| @@ -42,6 +42,7 @@ |
| #include "execution.h" |
| #include "jsregexp.h" |
| #include "liveedit.h" |
| +#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
|
| #include "parser.h" |
| #include "platform.h" |
| #include "runtime.h" |
| @@ -10473,6 +10474,207 @@ |
| } |
| return Smi::FromInt(usage); |
| } |
| + |
| + |
| +// Captures a live object list from the present heap. |
| +static MaybeObject* Runtime_HasLOLEnabled(Arguments args) { |
| +#ifdef LIVE_OBJECT_LIST |
| + return Heap::true_value(); |
| +#else |
| + return Heap::false_value(); |
| +#endif |
| +} |
| + |
| + |
| +// Captures a live object list from the present heap. |
| +static MaybeObject* Runtime_CaptureLOL(Arguments args) { |
| +#ifdef LIVE_OBJECT_LIST |
| + return LiveObjectList::Capture(); |
| +#else |
| + return Heap::undefined_value(); |
| +#endif |
| +} |
| + |
| + |
| +// Deletes the specified live object list. |
| +static MaybeObject* Runtime_DeleteLOL(Arguments args) { |
| +#ifdef LIVE_OBJECT_LIST |
| + CONVERT_SMI_CHECKED(id, args[0]); |
| + bool success = LiveObjectList::Delete(id); |
| + return success ? Heap::true_value() : Heap::false_value(); |
| +#else |
| + return Heap::undefined_value(); |
| +#endif |
| +} |
| + |
| + |
| +// Generates the response to a debugger request for a dump of the objects |
| +// contained in the difference between the captured live object lists |
| +// specified by id1 and id2. |
| +// If id1 is 0 (i.e. not a valid lol), then the whole of lol id2 will be |
| +// dumped. |
| +static MaybeObject* Runtime_DumpLOL(Arguments args) { |
| +#ifdef LIVE_OBJECT_LIST |
| + HandleScope scope; |
| + CONVERT_SMI_CHECKED(id1, args[0]); |
| + CONVERT_SMI_CHECKED(id2, args[1]); |
| + CONVERT_SMI_CHECKED(start, args[2]); |
| + CONVERT_SMI_CHECKED(count, args[3]); |
| + CONVERT_ARG_CHECKED(JSObject, filter_obj, 4); |
| + EnterDebugger enter_debugger; |
| + return LiveObjectList::Dump(id1, id2, start, count, filter_obj); |
| +#else |
| + return Heap::undefined_value(); |
| +#endif |
| +} |
| + |
| + |
| +// Gets the specified object as requested by the debugger. |
| +// This is only used for obj ids shown in live object lists. |
| +static MaybeObject* Runtime_GetLOLObj(Arguments args) { |
| +#ifdef LIVE_OBJECT_LIST |
| + CONVERT_SMI_CHECKED(obj_id, args[0]); |
| + Object* result = LiveObjectList::GetObj(obj_id); |
| + return result; |
| +#else |
| + return Heap::undefined_value(); |
| +#endif |
| +} |
| + |
| + |
| +// Gets the obj id for the specified address if valid. |
| +// This is only used for obj ids shown in live object lists. |
| +static MaybeObject* Runtime_GetLOLObjId(Arguments args) { |
| +#ifdef LIVE_OBJECT_LIST |
| + HandleScope scope; |
| + CONVERT_ARG_CHECKED(String, address, 0); |
| + Object* result = LiveObjectList::GetObjId(address); |
| + return result; |
| +#else |
| + return Heap::undefined_value(); |
| +#endif |
| +} |
| + |
| + |
| +// Gets the retainers that references the specified object alive. |
| +static MaybeObject* Runtime_GetLOLObjRetainers(Arguments args) { |
| +#ifdef LIVE_OBJECT_LIST |
| + HandleScope scope; |
| + CONVERT_SMI_CHECKED(obj_id, args[0]); |
| + RUNTIME_ASSERT(args[1]->IsUndefined() || args[1]->IsJSObject()); |
| + RUNTIME_ASSERT(args[2]->IsUndefined() || args[2]->IsBoolean()); |
| + RUNTIME_ASSERT(args[3]->IsUndefined() || args[3]->IsSmi()); |
| + RUNTIME_ASSERT(args[4]->IsUndefined() || args[4]->IsSmi()); |
| + CONVERT_ARG_CHECKED(JSObject, filter_obj, 5); |
| + |
| + Handle<JSObject> instance_filter; |
| + if (args[1]->IsJSObject()) { |
| + instance_filter = args.at<JSObject>(1); |
| + } |
| + bool verbose = false; |
| + if (args[2]->IsBoolean()) { |
| + verbose = args[2]->IsTrue(); |
| + } |
| + int start = 0; |
| + if (args[3]->IsSmi()) { |
| + start = Smi::cast(args[3])->value(); |
| + } |
| + int limit = Smi::kMaxValue; |
| + if (args[4]->IsSmi()) { |
| + limit = Smi::cast(args[4])->value(); |
| + } |
| + |
| + return LiveObjectList::GetObjRetainers(obj_id, |
| + instance_filter, |
| + verbose, |
| + start, |
| + limit, |
| + filter_obj); |
| +#else |
| + return Heap::undefined_value(); |
| +#endif |
| +} |
| + |
| + |
| +// Gets the reference path between 2 objects. |
| +static MaybeObject* Runtime_GetLOLPath(Arguments args) { |
| +#ifdef LIVE_OBJECT_LIST |
| + HandleScope scope; |
| + CONVERT_SMI_CHECKED(obj_id1, args[0]); |
| + CONVERT_SMI_CHECKED(obj_id2, args[1]); |
| + RUNTIME_ASSERT(args[2]->IsUndefined() || args[2]->IsJSObject()); |
| + |
| + Handle<JSObject> instance_filter; |
| + if (args[2]->IsJSObject()) { |
| + instance_filter = args.at<JSObject>(2); |
| + } |
| + |
| + Object* result = |
| + LiveObjectList::GetPath(obj_id1, obj_id2, instance_filter); |
| + return result; |
| +#else |
| + return Heap::undefined_value(); |
| +#endif |
| +} |
| + |
| + |
| +// Generates the response to a debugger request for a list of all |
| +// previously captured live object lists. |
| +static MaybeObject* Runtime_InfoLOL(Arguments args) { |
| +#ifdef LIVE_OBJECT_LIST |
| + CONVERT_SMI_CHECKED(start, args[0]); |
| + CONVERT_SMI_CHECKED(count, args[1]); |
| + return LiveObjectList::Info(start, count); |
| +#else |
| + return Heap::undefined_value(); |
| +#endif |
| +} |
| + |
| + |
| +// Gets a dump of the specified object as requested by the debugger. |
| +// This is only used for obj ids shown in live object lists. |
| +static MaybeObject* Runtime_PrintLOLObj(Arguments args) { |
| +#ifdef LIVE_OBJECT_LIST |
| + HandleScope scope; |
| + CONVERT_SMI_CHECKED(obj_id, args[0]); |
| + Object* result = LiveObjectList::PrintObj(obj_id); |
| + return result; |
| +#else |
| + return Heap::undefined_value(); |
| +#endif |
| +} |
| + |
| + |
| +// Resets and releases all previously captured live object lists. |
| +static MaybeObject* Runtime_ResetLOL(Arguments args) { |
| +#ifdef LIVE_OBJECT_LIST |
| + LiveObjectList::Reset(); |
| + return Heap::undefined_value(); |
| +#else |
| + return Heap::undefined_value(); |
| +#endif |
| +} |
| + |
| + |
| +// Generates the response to a debugger request for a summary of the types |
| +// of objects in the difference between the captured live object lists |
| +// specified by id1 and id2. |
| +// If id1 is 0 (i.e. not a valid lol), then the whole of lol id2 will be |
| +// summarized. |
| +static MaybeObject* Runtime_SummarizeLOL(Arguments args) { |
| +#ifdef LIVE_OBJECT_LIST |
| + HandleScope scope; |
| + CONVERT_SMI_CHECKED(id1, args[0]); |
| + CONVERT_SMI_CHECKED(id2, args[1]); |
| + CONVERT_ARG_CHECKED(JSObject, filter_obj, 2); |
| + |
| + EnterDebugger enter_debugger; |
| + return LiveObjectList::Summarize(id1, id2, filter_obj); |
| +#else |
| + return Heap::undefined_value(); |
| +#endif |
| +} |
| + |
| #endif // ENABLE_DEBUGGER_SUPPORT |