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