diff options
author | elie <elie> | 2006-04-05 14:46:51 +0000 |
---|---|---|
committer | elie <elie> | 2006-04-05 14:46:51 +0000 |
commit | ba57472b350983f23257e57c5f2a6ed5d3ebf808 (patch) | |
tree | 4f06f631f42c835f72a45b4436d5e6610c33a289 /pyasn1/type/base.py | |
parent | bcda7e02bf552305c877e3fff0b703cb6e17b9fc (diff) | |
download | pyasn1-ba57472b350983f23257e57c5f2a6ed5d3ebf808.tar.gz |
clone() and subtype() methods now accept optional cloneValueFlag parameter
which controls prototype's value inheritance. Default is not to inherit
original value for performance reasons (constructed objects walkover may
be expensive).
Diffstat (limited to 'pyasn1/type/base.py')
-rw-r--r-- | pyasn1/type/base.py | 35 |
1 files changed, 15 insertions, 20 deletions
diff --git a/pyasn1/type/base.py b/pyasn1/type/base.py index 597a7ba..6fb0622 100644 --- a/pyasn1/type/base.py +++ b/pyasn1/type/base.py @@ -70,10 +70,11 @@ class AbstractSimpleAsn1Item(Asn1ItemBase): if self._value: return 1 else: return 0 - def clone(self, value=None, tagSet=None, subtypeSpec=None): + def clone(self, value=None, tagSet=None, subtypeSpec=None, + cloneValueFlag=None): if value is None and tagSet is None and subtypeSpec is None: return self - if value is None and self._value is not self.defaultValue: + if cloneValueFlag: value = self._value if tagSet is None: tagSet = self._tagSet @@ -82,8 +83,8 @@ class AbstractSimpleAsn1Item(Asn1ItemBase): return self.__class__(value, tagSet, subtypeSpec) def subtype(self, value=None, implicitTag=None, explicitTag=None, - subtypeSpec=None): - if value is None and self._value is not self.defaultValue: + subtypeSpec=None, cloneValueFlag=None): + if cloneValueFlag: value = self._value if implicitTag is not None: tagSet = self._tagSet.tagImplicitly(implicitTag) @@ -154,26 +155,21 @@ class AbstractConstructedAsn1Item(Asn1ItemBase): def getComponentTypeMap(self): raise error.PyAsn1Error('Method not implemented') - def clone(self, componentType=None, tagSet=None, subtypeSpec=None, - sizeSpec=None): - if componentType is None: - componentType = self._componentType + def clone(self, tagSet=None, subtypeSpec=None, sizeSpec=None, + cloneValueFlag=None): if tagSet is None: tagSet = self._tagSet if subtypeSpec is None: subtypeSpec = self._subtypeSpec if sizeSpec is None: sizeSpec = self._sizeSpec - r = self.__class__(componentType, tagSet, subtypeSpec, sizeSpec) - if componentType is self._componentType and \ - self.getComponentType() is not None: - self._cloneComponentValues(r) # XXX when do we clone inner vals? + r = self.__class__(self._componentType, tagSet, subtypeSpec, sizeSpec) + if cloneValueFlag: + self._cloneComponentValues(r, cloneValueFlag) return r - def subtype(self, componentType=None, implicitTag=None, explicitTag=None, - subtypeSpec=None, sizeSpec=None): - if componentType is None: - componentType = self._componentType + def subtype(self, implicitTag=None, explicitTag=None, subtypeSpec=None, + sizeSpec=None, cloneValueFlag=None): if implicitTag is not None: tagSet = self._tagSet.tagImplicitly(implicitTag) elif explicitTag is not None: @@ -188,10 +184,9 @@ class AbstractConstructedAsn1Item(Asn1ItemBase): sizeSpec = self._sizeSpec else: sizeSpec = sizeSpec + self._sizeSpec - r = self.__class__(componentType, tagSet, subtypeSpec, sizeSpec) - if componentType is self._componentType and \ - self.getComponentType() is not None: - self._cloneComponentValues(r) # XXX when do we clone inner vals? + r = self.__class__(self._componentType, tagSet, subtypeSpec, sizeSpec) + if cloneValueFlag: + self._cloneComponentValues(r, cloneValueFlag) return r def _verifyComponent(self, idx, value): pass |