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);
