[pypy-commit] pypy stacklet: Fix the assert... :-/

arigo noreply at buildbot.pypy.org
Sun Aug 7 19:08:54 CEST 2011


Author: Armin Rigo <arigo at tunes.org>
Branch: stacklet
Changeset: r46350:c2f583445aee
Date: 2011-08-07 19:10 +0200
http://bitbucket.org/pypy/pypy/changeset/c2f583445aee/

Log:	Fix the assert... :-/

diff --git a/pypy/translator/c/src/stacklet/stacklet.c b/pypy/translator/c/src/stacklet/stacklet.c
--- a/pypy/translator/c/src/stacklet/stacklet.c
+++ b/pypy/translator/c/src/stacklet/stacklet.c
@@ -279,8 +279,8 @@
 {
     long stackmarker;
     assert((char *)NULL < (char *)&stackmarker);
-    if (thrd->g_current_stack_stop < (char *)&stackmarker)
-        thrd->g_current_stack_stop = (char *)&stackmarker;
+    if (thrd->g_current_stack_stop <= (char *)&stackmarker)
+        thrd->g_current_stack_stop = ((char *)&stackmarker) + 1;
 
     thrd->g_current_stack_marker = (char *)&stackmarker;
     _stacklet_initialstub(thrd, run, run_arg);
@@ -291,8 +291,8 @@
                                 stacklet_handle target)
 {
     long stackmarker;
-    if (thrd->g_current_stack_stop < (char *)&stackmarker)
-        thrd->g_current_stack_stop = (char *)&stackmarker;
+    if (thrd->g_current_stack_stop <= (char *)&stackmarker)
+        thrd->g_current_stack_stop = ((char *)&stackmarker) + 1;
 
     thrd->g_target = target;
     _stacklet_switchstack(g_save_state, g_restore_state, thrd);
@@ -315,12 +315,18 @@
 {
   char *p = (char *)ptr;
   long delta = p - context->stack_start;
-  assert(((unsigned long)delta) <
-         (unsigned long)(context->stack_stop - context->stack_start));
   if (((unsigned long)delta) < ((unsigned long)context->stack_saved)) {
-    /* a pointer to a saved away word */
-    char *c = (char *)(context + 1);
-    return (char **)(c + delta);
+      /* a pointer to a saved away word */
+      char *c = (char *)(context + 1);
+      return (char **)(c + delta);
+  }
+  if (((unsigned long)delta) >=
+      (unsigned long)(context->stack_stop - context->stack_start)) {
+      /* out-of-stack pointer!  it's only ok if we are the main stacklet
+         and we are reading past the end, because the main stacklet's
+         stack stop is not exactly known. */
+      assert(delta >= 0);
+      assert(((long)context->stack_stop) & 1);
   }
   return ptr;
 }


More information about the pypy-commit mailing list