diff options
author | xi <xi@18f92427-320e-0410-9341-c67f048884a3> | 2006-05-22 19:49:54 +0000 |
---|---|---|
committer | xi <xi@18f92427-320e-0410-9341-c67f048884a3> | 2006-05-22 19:49:54 +0000 |
commit | 8e793cab346a0ef4f6d1984b0263b2f20bb77c98 (patch) | |
tree | 18a183cf60fc0ebdee0df70e5f356262162efe7c | |
parent | f5c1d370de01ba1011395b289223d19311851445 (diff) | |
download | pyyaml-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.py | 4 | ||||
-rw-r--r-- | lib/yaml/reader.py | 9 | ||||
-rw-r--r-- | lib/yaml/representer.py | 16 | ||||
-rw-r--r-- | tests/test_constructor.py | 12 | ||||
-rw-r--r-- | tests/test_representer.py | 3 |
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 |