1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#!/usr/bin/env python 2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org# (C) Copyright IBM Corporation 2005 4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org# All Rights Reserved. 5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org# 6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org# Permission is hereby granted, free of charge, to any person obtaining a 7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org# copy of this software and associated documentation files (the "Software"), 8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org# to deal in the Software without restriction, including without limitation 9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org# on the rights to use, copy, modify, merge, publish, distribute, sub 10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org# license, and/or sell copies of the Software, and to permit persons to whom 11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org# the Software is furnished to do so, subject to the following conditions: 12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org# 13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org# The above copyright notice and this permission notice (including the next 14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org# paragraph) shall be included in all copies or substantial portions of the 15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org# Software. 16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org# 17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org# FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL 20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org# IBM AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS 23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org# IN THE SOFTWARE. 24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org# 25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org# Authors: 26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org# Ian Romanick <idr@us.ibm.com> 27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgimport string, copy 29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgclass type_node: 31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org def __init__(self): 32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org self.pointer = 0 # bool 33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org self.const = 0 # bool 34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org self.signed = 1 # bool 35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org self.integer = 1 # bool 36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org # If elements is set to non-zero, then field is an array. 38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org self.elements = 0 39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org self.name = None 41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org self.size = 0 # type's size in bytes 42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org def string(self): 46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org """Return string representation of this type_node.""" 47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org s = "" 48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if self.pointer: 50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org s = "* " 51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if self.const: 53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org s += "const " 54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if not self.pointer: 56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if self.integer: 57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if self.signed: 58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org s += "signed " 59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else: 60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org s += "unsigned " 61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if self.name: 63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org s += "%s " % (self.name) 64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return s 66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgclass type_table: 69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org def __init__(self): 70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org self.types_by_name = {} 71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org def add_type(self, type_expr): 75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org self.types_by_name[ type_expr.get_base_name() ] = type_expr 76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org def find_type(self, name): 80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if name in self.types_by_name: 81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return self.types_by_name[ name ] 82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else: 83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return None 84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdef create_initial_types(): 87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tt = type_table() 88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org basic_types = [ 90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ("char", 1, 1), 91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ("short", 2, 1), 92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ("int", 4, 1), 93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ("long", 4, 1), 94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ("float", 4, 0), 95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ("double", 8, 0), 96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ("enum", 4, 1) 97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ] 98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (type_name, type_size, integer) in basic_types: 100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org te = type_expression(None) 101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tn = type_node() 102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tn.name = type_name 103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tn.size = type_size 104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tn.integer = integer 105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org te.expr.append(tn) 106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tt.add_type( te ) 107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org type_expression.built_in_types = tt 109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgclass type_expression: 113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org built_in_types = None 114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org def __init__(self, type_string, extra_types = None): 116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org self.expr = [] 117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if not type_string: 119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org self.original_string = type_string 122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if not type_expression.built_in_types: 124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org raise RuntimeError("create_initial_types must be called before creating type_expression objects.") 125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org # Replace '*' with ' * ' in type_string. Then, split the string 127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org # into tokens, separated by spaces. 128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tokens = string.split( string.replace( type_string, "*", " * " ) ) 129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const = 0 131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org t = None 132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org signed = 0 133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned = 0 134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for i in tokens: 136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if i == "const": 137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if t and t.pointer: 138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org t.const = 1 139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else: 140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const = 1 141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org elif i == "signed": 142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org signed = 1 143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org elif i == "unsigned": 144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned = 1 145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org elif i == "*": 146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org # This is a quirky special-case because of the 147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org # way the C works for types. If 'unsigned' is 148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org # specified all by itself, it is treated the 149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org # same as "unsigned int". 150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if unsigned: 152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org self.set_base_type( "int", signed, unsigned, const, extra_types ) 153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const = 0 154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org signed = 0 155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned = 0 156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if not self.expr: 158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org raise RuntimeError("Invalid type expression (dangling pointer)") 159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if signed: 161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org raise RuntimeError("Invalid type expression (signed / unsigned applied to pointer)") 162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org t = type_node() 164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org t.pointer = 1 165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org self.expr.append( t ) 166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else: 167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if self.expr: 168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org raise RuntimeError('Invalid type expression (garbage after pointer qualifier -> "%s")' % (self.original_string)) 169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org self.set_base_type( i, signed, unsigned, const, extra_types ) 171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const = 0 172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org signed = 0 173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned = 0 174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if signed and unsigned: 176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org raise RuntimeError("Invalid type expression (both signed and unsigned specified)") 177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if const: 180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org raise RuntimeError("Invalid type expression (dangling const)") 181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if unsigned: 183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org raise RuntimeError("Invalid type expression (dangling signed)") 184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if signed: 186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org raise RuntimeError("Invalid type expression (dangling unsigned)") 187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org def set_base_type(self, type_name, signed, unsigned, const, extra_types): 192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org te = type_expression.built_in_types.find_type( type_name ) 193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if not te: 194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org te = extra_types.find_type( type_name ) 195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if not te: 197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org raise RuntimeError('Unknown base type "%s".' % (type_name)) 198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org self.expr = copy.deepcopy(te.expr) 200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org t = self.expr[ len(self.expr) - 1 ] 202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org t.const = const 203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if signed: 204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org t.signed = 1 205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org elif unsigned: 206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org t.signed = 0 207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org def set_base_type_node(self, tn): 210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org self.expr = [tn] 211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org def set_elements(self, count): 215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tn = self.expr[0] 216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tn.elements = count 218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org def string(self): 222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org s = "" 223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for t in self.expr: 224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org s += t.string() 225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return s 227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org def get_base_type_node(self): 230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return self.expr[0] 231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org def get_base_name(self): 234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if len(self.expr): 235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return self.expr[0].name 236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else: 237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return None 238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org def get_element_size(self): 241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tn = self.expr[0] 242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if tn.elements: 244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return tn.elements * tn.size 245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else: 246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return tn.size 247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org def get_element_count(self): 250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tn = self.expr[0] 251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return tn.elements 252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org def get_stack_size(self): 255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tn = self.expr[ -1 ] 256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if tn.elements or tn.pointer: 258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 4 259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org elif not tn.integer: 260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return tn.size 261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else: 262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 4 263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org def is_pointer(self): 266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tn = self.expr[ -1 ] 267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return tn.pointer 268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org def format_string(self): 271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tn = self.expr[ -1 ] 272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if tn.pointer: 273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return "%p" 274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org elif not tn.integer: 275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return "%f" 276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else: 277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return "%d" 278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgif __name__ == '__main__': 282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org types_to_try = [ "int", "int *", "const int *", "int * const", "const int * const", \ 284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "unsigned * const *", \ 285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "float", "const double", "double * const"] 286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org create_initial_types() 288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for t in types_to_try: 290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org print 'Trying "%s"...' % (t) 291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org te = type_expression( t ) 292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org print 'Got "%s" (%u, %u).' % (te.string(), te.get_stack_size(), te.get_element_size()) 293