Special case Booleans in Freezer_thaw

Now Freezer_deserialize doesn't support Booleans anymore but this
should be harmless.

Fixes LUCY-292.


Project: http://git-wip-us.apache.org/repos/asf/lucy/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucy/commit/8a37f575
Tree: http://git-wip-us.apache.org/repos/asf/lucy/tree/8a37f575
Diff: http://git-wip-us.apache.org/repos/asf/lucy/diff/8a37f575

Branch: refs/heads/master
Commit: 8a37f575d2e2aa640ac930467ad81ec9bc6c3eed
Parents: af6e18e
Author: Nick Wellnhofer <[email protected]>
Authored: Wed Dec 28 20:22:08 2016 +0100
Committer: Nick Wellnhofer <[email protected]>
Committed: Mon Jan 2 16:35:07 2017 +0100

----------------------------------------------------------------------
 core/Lucy/Util/Freezer.c          | 25 +++++++++++++++----------
 test/Lucy/Test/Util/TestFreezer.c | 12 +++---------
 2 files changed, 18 insertions(+), 19 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucy/blob/8a37f575/core/Lucy/Util/Freezer.c
----------------------------------------------------------------------
diff --git a/core/Lucy/Util/Freezer.c b/core/Lucy/Util/Freezer.c
index f8034f2..3aa2810 100644
--- a/core/Lucy/Util/Freezer.c
+++ b/core/Lucy/Util/Freezer.c
@@ -47,9 +47,22 @@ Obj*
 Freezer_thaw(InStream *instream) {
     String *class_name = Freezer_read_string(instream);
     Class *klass = Class_singleton(class_name, NULL);
-    Obj *blank = Class_Make_Obj(klass);
     DECREF(class_name);
-    return Freezer_deserialize(blank, instream);
+    Obj *obj = NULL;
+
+    if (klass == BOOLEAN) {
+        // Booleans shouldn't be created with Make_Obj because only the
+        // TRUE and FALSE singletons are expected to exist and decref is
+        // a no-op.
+        bool value = InStream_Read_U8(instream);
+        obj = (Obj*)Bool_singleton(value);
+    }
+    else {
+        Obj *blank = Class_Make_Obj(klass);
+        obj = Freezer_deserialize(blank, instream);
+    }
+
+    return obj;
 }
 
 void
@@ -133,14 +146,6 @@ Freezer_deserialize(Obj *obj, InStream *instream) {
         double value = InStream_Read_F64(instream);
         obj = (Obj*)Float_init((Float*)obj, value);
     }
-    else if (Obj_is_a(obj, BOOLEAN)) {
-        bool value = !!InStream_Read_U8(instream);
-        Obj *result = value ? INCREF(CFISH_TRUE) : INCREF(CFISH_FALSE);
-        // FIXME: This DECREF is essentially a no-op causing a
-        // memory leak.
-        DECREF(obj);
-        obj = result;
-    }
     else if (Obj_is_a(obj, QUERY)) {
         obj = (Obj*)Query_Deserialize((Query*)obj, instream);
     }

http://git-wip-us.apache.org/repos/asf/lucy/blob/8a37f575/test/Lucy/Test/Util/TestFreezer.c
----------------------------------------------------------------------
diff --git a/test/Lucy/Test/Util/TestFreezer.c 
b/test/Lucy/Test/Util/TestFreezer.c
index 6eecab7..455fca2 100644
--- a/test/Lucy/Test/Util/TestFreezer.c
+++ b/test/Lucy/Test/Util/TestFreezer.c
@@ -123,20 +123,14 @@ test_num(TestBatchRunner *runner) {
     Integer *i64 = Int_new(-1);
     Float   *f64_thaw = (Float*)S_freeze_thaw((Obj*)f64);
     Integer *i64_thaw = (Integer*)S_freeze_thaw((Obj*)i64);
+    Boolean *true_thaw = (Boolean*)S_freeze_thaw((Obj*)CFISH_TRUE);
 
     TEST_TRUE(runner, Float_Equals(f64, (Obj*)f64_thaw),
               "Float freeze/thaw");
     TEST_TRUE(runner, Int_Equals(i64, (Obj*)i64_thaw),
               "Integer freeze/thaw");
-
-    if (getenv("LUCY_VALGRIND")) {
-        SKIP(runner, 1, "known leaks");
-    }
-    else {
-        Boolean *true_thaw = (Boolean*)S_freeze_thaw((Obj*)CFISH_TRUE);
-        TEST_TRUE(runner, Bool_Equals(CFISH_TRUE, (Obj*)true_thaw),
-                  "Boolean freeze/thaw");
-    }
+    TEST_TRUE(runner, Bool_Equals(CFISH_TRUE, (Obj*)true_thaw),
+              "Boolean freeze/thaw");
 
     DECREF(i64_thaw);
     DECREF(f64_thaw);

Reply via email to