| Index: src/d8.cc
|
| diff --git a/src/d8.cc b/src/d8.cc
|
| index cde8404dcc29b914e5e4114c59f918b55892d914..7e41bd64ab9fb11a159e6657384d2fef1d105202 100644
|
| --- a/src/d8.cc
|
| +++ b/src/d8.cc
|
| @@ -1406,6 +1406,14 @@ bool Shell::SetOptions(int argc, char* argv[]) {
|
| #else
|
| options.num_parallel_files++;
|
| #endif // V8_SHARED
|
| + } else if (strcmp(argv[i], "--dump-heap-constants") == 0) {
|
| +#ifdef V8_SHARED
|
| + printf("D8 with shared library does not support constant dumping\n");
|
| + return false;
|
| +#else
|
| + options.dump_heap_constants = true;
|
| + argv[i] = NULL;
|
| +#endif
|
| }
|
| #ifdef V8_SHARED
|
| else if (strcmp(argv[i], "--dump-counters") == 0) {
|
| @@ -1560,6 +1568,63 @@ static void SetStandaloneFlagsViaCommandLine() {
|
| #endif
|
|
|
|
|
| +#ifndef V8_SHARED
|
| +static void DumpHeapConstants(i::Isolate* isolate) {
|
| + i::Heap* heap = isolate->heap();
|
| +
|
| + // Dump the INSTANCE_TYPES table to the console.
|
| + printf("# List of known V8 instance types.\n");
|
| +#define DUMP_TYPE(T) printf(" %d: \"%s\",\n", i::T, #T);
|
| + printf("INSTANCE_TYPES = {\n");
|
| + INSTANCE_TYPE_LIST(DUMP_TYPE)
|
| + printf("}\n");
|
| +#undef DUMP_TYPE
|
| +
|
| + // Dump the KNOWN_MAP table to the console.
|
| + printf("\n# List of known V8 maps.\n");
|
| +#define ROOT_LIST_CASE(type, name, camel_name) \
|
| + if (o == heap->name()) n = #camel_name;
|
| +#define STRUCT_LIST_CASE(upper_name, camel_name, name) \
|
| + if (o == heap->name##_map()) n = #camel_name "Map";
|
| + i::HeapObjectIterator it(heap->map_space());
|
| + printf("KNOWN_MAPS = {\n");
|
| + for (i::Object* o = it.Next(); o != NULL; o = it.Next()) {
|
| + i::Map* m = i::Map::cast(o);
|
| + const char* n = NULL;
|
| + intptr_t p = reinterpret_cast<intptr_t>(m) & 0xfffff;
|
| + int t = m->instance_type();
|
| + ROOT_LIST(ROOT_LIST_CASE)
|
| + STRUCT_LIST(STRUCT_LIST_CASE)
|
| + if (n == NULL) continue;
|
| + printf(" 0x%05x: (%d, \"%s\"),\n", p, t, n);
|
| + }
|
| + printf("}\n");
|
| +#undef STRUCT_LIST_CASE
|
| +#undef ROOT_LIST_CASE
|
| +
|
| + // Dump the KNOWN_OBJECTS table to the console.
|
| + printf("\n# List of known V8 objects.\n");
|
| +#define ROOT_LIST_CASE(type, name, camel_name) \
|
| + if (o == heap->name()) n = #camel_name;
|
| + i::OldSpaces spit(heap);
|
| + printf("KNOWN_OBJECTS = {\n");
|
| + for (i::PagedSpace* s = spit.next(); s != NULL; s = spit.next()) {
|
| + i::HeapObjectIterator it(s);
|
| + const char* sname = AllocationSpaceName(s->identity());
|
| + for (i::Object* o = it.Next(); o != NULL; o = it.Next()) {
|
| + const char* n = NULL;
|
| + intptr_t p = reinterpret_cast<intptr_t>(o) & 0xfffff;
|
| + ROOT_LIST(ROOT_LIST_CASE)
|
| + if (n == NULL) continue;
|
| + printf(" (\"%s\", 0x%05x): \"%s\",\n", sname, p, n);
|
| + }
|
| + }
|
| + printf("}\n");
|
| +#undef ROOT_LIST_CASE
|
| +}
|
| +#endif // V8_SHARED
|
| +
|
| +
|
| class ShellArrayBufferAllocator : public v8::ArrayBuffer::Allocator {
|
| public:
|
| virtual void* Allocate(size_t length) {
|
| @@ -1597,6 +1662,13 @@ int Shell::Main(int argc, char* argv[]) {
|
| PerIsolateData data(isolate);
|
| InitializeDebugger(isolate);
|
|
|
| +#ifndef V8_SHARED
|
| + if (options.dump_heap_constants) {
|
| + DumpHeapConstants(reinterpret_cast<i::Isolate*>(isolate));
|
| + return 0;
|
| + }
|
| +#endif
|
| +
|
| if (options.stress_opt || options.stress_deopt) {
|
| Testing::SetStressRunType(options.stress_opt
|
| ? Testing::kStressTypeOpt
|
|
|