diff options
author | Nilay Vaish <nilay@cs.wisc.edu> | 2015-08-30 10:52:58 -0500 |
---|---|---|
committer | Nilay Vaish <nilay@cs.wisc.edu> | 2015-08-30 10:52:58 -0500 |
commit | 426e38af8b112c5b78dd36f88e66e28f55f27ecd (patch) | |
tree | 816058a6290c911cac7bbca9e478b2bf3d4ec9a5 | |
parent | 4727fc26f885d09f07f18a10fabe6c75dffe165f (diff) | |
download | gem5-426e38af8b112c5b78dd36f88e66e28f55f27ecd.tar.xz |
ruby: slicc: avoid duplicate code for function argument check
Both FuncCallExprAST and MethodCallExprAST had code for checking the arguments
with which a function is being called. The patch does away with this
duplication. Now the code for checking function call arguments resides in the
Func class.
-rw-r--r-- | src/mem/slicc/ast/FuncCallExprAST.py | 17 | ||||
-rw-r--r-- | src/mem/slicc/ast/MethodCallExprAST.py | 21 | ||||
-rw-r--r-- | src/mem/slicc/parser.py | 9 | ||||
-rw-r--r-- | src/mem/slicc/symbols/Func.py | 21 |
4 files changed, 32 insertions, 36 deletions
diff --git a/src/mem/slicc/ast/FuncCallExprAST.py b/src/mem/slicc/ast/FuncCallExprAST.py index 9336a2297..0c9880d6d 100644 --- a/src/mem/slicc/ast/FuncCallExprAST.py +++ b/src/mem/slicc/ast/FuncCallExprAST.py @@ -93,22 +93,7 @@ class FuncCallExprAST(ExprAST): if func is None: self.error("Unrecognized function name: '%s'", func_name_args) - if len(self.exprs) != len(func.param_types): - self.error("Wrong number of arguments passed to function : '%s'" +\ - " Expected %d, got %d", self.proc_name, - len(func.param_types), len(self.exprs)) - - cvec = [] - type_vec = [] - for expr,expected_type in zip(self.exprs, func.param_types): - # Check the types of the parameter - actual_type,param_code = expr.inline(True) - if str(actual_type) != 'OOD' and \ - str(actual_type) != str(expected_type): - expr.error("Type mismatch: expected: %s actual: %s" % \ - (expected_type, actual_type)) - cvec.append(param_code) - type_vec.append(expected_type) + cvec, type_vec = func.checkArguments(self.exprs) # OK, the semantics of "trigger" here is that, ports in the # machine have different priorities. We always check the first diff --git a/src/mem/slicc/ast/MethodCallExprAST.py b/src/mem/slicc/ast/MethodCallExprAST.py index 8be319a40..104d6f8df 100644 --- a/src/mem/slicc/ast/MethodCallExprAST.py +++ b/src/mem/slicc/ast/MethodCallExprAST.py @@ -56,20 +56,8 @@ class MethodCallExprAST(ExprAST): self.error("Invalid method call: Type '%s' does not have a method '%s'", obj_type, methodId) - if len(self.expr_ast_vec) != \ - len(obj_type.methods[methodId].param_types): - # Right number of parameters - self.error("Wrong number of parameters for function name: '%s', " + \ - "expected: , actual: ", proc_name, - len(obj_type.methods[methodId].param_types), - len(self.expr_ast_vec)) - - for actual_type, expected_type in \ - zip(paramTypes, obj_type.methods[methodId].param_types): - if actual_type != expected_type and \ - str(actual_type["interface"]) != str(expected_type): - self.error("Type mismatch: expected: %s actual: %s", - expected_type, actual_type) + func = obj_type.methods[methodId] + func.checkArguments(self.expr_ast_vec) # Return the return type of the method return obj_type.methods[methodId].return_type @@ -78,10 +66,9 @@ class MethodCallExprAST(ExprAST): pass class MemberMethodCallExprAST(MethodCallExprAST): - def __init__(self, slicc, obj_expr_ast, proc_name, expr_ast_vec): + def __init__(self, slicc, obj_expr_ast, func_call): s = super(MemberMethodCallExprAST, self) - s.__init__(slicc, proc_name, expr_ast_vec) - + s.__init__(slicc, func_call.proc_name, func_call.exprs) self.obj_expr_ast = obj_expr_ast def __repr__(self): diff --git a/src/mem/slicc/parser.py b/src/mem/slicc/parser.py index 0cbe9ea63..49177345d 100644 --- a/src/mem/slicc/parser.py +++ b/src/mem/slicc/parser.py @@ -669,15 +669,18 @@ class SLICC(Grammar): def p_expr__member_method_call(self, p): "aexpr : aexpr DOT ident '(' exprs ')'" - p[0] = ast.MemberMethodCallExprAST(self, p[1], p[3], p[5]) + p[0] = ast.MemberMethodCallExprAST(self, p[1], + ast.FuncCallExprAST(self, p[3], p[5])) def p_expr__member_method_call_lookup(self, p): "aexpr : aexpr '[' exprs ']'" - p[0] = ast.MemberMethodCallExprAST(self, p[1], "lookup", p[3]) + p[0] = ast.MemberMethodCallExprAST(self, p[1], + ast.FuncCallExprAST(self, "lookup", p[3])) def p_expr__class_method_call(self, p): "aexpr : type DOUBLE_COLON ident '(' exprs ')'" - p[0] = ast.ClassMethodCallExprAST(self, p[1], p[3], p[5]) + p[0] = ast.ClassMethodCallExprAST(self, p[1], + ast.FuncCallExprAST(self, p[3], p[5])) def p_expr__aexpr(self, p): "expr : aexpr" diff --git a/src/mem/slicc/symbols/Func.py b/src/mem/slicc/symbols/Func.py index d50d0309f..6da74002a 100644 --- a/src/mem/slicc/symbols/Func.py +++ b/src/mem/slicc/symbols/Func.py @@ -62,6 +62,27 @@ class Func(Symbol): def writeCodeFiles(self, path, includes): return + def checkArguments(self, args): + if len(args) != len(self.param_types): + self.error("Wrong number of arguments passed to function : '%s'" +\ + " Expected %d, got %d", self.c_ident, + len(self.param_types), len(args)) + + cvec = [] + type_vec = [] + for expr,expected_type in zip(args, self.param_types): + # Check the types of the parameter + actual_type,param_code = expr.inline(True) + if str(actual_type) != 'OOD' and \ + str(actual_type) != str(expected_type) and \ + str(actual_type["interface"]) != str(expected_type): + expr.error("Type mismatch: expected: %s actual: %s" % \ + (expected_type, actual_type)) + cvec.append(param_code) + type_vec.append(expected_type) + + return cvec, type_vec + def generateCode(self): '''This write a function of object Chip''' if "external" in self: |