Merge remote branch 'origin/master' into import-gui
[pspp] / src / data / casereader.c
index e50096f5e8cc10980ec93b5b682042072466d2c9..423a4dada271b432bef5ce8397f4f771b09e909a 100644 (file)
@@ -1,4 +1,4 @@
-/* PSPP - a program for statistical analysis.
+/* pspp - a program for statistical analysis.
    Copyright (C) 2007, 2009, 2010, 2013 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify
@@ -91,10 +91,10 @@ casereader_destroy (struct casereader *reader)
   bool ok = true;
   if (reader != NULL)
     {
-      //      reader->class->destroy (reader, reader->aux);
-      // ok = taint_destroy (reader->taint);
-      // caseproto_unref (reader->proto);
-      //  free (reader);
+      reader->class->destroy (reader, reader->aux);
+      ok = taint_destroy (reader->taint);
+      caseproto_unref (reader->proto);
+      free (reader);
     }
   return ok;
 }
@@ -239,12 +239,25 @@ static casenumber
 casereader_count_cases__ (const struct casereader *reader,
                           casenumber max_cases)
 {
-  struct casereader *clone = casereader_clone (reader);
-  casenumber n_cases = casereader_advance (clone, max_cases);
+  struct casereader *clone;
+  casenumber n_cases;
+
+  /* This seems to avoid a bug in Gcc 4.4.5 where, upon
+     return from this function, the stack appeared corrupt,
+     and the program returned to the wrong address.  Oddly
+     the problem only manifested itself when used in conjunction
+     with the ODS reader, in code such as:
+
+     GET DATA /TYPE=ODS ....
+     LIST.
+  */
 #if (__GNUC__ == 4 ) && (__GNUC_MINOR__ == 4)
-  // volatile int x = 1;
+  volatile int x = 1; x++;
 #endif
-  //  casereader_destroy (clone);
+
+  clone = casereader_clone (reader);
+  n_cases = casereader_advance (clone, max_cases);
+  casereader_destroy (clone);
   return n_cases;
 }