handle case where we can expand attributed variable stack
without having to grow stack physically.
This commit is contained in:
		
							
								
								
									
										68
									
								
								C/grow.c
									
									
									
									
									
								
							
							
						
						
									
										68
									
								
								C/grow.c
									
									
									
									
									
								
							| @@ -131,7 +131,10 @@ SetHeapRegs(void) | |||||||
|   /* Adjust stack addresses */ |   /* Adjust stack addresses */ | ||||||
|   Yap_TrailBase = TrailAddrAdjust(Yap_TrailBase); |   Yap_TrailBase = TrailAddrAdjust(Yap_TrailBase); | ||||||
|   Yap_TrailTop = TrailAddrAdjust(Yap_TrailTop); |   Yap_TrailTop = TrailAddrAdjust(Yap_TrailTop); | ||||||
|   Yap_GlobalBase = DelayAddrAdjust(Yap_GlobalBase); |   if (!(GDiff==0 && DelayDiff < 0)) { | ||||||
|  |     /* make sure we are not just expanding the delay stack */ | ||||||
|  |     Yap_GlobalBase = DelayAddrAdjust(Yap_GlobalBase); | ||||||
|  |   } | ||||||
|   Yap_LocalBase = LocalAddrAdjust(Yap_LocalBase); |   Yap_LocalBase = LocalAddrAdjust(Yap_LocalBase); | ||||||
| #if !USE_SYSTEM_MALLOC && !USE_DL_MALLOC | #if !USE_SYSTEM_MALLOC && !USE_DL_MALLOC | ||||||
|   AuxSp = PtoDelayAdjust(AuxSp); |   AuxSp = PtoDelayAdjust(AuxSp); | ||||||
| @@ -256,6 +259,18 @@ MoveHalfGlobal(CELL *OldPt) | |||||||
|   cpcellsd(NewPt, IntPt, diff); |   cpcellsd(NewPt, IntPt, diff); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | static void | ||||||
|  | MoveHalfAttrs(CELL *DTop, CELL *OldPt) | ||||||
|  | { | ||||||
|  | 	/* | ||||||
|  | 	 * cpcellsd(To,From,NOfCells) - copy the cells downwards - in | ||||||
|  | 	 * absmi.asm  | ||||||
|  | 	 */ | ||||||
|  |   UInt sz = sizeof(CELL)*(OldPt-DTop); | ||||||
|  |   char *base = (char *)DTop+DelayDiff; | ||||||
|  |   cpcellsd((CELL *)base, DTop, sz); | ||||||
|  | } | ||||||
|  |  | ||||||
| static inline CELL | static inline CELL | ||||||
| AdjustAppl(register CELL t0) | AdjustAppl(register CELL t0) | ||||||
| { | { | ||||||
| @@ -724,13 +739,19 @@ static_growglobal(long size, CELL **ptr, CELL *hsplit) | |||||||
|   size0 = size; |   size0 = size; | ||||||
|   if (hsplit) { |   if (hsplit) { | ||||||
|     /* just a little bit of sanity checking */ |     /* just a little bit of sanity checking */ | ||||||
|     if (hsplit < (CELL*)omax || |     if (hsplit < H0 && hsplit > (CELL *)Yap_GlobalBase) { | ||||||
|  |       /* expanding attributed variables */ | ||||||
|  |       if (omax - size > Yap_GlobalBase+4096*sizeof(CELL)) { | ||||||
|  | 	size = -size; | ||||||
|  |       } | ||||||
|  |     } else if (hsplit < (CELL*)omax || | ||||||
| 	hsplit > H) | 	hsplit > H) | ||||||
|       return FALSE; |       return FALSE; | ||||||
|     else if (hsplit == (CELL *)omax) |     else if (hsplit == (CELL *)omax) | ||||||
|       hsplit = NULL; |       hsplit = NULL; | ||||||
|     if (size+H < ASP-4096 && |     if (size < 0 || | ||||||
| 	hsplit > H0) { | 	(size+H < ASP-4096 && | ||||||
|  | 	 hsplit > H0)) { | ||||||
|       /* don't need to expand stacks */ |       /* don't need to expand stacks */ | ||||||
|       do_grow = FALSE; |       do_grow = FALSE; | ||||||
|     } |     } | ||||||
| @@ -787,13 +808,23 @@ static_growglobal(long size, CELL **ptr, CELL *hsplit) | |||||||
|   if (do_grow) { |   if (do_grow) { | ||||||
|     DelayDiff = size0; |     DelayDiff = size0; | ||||||
|     TrDiff = LDiff = GDiff = size+size0;   |     TrDiff = LDiff = GDiff = size+size0;   | ||||||
|  |     GDiff0 = DelayDiff; | ||||||
|   } else { |   } else { | ||||||
|     TrDiff = DelayDiff = LDiff = 0; |     TrDiff = LDiff = 0; | ||||||
|     GDiff = size;   |     if (size > 0) { | ||||||
|  |       DelayDiff = 0; | ||||||
|  |       GDiff = size;   | ||||||
|  |       GDiff0 = DelayDiff; | ||||||
|  |     } else { | ||||||
|  |       DelayDiff = size; | ||||||
|  |       GDiff = 0;   | ||||||
|  |       GDiff0 = 0; | ||||||
|  |     } | ||||||
|   } |   } | ||||||
|   GDiff0 = DelayDiff; |  | ||||||
|   if (hsplit) { |   if (hsplit) { | ||||||
|     GDiff = GDiff0+sz; |     if (size > 0) { | ||||||
|  |       GDiff = GDiff0+sz; | ||||||
|  |     } | ||||||
|     GSplit = hsplit; |     GSplit = hsplit; | ||||||
|   } else { |   } else { | ||||||
|     GSplit = NULL; |     GSplit = NULL; | ||||||
| @@ -802,7 +833,11 @@ static_growglobal(long size, CELL **ptr, CELL *hsplit) | |||||||
|   if (!do_grow) { |   if (!do_grow) { | ||||||
|     TrDiff = DelayDiff = LDiff = 0; |     TrDiff = DelayDiff = LDiff = 0; | ||||||
|     /* don't grow more than what we asked for */ |     /* don't grow more than what we asked for */ | ||||||
|     GDiff = size-(size0-sz);     |     if (size > 0) { | ||||||
|  |       GDiff = size-(size0-sz); | ||||||
|  |     } else { | ||||||
|  |       GDiff = 0; | ||||||
|  |     } | ||||||
|   } else if (minimal_request) { |   } else if (minimal_request) { | ||||||
|     DelayDiff = size-size0; |     DelayDiff = size-size0; | ||||||
|     TrDiff = LDiff = GDiff = size; |     TrDiff = LDiff = GDiff = size; | ||||||
| @@ -811,7 +846,12 @@ static_growglobal(long size, CELL **ptr, CELL *hsplit) | |||||||
|     DelayDiff = 0; |     DelayDiff = 0; | ||||||
|   } |   } | ||||||
|   if (hsplit) { |   if (hsplit) { | ||||||
|     GDiff0 = GDiff-size0; |     if (size > 0) { | ||||||
|  |       GDiff0 = GDiff-size0; | ||||||
|  |     } else { | ||||||
|  |       DelayDiff = size; | ||||||
|  |       GDiff0 = 0; | ||||||
|  |     } | ||||||
|     GSplit = hsplit; |     GSplit = hsplit; | ||||||
|   } else { |   } else { | ||||||
|     GDiff0 = DelayDiff; |     GDiff0 = DelayDiff; | ||||||
| @@ -824,7 +864,7 @@ static_growglobal(long size, CELL **ptr, CELL *hsplit) | |||||||
|   if (do_grow) { |   if (do_grow) { | ||||||
|     MoveLocalAndTrail(); |     MoveLocalAndTrail(); | ||||||
|     if (hsplit) { |     if (hsplit) { | ||||||
|       MoveGlobalWithHole(); | 	MoveGlobalWithHole(); | ||||||
|     } else { |     } else { | ||||||
|       MoveExpandedGlobal(); |       MoveExpandedGlobal(); | ||||||
|     } |     } | ||||||
| @@ -840,7 +880,11 @@ static_growglobal(long size, CELL **ptr, CELL *hsplit) | |||||||
|     *ptr = PtoLocAdjust(*ptr); |     *ptr = PtoLocAdjust(*ptr); | ||||||
|   } |   } | ||||||
|   if (hsplit) { |   if (hsplit) { | ||||||
|     MoveHalfGlobal(hsplit); |     if (!do_grow && size < 0) { | ||||||
|  |       MoveHalfAttrs(CurrentDelayTop,hsplit); | ||||||
|  |     } else { | ||||||
|  |       MoveHalfGlobal(hsplit); | ||||||
|  |     } | ||||||
|   } |   } | ||||||
|   YAPLeaveCriticalSection(); |   YAPLeaveCriticalSection(); | ||||||
|   ASP += 256; |   ASP += 256; | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user