MemberExprAST.py (8436:5648986156db) MemberExprAST.py (8644:acf68e5a8cd7)
1# Copyright (c) 1999-2008 Mark D. Hill and David A. Wood
2# Copyright (c) 2009 The Hewlett-Packard Development Company
3# All rights reserved.
4#
5# Redistribution and use in source and binary forms, with or without
6# modification, are permitted provided that the following conditions are
7# met: redistributions of source code must retain the above copyright
8# notice, this list of conditions and the following disclaimer;

--- 27 unchanged lines hidden (view full) ---

36
37 def __repr__(self):
38 return "[MemberExprAST: %r.%r]" % (self.expr_ast, self.field)
39
40 def generate(self, code):
41 return_type, gcode = self.expr_ast.inline(True)
42 fix = code.nofix()
43
1# Copyright (c) 1999-2008 Mark D. Hill and David A. Wood
2# Copyright (c) 2009 The Hewlett-Packard Development Company
3# All rights reserved.
4#
5# Redistribution and use in source and binary forms, with or without
6# modification, are permitted provided that the following conditions are
7# met: redistributions of source code must retain the above copyright
8# notice, this list of conditions and the following disclaimer;

--- 27 unchanged lines hidden (view full) ---

36
37 def __repr__(self):
38 return "[MemberExprAST: %r.%r]" % (self.expr_ast, self.field)
39
40 def generate(self, code):
41 return_type, gcode = self.expr_ast.inline(True)
42 fix = code.nofix()
43
44 if str(return_type) == "TBE" or ("interface" in return_type and return_type["interface"] == "AbstractCacheEntry"):
44 if str(return_type) == "TBE" \
45 or ("interface" in return_type and
46 (return_type["interface"] == "AbstractCacheEntry" or
47 return_type["interface"] == "AbstractEntry")):
45 code("(*$gcode).m_${{self.field}}")
46 else:
47 code("($gcode).m_${{self.field}}")
48
49 code.fix(fix)
50
51 # Verify that this is a valid field name for this type
52 if self.field in return_type.data_members:
53 # Return the type of the field
54 return return_type.data_members[self.field].type
55 else:
56 if "interface" in return_type:
57 interface_type = self.symtab.find(return_type["interface"]);
58 if self.field in interface_type.data_members:
59 # Return the type of the field
60 return interface_type.data_members[self.field].type
61 self.error("Invalid object field: " +
62 "Type '%s' does not have data member %s" % \
63 (return_type, self.field))
48 code("(*$gcode).m_${{self.field}}")
49 else:
50 code("($gcode).m_${{self.field}}")
51
52 code.fix(fix)
53
54 # Verify that this is a valid field name for this type
55 if self.field in return_type.data_members:
56 # Return the type of the field
57 return return_type.data_members[self.field].type
58 else:
59 if "interface" in return_type:
60 interface_type = self.symtab.find(return_type["interface"]);
61 if self.field in interface_type.data_members:
62 # Return the type of the field
63 return interface_type.data_members[self.field].type
64 self.error("Invalid object field: " +
65 "Type '%s' does not have data member %s" % \
66 (return_type, self.field))