Browse Source

reduced ParamObj memory usage

Darren Ranalli 18 years ago
parent
commit
f146e74f9c
1 changed files with 69 additions and 52 deletions
  1. 69 52
      direct/src/showbase/PythonUtil.py

+ 69 - 52
direct/src/showbase/PythonUtil.py

@@ -1236,39 +1236,7 @@ class ParamObj:
         self._curParamStack = []
         self._curParamStack = []
         self._priorValuesStack = []
         self._priorValuesStack = []
 
 
-        def setterStub(param, setterFunc, self,
-                       value):
-            # should we apply the value now or should we wait?
-            # if this obj's params are locked, we track which values have
-            # been set, and on unlock, we'll call the applyers for those
-            # values
-            if self._paramLockRefCount > 0:
-                priorValues = self._priorValuesStack[-1]
-                if param not in priorValues:
-                    try:
-                        priorValue = getSetter(self, param, 'get')()
-                    except:
-                        priorValue = None
-                    priorValues[param] = priorValue
-                self._paramsSet[param] = None
-                setterFunc(value)
-            else:
-                # prepare for call to getPriorValue
-                self._priorValuesStack.append({
-                    param: getSetter(self, param, 'get')()
-                    })
-                setterFunc(value)
-                # call the applier, if there is one
-                applier = getattr(self, getSetterName(param, 'apply'), None)
-                if applier is not None:
-                    self._curParamStack.append(param)
-                    applier()
-                    self._curParamStack.pop()
-                self._priorValuesStack.pop()
-                if hasattr(self, 'handleParamChange'):
-                    self.handleParamChange((param,))
-
-        # insert stub funcs for param setters
+        # insert stub funcs for param setters, to handle locked params
         for param in self.ParamSet.getParams():
         for param in self.ParamSet.getParams():
             setterName = getSetterName(param)
             setterName = getSetterName(param)
             getterName = getSetterName(param, 'get')
             getterName = getSetterName(param, 'get')
@@ -1277,6 +1245,7 @@ class ParamObj:
             if not hasattr(self, setterName):
             if not hasattr(self, setterName):
                 # no; provide the default
                 # no; provide the default
                 def defaultSetter(self, value, param=param):
                 def defaultSetter(self, value, param=param):
+                    #print '%s=%s for %s' % (param, value, id(self))
                     setattr(self, param, value)
                     setattr(self, param, value)
                 self.__class__.__dict__[setterName] = defaultSetter
                 self.__class__.__dict__[setterName] = defaultSetter
 
 
@@ -1289,27 +1258,74 @@ class ParamObj:
                     return getattr(self, param, default)
                     return getattr(self, param, default)
                 self.__class__.__dict__[getterName] = defaultGetter
                 self.__class__.__dict__[getterName] = defaultGetter
 
 
-            # grab a reference to the setter
-            setterFunc = getattr(self, setterName)
-            # if the setter is a direct member of this instance, move the setter
-            # aside
-            if setterName in self.__dict__:
-                self.__dict__[setterName + '_MOVED'] = self.__dict__[setterName]
-                setterFunc = self.__dict__[setterName]
-            # install a setter stub that will a) call the real setter and
-            # then the applier, or b) call the setter and queue the
-            # applier, depending on whether our params are locked
-            setattr(self, setterName, new.instancemethod(
-                Functor(setterStub, param, setterFunc), self, self.__class__))
+            # have we already installed a setter stub?
+            origSetterName = '%s_ORIG' % (setterName,)
+            if not hasattr(self, origSetterName):
+                # move the original setter aside
+                origSetterFunc = getattr(self.__class__, setterName)
+                setattr(self.__class__, origSetterName, origSetterFunc)
+                """
+                # if the setter is a direct member of this instance, move the setter
+                # aside
+                if setterName in self.__dict__:
+                    self.__dict__[setterName + '_MOVED'] = self.__dict__[setterName]
+                    setterFunc = self.__dict__[setterName]
+                    """
+                # install a setter stub that will a) call the real setter and
+                # then the applier, or b) call the setter and queue the
+                # applier, depending on whether our params are locked
+                """
+                setattr(self, setterName, new.instancemethod(
+                    Functor(setterStub, param, setterFunc), self, self.__class__))
+                    """
+                def setterStub(self, value, param=param, origSetterName=origSetterName):
+                    # should we apply the value now or should we wait?
+                    # if this obj's params are locked, we track which values have
+                    # been set, and on unlock, we'll call the applyers for those
+                    # values
+                    if self._paramLockRefCount > 0:
+                        priorValues = self._priorValuesStack[-1]
+                        if param not in priorValues:
+                            try:
+                                priorValue = getSetter(self, param, 'get')()
+                            except:
+                                priorValue = None
+                            priorValues[param] = priorValue
+                        self._paramsSet[param] = None
+                        getattr(self, origSetterName)(value)
+                    else:
+                        # prepare for call to getPriorValue
+                        try:
+                            priorValue = getSetter(self, param, 'get')()
+                        except:
+                            priorValue = None
+                        self._priorValuesStack.append({
+                            param: priorValue,
+                            })
+                        getattr(self, origSetterName)(value)
+                        # call the applier, if there is one
+                        applier = getattr(self, getSetterName(param, 'apply'), None)
+                        if applier is not None:
+                            self._curParamStack.append(param)
+                            applier()
+                            self._curParamStack.pop()
+                        self._priorValuesStack.pop()
+                        if hasattr(self, 'handleParamChange'):
+                            self.handleParamChange((param,))
+
+                setattr(self.__class__, setterName, setterStub)
 
 
         if params is not None:
         if params is not None:
             params.applyTo(self)
             params.applyTo(self)
 
 
     def destroy(self):
     def destroy(self):
+        """
         for param in self.ParamSet.getParams():
         for param in self.ParamSet.getParams():
             setterName = getSetterName(param)
             setterName = getSetterName(param)
             self.__dict__[setterName].destroy()
             self.__dict__[setterName].destroy()
             del self.__dict__[setterName]
             del self.__dict__[setterName]
+            """
+        pass
     
     
     def setDefaultParams(self):
     def setDefaultParams(self):
         # set all the default parameters on ourself
         # set all the default parameters on ourself
@@ -1357,8 +1373,11 @@ class ParamObj:
     def __repr__(self):
     def __repr__(self):
         argStr = ''
         argStr = ''
         for param in self.ParamSet.getParams():
         for param in self.ParamSet.getParams():
-            argStr += '%s=%s,' % (param,
-                                  repr(getSetter(self, param, 'get')()))
+            try:
+                value = getSetter(self, param, 'get')()
+            except:
+                value = '<unknown>'
+            argStr += '%s=%s,' % (param, repr(value))
         return '%s(%s)' % (self.__class__.__name__, argStr)
         return '%s(%s)' % (self.__class__.__name__, argStr)
 
 
 if __debug__:
 if __debug__:
@@ -1492,19 +1511,19 @@ class POD:
     def getValue(self, name):
     def getValue(self, name):
         return getSetter(self, name, 'get')()
         return getSetter(self, name, 'get')()
 
 
-    # CLASS METHODS
+    @classmethod
     def getDataNames(cls):
     def getDataNames(cls):
         # returns safely-mutable list of datum names
         # returns safely-mutable list of datum names
         cls._compileDefaultDataSet()
         cls._compileDefaultDataSet()
         return cls._DataSet.keys()
         return cls._DataSet.keys()
-    getDataNames = classmethod(getDataNames)
+    @classmethod
     def getDefaultValue(cls, name):
     def getDefaultValue(cls, name):
         cls._compileDefaultDataSet()
         cls._compileDefaultDataSet()
         dv = cls._DataSet[name]
         dv = cls._DataSet[name]
         if callable(dv):
         if callable(dv):
             dv = dv()
             dv = dv()
         return dv
         return dv
-    getDefaultValue = classmethod(getDefaultValue)
+    @classmethod
     def _compileDefaultDataSet(cls):
     def _compileDefaultDataSet(cls):
         if cls.__dict__.has_key('_DataSet'):
         if cls.__dict__.has_key('_DataSet'):
             # we've already compiled the defaults for this class
             # we've already compiled the defaults for this class
@@ -1537,8 +1556,6 @@ class POD:
                 if c.__dict__.has_key('DataSet'):
                 if c.__dict__.has_key('DataSet'):
                     # apply this class' default data values to our dict
                     # apply this class' default data values to our dict
                     cls._DataSet.update(c.DataSet)
                     cls._DataSet.update(c.DataSet)
-    _compileDefaultDataSet = classmethod(_compileDefaultDataSet)
-    # END CLASS METHODS
 
 
     def __repr__(self):
     def __repr__(self):
         argStr = ''
         argStr = ''