| Index: src/d8.cc
 | 
| diff --git a/src/d8.cc b/src/d8.cc
 | 
| index 92bc86391384e32d9dd722a739ba54b250c5b902..e48bb0cc0eaa6ff59bc1985c591f2f68edd8945f 100644
 | 
| --- a/src/d8.cc
 | 
| +++ b/src/d8.cc
 | 
| @@ -2540,6 +2540,9 @@
 | 
|        continue;
 | 
|      } else if (strcmp(argv[i], "--isolate") == 0) {
 | 
|        options.num_isolates++;
 | 
| +    } else if (strcmp(argv[i], "--dump-heap-constants") == 0) {
 | 
| +      options.dump_heap_constants = true;
 | 
| +      argv[i] = NULL;
 | 
|      } else if (strcmp(argv[i], "--throws") == 0) {
 | 
|        options.expected_to_throw = true;
 | 
|        argv[i] = NULL;
 | 
| @@ -2920,6 +2923,73 @@
 | 
|    externalized_contents_.clear();
 | 
|  }
 | 
|  
 | 
| +
 | 
| +static void DumpHeapConstants(i::Isolate* isolate) {
 | 
| +  i::Heap* heap = isolate->heap();
 | 
| +  printf(
 | 
| +      "# Copyright 2017 the V8 project authors. All rights reserved.\n"
 | 
| +      "# Use of this source code is governed by a BSD-style license that can\n"
 | 
| +      "# be found in the LICENSE file.\n\n");
 | 
| +  // 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 (n == NULL && o == heap->name()) n = #camel_name;
 | 
| +#define STRUCT_LIST_CASE(upper_name, camel_name, name) \
 | 
| +  if (n == NULL && 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) & 0x7ffff;
 | 
| +    int t = m->instance_type();
 | 
| +    ROOT_LIST(ROOT_LIST_CASE)
 | 
| +    STRUCT_LIST(STRUCT_LIST_CASE)
 | 
| +    if (n == NULL) continue;
 | 
| +    printf("  0x%05" V8PRIxPTR ": (%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 (n == NULL && 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) & 0x7ffff;
 | 
| +      ROOT_LIST(ROOT_LIST_CASE)
 | 
| +      if (n == NULL) continue;
 | 
| +      printf("  (\"%s\", 0x%05" V8PRIxPTR "): \"%s\",\n", sname, p, n);
 | 
| +    }
 | 
| +  }
 | 
| +  printf("}\n");
 | 
| +#undef ROOT_LIST_CASE
 | 
| +
 | 
| +  // Dump frame markers
 | 
| +  printf("\n# List of known V8 Frame Markers.\n");
 | 
| +#define DUMP_MARKER(T, class) printf("  \"%s\",\n", #T);
 | 
| +  printf("FRAME_MARKERS = (\n");
 | 
| +  STACK_FRAME_TYPE_LIST(DUMP_MARKER)
 | 
| +  printf(")\n");
 | 
| +#undef DUMP_TYPE
 | 
| +}
 | 
| +
 | 
| +
 | 
|  int Shell::Main(int argc, char* argv[]) {
 | 
|    std::ofstream trace_file;
 | 
|  #if (defined(_WIN32) || defined(_WIN64))
 | 
| @@ -3022,6 +3092,11 @@
 | 
|              platform::tracing::TraceConfig::CreateDefaultTraceConfig();
 | 
|        }
 | 
|        tracing_controller->StartTracing(trace_config);
 | 
| +    }
 | 
| +
 | 
| +    if (options.dump_heap_constants) {
 | 
| +      DumpHeapConstants(reinterpret_cast<i::Isolate*>(isolate));
 | 
| +      return 0;
 | 
|      }
 | 
|  
 | 
|      if (options.stress_opt || options.stress_deopt) {
 | 
| 
 |