diff -r 8bccb92a3503 -r 0347c75836a0 src/mem/slicc/ast/FormalParamAST.py --- a/src/mem/slicc/ast/FormalParamAST.py Fri Jul 10 11:20:14 2015 -0500 +++ b/src/mem/slicc/ast/FormalParamAST.py Fri Jul 10 11:20:40 2015 -0500 @@ -56,6 +56,16 @@ "interface" in type and ( type["interface"] == "AbstractCacheEntry" or type["interface"] == "AbstractEntry")): - return type, "%s* %s" % (type.c_ident, param) + return type, "%s* %s" % (type.c_ident, param), False + elif self.default != None: + value = "" + if self.default == True: + value = "true" + elif self.default == False: + value = "false" + else: + value = "%s" % self.default + return type, "const %s& %s = %s" % (type.c_ident, param, + value), True else: - return type, "const %s& %s" % (type.c_ident, param) + return type, "const %s& %s" % (type.c_ident, param), False diff -r 8bccb92a3503 -r 0347c75836a0 src/mem/slicc/ast/FuncDeclAST.py --- a/src/mem/slicc/ast/FuncDeclAST.py Fri Jul 10 11:20:14 2015 -0500 +++ b/src/mem/slicc/ast/FuncDeclAST.py Fri Jul 10 11:20:40 2015 -0500 @@ -46,6 +46,7 @@ def generate(self, parent = None): types = [] params = [] + default_count = 0 void_type = self.symtab.find("void", Type) # Generate definition code @@ -58,9 +59,11 @@ for formal in self.formals: # Lookup parameter types try: - type, ident = formal.generate() + type, ident, default = formal.generate() types.append(type) params.append(ident) + if default: + default_count += 1 except AttributeError: types.append(formal.type) @@ -76,7 +79,7 @@ machine = self.state_machine func = Func(self.symtab, self.ident, self.location, return_type, - types, params, str(body), self.pairs) + types, params, str(body), self.pairs, default_count) if parent is not None: if not parent.addFunc(func): diff -r 8bccb92a3503 -r 0347c75836a0 src/mem/slicc/symbols/Func.py --- a/src/mem/slicc/symbols/Func.py Fri Jul 10 11:20:14 2015 -0500 +++ b/src/mem/slicc/symbols/Func.py Fri Jul 10 11:20:40 2015 -0500 @@ -30,7 +30,7 @@ class Func(Symbol): def __init__(self, table, ident, location, return_type, param_types, - param_strings, body, pairs): + param_strings, body, pairs, default_count = 0): super(Func, self).__init__(table, ident, location, pairs) self.return_type = return_type self.param_types = param_types @@ -39,6 +39,7 @@ self.isInternalMachineFunc = False self.c_ident = ident self.class_name = "" + self.default_count = default_count def __repr__(self): return "" @@ -58,14 +59,20 @@ return "%s %s(%s);" % (return_type, self.c_ident, ", ".join(self.param_strings)) + @property + def numParamsWithDefaults(self): + return self.default_count + 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)) + if len(args) + self.numParamsWithDefaults < len(self.param_types) or \ + len(args) > len(self.param_types): + self.error("Wrong number of arguments passed to function: '%s'" + \ + " Expected at least: %d, got: %d", self.c_ident, + len(self.param_types) - self.numParamsWithDefaults, + len(args)) cvec = [] type_vec = []