help-smalltalk
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Help-smalltalk] Re: [GNU Smalltalk 3.0] testsuite: 117 failed


From: Paolo Bonzini
Subject: [Help-smalltalk] Re: [GNU Smalltalk 3.0] testsuite: 117 failed
Date: Tue, 15 Jan 2008 09:02:42 +0100
User-agent: Thunderbird 2.0.0.9 (Macintosh/20071031)

Paolo Bonzini wrote:
Hi,

I'm absolutely not sure that this patch will fix it, but it might. I don't see other places where there could be a GC bug.

Now, this is exactly the patch I *don't* want to put in a minor release. But this particular bug seems frequent, and a GC bug anyway has to be fixed as soon as possible.

This is the same patch, with the difference that this one is finished and works; I hoped to get a response overnight, but no problem.

Jochen, you may want to try this one too.

Paolo
2008-01-15  Paolo Bonzini  <address@hidden>

        * libgst/prims.def: Do not pop arguments that end up in an
        object that the primitive creates.

 
diff --git a/libgst/prims.def b/libgst/prims.def
index a243af4..7d92e3d 100644
--- a/libgst/prims.def
+++ b/libgst/prims.def
@@ -2204,16 +2204,17 @@ primitive VMpr_CompiledCode_verificationResult [succeed]
 /* CompiledBlock numArgs:numTemps:bytecodes:depth:literals: */
 primitive VMpr_CompiledBlock_create [succeed]
 {
-  OOP *_gst_literals = OOP_TO_OBJ (POP_OOP ())->data;
-  int depth = TO_INT (POP_OOP ());
-  OOP bytecodesOOP = POP_OOP ();
-  int blockTemps = TO_INT (POP_OOP ());
-  int blockArgs = TO_INT (POP_OOP ());
+  OOP *_gst_literals = OOP_TO_OBJ (STACK_AT (0))->data;
+  int depth = TO_INT (STACK_AT (1));
+  OOP bytecodesOOP = STACK_AT (2);
+  int blockTemps = TO_INT (STACK_AT (3));
+  int blockArgs = TO_INT (STACK_AT (4));
   bc_vector bytecodes = _gst_extract_bytecodes (bytecodesOOP);
 
   OOP block =
     _gst_block_new (blockArgs, blockTemps, bytecodes, depth, _gst_literals);
 
+  POP_N_OOPS (5);
   OOP_CLASS(block) = STACKTOP ();
 
   _gst_primitives_executed++;
@@ -2236,12 +2237,11 @@ primitive VMpr_CompiledMethod_create [succeed,fail]
   if (primitive == -1)
     PRIM_FAILED;
 
-  POP_N_OOPS(6);
-
   method = _gst_make_new_method (primitive, methodArgs, methodTemps, depth,
                                 literals, bytecodes, _gst_nil_oop,
                                 _gst_nil_oop, _gst_nil_oop, -1, -1);
 
+  POP_N_OOPS(6);
   OOP_CLASS(method) = STACKTOP ();
 
   _gst_primitives_executed++;
@@ -3914,22 +3914,21 @@ primitive VMpr_CObject_allocType [succeed,fail]
   OOP oop3;
   _gst_primitives_executed++;
 
-  oop1 = POP_OOP ();
-  oop2 = POP_OOP ();
-  oop3 = STACKTOP ();
+  oop1 = STACK_AT (0);
+  oop2 = STACK_AT (1);
+  oop3 = STACK_AT (2);
   if (IS_INT (oop2)
       && (IS_NIL (oop1) || is_a_kind_of (OOP_CLASS (oop1), _gst_c_type_class))
       && COMMON (RECEIVER_IS_A_KIND_OF (oop3, _gst_c_object_class)))
     {
-      intptr_t arg2;
-      PTR ptr;
-      arg2 = TO_INT (oop2);
-      ptr = xmalloc (arg2);
+      intptr_t arg2 = TO_INT (oop2);
+      PTR ptr = xmalloc (arg2);
+      OOP cObjectOOP = _gst_c_object_new (ptr, oop1, oop3);
 
-      SET_STACKTOP (_gst_c_object_new (ptr, oop1, oop3));
+      POP_N_OOPS (2);
+      SET_STACKTOP (cObjectOOP);
       PRIM_SUCCEEDED;
     }
-  UNPOP (2);
   PRIM_FAILED;
 }
 
@@ -4814,36 +4813,25 @@ primitive VMpr_String_ByteArray_asCData :
      prim_id VMpr_String_asCData [checks_receiver],
      prim_id VMpr_ByteArray_asCData [checks_receiver]
 {
-  PTR data;
-  int size;
   OOP oop1;
   OOP oop2;
   _gst_primitives_executed++;
 
-  oop2 = POP_OOP ();
-  oop1 = STACKTOP ();
-#ifndef OPTIMIZE
-  if ((IS_CLASS (oop1, _gst_string_class)
-       && id == prim_id (VMpr_String_asCData))
-      || (IS_CLASS (oop1, _gst_byte_array_class)
-         && id == prim_id (VMpr_ByteArray_asCData)))
+  oop2 = STACK_AT (0);
+  oop1 = STACK_AT (1);
+  if (is_a_kind_of (OOP_CLASS (oop2), _gst_c_type_class))
     {
-#endif
-      if (is_a_kind_of (OOP_CLASS (oop2), _gst_c_type_class))
+      int size = NUM_INDEXABLE_FIELDS (oop1);
+      PTR data = xmalloc (size);
+      if (data)
        {
-         size = NUM_INDEXABLE_FIELDS (oop1);
-         data = xmalloc (size);
-         if (data)
-           {
-             memcpy (data, OOP_TO_OBJ (oop1)->data, size);
-             SET_STACKTOP (_gst_c_object_new (data, oop2, 
_gst_c_object_class));
-             PRIM_SUCCEEDED;
-           }
+         OOP cObjectOOP = _gst_c_object_new (data, oop2, _gst_c_object_class);
+         memcpy (data, OOP_TO_OBJ (oop1)->data, size);
+         POP_OOP ();
+         SET_STACKTOP (cObjectOOP);
+         PRIM_SUCCEEDED;
        }
-#ifndef OPTIMIZE
     }
-#endif
-  UNPOP (1);
   PRIM_FAILED;
 }
 
@@ -5036,10 +5024,9 @@ primitive VMpr_CFuncDescriptor_create [succeed,fail]
   OOP oop4;
   _gst_primitives_executed++;
 
-  oop4 = POP_OOP ();
-  oop3 = POP_OOP ();
-  oop2 = POP_OOP ();
-  oop1 = POP_OOP ();
+  oop4 = STACK_AT (0);
+  oop3 = STACK_AT (1);
+  oop2 = STACK_AT (2);
 
   if (IS_CLASS (oop2, _gst_string_class)
       && (IS_CLASS (oop3, _gst_symbol_class)
@@ -5047,11 +5034,13 @@ primitive VMpr_CFuncDescriptor_create [succeed,fail]
       && (IS_CLASS (oop4, _gst_array_class)
          || IS_CLASS (oop4, _gst_undefined_object_class)))
     {
-      PUSH_OOP (_gst_make_descriptor (oop2, oop3, oop4));
+      OOP cFuncDescrOOP = _gst_make_descriptor (oop2, oop3, oop4);
+      POP_N_OOPS (3);
+      SET_STACKTOP (cFuncDescrOOP);
       PRIM_SUCCEEDED;
     }
-  UNPOP (4);
-  PRIM_FAILED;
+  else
+    PRIM_FAILED;
 }
 
 /* Object snapshot: aString */
@@ -5150,18 +5139,18 @@ primitive VMpr_FileDescriptor_fileOp [succeed,fail]
   OOP *oopVec = alloca (numArgs * sizeof (OOP));
   int i;
   intptr_t arg1;
+  OOP resultOOP;
 
   _gst_primitives_executed++;
 
   for (i = numArgs; --i >= 0;)
     oopVec[i] = POP_OOP ();
 
-  oop1 = STACKTOP ();
+  resultOOP = oop1 = STACKTOP ();
+  UNPOP (numArgs);
+
   if (!IS_INT (oopVec[0]))
-    {
-      UNPOP (numArgs);
-      PRIM_FAILED;
-    }
+    goto fail;
 
   arg1 = TO_INT (oopVec[0]);
   switch (arg1) {
@@ -5213,16 +5202,13 @@ primitive VMpr_FileDescriptor_fileOp [succeed,fail]
 
       xfree (fileName);
       if (fd < 0)
-        {
-         UNPOP (numArgs);
-         PRIM_FAILED;
-        }
+       goto fail;
 
       _gst_set_file_stream_file (oop1, fd, oopVec[1],
                                 is_pipe, access, false);
-    }
 
-    PRIM_SUCCEEDED;
+      goto succeed;
+    }
 
   case PRIM_MK_TEMP:
     fileName = _gst_to_cstring (oopVec[1]);
@@ -5233,31 +5219,27 @@ primitive VMpr_FileDescriptor_fileOp [succeed,fail]
     if (fd < 0)
       {
         xfree (fileName2);
-       UNPOP (numArgs);
-       PRIM_FAILED;
+       goto fail;
       }
     
     _gst_set_file_stream_file (oop1, fd, _gst_string_new (fileName2),
                               false, O_RDWR, false);
 
     xfree (fileName2);
-    PRIM_SUCCEEDED;
+    goto succeed;
   }
 
   fileStream = (gst_file_stream) OOP_TO_OBJ (oop1);
   if (!IS_INT (fileStream->file))
-    {
-      UNPOP (numArgs);
-      PRIM_FAILED;
-    }
+    goto fail;
 
   fd = TO_INT (fileStream->file);
   switch (arg1)
     {
 
     case PRIM_CLOSE_FILE:      /* FileDescriptor close */
-      SET_STACKTOP_INT (close (fd));
-      PRIM_SUCCEEDED;
+      resultOOP = FROM_INT (close (fd));
+      goto succeed;
 
     case PRIM_FSEEK_SET:               /* FileDescriptor position: position */
       if (IS_OFF_T (oopVec[1]) &&
@@ -5267,7 +5249,7 @@ primitive VMpr_FileDescriptor_fileOp [succeed,fail]
          break;
        }
       else
-       PRIM_SUCCEEDED;
+        goto succeed;
 
     case PRIM_FTELL:           /* FileDescriptor position */
       {
@@ -5278,19 +5260,24 @@ primitive VMpr_FileDescriptor_fileOp [succeed,fail]
            break;
          }
 
-       SET_STACKTOP (FROM_OFF_T (off));
-       PRIM_SUCCEEDED;
+       resultOOP = FROM_OFF_T (off);
+       goto succeed;
       }
 
     case PRIM_FEOF:
       {                                /* FileDescriptor atEnd */
        off_t oldPos;
        oldPos = lseek (fd, 0, SEEK_CUR);
-       SET_STACKTOP_BOOLEAN (oldPos >= 0
-                             && lseek (fd, 0, SEEK_END) == oldPos);
-       lseek (fd, oldPos, SEEK_SET);
+       if (oldPos >= 0 && lseek (fd, 0, SEEK_END) == oldPos)
+         resultOOP = _gst_true_oop;
+       else
+         {
+           resultOOP = _gst_false_oop;
+           if (oldPos >= 0)
+             lseek (fd, oldPos, SEEK_SET);
+         }
        errno = 0;
-       PRIM_SUCCEEDED;
+       goto succeed;
       }
 
     case PRIM_FSIZE:
@@ -5301,8 +5288,8 @@ primitive VMpr_FileDescriptor_fileOp [succeed,fail]
            errno = 0;
            break;
          }
-       SET_STACKTOP_INT (statBuf.st_size);
-       PRIM_SUCCEEDED;
+       resultOOP = FROM_INT (statBuf.st_size);
+       goto succeed;
       }
 
     case PRIM_PUT_CHARS:
@@ -5319,8 +5306,8 @@ primitive VMpr_FileDescriptor_fileOp [succeed,fail]
              result = _gst_write (fd, data + from - 1, to - from + 1);
              if (result >= 0)
                {
-                 SET_STACKTOP_INT (result);
-                 PRIM_SUCCEEDED;
+                 resultOOP = FROM_INT (result);
+                 goto succeed;
                }
            }
        }
@@ -5345,8 +5332,8 @@ primitive VMpr_FileDescriptor_fileOp [succeed,fail]
 
              if (result >= 0)
                {
-                 SET_STACKTOP_INT (result);
-                 PRIM_SUCCEEDED;
+                 resultOOP = FROM_INT (result);
+                 goto succeed;
                }
            }
        }
@@ -5385,8 +5372,8 @@ primitive VMpr_FileDescriptor_fileOp [succeed,fail]
 
              if (result >= 0)
                {
-                 SET_STACKTOP_INT (result);
-                 PRIM_SUCCEEDED;
+                 resultOOP = FROM_INT (result);
+                 goto succeed;
                }
            }
        }
@@ -5425,8 +5412,8 @@ primitive VMpr_FileDescriptor_fileOp [succeed,fail]
 
              if (result >= 0)
                {
-                 SET_STACKTOP_INT (result);
-                 PRIM_SUCCEEDED;
+                 resultOOP = FROM_INT (result);
+                 goto succeed;
                }
            }
        }
@@ -5440,7 +5427,7 @@ primitive VMpr_FileDescriptor_fileOp [succeed,fail]
          break;
 
        ftruncate (fd, pos);
-       PRIM_SUCCEEDED;
+       goto succeed;
       }
 
     case PRIM_FSEEK_CUR:               /* FileDescriptor skip: */
@@ -5448,7 +5435,7 @@ primitive VMpr_FileDescriptor_fileOp [succeed,fail]
          lseek (fd, TO_OFF_T (oopVec[1]), SEEK_CUR) < 0)
        break;
       else
-       PRIM_SUCCEEDED;
+       goto succeed;
 
     case PRIM_SYNC_POLL:
       {
@@ -5457,8 +5444,8 @@ primitive VMpr_FileDescriptor_fileOp [succeed,fail]
        result = _gst_sync_file_polling (fd, TO_INT (oopVec[1]));
        if (result >= 0)
          {
-           SET_STACKTOP_INT (result);
-           PRIM_SUCCEEDED;
+           resultOOP = FROM_INT (result);
+           goto succeed;
          }
       }
       break;
@@ -5470,7 +5457,7 @@ primitive VMpr_FileDescriptor_fileOp [succeed,fail]
        result =
          _gst_async_file_polling (fd, TO_INT (oopVec[1]), oopVec[2]);
        if (result >= 0)
-         PRIM_SUCCEEDED;
+         goto succeed;
       }
       break;
 
@@ -5479,25 +5466,21 @@ primitive VMpr_FileDescriptor_fileOp [succeed,fail]
        off_t result;
 
        result = lseek (fd, 0, SEEK_END);
-       if (result == -1)
+       if (result != -1)
          {
-           if (errno == ESPIPE || errno == EINVAL)
-             {
-               SET_STACKTOP (_gst_true_oop);
-               errno = 0;
-             }
-           else
-             PRIM_FAILED;
+           lseek (fd, result, SEEK_SET);
+           resultOOP = _gst_false_oop;
+           goto succeed;
          }
-       else
+       else if (errno == ESPIPE || errno == EINVAL)
          {
-           lseek (fd, result, SEEK_SET);
-           SET_STACKTOP (_gst_false_oop);
+           resultOOP = _gst_true_oop;
+           errno = 0;
+           goto succeed;
          }
 
-       PRIM_SUCCEEDED;
+       goto fail;
       }
-      break;
 
     case PRIM_SHUTDOWN_WRITE:
       shutdown (fd, 1);
@@ -5509,14 +5492,19 @@ primitive VMpr_FileDescriptor_fileOp [succeed,fail]
          errno = 0;
        }
 #endif
-      break;
+      goto succeed;
     }
 
+ fail:
   if (errno)
     _gst_set_errno (errno);
 
-  UNPOP (numArgs);
   PRIM_FAILED;
+
+ succeed:
+  POP_N_OOPS (numArgs);
+  SET_STACKTOP (resultOOP);
+  PRIM_SUCCEEDED;
 }
 
 /* FileDescriptor>>#socketOp..., socket version, variadic */
@@ -5525,7 +5513,7 @@ primitive VMpr_FileDescriptor_socketOp [succeed,fail]
 {
   gst_file_stream fileStream;
   int fd;
-  OOP oop1;
+  OOP oop1, resultOOP;
   OOP *oopVec = alloca (numArgs * sizeof (OOP));
   int i;
   intptr_t arg1;
@@ -5536,20 +5524,16 @@ primitive VMpr_FileDescriptor_socketOp [succeed,fail]
   for (i = numArgs; --i >= 0;)
     oopVec[i] = POP_OOP ();
 
-  oop1 = STACKTOP ();
+  resultOOP = oop1 = STACKTOP ();
+  UNPOP (numArgs);
   if (!IS_INT (oopVec[0]))
-    {
-      UNPOP (numArgs);
-      PRIM_FAILED;
-    }
+    goto fail;
 
   arg1 = TO_INT (oopVec[0]);
   fileStream = (gst_file_stream) OOP_TO_OBJ (oop1);
   if (IS_NIL (fileStream->file))
-    {
-      UNPOP (numArgs);
-      PRIM_FAILED;
-    }
+    goto fail;
+
   fd = TO_INT (fileStream->file);
   switch (arg1)
     {
@@ -5557,8 +5541,8 @@ primitive VMpr_FileDescriptor_socketOp [succeed,fail]
     case PRIM_CLOSE_FILE:      /* FileDescriptor close */
       {
         int result = closesocket (fd);
-        SET_STACKTOP_INT (result);
-        PRIM_SUCCEEDED;
+        resultOOP = FROM_INT (result);
+        goto succeed;
       }
 
     case PRIM_PUT_CHARS:
@@ -5578,8 +5562,8 @@ primitive VMpr_FileDescriptor_socketOp [succeed,fail]
                abort ();
              if (result >= 0)
                {
-                 SET_STACKTOP_INT (result);
-                 PRIM_SUCCEEDED;
+                 resultOOP = FROM_INT (result);
+                 goto succeed;
                }
            }
        }
@@ -5612,8 +5596,8 @@ primitive VMpr_FileDescriptor_socketOp [succeed,fail]
 
              if (result >= 0)
                {
-                 SET_STACKTOP_INT (result);
-                 PRIM_SUCCEEDED;
+                 resultOOP = FROM_INT (result);
+                 goto succeed;
                }
            }
        }
@@ -5626,8 +5610,8 @@ primitive VMpr_FileDescriptor_socketOp [succeed,fail]
        result = _gst_sync_file_polling (fd, TO_INT (oopVec[1]));
        if (result >= 0)
          {
-           SET_STACKTOP_INT (result);
-           PRIM_SUCCEEDED;
+           resultOOP = FROM_INT (result);
+           goto succeed;
          }
       }
       break;
@@ -5639,22 +5623,25 @@ primitive VMpr_FileDescriptor_socketOp [succeed,fail]
        result =
          _gst_async_file_polling (fd, TO_INT (oopVec[1]), oopVec[2]);
        if (result >= 0)
-         PRIM_SUCCEEDED;
+         goto succeed;
       }
       break;
 
     case PRIM_IS_PIPE:
-      {
-       SET_STACKTOP (_gst_true_oop);
-       PRIM_SUCCEEDED;
-      }
+      resultOOP =_gst_true_oop;
+      goto succeed;
       break;
     }
 
-  UNPOP (numArgs);
 #endif
 
+ fail:
   PRIM_FAILED;
+
+ succeed:
+  POP_N_OOPS (numArgs);
+  SET_STACKTOP (resultOOP);
+  PRIM_SUCCEEDED;
 }
 
 /* C callout primitives.  */

reply via email to

[Prev in Thread] Current Thread [Next in Thread]