summaryrefslogtreecommitdiff
path: root/lang/schemetoc/files/patch-ac
blob: 790f18a3cf29310dbdb7095abca396f005b29cd0 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
--- scrt/callcc.c.orig	Wed Feb 24 08:25:41 1993
+++ scrt/callcc.c	Wed Feb  2 22:22:22 2000
@@ -91,6 +91,11 @@
 #define  SETJMP( x )		sc_setjmp( x )
 #endif
 
+#ifdef FREEBSD
+#define  LONGJMP( x, y )	longjmp( x, y )
+#define  SETJMP( x )		setjmp( x )
+#endif
+
 TSCP  sc_clink;		/* Pointer to inner most continuation on stack. */
 
 /* Static declarations for data structures internal to the module.  These
@@ -192,6 +197,17 @@
 	STACKPTR( tos );
  	count = (((STACK_BYTES (bfp, tos)) + ((sizeof (S2CINT)) - 1))
 		 / (sizeof (S2CINT)));
+#ifdef LAZY_STACK_POP
+	/* NOTE WELL!
+	 * For machines that must pop arguments after a function call, 
+	 * the compiler may let arguments accumulate on the stack for several 
+	 * function calls and pop them all at once.
+	 * If your compiler uses this optimization, 'count' must be incremented
+	 * by the number of S2CINTs pushed as arguments between this point and 
+	 * the point where 'bcount' is computed.
+	 */
+	count += LAZY_STACK_INCREMENT;
+#endif
 	save_fp = (S2CINT*)bfp;
 	cp = sc_allocateheap( NULLCONTINUATIONSIZE+count+2+sc_maxdisplay,
 			      CONTINUATIONTAG,
@@ -199,6 +215,13 @@
 	STACKPTR( tos );	
 	fp = save_fp;
 	bcount = (STACK_BYTES (fp, tos));
+	if (bcount > count*sizeof(S2CINT))
+	    /* If you get this error, look above at LAZY_STACK_POP */
+	    sc_error( "CALL-WITH-CURRENT-CONTINUATION",
+		     "internal error: want to write ~s bytes of stack, "
+		     "but only ~s bytes allocated.",
+		      LIST2( C_FIXED( bcount ),
+			     C_FIXED( count*sizeof(S2CINT) ) ) );
 	cp->continuation.continuation = sc_clink;
 	cp->continuation.stackbytes = bcount;
 	cp->continuation.stacktrace = sc_stacktrace;