| Index: src/runtime.cc
|
| ===================================================================
|
| --- src/runtime.cc (revision 6997)
|
| +++ src/runtime.cc (working copy)
|
| @@ -43,6 +43,7 @@
|
| #include "global-handles.h"
|
| #include "jsregexp.h"
|
| #include "liveedit.h"
|
| +#include "liveobjectlist-inl.h"
|
| #include "parser.h"
|
| #include "platform.h"
|
| #include "runtime.h"
|
| @@ -10890,6 +10891,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
|
|
|
|
|
|
|