summaryrefslogtreecommitdiff
path: root/pyasn1/type/base.py
diff options
context:
space:
mode:
authorelie <elie>2006-04-05 14:46:51 +0000
committerelie <elie>2006-04-05 14:46:51 +0000
commitba57472b350983f23257e57c5f2a6ed5d3ebf808 (patch)
tree4f06f631f42c835f72a45b4436d5e6610c33a289 /pyasn1/type/base.py
parentbcda7e02bf552305c877e3fff0b703cb6e17b9fc (diff)
downloadpyasn1-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.py35
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