| Index: tools/gen-postmortem-metadata.py | 
| diff --git a/tools/gen-postmortem-metadata.py b/tools/gen-postmortem-metadata.py | 
| index 032b713393b6609cf8323fae732c846d7178b35b..76c8ad8364cc81adcf94f9d6018c982462494137 100644 | 
| --- a/tools/gen-postmortem-metadata.py | 
| +++ b/tools/gen-postmortem-metadata.py | 
| @@ -181,6 +181,25 @@ consts_misc = [ | 
| 'value': 'JSArrayBuffer::WasNeutered::kMask' }, | 
| { 'name': 'jsarray_buffer_was_neutered_shift', | 
| 'value': 'JSArrayBuffer::WasNeutered::kShift' }, | 
| + | 
| +    { 'name': 'new_space', | 
| +        'value': 'AllocationSpace::NEW_SPACE' }, | 
| +    { 'name': 'old_space', | 
| +        'value': 'AllocationSpace::OLD_SPACE' }, | 
| +    { 'name': 'code_space', | 
| +        'value': 'AllocationSpace::CODE_SPACE' }, | 
| +    { 'name': 'map_space', | 
| +        'value': 'AllocationSpace::MAP_SPACE' }, | 
| +    { 'name': 'lo_space', | 
| +        'value': 'AllocationSpace::LO_SPACE' }, | 
| +    { 'name': 'first_space', | 
| +        'value': 'AllocationSpace::FIRST_SPACE' }, | 
| +    { 'name': 'last_space', | 
| +        'value': 'AllocationSpace::LAST_SPACE' }, | 
| +    { 'name': 'first_paged_space', | 
| +        'value': 'AllocationSpace::FIRST_PAGED_SPACE' }, | 
| +    { 'name': 'last_paged_space', | 
| +        'value': 'AllocationSpace::LAST_PAGED_SPACE' }, | 
| ]; | 
|  | 
| # | 
| @@ -223,6 +242,7 @@ extras_accessors = [ | 
| 'SlicedString, parent, String, kParentOffset', | 
| 'Code, instruction_start, uintptr_t, kHeaderSize', | 
| 'Code, instruction_size, int, kInstructionSizeOffset', | 
| +    'Heap, root_count, int, kRootListLength', | 
| ]; | 
|  | 
| # | 
| @@ -237,6 +257,67 @@ expected_classes = [ | 
| ]; | 
|  | 
|  | 
| +private_fields = [ | 
| +    { 'class': 'Isolate', 'field': 'heap_' }, | 
| + | 
| +    { 'class': 'Heap', 'field': 'amount_of_external_allocated_memory_' }, | 
| +    { 'class': 'Heap', 'field': 'roots_' }, | 
| +    { 'class': 'Heap', 'field': 'new_space_' }, | 
| +    { 'class': 'Heap', 'field': 'old_space_' }, | 
| +    { 'class': 'Heap', 'field': 'code_space_' }, | 
| +    { 'class': 'Heap', 'field': 'map_space_' }, | 
| +    { 'class': 'Heap', 'field': 'lo_space_' }, | 
| + | 
| +    { 'class': 'NewSpace', 'field': 'heap_' }, | 
| +    { 'class': 'NewSpace', 'field': 'id_' }, | 
| +    { 'class': 'NewSpace', 'field': 'executable_' }, | 
| +    { 'class': 'NewSpace', 'field': 'to_space_' }, | 
| +    { 'class': 'NewSpace', 'field': 'from_space_' }, | 
| +    { 'class': 'NewSpace', 'field': 'pages_used_' }, | 
| + | 
| +    { 'class': 'SemiSpace', 'field': 'heap_' }, | 
| +    { 'class': 'SemiSpace', 'field': 'id_' }, | 
| +    { 'class': 'SemiSpace', 'field': 'executable_' }, | 
| +    { 'class': 'SemiSpace', 'field': 'anchor_' }, | 
| +    { 'class': 'SemiSpace', 'field': 'current_page_' }, | 
| +    { 'class': 'SemiSpace', 'field': 'committed_' }, | 
| + | 
| +    { 'class': 'OldSpace', 'field': 'heap_' }, | 
| +    { 'class': 'OldSpace', 'field': 'id_' }, | 
| +    { 'class': 'OldSpace', 'field': 'executable_' }, | 
| +    { 'class': 'OldSpace', 'field': 'anchor_' }, | 
| + | 
| +    { 'class': 'MapSpace', 'field': 'heap_' }, | 
| +    { 'class': 'MapSpace', 'field': 'id_' }, | 
| +    { 'class': 'MapSpace', 'field': 'executable_' }, | 
| +    { 'class': 'MapSpace', 'field': 'anchor_' }, | 
| + | 
| +    { 'class': 'LargeObjectSpace', 'field': 'heap_' }, | 
| +    { 'class': 'LargeObjectSpace', 'field': 'id_' }, | 
| +    { 'class': 'LargeObjectSpace', 'field': 'executable_' }, | 
| +    { 'class': 'LargeObjectSpace', 'field': 'size_' }, | 
| +    { 'class': 'LargeObjectSpace', 'field': 'objects_size_' }, | 
| +    { 'class': 'LargeObjectSpace', 'field': 'first_page_' }, | 
| + | 
| +    { 'class': 'Page', 'field': 'size_' }, | 
| +    { 'class': 'Page', 'field': 'area_start_' }, | 
| +    { 'class': 'Page', 'field': 'area_end_' }, | 
| +    { 'class': 'Page', 'field': 'prev_chunk_' }, | 
| +    { 'class': 'Page', 'field': 'next_chunk_' }, | 
| + | 
| +    { 'class': 'NewSpacePage', 'field': 'size_' }, | 
| +    { 'class': 'NewSpacePage', 'field': 'area_start_' }, | 
| +    { 'class': 'NewSpacePage', 'field': 'area_end_' }, | 
| +    { 'class': 'NewSpacePage', 'field': 'prev_chunk_' }, | 
| +    { 'class': 'NewSpacePage', 'field': 'next_chunk_' }, | 
| + | 
| +    { 'class': 'LargePage', 'field': 'size_' }, | 
| +    { 'class': 'LargePage', 'field': 'area_start_' }, | 
| +    { 'class': 'LargePage', 'field': 'area_end_' }, | 
| +    { 'class': 'LargePage', 'field': 'prev_chunk_' }, | 
| +    { 'class': 'LargePage', 'field': 'next_chunk_' }, | 
| +]; | 
| + | 
| # | 
| # The following structures store high-level representations of the structures | 
| # for which we're going to emit descriptive constants. | 
| @@ -538,6 +619,31 @@ def emit_set(out, consts): | 
| out.write('\n'); | 
|  | 
| # | 
| +# Emit private fields class and values | 
| +# | 
| +def emit_private_fields(out, fields, consts): | 
| +        # Fix up overzealous parses.  This could be done inside the | 
| +        # parsers but as there are several, it's easiest to do it here. | 
| +        ws = re.compile('\s+') | 
| +        out.write('namespace v8 {\n'); | 
| +        out.write('namespace internal {\n\n'); | 
| +        out.write('class PostMortem {\n'); | 
| +        out.write(' public:\n'); | 
| +        for field in fields: | 
| +                klass = ws.sub('', field['class']) | 
| +                field = ws.sub('', field['field']) | 
| +                out.write('  static const int k%s__%s = offsetof(%s, %s);\n' % | 
| +                        (klass, field, klass, field)); | 
| +                consts.append({ | 
| +                    'name': 'field_%s__%s' % (klass, field), | 
| +                    'value': 'v8::internal::PostMortem::k%s__%s' % | 
| +                        (klass, field) | 
| +                }); | 
| +        out.write('};\n'); | 
| +        out.write('}  // namespace internal\n'); | 
| +        out.write('}  // namespace v8\n\n'); | 
| + | 
| +# | 
| # Emit the whole output file. | 
| # | 
| def emit_config(): | 
| @@ -580,6 +686,12 @@ def emit_config(): | 
| out.write('/* field information */\n'); | 
| emit_set(out, fields); | 
|  | 
| +        out.write('/* private fields */\n'); | 
| +        consts = [] | 
| +        emit_private_fields(out, private_fields, consts); | 
| + | 
| +        emit_set(out, consts); | 
| + | 
| out.write(footer); | 
|  | 
| if (len(sys.argv) < 4): | 
|  |