diff options
author | Miles Kaufmann <milesck@eecs.umich.edu> | 2007-08-30 15:16:58 -0400 |
---|---|---|
committer | Miles Kaufmann <milesck@eecs.umich.edu> | 2007-08-30 15:16:58 -0400 |
commit | 9cb49ab9e0ff8917d20fd7dc81be3ce5ecc81bd8 (patch) | |
tree | 110c04e9c6002f4be98a36a77ff85f7dcc29a9f2 /src/python/m5/params.py | |
parent | f67cd046731f07cc76ec63d0614be81d2e212ac4 (diff) | |
download | gem5-9cb49ab9e0ff8917d20fd7dc81be3ce5ecc81bd8.tar.xz |
python: Eliminate the Python use of eval() and frame manipulation
--HG--
extra : convert_revision : 04520bcfab510580a1c7fb341afbd2487287d1ab
Diffstat (limited to 'src/python/m5/params.py')
-rw-r--r-- | src/python/m5/params.py | 43 |
1 files changed, 22 insertions, 21 deletions
diff --git a/src/python/m5/params.py b/src/python/m5/params.py index df70bf469..52a927ba3 100644 --- a/src/python/m5/params.py +++ b/src/python/m5/params.py @@ -46,7 +46,6 @@ import copy import datetime -import inspect import re import sys import time @@ -67,9 +66,20 @@ def isSimObjectSequence(*args, **kwargs): def isSimObjectClass(*args, **kwargs): return SimObject.isSimObjectClass(*args, **kwargs) +allParams = {} + +class MetaParamValue(type): + def __new__(mcls, name, bases, dct): + cls = super(MetaParamValue, mcls).__new__(mcls, name, bases, dct) + assert name not in allParams + allParams[name] = cls + return cls + + # Dummy base class to identify types that are legitimate for SimObject # parameters. class ParamValue(object): + __metaclass__ = MetaParamValue cxx_predecls = [] swig_predecls = [] @@ -119,16 +129,11 @@ class ParamDesc(object): def __getattr__(self, attr): if attr == 'ptype': - try: - ptype = SimObject.allClasses[self.ptype_str] - if not isinstance(ptype, type): - raise NameError - self.ptype = ptype - return ptype - except NameError: - raise - #raise TypeError, \ - # "Param qualifier '%s' is not a type" % self.ptype_str + ptype = SimObject.allClasses[self.ptype_str] + assert issubclass(ptype, SimObject.SimObject) + self.ptype = ptype + return ptype + raise AttributeError, "'%s' object has no attribute '%s'" % \ (type(self).__name__, attr) @@ -160,6 +165,7 @@ class ParamDesc(object): # single value. class VectorParamValue(list): + __metaclass__ = MetaParamValue def ini_str(self): return ' '.join([v.ini_str() for v in self]) @@ -217,15 +223,10 @@ class ParamFactory(object): # E.g., Param.Int(5, "number of widgets") def __call__(self, *args, **kwargs): - caller_frame = inspect.currentframe().f_back ptype = None try: - ptype = eval(self.ptype_str, - caller_frame.f_globals, caller_frame.f_locals) - if not isinstance(ptype, type): - raise TypeError, \ - "Param qualifier is not a type: %s" % ptype - except NameError: + ptype = allParams[self.ptype_str] + except KeyError: # if name isn't defined yet, assume it's a SimObject, and # try to resolve it later pass @@ -300,7 +301,7 @@ class NumericParamValue(ParamValue): return newobj # Metaclass for bounds-checked integer parameters. See CheckedInt. -class CheckedIntType(type): +class CheckedIntType(MetaParamValue): def __init__(cls, name, bases, dict): super(CheckedIntType, cls).__init__(name, bases, dict) @@ -424,7 +425,7 @@ class Addr(CheckedInt): return self.value + other -class MetaRange(type): +class MetaRange(MetaParamValue): def __init__(cls, name, bases, dict): super(MetaRange, cls).__init__(name, bases, dict) if name == 'Range': @@ -665,7 +666,7 @@ class Time(ParamValue): allEnums = {} # Metaclass for Enum types -class MetaEnum(type): +class MetaEnum(MetaParamValue): def __new__(mcls, name, bases, dict): assert name not in allEnums |