Fixes for bugs/warts found in debug mode compile (bug #17092).
authorBen Pfaff <blp@gnu.org>
Fri, 14 Jul 2006 02:28:29 +0000 (02:28 +0000)
committerBen Pfaff <blp@gnu.org>
Fri, 14 Jul 2006 02:28:29 +0000 (02:28 +0000)
Thanks to Jason for reporting this bug and John for insight.

src/data/ChangeLog
src/data/case.c
src/data/case.h
src/data/procedure.c
src/language/expressions/ChangeLog
src/language/expressions/evaluate.c
src/output/ChangeLog
src/output/table.c

index 5297f3b90313728a5d77f1463382e770ae50ab09..0d10921c52e2dec462b75937dbf6021f3ebffb7d 100644 (file)
@@ -1,3 +1,17 @@
+Wed Jul 12 21:02:26 2006  Ben Pfaff  <blp@gnu.org>
+
+       * procedure.c (internal_procedure): Create sink_case with only as
+       many values as the compacted dictionary.
+
+Wed Jul 12 21:01:00 2006  Ben Pfaff  <blp@gnu.org>
+
+       Remove "debugging" code that caused plenty of false positives and
+       no true positives.
+       
+       * case.h (struct ccase): [DEBUGGING] Remove `this' member.
+
+       * case.c: Remove all references to `this' member.
+
 Thu Jul  6 19:09:53 2006  Ben Pfaff  <blp@gnu.org>
 
        Fix link error noted by Jason Stover.
index 6e65af975a1d77150c7cbaaeb49d6d278457c433..98de9ec6a1eab70fdd6bd1f52d7558e9ffee842a 100644 (file)
@@ -45,9 +45,6 @@ case_unshare (struct ccase *c)
 {
   struct case_data *cd;
   
-  assert (c != NULL);
-  assert (c->this == c);
-  assert (c->case_data != NULL);
   assert (c->case_data->ref_cnt > 1);
 
   cd = c->case_data;
@@ -72,7 +69,6 @@ void
 case_nullify (struct ccase *c) 
 {
   c->case_data = NULL;
-  c->this = c;
 }
 #endif /* DEBUGGING */
 
@@ -100,17 +96,10 @@ case_create (struct ccase *c, size_t value_cnt)
 void
 case_clone (struct ccase *clone, const struct ccase *orig)
 {
-  assert (orig != NULL);
-  assert (orig->this == orig);
-  assert (orig->case_data != NULL);
   assert (orig->case_data->ref_cnt > 0);
-  assert (clone != NULL);
 
   if (clone != orig) 
-    {
-      *clone = *orig;
-      clone->this = clone;
-    }
+    *clone = *orig;
   orig->case_data->ref_cnt++;
 }
 #endif /* DEBUGGING */
@@ -121,16 +110,11 @@ case_clone (struct ccase *clone, const struct ccase *orig)
 void
 case_move (struct ccase *dst, struct ccase *src) 
 {
-  assert (src != NULL);
-  assert (src->this == src);
-  assert (src->case_data != NULL);
   assert (src->case_data->ref_cnt > 0);
-  assert (dst != NULL);
   
   if (dst != src) 
     {
       *dst = *src;
-      dst->this = dst;
       case_nullify (src); 
     }
 }
@@ -144,7 +128,6 @@ case_destroy (struct ccase *c)
   struct case_data *cd;
   
   assert (c != NULL);
-  assert (c->this == c);
 
   cd = c->case_data;
   if (cd != NULL && --cd->ref_cnt == 0) 
@@ -183,9 +166,6 @@ case_swap (struct ccase *a, struct ccase *b)
 int
 case_try_create (struct ccase *c, size_t value_cnt) 
 {
-#ifdef DEBUGGING
-  c->this = c;
-#endif
   c->case_data = malloc (case_size (value_cnt));
   if (c->case_data != NULL) 
     {
@@ -215,17 +195,11 @@ case_copy (struct ccase *dst, size_t dst_idx,
            const struct ccase *src, size_t src_idx,
            size_t value_cnt)
 {
-  assert (dst != NULL);
-  assert (dst->this == dst);
-  assert (dst->case_data != NULL);
   assert (dst->case_data->ref_cnt > 0);
   assert (dst_idx + value_cnt <= dst->case_data->value_cnt);
 
-  assert (src != NULL);
-  assert (src->this == src);
-  assert (src->case_data != NULL);
   assert (src->case_data->ref_cnt > 0);
-  assert (src_idx + value_cnt <= dst->case_data->value_cnt);
+  assert (src_idx + value_cnt <= src->case_data->value_cnt);
 
   if (dst->case_data != src->case_data || dst_idx != src_idx) 
     {
@@ -246,9 +220,6 @@ void
 case_to_values (const struct ccase *c, union value *output,
                 size_t output_size UNUSED) 
 {
-  assert (c != NULL);
-  assert (c->this == c);
-  assert (c->case_data != NULL);
   assert (c->case_data->ref_cnt > 0);
   assert (output_size == c->case_data->value_cnt);
   assert (output != NULL || output_size == 0);
@@ -267,7 +238,6 @@ case_from_values (struct ccase *c, const union value *input,
                   size_t input_size UNUSED) 
 {
   assert (c != NULL);
-  assert (c->this == c);
   assert (c->case_data != NULL);
   assert (c->case_data->ref_cnt > 0);
   assert (input_size == c->case_data->value_cnt);
@@ -288,7 +258,6 @@ const union value *
 case_data (const struct ccase *c, size_t idx) 
 {
   assert (c != NULL);
-  assert (c->this == c);
   assert (c->case_data != NULL);
   assert (c->case_data->ref_cnt > 0);
   assert (idx < c->case_data->value_cnt);
@@ -304,7 +273,6 @@ double
 case_num (const struct ccase *c, size_t idx) 
 {
   assert (c != NULL);
-  assert (c->this == c);
   assert (c->case_data != NULL);
   assert (c->case_data->ref_cnt > 0);
   assert (idx < c->case_data->value_cnt);
@@ -322,7 +290,6 @@ const char *
 case_str (const struct ccase *c, size_t idx) 
 {
   assert (c != NULL);
-  assert (c->this == c);
   assert (c->case_data != NULL);
   assert (c->case_data->ref_cnt > 0);
   assert (idx < c->case_data->value_cnt);
@@ -339,7 +306,6 @@ union value *
 case_data_rw (struct ccase *c, size_t idx) 
 {
   assert (c != NULL);
-  assert (c->this == c);
   assert (c->case_data != NULL);
   assert (c->case_data->ref_cnt > 0);
   assert (idx < c->case_data->value_cnt);
@@ -405,7 +371,6 @@ const union value *
 case_data_all (const struct ccase *c) 
 {
   assert (c != NULL);
-  assert (c->this == c);
   assert (c->case_data != NULL);
   assert (c->case_data->ref_cnt > 0);
 
@@ -421,7 +386,6 @@ union value *
 case_data_all_rw (struct ccase *c) 
 {
   assert (c != NULL);
-  assert (c->this == c);
   assert (c->case_data != NULL);
   assert (c->case_data->ref_cnt > 0);
 
index 05c4568c6befe3f501cfcf65dd622ab10ee6023c..d0b9fc9dac540ca2cecdab682026bd824f3ab091 100644 (file)
@@ -30,9 +30,6 @@
 struct ccase 
   {
     struct case_data *case_data;        /* Actual data. */
-#if DEBUGGING
-    struct ccase *this;                 /* Detects unauthorized move/copy. */
-#endif
   };
 
 /* Invisible to user code. */
index a2ca8b23ee85f8b51285a6c8f61c422911f06638..4dcce32b0f8ec8ac467423d52c1d25ebf4cdb951 100644 (file)
@@ -219,7 +219,8 @@ internal_procedure (bool (*case_func) (const struct ccase *, void *),
   wc_data.case_func = case_func;
   wc_data.aux = aux;
   create_trns_case (&wc_data.trns_case, default_dict);
-  case_create (&wc_data.sink_case, dict_get_next_value_idx (default_dict));
+  case_create (&wc_data.sink_case,
+               dict_get_compacted_value_cnt (default_dict));
   wc_data.cases_written = 0;
 
   ok = proc_source->class->read (proc_source,
index 824216727ee68722e2f5657a2bfea1fc48935b27..ab68d8ca94128844bdaea66a9435bd4a826c14e7 100644 (file)
@@ -1,3 +1,8 @@
+Wed Jul 12 21:03:17 2006  Ben Pfaff  <blp@gnu.org>
+
+       * evaluate.c (cmd_debug_evaluate): Don't try to resize a null
+       case.
+
 Fri Jun  9 13:59:15 2006  Ben Pfaff  <blp@gnu.org>
 
        Reform string library.
index ac36d18110d558f69e41b1985f65b0f4c8837184..fd12a04b059de0b2972f8f86c8e43a5d3c9ea4c8 100644 (file)
@@ -163,9 +163,10 @@ cmd_debug_evaluate (void)
           if (c == NULL) 
             {
               c = xmalloc (sizeof *c);
-              case_nullify (c);
+              case_create (c, dict_get_next_value_idx (d));
             }
-          case_resize (c, old_value_cnt, dict_get_next_value_idx (d));
+          else
+            case_resize (c, old_value_cnt, dict_get_next_value_idx (d));
 
           if (lex_is_number ())
             case_data_rw (c, v->fv)->f = tokval;
index 2757aa167c60ae67972fc78af36de7a53a50bfd1..b7e72cc74cc01c5a800879a88e723056a15f5025 100644 (file)
@@ -1,3 +1,13 @@
+Wed Jul 12 21:03:37 2006  Ben Pfaff  <blp@gnu.org>
+
+       * table.c (tab_natural_width): Get rid of warning on empty column,
+       which tended to just trigger false positives because we handle
+       joined cells so badly.  We need a real fix, and the warning is not
+       helpful.
+
+       * table.c (tab_offset): [DEBUGGING] Let row, col arguments be as
+       big as row or column count.
+       
 Wed Jul 12 20:58:19 2006  Ben Pfaff  <blp@gnu.org>
 
        * output.c (outp_drivers): [DEBUGGING] Delete unused declaration.
index 430742d743f3c045c3f6c3c8f7f397db816826c5..8d5ed12b2155bd42214a4827efddd1cfce2c7db1 100644 (file)
@@ -435,10 +435,10 @@ tab_natural_width (struct tab_table *t, struct outp_driver *d, int c)
 
   if (width == 0)
     {
-      width = d->prop_em_width * 8;
-#if DEBUGGING
-      printf ("warning: table column %d contains no data.\n", c);
-#endif
+      /* FIXME: This is an ugly kluge to compensate for the fact
+         that we don't let joined cells contribute to column
+         widths. */
+      width = d->prop_em_width * 8; 
     }
   
   {
@@ -802,12 +802,12 @@ tab_offset (struct tab_table *t, int col, int row)
 
   assert (t != NULL);
 #if DEBUGGING
-  if (row < -1 || row >= t->nr)
+  if (row < -1 || row > t->nr)
     {
       printf ("tab_offset(): row=%d in %d-row table\n", row, t->nr);
       NOT_REACHED ();
     }
-  if (col < -1 || col >= t->nc)
+  if (col < -1 || col > t->nc)
     {
       printf ("tab_offset(): col=%d in %d-column table\n", col, t->nc);
       NOT_REACHED ();