1994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org#!/usr/bin/env python 2994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org 3994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org# 4994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org# Copyright 2012 the V8 project authors. All rights reserved. 5994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org# Redistribution and use in source and binary forms, with or without 6994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org# modification, are permitted provided that the following conditions are 7994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org# met: 8994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org# 9994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org# * Redistributions of source code must retain the above copyright 10994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org# notice, this list of conditions and the following disclaimer. 11994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org# * Redistributions in binary form must reproduce the above 12994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org# copyright notice, this list of conditions and the following 13994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org# disclaimer in the documentation and/or other materials provided 14994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org# with the distribution. 15994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org# * Neither the name of Google Inc. nor the names of its 16994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org# contributors may be used to endorse or promote products derived 17994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org# from this software without specific prior written permission. 18994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org# 19994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 20994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 21994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 22994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 23994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 24994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 25994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 26994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 27994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 28994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 29994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org# 31994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org 32994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org# 33994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org# Emits a C++ file to be compiled and linked into libv8 to support postmortem 34994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org# debugging tools. Most importantly, this tool emits constants describing V8 35994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org# internals: 36994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org# 37994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org# v8dbg_type_CLASS__TYPE = VALUE Describes class type values 38994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org# v8dbg_class_CLASS__FIELD__TYPE = OFFSET Describes class fields 39994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org# v8dbg_parent_CLASS__PARENT Describes class hierarchy 40994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org# v8dbg_frametype_NAME = VALUE Describes stack frame values 41994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org# v8dbg_off_fp_NAME = OFFSET Frame pointer offsets 42994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org# v8dbg_prop_NAME = OFFSET Object property offsets 43994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org# v8dbg_NAME = VALUE Miscellaneous values 44994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org# 45994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org# These constants are declared as global integers so that they'll be present in 46994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org# the generated libv8 binary. 47994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org# 48994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org 49994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.orgimport re 50994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.orgimport sys 51994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org 52994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org# 53994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org# Miscellaneous constants, tags, and masks used for object identification. 54994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org# 55994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.orgconsts_misc = [ 56994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org { 'name': 'FirstNonstringType', 'value': 'FIRST_NONSTRING_TYPE' }, 57994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org 58994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org { 'name': 'IsNotStringMask', 'value': 'kIsNotStringMask' }, 59994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org { 'name': 'StringTag', 'value': 'kStringTag' }, 60994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org { 'name': 'NotStringTag', 'value': 'kNotStringTag' }, 61994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org 62994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org { 'name': 'StringEncodingMask', 'value': 'kStringEncodingMask' }, 63994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org { 'name': 'TwoByteStringTag', 'value': 'kTwoByteStringTag' }, 642c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org { 'name': 'OneByteStringTag', 'value': 'kOneByteStringTag' }, 65994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org 66994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org { 'name': 'StringRepresentationMask', 67994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org 'value': 'kStringRepresentationMask' }, 68994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org { 'name': 'SeqStringTag', 'value': 'kSeqStringTag' }, 69994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org { 'name': 'ConsStringTag', 'value': 'kConsStringTag' }, 70994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org { 'name': 'ExternalStringTag', 'value': 'kExternalStringTag' }, 71a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org { 'name': 'SlicedStringTag', 'value': 'kSlicedStringTag' }, 72994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org 73994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org { 'name': 'FailureTag', 'value': 'kFailureTag' }, 74994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org { 'name': 'FailureTagMask', 'value': 'kFailureTagMask' }, 75994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org { 'name': 'HeapObjectTag', 'value': 'kHeapObjectTag' }, 76994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org { 'name': 'HeapObjectTagMask', 'value': 'kHeapObjectTagMask' }, 77994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org { 'name': 'SmiTag', 'value': 'kSmiTag' }, 78994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org { 'name': 'SmiTagMask', 'value': 'kSmiTagMask' }, 79994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org { 'name': 'SmiValueShift', 'value': 'kSmiTagSize' }, 804cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org { 'name': 'SmiShiftSize', 'value': 'kSmiShiftSize' }, 81994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org { 'name': 'PointerSizeLog2', 'value': 'kPointerSizeLog2' }, 82994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org 837c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org { 'name': 'OddballFalse', 'value': 'Oddball::kFalse' }, 847c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org { 'name': 'OddballTrue', 'value': 'Oddball::kTrue' }, 857c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org { 'name': 'OddballTheHole', 'value': 'Oddball::kTheHole' }, 867c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org { 'name': 'OddballNull', 'value': 'Oddball::kNull' }, 877c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org { 'name': 'OddballArgumentMarker', 'value': 'Oddball::kArgumentMarker' }, 887c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org { 'name': 'OddballUndefined', 'value': 'Oddball::kUndefined' }, 897c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org { 'name': 'OddballUninitialized', 'value': 'Oddball::kUninitialized' }, 907c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org { 'name': 'OddballOther', 'value': 'Oddball::kOther' }, 917c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org { 'name': 'OddballException', 'value': 'Oddball::kException' }, 927c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org 93994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org { 'name': 'prop_idx_first', 94994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org 'value': 'DescriptorArray::kFirstIndex' }, 95994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org { 'name': 'prop_type_field', 96994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org 'value': 'FIELD' }, 97994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org { 'name': 'prop_type_first_phantom', 984cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org 'value': 'TRANSITION' }, 99994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org { 'name': 'prop_type_mask', 100994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org 'value': 'PropertyDetails::TypeField::kMask' }, 1017c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org { 'name': 'prop_index_mask', 1027c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org 'value': 'PropertyDetails::FieldIndexField::kMask' }, 1037c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org { 'name': 'prop_index_shift', 1047c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org 'value': 'PropertyDetails::FieldIndexField::kShift' }, 105994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org 106a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org { 'name': 'prop_desc_key', 107a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org 'value': 'DescriptorArray::kDescriptorKey' }, 108a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org { 'name': 'prop_desc_details', 109a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org 'value': 'DescriptorArray::kDescriptorDetails' }, 110a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org { 'name': 'prop_desc_value', 111a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org 'value': 'DescriptorArray::kDescriptorValue' }, 112a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org { 'name': 'prop_desc_size', 113a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org 'value': 'DescriptorArray::kDescriptorSize' }, 114a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org 1157c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org { 'name': 'elements_fast_holey_elements', 1167c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org 'value': 'FAST_HOLEY_ELEMENTS' }, 1177c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org { 'name': 'elements_fast_elements', 1187c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org 'value': 'FAST_ELEMENTS' }, 1197c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org { 'name': 'elements_dictionary_elements', 1207c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org 'value': 'DICTIONARY_ELEMENTS' }, 1217c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org 1227c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org { 'name': 'bit_field2_elements_kind_mask', 1237c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org 'value': 'Map::kElementsKindMask' }, 1247c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org { 'name': 'bit_field2_elements_kind_shift', 1257c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org 'value': 'Map::kElementsKindShift' }, 1267c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org { 'name': 'bit_field3_dictionary_map_shift', 1277c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org 'value': 'Map::DictionaryMap::kShift' }, 1287c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org 129994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org { 'name': 'off_fp_context', 130994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org 'value': 'StandardFrameConstants::kContextOffset' }, 1319ca3017c616a778baff6d57c68d6d4746a130036ulan@chromium.org { 'name': 'off_fp_constant_pool', 1329ca3017c616a778baff6d57c68d6d4746a130036ulan@chromium.org 'value': 'StandardFrameConstants::kConstantPoolOffset' }, 133994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org { 'name': 'off_fp_marker', 134994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org 'value': 'StandardFrameConstants::kMarkerOffset' }, 135994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org { 'name': 'off_fp_function', 136994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org 'value': 'JavaScriptFrameConstants::kFunctionOffset' }, 137994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org { 'name': 'off_fp_args', 138994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org 'value': 'JavaScriptFrameConstants::kLastParameterOffset' }, 139994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org]; 140994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org 141994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org# 142994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org# The following useful fields are missing accessors, so we define fake ones. 143994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org# 144994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.orgextras_accessors = [ 145994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org 'HeapObject, map, Map, kMapOffset', 146994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org 'JSObject, elements, Object, kElementsOffset', 147994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org 'FixedArray, data, uintptr_t, kHeaderSize', 148994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org 'Map, instance_attributes, int, kInstanceAttributesOffset', 149994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org 'Map, inobject_properties, int, kInObjectPropertiesOffset', 150994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org 'Map, instance_size, int, kInstanceSizeOffset', 1517c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org 'Map, bit_field, char, kBitFieldOffset', 1527c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org 'Map, bit_field2, char, kBitField2Offset', 1537c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org 'Map, bit_field3, SMI, kBitField3Offset', 1547c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org 'Map, prototype, Object, kPrototypeOffset', 1557c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org 'NameDictionaryShape, prefix_size, int, kPrefixSize', 1567c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org 'NameDictionaryShape, entry_size, int, kEntrySize', 1577c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org 'SeededNumberDictionaryShape, prefix_size, int, kPrefixSize', 1587c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org 'UnseededNumberDictionaryShape, prefix_size, int, kPrefixSize', 1597c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org 'NumberDictionaryShape, entry_size, int, kEntrySize', 1607c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org 'Oddball, kind_offset, int, kKindOffset', 161994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org 'HeapNumber, value, double, kValueOffset', 162994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org 'ConsString, first, String, kFirstOffset', 163994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org 'ConsString, second, String, kSecondOffset', 164994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org 'ExternalString, resource, Object, kResourceOffset', 165fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org 'SeqOneByteString, chars, char, kHeaderSize', 166a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org 'SeqTwoByteString, chars, char, kHeaderSize', 1674efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.org 'SharedFunctionInfo, code, Code, kCodeOffset', 168a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org 'SlicedString, parent, String, kParentOffset', 1694efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.org 'Code, instruction_start, uintptr_t, kHeaderSize', 1704efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.org 'Code, instruction_size, int, kInstructionSizeOffset', 171994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org]; 172994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org 173994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org# 174994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org# The following is a whitelist of classes we expect to find when scanning the 175994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org# source code. This list is not exhaustive, but it's still useful to identify 176994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org# when this script gets out of sync with the source. See load_objects(). 177994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org# 178994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.orgexpected_classes = [ 179994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org 'ConsString', 'FixedArray', 'HeapNumber', 'JSArray', 'JSFunction', 180994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org 'JSObject', 'JSRegExp', 'JSValue', 'Map', 'Oddball', 'Script', 181fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org 'SeqOneByteString', 'SharedFunctionInfo' 182994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org]; 183994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org 184994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org 185994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org# 186994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org# The following structures store high-level representations of the structures 187994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org# for which we're going to emit descriptive constants. 188994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org# 189994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.orgtypes = {}; # set of all type names 190994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.orgtypeclasses = {}; # maps type names to corresponding class names 191994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.orgklasses = {}; # known classes, including parents 192994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.orgfields = []; # field declarations 193994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org 194994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.orgheader = ''' 195994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org/* 196994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org * This file is generated by %s. Do not edit directly. 197994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org */ 198994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org 199994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org#include "v8.h" 200994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org#include "frames.h" 201994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org#include "frames-inl.h" /* for architecture-specific frame constants */ 202994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org 203994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.orgusing namespace v8::internal; 204994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org 205994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.orgextern "C" { 206994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org 207994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org/* stack frame constants */ 208994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org#define FRAME_CONST(value, klass) \ 209994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org int v8dbg_frametype_##klass = StackFrame::value; 210994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org 211994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.orgSTACK_FRAME_TYPE_LIST(FRAME_CONST) 212994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org 213994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org#undef FRAME_CONST 214994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org 215994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org''' % sys.argv[0]; 216994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org 217994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.orgfooter = ''' 218994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org} 219994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org''' 220994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org 221994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org# 222994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org# Loads class hierarchy and type information from "objects.h". 223994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org# 224994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.orgdef load_objects(): 225994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org objfilename = sys.argv[2]; 226994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org objfile = open(objfilename, 'r'); 227994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org in_insttype = False; 228994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org 229994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org typestr = ''; 230994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org 231994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org # 232994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org # Construct a dictionary for the classes we're sure should be present. 233994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org # 234994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org checktypes = {}; 235994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org for klass in expected_classes: 236994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org checktypes[klass] = True; 237994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org 238994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org # 239994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org # Iterate objects.h line-by-line to collect type and class information. 240994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org # For types, we accumulate a string representing the entire InstanceType 241994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org # enum definition and parse it later because it's easier to do so 242994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org # without the embedded newlines. 243994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org # 244994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org for line in objfile: 245994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org if (line.startswith('enum InstanceType {')): 246994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org in_insttype = True; 247994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org continue; 248994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org 249994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org if (in_insttype and line.startswith('};')): 250994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org in_insttype = False; 251994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org continue; 252994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org 253994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org line = re.sub('//.*', '', line.rstrip().lstrip()); 254994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org 255994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org if (in_insttype): 256994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org typestr += line; 257994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org continue; 258994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org 259994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org match = re.match('class (\w[^\s:]*)(: public (\w[^\s{]*))?\s*{', 260994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org line); 261994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org 262994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org if (match): 263994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org klass = match.group(1); 264994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org pklass = match.group(3); 265994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org klasses[klass] = { 'parent': pklass }; 266994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org 267994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org # 268994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org # Process the instance type declaration. 269994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org # 270994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org entries = typestr.split(','); 271994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org for entry in entries: 272994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org types[re.sub('\s*=.*', '', entry).lstrip()] = True; 273994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org 274994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org # 275994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org # Infer class names for each type based on a systematic transformation. 276994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org # For example, "JS_FUNCTION_TYPE" becomes "JSFunction". We find the 277994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org # class for each type rather than the other way around because there are 278994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org # fewer cases where one type maps to more than one class than the other 279994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org # way around. 280994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org # 281994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org for type in types: 282994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org # 283994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org # Symbols and Strings are implemented using the same classes. 284994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org # 285994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org usetype = re.sub('SYMBOL_', 'STRING_', type); 286994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org 287994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org # 288994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org # REGEXP behaves like REG_EXP, as in JS_REGEXP_TYPE => JSRegExp. 289994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org # 290994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org usetype = re.sub('_REGEXP_', '_REG_EXP_', usetype); 291994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org 292994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org # 293994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org # Remove the "_TYPE" suffix and then convert to camel case, 294994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org # except that a "JS" prefix remains uppercase (as in 295994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org # "JS_FUNCTION_TYPE" => "JSFunction"). 296994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org # 297994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org if (not usetype.endswith('_TYPE')): 298994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org continue; 299994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org 300994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org usetype = usetype[0:len(usetype) - len('_TYPE')]; 301994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org parts = usetype.split('_'); 302994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org cctype = ''; 303994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org 304994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org if (parts[0] == 'JS'): 305994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org cctype = 'JS'; 306994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org start = 1; 307994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org else: 308994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org cctype = ''; 309994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org start = 0; 310994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org 311994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org for ii in range(start, len(parts)): 312994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org part = parts[ii]; 313994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org cctype += part[0].upper() + part[1:].lower(); 314994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org 315994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org # 316994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org # Mapping string types is more complicated. Both types and 317994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org # class names for Strings specify a representation (e.g., Seq, 3182c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org # Cons, External, or Sliced) and an encoding (TwoByte/OneByte), 319994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org # In the simplest case, both of these are explicit in both 320994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org # names, as in: 321994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org # 3222c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org # EXTERNAL_ONE_BYTE_STRING_TYPE => ExternalOneByteString 323994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org # 324994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org # However, either the representation or encoding can be omitted 325994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org # from the type name, in which case "Seq" and "TwoByte" are 326994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org # assumed, as in: 327994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org # 328994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org # STRING_TYPE => SeqTwoByteString 329994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org # 330994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org # Additionally, sometimes the type name has more information 331994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org # than the class, as in: 332994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org # 3332c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org # CONS_ONE_BYTE_STRING_TYPE => ConsString 334994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org # 335994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org # To figure this out dynamically, we first check for a 336994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org # representation and encoding and add them if they're not 337994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org # present. If that doesn't yield a valid class name, then we 338994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org # strip out the representation. 339994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org # 340994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org if (cctype.endswith('String')): 341994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org if (cctype.find('Cons') == -1 and 342994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org cctype.find('External') == -1 and 343994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org cctype.find('Sliced') == -1): 3442c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org if (cctype.find('OneByte') != -1): 3452c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org cctype = re.sub('OneByteString$', 346fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org 'SeqOneByteString', cctype); 347994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org else: 348994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org cctype = re.sub('String$', 349994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org 'SeqString', cctype); 350994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org 3512c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org if (cctype.find('OneByte') == -1): 352994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org cctype = re.sub('String$', 'TwoByteString', 353994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org cctype); 354994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org 355994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org if (not (cctype in klasses)): 3562c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org cctype = re.sub('OneByte', '', cctype); 357994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org cctype = re.sub('TwoByte', '', cctype); 358994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org 359994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org # 360994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org # Despite all that, some types have no corresponding class. 361994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org # 362994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org if (cctype in klasses): 363994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org typeclasses[type] = cctype; 364994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org if (cctype in checktypes): 365994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org del checktypes[cctype]; 366994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org 367994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org if (len(checktypes) > 0): 368994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org for klass in checktypes: 369994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org print('error: expected class \"%s\" not found' % klass); 370994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org 371994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org sys.exit(1); 372994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org 373994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org 374994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org# 375994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org# For a given macro call, pick apart the arguments and return an object 376994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org# describing the corresponding output constant. See load_fields(). 377994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org# 378994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.orgdef parse_field(call): 379994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org # Replace newlines with spaces. 380994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org for ii in range(0, len(call)): 381994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org if (call[ii] == '\n'): 382994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org call[ii] == ' '; 383994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org 384994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org idx = call.find('('); 385994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org kind = call[0:idx]; 386994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org rest = call[idx + 1: len(call) - 1]; 387994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org args = re.split('\s*,\s*', rest); 388994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org 389994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org consts = []; 390994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org 391994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org if (kind == 'ACCESSORS' or kind == 'ACCESSORS_GCSAFE'): 392994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org klass = args[0]; 393994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org field = args[1]; 394994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org dtype = args[2]; 395994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org offset = args[3]; 396994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org 397994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org return ({ 398994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org 'name': 'class_%s__%s__%s' % (klass, field, dtype), 399994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org 'value': '%s::%s' % (klass, offset) 400994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org }); 401994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org 4027c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org assert(kind == 'SMI_ACCESSORS' or kind == 'ACCESSORS_TO_SMI'); 403994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org klass = args[0]; 404994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org field = args[1]; 405994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org offset = args[2]; 406994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org 407994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org return ({ 408994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org 'name': 'class_%s__%s__%s' % (klass, field, 'SMI'), 409994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org 'value': '%s::%s' % (klass, offset) 410994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org }); 411994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org 412994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org# 413994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org# Load field offset information from objects-inl.h. 414994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org# 415994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.orgdef load_fields(): 416994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org inlfilename = sys.argv[3]; 417994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org inlfile = open(inlfilename, 'r'); 418994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org 419994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org # 420994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org # Each class's fields and the corresponding offsets are described in the 421994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org # source by calls to macros like "ACCESSORS" (and friends). All we do 422994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org # here is extract these macro invocations, taking into account that they 423994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org # may span multiple lines and may contain nested parentheses. We also 424994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org # call parse_field() to pick apart the invocation. 425994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org # 4267c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org prefixes = [ 'ACCESSORS', 'ACCESSORS_GCSAFE', 4277c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org 'SMI_ACCESSORS', 'ACCESSORS_TO_SMI' ]; 428994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org current = ''; 429994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org opens = 0; 430994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org 431994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org for line in inlfile: 432994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org if (opens > 0): 433994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org # Continuation line 434994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org for ii in range(0, len(line)): 435994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org if (line[ii] == '('): 436994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org opens += 1; 437994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org elif (line[ii] == ')'): 438994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org opens -= 1; 439994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org 440994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org if (opens == 0): 441994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org break; 442994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org 443994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org current += line[0:ii + 1]; 444994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org continue; 445994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org 446994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org for prefix in prefixes: 447994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org if (not line.startswith(prefix + '(')): 448994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org continue; 449994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org 450994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org if (len(current) > 0): 451994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org fields.append(parse_field(current)); 452994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org current = ''; 453994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org 454994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org for ii in range(len(prefix), len(line)): 455994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org if (line[ii] == '('): 456994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org opens += 1; 457994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org elif (line[ii] == ')'): 458994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org opens -= 1; 459994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org 460994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org if (opens == 0): 461994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org break; 462994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org 463994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org current += line[0:ii + 1]; 464994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org 465994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org if (len(current) > 0): 466994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org fields.append(parse_field(current)); 467994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org current = ''; 468994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org 469994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org for body in extras_accessors: 470994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org fields.append(parse_field('ACCESSORS(%s)' % body)); 471994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org 472994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org# 473994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org# Emit a block of constants. 474994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org# 475994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.orgdef emit_set(out, consts): 4764edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org # Fix up overzealous parses. This could be done inside the 4774edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org # parsers but as there are several, it's easiest to do it here. 4784edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org ws = re.compile('\s+') 4794edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org for const in consts: 4804edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org name = ws.sub('', const['name']) 4814edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org value = ws.sub('', str(const['value'])) # Can be a number. 4824edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org out.write('int v8dbg_%s = %s;\n' % (name, value)) 483994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org out.write('\n'); 484994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org 485994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org# 486994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org# Emit the whole output file. 487994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org# 488994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.orgdef emit_config(): 489994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org out = file(sys.argv[1], 'w'); 490994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org 491994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org out.write(header); 492994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org 493994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org out.write('/* miscellaneous constants */\n'); 494994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org emit_set(out, consts_misc); 495994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org 496994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org out.write('/* class type information */\n'); 497994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org consts = []; 498994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org keys = typeclasses.keys(); 499994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org keys.sort(); 500994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org for typename in keys: 501994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org klass = typeclasses[typename]; 502994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org consts.append({ 503994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org 'name': 'type_%s__%s' % (klass, typename), 504994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org 'value': typename 505994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org }); 506994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org 507994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org emit_set(out, consts); 508994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org 509994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org out.write('/* class hierarchy information */\n'); 510994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org consts = []; 511994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org keys = klasses.keys(); 512994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org keys.sort(); 513994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org for klassname in keys: 514994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org pklass = klasses[klassname]['parent']; 515994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org if (pklass == None): 516994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org continue; 517994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org 518994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org consts.append({ 519994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org 'name': 'parent_%s__%s' % (klassname, pklass), 520994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org 'value': 0 521994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org }); 522994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org 523994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org emit_set(out, consts); 524994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org 525994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org out.write('/* field information */\n'); 526994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org emit_set(out, fields); 527994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org 528994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org out.write(footer); 529994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org 530994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.orgif (len(sys.argv) < 4): 531994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org print('usage: %s output.cc objects.h objects-inl.h' % sys.argv[0]); 532994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org sys.exit(2); 533994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org 534994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.orgload_objects(); 535994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.orgload_fields(); 536994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.orgemit_config(); 537