StaticCastAST.py (6882:898047a3672c) StaticCastAST.py (7839:9e556fb25900)
1# Copyright (c) 2009 Advanced Micro Devices, Inc.
2# All rights reserved.
3#
4# Redistribution and use in source and binary forms, with or without
5# modification, are permitted provided that the following conditions are
6# met: redistributions of source code must retain the above copyright
7# notice, this list of conditions and the following disclaimer;
8# redistributions in binary form must reproduce the above copyright

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

22# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
23# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
25# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26
27from slicc.ast.ExprAST import ExprAST
28
29class StaticCastAST(ExprAST):
1# Copyright (c) 2009 Advanced Micro Devices, Inc.
2# All rights reserved.
3#
4# Redistribution and use in source and binary forms, with or without
5# modification, are permitted provided that the following conditions are
6# met: redistributions of source code must retain the above copyright
7# notice, this list of conditions and the following disclaimer;
8# redistributions in binary form must reproduce the above copyright

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

22# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
23# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
25# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26
27from slicc.ast.ExprAST import ExprAST
28
29class StaticCastAST(ExprAST):
30 def __init__(self, slicc, type_ast, expr_ast):
30 def __init__(self, slicc, type_ast, type_modifier, expr_ast):
31 super(StaticCastAST, self).__init__(slicc)
32
33 self.type_ast = type_ast
34 self.expr_ast = expr_ast
31 super(StaticCastAST, self).__init__(slicc)
32
33 self.type_ast = type_ast
34 self.expr_ast = expr_ast
35 self.type_modifier = type_modifier
35
36 def __repr__(self):
37 return "[StaticCastAST: %r]" % self.expr_ast
38
39 def generate(self, code):
40 actual_type, ecode = self.expr_ast.inline(True)
36
37 def __repr__(self):
38 return "[StaticCastAST: %r]" % self.expr_ast
39
40 def generate(self, code):
41 actual_type, ecode = self.expr_ast.inline(True)
41 code('static_cast<${{self.type_ast.type.c_ident}} &>($ecode)')
42 if self.type_modifier == "pointer":
43 code('static_cast<${{self.type_ast.type.c_ident}} *>($ecode)')
44 else:
45 code('static_cast<${{self.type_ast.type.c_ident}} &>($ecode)')
42
43 if not "interface" in self.type_ast.type:
44 self.expr_ast.error("static cast only premitted for those types " \
45 "that implement inherit an interface")
46
47 # The interface type should match
48 if str(actual_type) != str(self.type_ast.type["interface"]):
49 self.expr_ast.error("static cast miss-match, type is '%s'," \
50 "but inherited type is '%s'",
51 actual_type, self.type_ast.type["interface"])
52
53 return self.type_ast.type
54
46
47 if not "interface" in self.type_ast.type:
48 self.expr_ast.error("static cast only premitted for those types " \
49 "that implement inherit an interface")
50
51 # The interface type should match
52 if str(actual_type) != str(self.type_ast.type["interface"]):
53 self.expr_ast.error("static cast miss-match, type is '%s'," \
54 "but inherited type is '%s'",
55 actual_type, self.type_ast.type["interface"])
56
57 return self.type_ast.type
58