13ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#!/usr/bin/env python 23ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 33ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch# 43ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch# Copyright 2012 the V8 project authors. All rights reserved. 53ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch# Redistribution and use in source and binary forms, with or without 63ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch# modification, are permitted provided that the following conditions are 73ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch# met: 83ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch# 93ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch# * Redistributions of source code must retain the above copyright 103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch# notice, this list of conditions and the following disclaimer. 113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch# * Redistributions in binary form must reproduce the above 123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch# copyright notice, this list of conditions and the following 133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch# disclaimer in the documentation and/or other materials provided 143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch# with the distribution. 153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch# * Neither the name of Google Inc. nor the names of its 163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch# contributors may be used to endorse or promote products derived 173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch# from this software without specific prior written permission. 183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch# 193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch# 313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch# 333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch# Emits a C++ file to be compiled and linked into libv8 to support postmortem 343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch# debugging tools. Most importantly, this tool emits constants describing V8 353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch# internals: 363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch# 373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch# v8dbg_type_CLASS__TYPE = VALUE Describes class type values 383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch# v8dbg_class_CLASS__FIELD__TYPE = OFFSET Describes class fields 393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch# v8dbg_parent_CLASS__PARENT Describes class hierarchy 403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch# v8dbg_frametype_NAME = VALUE Describes stack frame values 413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch# v8dbg_off_fp_NAME = OFFSET Frame pointer offsets 423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch# v8dbg_prop_NAME = OFFSET Object property offsets 433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch# v8dbg_NAME = VALUE Miscellaneous values 443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch# 453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch# These constants are declared as global integers so that they'll be present in 463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch# the generated libv8 binary. 473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch# 483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochimport re 503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochimport sys 513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch# 533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch# Miscellaneous constants, tags, and masks used for object identification. 543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch# 553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochconsts_misc = [ 563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch { 'name': 'FirstNonstringType', 'value': 'FIRST_NONSTRING_TYPE' }, 573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch { 'name': 'IsNotStringMask', 'value': 'kIsNotStringMask' }, 593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch { 'name': 'StringTag', 'value': 'kStringTag' }, 603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch { 'name': 'NotStringTag', 'value': 'kNotStringTag' }, 613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch { 'name': 'StringEncodingMask', 'value': 'kStringEncodingMask' }, 633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch { 'name': 'TwoByteStringTag', 'value': 'kTwoByteStringTag' }, 64b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch { 'name': 'OneByteStringTag', 'value': 'kOneByteStringTag' }, 653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch { 'name': 'StringRepresentationMask', 673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 'value': 'kStringRepresentationMask' }, 683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch { 'name': 'SeqStringTag', 'value': 'kSeqStringTag' }, 693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch { 'name': 'ConsStringTag', 'value': 'kConsStringTag' }, 703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch { 'name': 'ExternalStringTag', 'value': 'kExternalStringTag' }, 71b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch { 'name': 'SlicedStringTag', 'value': 'kSlicedStringTag' }, 723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch { 'name': 'HeapObjectTag', 'value': 'kHeapObjectTag' }, 743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch { 'name': 'HeapObjectTagMask', 'value': 'kHeapObjectTagMask' }, 753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch { 'name': 'SmiTag', 'value': 'kSmiTag' }, 763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch { 'name': 'SmiTagMask', 'value': 'kSmiTagMask' }, 773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch { 'name': 'SmiValueShift', 'value': 'kSmiTagSize' }, 78b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch { 'name': 'SmiShiftSize', 'value': 'kSmiShiftSize' }, 793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch { 'name': 'PointerSizeLog2', 'value': 'kPointerSizeLog2' }, 803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 81b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch { 'name': 'OddballFalse', 'value': 'Oddball::kFalse' }, 82b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch { 'name': 'OddballTrue', 'value': 'Oddball::kTrue' }, 83b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch { 'name': 'OddballTheHole', 'value': 'Oddball::kTheHole' }, 84b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch { 'name': 'OddballNull', 'value': 'Oddball::kNull' }, 85b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch { 'name': 'OddballArgumentMarker', 'value': 'Oddball::kArgumentMarker' }, 86b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch { 'name': 'OddballUndefined', 'value': 'Oddball::kUndefined' }, 87b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch { 'name': 'OddballUninitialized', 'value': 'Oddball::kUninitialized' }, 88b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch { 'name': 'OddballOther', 'value': 'Oddball::kOther' }, 89b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch { 'name': 'OddballException', 'value': 'Oddball::kException' }, 90b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch { 'name': 'prop_idx_first', 923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 'value': 'DescriptorArray::kFirstIndex' }, 933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch { 'name': 'prop_type_field', 94014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 'value': 'DATA' }, 953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch { 'name': 'prop_type_mask', 963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 'value': 'PropertyDetails::TypeField::kMask' }, 97b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch { 'name': 'prop_index_mask', 98b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 'value': 'PropertyDetails::FieldIndexField::kMask' }, 99b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch { 'name': 'prop_index_shift', 100b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 'value': 'PropertyDetails::FieldIndexField::kShift' }, 101014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch { 'name': 'prop_representation_mask', 102014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 'value': 'PropertyDetails::RepresentationField::kMask' }, 103014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch { 'name': 'prop_representation_shift', 104014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 'value': 'PropertyDetails::RepresentationField::kShift' }, 105014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch { 'name': 'prop_representation_integer8', 106014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 'value': 'Representation::Kind::kInteger8' }, 107014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch { 'name': 'prop_representation_uinteger8', 108014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 'value': 'Representation::Kind::kUInteger8' }, 109014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch { 'name': 'prop_representation_integer16', 110014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 'value': 'Representation::Kind::kInteger16' }, 111014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch { 'name': 'prop_representation_uinteger16', 112014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 'value': 'Representation::Kind::kUInteger16' }, 113014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch { 'name': 'prop_representation_smi', 114014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 'value': 'Representation::Kind::kSmi' }, 115014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch { 'name': 'prop_representation_integer32', 116014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 'value': 'Representation::Kind::kInteger32' }, 117014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch { 'name': 'prop_representation_double', 118014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 'value': 'Representation::Kind::kDouble' }, 119014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch { 'name': 'prop_representation_heapobject', 120014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 'value': 'Representation::Kind::kHeapObject' }, 121014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch { 'name': 'prop_representation_tagged', 122014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 'value': 'Representation::Kind::kTagged' }, 123014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch { 'name': 'prop_representation_external', 124014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 'value': 'Representation::Kind::kExternal' }, 125b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 126b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch { 'name': 'prop_desc_key', 127b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 'value': 'DescriptorArray::kDescriptorKey' }, 128b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch { 'name': 'prop_desc_details', 129b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 'value': 'DescriptorArray::kDescriptorDetails' }, 130b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch { 'name': 'prop_desc_value', 131b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 'value': 'DescriptorArray::kDescriptorValue' }, 132b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch { 'name': 'prop_desc_size', 133b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 'value': 'DescriptorArray::kDescriptorSize' }, 134b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 135b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch { 'name': 'elements_fast_holey_elements', 136b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 'value': 'FAST_HOLEY_ELEMENTS' }, 137b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch { 'name': 'elements_fast_elements', 138b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 'value': 'FAST_ELEMENTS' }, 139b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch { 'name': 'elements_dictionary_elements', 140b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 'value': 'DICTIONARY_ELEMENTS' }, 141b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 142b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch { 'name': 'bit_field2_elements_kind_mask', 143014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 'value': 'Map::ElementsKindBits::kMask' }, 144b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch { 'name': 'bit_field2_elements_kind_shift', 145014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 'value': 'Map::ElementsKindBits::kShift' }, 146b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch { 'name': 'bit_field3_dictionary_map_shift', 147b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 'value': 'Map::DictionaryMap::kShift' }, 148014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch { 'name': 'bit_field3_number_of_own_descriptors_mask', 149014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 'value': 'Map::NumberOfOwnDescriptorsBits::kMask' }, 150014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch { 'name': 'bit_field3_number_of_own_descriptors_shift', 151014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 'value': 'Map::NumberOfOwnDescriptorsBits::kShift' }, 1523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch { 'name': 'off_fp_context', 1543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 'value': 'StandardFrameConstants::kContextOffset' }, 155b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch { 'name': 'off_fp_constant_pool', 156b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 'value': 'StandardFrameConstants::kConstantPoolOffset' }, 1573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch { 'name': 'off_fp_marker', 1583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 'value': 'StandardFrameConstants::kMarkerOffset' }, 1593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch { 'name': 'off_fp_function', 1603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 'value': 'JavaScriptFrameConstants::kFunctionOffset' }, 1613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch { 'name': 'off_fp_args', 1623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 'value': 'JavaScriptFrameConstants::kLastParameterOffset' }, 163014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 164014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch { 'name': 'scopeinfo_idx_nparams', 165014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 'value': 'ScopeInfo::kParameterCount' }, 166014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch { 'name': 'scopeinfo_idx_nstacklocals', 167014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 'value': 'ScopeInfo::kStackLocalCount' }, 168014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch { 'name': 'scopeinfo_idx_ncontextlocals', 169014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 'value': 'ScopeInfo::kContextLocalCount' }, 170014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch { 'name': 'scopeinfo_idx_ncontextglobals', 171014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 'value': 'ScopeInfo::kContextGlobalCount' }, 172014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch { 'name': 'scopeinfo_idx_first_vars', 173014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 'value': 'ScopeInfo::kVariablePartIndex' }, 174014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 175014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch { 'name': 'sharedfunctioninfo_start_position_mask', 176014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 'value': 'SharedFunctionInfo::kStartPositionMask' }, 177014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch { 'name': 'sharedfunctioninfo_start_position_shift', 178014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 'value': 'SharedFunctionInfo::kStartPositionShift' }, 179014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 180014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch { 'name': 'jsarray_buffer_was_neutered_mask', 181014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 'value': 'JSArrayBuffer::WasNeutered::kMask' }, 182014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch { 'name': 'jsarray_buffer_was_neutered_shift', 183014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 'value': 'JSArrayBuffer::WasNeutered::kShift' }, 1843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch]; 1853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch# 1873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch# The following useful fields are missing accessors, so we define fake ones. 1883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch# 1893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochextras_accessors = [ 190014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 'JSFunction, context, Context, kContextOffset', 191014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 'Context, closure_index, int, CLOSURE_INDEX', 192014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 'Context, native_context_index, int, NATIVE_CONTEXT_INDEX', 193014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 'Context, previous_index, int, PREVIOUS_INDEX', 194014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 'Context, min_context_slots, int, MIN_CONTEXT_SLOTS', 1953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 'HeapObject, map, Map, kMapOffset', 1963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 'JSObject, elements, Object, kElementsOffset', 1973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 'FixedArray, data, uintptr_t, kHeaderSize', 198014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 'JSArrayBuffer, backing_store, Object, kBackingStoreOffset', 199014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 'JSArrayBufferView, byte_offset, Object, kByteOffsetOffset', 200014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 'JSTypedArray, length, Object, kLengthOffset', 2013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 'Map, instance_attributes, int, kInstanceAttributesOffset', 202014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 'Map, inobject_properties_or_constructor_function_index, int, kInObjectPropertiesOrConstructorFunctionIndexOffset', 2033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 'Map, instance_size, int, kInstanceSizeOffset', 204b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 'Map, bit_field, char, kBitFieldOffset', 205b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 'Map, bit_field2, char, kBitField2Offset', 206014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 'Map, bit_field3, int, kBitField3Offset', 207b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 'Map, prototype, Object, kPrototypeOffset', 208b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 'NameDictionaryShape, prefix_size, int, kPrefixSize', 209b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 'NameDictionaryShape, entry_size, int, kEntrySize', 210014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 'NameDictionary, prefix_start_index, int, kPrefixStartIndex', 211b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 'SeededNumberDictionaryShape, prefix_size, int, kPrefixSize', 212b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 'UnseededNumberDictionaryShape, prefix_size, int, kPrefixSize', 213b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 'NumberDictionaryShape, entry_size, int, kEntrySize', 214b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 'Oddball, kind_offset, int, kKindOffset', 2153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 'HeapNumber, value, double, kValueOffset', 2163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 'ConsString, first, String, kFirstOffset', 2173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 'ConsString, second, String, kSecondOffset', 2183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 'ExternalString, resource, Object, kResourceOffset', 219b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 'SeqOneByteString, chars, char, kHeaderSize', 220b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 'SeqTwoByteString, chars, char, kHeaderSize', 2213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 'SharedFunctionInfo, code, Code, kCodeOffset', 222014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 'SharedFunctionInfo, scope_info, ScopeInfo, kScopeInfoOffset', 223b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 'SlicedString, parent, String, kParentOffset', 2243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 'Code, instruction_start, uintptr_t, kHeaderSize', 2253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 'Code, instruction_size, int, kInstructionSizeOffset', 2263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch]; 2273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch# 2293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch# The following is a whitelist of classes we expect to find when scanning the 2303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch# source code. This list is not exhaustive, but it's still useful to identify 2313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch# when this script gets out of sync with the source. See load_objects(). 2323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch# 2333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochexpected_classes = [ 2343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 'ConsString', 'FixedArray', 'HeapNumber', 'JSArray', 'JSFunction', 2353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 'JSObject', 'JSRegExp', 'JSValue', 'Map', 'Oddball', 'Script', 236b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 'SeqOneByteString', 'SharedFunctionInfo' 2373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch]; 2383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch# 2413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch# The following structures store high-level representations of the structures 2423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch# for which we're going to emit descriptive constants. 2433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch# 2443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochtypes = {}; # set of all type names 2453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochtypeclasses = {}; # maps type names to corresponding class names 2463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochklasses = {}; # known classes, including parents 2473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochfields = []; # field declarations 2483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochheader = ''' 2503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch/* 2513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch * This file is generated by %s. Do not edit directly. 2523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch */ 2533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 254014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/v8.h" 255014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/frames.h" 256014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/frames-inl.h" /* for architecture-specific frame constants */ 2573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochusing namespace v8::internal; 2593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochextern "C" { 2613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch/* stack frame constants */ 2633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#define FRAME_CONST(value, klass) \ 2643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch int v8dbg_frametype_##klass = StackFrame::value; 2653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2663ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochSTACK_FRAME_TYPE_LIST(FRAME_CONST) 2673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#undef FRAME_CONST 2693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch''' % sys.argv[0]; 2713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochfooter = ''' 2733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 2743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch''' 2753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch# 277014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch# Get the base class 278014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch# 279014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochdef get_base_class(klass): 280014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (klass == 'Object'): 281014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return klass; 282014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 283014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (not (klass in klasses)): 284014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return None; 285014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 286014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch k = klasses[klass]; 287014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 288014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return get_base_class(k['parent']); 289014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 290014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch# 2913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch# Loads class hierarchy and type information from "objects.h". 2923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch# 2933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochdef load_objects(): 2943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch objfilename = sys.argv[2]; 2953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch objfile = open(objfilename, 'r'); 2963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch in_insttype = False; 2973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch typestr = ''; 2993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 3003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch # 3013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch # Construct a dictionary for the classes we're sure should be present. 3023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch # 3033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch checktypes = {}; 3043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch for klass in expected_classes: 3053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch checktypes[klass] = True; 3063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 3073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch # 3083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch # Iterate objects.h line-by-line to collect type and class information. 3093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch # For types, we accumulate a string representing the entire InstanceType 3103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch # enum definition and parse it later because it's easier to do so 3113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch # without the embedded newlines. 3123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch # 3133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch for line in objfile: 3143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (line.startswith('enum InstanceType {')): 3153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch in_insttype = True; 3163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch continue; 3173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 3183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (in_insttype and line.startswith('};')): 3193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch in_insttype = False; 3203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch continue; 3213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 322014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch line = re.sub('//.*', '', line.strip()); 3233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 3243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (in_insttype): 3253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch typestr += line; 3263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch continue; 3273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 328014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch match = re.match('class (\w[^:]*)(: public (\w[^{]*))?\s*{\s*', 3293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch line); 3303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 3313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (match): 332014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch klass = match.group(1).strip(); 3333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch pklass = match.group(3); 334014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (pklass): 335014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch pklass = pklass.strip(); 3363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch klasses[klass] = { 'parent': pklass }; 3373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 3383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch # 3393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch # Process the instance type declaration. 3403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch # 3413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch entries = typestr.split(','); 3423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch for entry in entries: 3433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch types[re.sub('\s*=.*', '', entry).lstrip()] = True; 3443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 3453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch # 3463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch # Infer class names for each type based on a systematic transformation. 3473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch # For example, "JS_FUNCTION_TYPE" becomes "JSFunction". We find the 3483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch # class for each type rather than the other way around because there are 3493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch # fewer cases where one type maps to more than one class than the other 3503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch # way around. 3513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch # 3523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch for type in types: 3533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch # 3543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch # Symbols and Strings are implemented using the same classes. 3553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch # 3563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch usetype = re.sub('SYMBOL_', 'STRING_', type); 3573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 3583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch # 3593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch # REGEXP behaves like REG_EXP, as in JS_REGEXP_TYPE => JSRegExp. 3603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch # 3613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch usetype = re.sub('_REGEXP_', '_REG_EXP_', usetype); 3623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 3633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch # 3643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch # Remove the "_TYPE" suffix and then convert to camel case, 3653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch # except that a "JS" prefix remains uppercase (as in 3663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch # "JS_FUNCTION_TYPE" => "JSFunction"). 3673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch # 3683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (not usetype.endswith('_TYPE')): 3693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch continue; 3703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 3713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch usetype = usetype[0:len(usetype) - len('_TYPE')]; 3723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch parts = usetype.split('_'); 3733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch cctype = ''; 3743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 3753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (parts[0] == 'JS'): 3763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch cctype = 'JS'; 3773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch start = 1; 3783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch else: 3793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch cctype = ''; 3803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch start = 0; 3813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 3823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch for ii in range(start, len(parts)): 3833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch part = parts[ii]; 3843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch cctype += part[0].upper() + part[1:].lower(); 3853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 3863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch # 3873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch # Mapping string types is more complicated. Both types and 3883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch # class names for Strings specify a representation (e.g., Seq, 389b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch # Cons, External, or Sliced) and an encoding (TwoByte/OneByte), 3903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch # In the simplest case, both of these are explicit in both 3913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch # names, as in: 3923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch # 393b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch # EXTERNAL_ONE_BYTE_STRING_TYPE => ExternalOneByteString 3943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch # 3953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch # However, either the representation or encoding can be omitted 3963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch # from the type name, in which case "Seq" and "TwoByte" are 3973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch # assumed, as in: 3983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch # 3993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch # STRING_TYPE => SeqTwoByteString 4003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch # 4013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch # Additionally, sometimes the type name has more information 4023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch # than the class, as in: 4033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch # 404b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch # CONS_ONE_BYTE_STRING_TYPE => ConsString 4053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch # 4063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch # To figure this out dynamically, we first check for a 4073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch # representation and encoding and add them if they're not 4083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch # present. If that doesn't yield a valid class name, then we 4093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch # strip out the representation. 4103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch # 4113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (cctype.endswith('String')): 4123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (cctype.find('Cons') == -1 and 4133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch cctype.find('External') == -1 and 4143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch cctype.find('Sliced') == -1): 415b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (cctype.find('OneByte') != -1): 416b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch cctype = re.sub('OneByteString$', 417b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 'SeqOneByteString', cctype); 4183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch else: 4193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch cctype = re.sub('String$', 4203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 'SeqString', cctype); 4213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 422b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (cctype.find('OneByte') == -1): 4233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch cctype = re.sub('String$', 'TwoByteString', 4243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch cctype); 4253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 4263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (not (cctype in klasses)): 427b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch cctype = re.sub('OneByte', '', cctype); 4283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch cctype = re.sub('TwoByte', '', cctype); 4293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 4303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch # 4313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch # Despite all that, some types have no corresponding class. 4323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch # 4333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (cctype in klasses): 4343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch typeclasses[type] = cctype; 4353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (cctype in checktypes): 4363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch del checktypes[cctype]; 4373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 4383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (len(checktypes) > 0): 4393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch for klass in checktypes: 4403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch print('error: expected class \"%s\" not found' % klass); 4413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 4423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch sys.exit(1); 4433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 4443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 4453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch# 4463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch# For a given macro call, pick apart the arguments and return an object 4473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch# describing the corresponding output constant. See load_fields(). 4483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch# 4493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochdef parse_field(call): 4503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch # Replace newlines with spaces. 4513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch for ii in range(0, len(call)): 4523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (call[ii] == '\n'): 4533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch call[ii] == ' '; 4543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 4553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch idx = call.find('('); 4563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch kind = call[0:idx]; 4573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch rest = call[idx + 1: len(call) - 1]; 4583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch args = re.split('\s*,\s*', rest); 4593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 4603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch consts = []; 4613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 4623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (kind == 'ACCESSORS' or kind == 'ACCESSORS_GCSAFE'): 4633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch klass = args[0]; 4643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch field = args[1]; 4653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch dtype = args[2]; 4663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch offset = args[3]; 4673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 4683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return ({ 4693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 'name': 'class_%s__%s__%s' % (klass, field, dtype), 4703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 'value': '%s::%s' % (klass, offset) 4713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch }); 4723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 473b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assert(kind == 'SMI_ACCESSORS' or kind == 'ACCESSORS_TO_SMI'); 4743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch klass = args[0]; 4753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch field = args[1]; 4763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch offset = args[2]; 4773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 4783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return ({ 4793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 'name': 'class_%s__%s__%s' % (klass, field, 'SMI'), 4803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 'value': '%s::%s' % (klass, offset) 4813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch }); 4823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 4833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch# 4843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch# Load field offset information from objects-inl.h. 4853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch# 4863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochdef load_fields(): 4873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch inlfilename = sys.argv[3]; 4883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch inlfile = open(inlfilename, 'r'); 4893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 4903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch # 4913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch # Each class's fields and the corresponding offsets are described in the 4923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch # source by calls to macros like "ACCESSORS" (and friends). All we do 4933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch # here is extract these macro invocations, taking into account that they 4943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch # may span multiple lines and may contain nested parentheses. We also 4953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch # call parse_field() to pick apart the invocation. 4963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch # 497b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch prefixes = [ 'ACCESSORS', 'ACCESSORS_GCSAFE', 498b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 'SMI_ACCESSORS', 'ACCESSORS_TO_SMI' ]; 4993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch current = ''; 5003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch opens = 0; 5013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 5023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch for line in inlfile: 5033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (opens > 0): 5043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch # Continuation line 5053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch for ii in range(0, len(line)): 5063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (line[ii] == '('): 5073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch opens += 1; 5083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch elif (line[ii] == ')'): 5093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch opens -= 1; 5103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 5113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (opens == 0): 5123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch break; 5133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 5143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch current += line[0:ii + 1]; 5153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch continue; 5163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 5173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch for prefix in prefixes: 5183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (not line.startswith(prefix + '(')): 5193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch continue; 5203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 5213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (len(current) > 0): 5223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch fields.append(parse_field(current)); 5233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch current = ''; 5243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 5253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch for ii in range(len(prefix), len(line)): 5263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (line[ii] == '('): 5273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch opens += 1; 5283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch elif (line[ii] == ')'): 5293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch opens -= 1; 5303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 5313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (opens == 0): 5323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch break; 5333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 5343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch current += line[0:ii + 1]; 5353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 5363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (len(current) > 0): 5373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch fields.append(parse_field(current)); 5383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch current = ''; 5393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 5403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch for body in extras_accessors: 5413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch fields.append(parse_field('ACCESSORS(%s)' % body)); 5423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 5433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch# 5443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch# Emit a block of constants. 5453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch# 5463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochdef emit_set(out, consts): 547b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch # Fix up overzealous parses. This could be done inside the 548b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch # parsers but as there are several, it's easiest to do it here. 549b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ws = re.compile('\s+') 550b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for const in consts: 551b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch name = ws.sub('', const['name']) 552b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch value = ws.sub('', str(const['value'])) # Can be a number. 553b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch out.write('int v8dbg_%s = %s;\n' % (name, value)) 5543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch out.write('\n'); 5553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 5563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch# 5573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch# Emit the whole output file. 5583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch# 5593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochdef emit_config(): 5603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch out = file(sys.argv[1], 'w'); 5613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 5623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch out.write(header); 5633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 5643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch out.write('/* miscellaneous constants */\n'); 5653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch emit_set(out, consts_misc); 5663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 5673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch out.write('/* class type information */\n'); 5683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch consts = []; 5693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch keys = typeclasses.keys(); 5703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch keys.sort(); 5713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch for typename in keys: 5723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch klass = typeclasses[typename]; 5733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch consts.append({ 5743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 'name': 'type_%s__%s' % (klass, typename), 5753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 'value': typename 5763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch }); 5773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 5783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch emit_set(out, consts); 5793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 5803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch out.write('/* class hierarchy information */\n'); 5813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch consts = []; 5823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch keys = klasses.keys(); 5833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch keys.sort(); 5843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch for klassname in keys: 5853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch pklass = klasses[klassname]['parent']; 586014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch bklass = get_base_class(klassname); 587014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (bklass != 'Object'): 588014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch continue; 5893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (pklass == None): 5903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch continue; 5913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 5923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch consts.append({ 5933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 'name': 'parent_%s__%s' % (klassname, pklass), 5943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 'value': 0 5953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch }); 5963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 5973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch emit_set(out, consts); 5983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 5993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch out.write('/* field information */\n'); 6003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch emit_set(out, fields); 6013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 6023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch out.write(footer); 6033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 6043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochif (len(sys.argv) < 4): 6053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch print('usage: %s output.cc objects.h objects-inl.h' % sys.argv[0]); 6063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch sys.exit(2); 6073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 6083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochload_objects(); 6093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochload_fields(); 6103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochemit_config(); 611