summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorxi <xi@18f92427-320e-0410-9341-c67f048884a3>2006-05-22 19:49:54 +0000
committerxi <xi@18f92427-320e-0410-9341-c67f048884a3>2006-05-22 19:49:54 +0000
commit8e793cab346a0ef4f6d1984b0263b2f20bb77c98 (patch)
tree18a183cf60fc0ebdee0df70e5f356262162efe7c
parentf5c1d370de01ba1011395b289223d19311851445 (diff)
downloadpyyaml-8e793cab346a0ef4f6d1984b0263b2f20bb77c98.tar.gz
Revamp the inf/nan handling again.
git-svn-id: http://svn.pyyaml.org/pyyaml/trunk@173 18f92427-320e-0410-9341-c67f048884a3
-rw-r--r--lib/yaml/constructor.py4
-rw-r--r--lib/yaml/reader.py9
-rw-r--r--lib/yaml/representer.py16
-rw-r--r--tests/test_constructor.py12
-rw-r--r--tests/test_representer.py3
5 files changed, 27 insertions, 17 deletions
diff --git a/lib/yaml/constructor.py b/lib/yaml/constructor.py
index e35cca7..0d1bb19 100644
--- a/lib/yaml/constructor.py
+++ b/lib/yaml/constructor.py
@@ -232,9 +232,9 @@ class SafeConstructor(BaseConstructor):
return sign*int(value)
inf_value = 1e300
- while repr(inf_value) != repr(inf_value*inf_value):
+ while inf_value != inf_value*inf_value:
inf_value *= inf_value
- nan_value = inf_value/inf_value
+ nan_value = -inf_value/inf_value # Trying to make a quiet NaN (like C99).
def construct_yaml_float(self, node):
value = str(self.construct_scalar(node))
diff --git a/lib/yaml/reader.py b/lib/yaml/reader.py
index beb76d0..e9c34b1 100644
--- a/lib/yaml/reader.py
+++ b/lib/yaml/reader.py
@@ -120,9 +120,11 @@ class Reader:
self.determine_encoding()
def peek(self, index=0):
- if self.pointer+index+1 >= len(self.buffer):
+ try:
+ return self.buffer[self.pointer+index]
+ except IndexError:
self.update(index+1)
- return self.buffer[self.pointer+index]
+ return self.buffer[self.pointer+index]
def prefix(self, length=1):
if self.pointer+length >= len(self.buffer):
@@ -132,7 +134,7 @@ class Reader:
def forward(self, length=1):
if self.pointer+length+1 >= len(self.buffer):
self.update(length+1)
- for k in range(length):
+ while length:
ch = self.buffer[self.pointer]
self.pointer += 1
self.index += 1
@@ -142,6 +144,7 @@ class Reader:
self.column = 0
elif ch != u'\uFEFF':
self.column += 1
+ length -= 1
def get_mark(self):
if self.stream is None:
diff --git a/lib/yaml/representer.py b/lib/yaml/representer.py
index b78c882..932dede 100644
--- a/lib/yaml/representer.py
+++ b/lib/yaml/representer.py
@@ -195,22 +195,16 @@ class SafeRepresenter(BaseRepresenter):
inf_value = 1e300
while repr(inf_value) != repr(inf_value*inf_value):
inf_value *= inf_value
- nan_value = inf_value/inf_value
-
- repr_pos_inf = repr(inf_value)
- repr_neg_inf = repr(-inf_value)
- repr_nan = repr(inf_value/inf_value)
def represent_float(self, data):
- repr_data = repr(data)
- if repr_data == self.repr_pos_inf:
+ if data != data or (data == 0.0 and data == 1.0):
+ value = u'.nan'
+ elif data == self.inf_value:
value = u'.inf'
- elif repr_data == self.repr_neg_inf:
+ elif data == -self.inf_value:
value = u'-.inf'
- elif repr_data == self.repr_nan:
- value = u'.nan'
else:
- value = unicode(repr_data)
+ value = unicode(repr(data))
return self.represent_scalar(u'tag:yaml.org,2002:float', value)
def represent_list(self, data):
diff --git a/tests/test_constructor.py b/tests/test_constructor.py
index efbdbd4..cd6695f 100644
--- a/tests/test_constructor.py
+++ b/tests/test_constructor.py
@@ -261,7 +261,17 @@ class TestConstructorTypes(test_appliance.TestAppliance):
data2 = [(repr(key), value) for key, value in data2.items()]
data2.sort()
data2 = repr(data2)
- if data1 != data2:
+ if data1 != data2:
+ raise
+ elif isinstance(data1, list):
+ self.failUnlessEqual(type(data1), type(data2))
+ self.failUnlessEqual(len(data1), len(data2))
+ for item1, item2 in zip(data1, data2):
+ if (item1 != item1 or (item1 == 0.0 and item1 == 1.0)) and \
+ (item2 != item2 or (item2 == 0.0 and item2 == 1.0)):
+ continue
+ self.failUnlessEqual(item1, item2)
+ else:
raise
except:
print
diff --git a/tests/test_representer.py b/tests/test_representer.py
index e0fa894..8097733 100644
--- a/tests/test_representer.py
+++ b/tests/test_representer.py
@@ -33,6 +33,9 @@ class TestRepresenterTypes(test_appliance.TestAppliance):
self.failUnlessEqual(type(data1), type(data2))
self.failUnlessEqual(len(data1), len(data2))
for item1, item2 in zip(data1, data2):
+ if (item1 != item1 or (item1 == 0.0 and item1 == 1.0)) and \
+ (item2 != item2 or (item2 == 0.0 and item2 == 1.0)):
+ continue
self.failUnlessEqual(item1, item2)
else:
raise