[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