| 
									
										
										
										
											2013-05-11 21:45:44 -04:00
										 |  |  | namespace factor { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-21 04:34:23 -05:00
										 |  |  | struct bump_allocator { | 
					
						
							| 
									
										
										
										
											2013-05-11 21:45:44 -04:00
										 |  |  |   /* offset of 'here' and 'end' is hardcoded in compiler backends */ | 
					
						
							|  |  |  |   cell here; | 
					
						
							|  |  |  |   cell start; | 
					
						
							|  |  |  |   cell end; | 
					
						
							|  |  |  |   cell size; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-05-12 23:20:43 -04:00
										 |  |  |   bump_allocator(cell size, cell start) | 
					
						
							|  |  |  |       : here(start), start(start), end(start + size), size(size) {} | 
					
						
							| 
									
										
										
										
											2013-05-11 21:45:44 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-21 04:34:23 -05:00
										 |  |  |   bool contains_p(object* obj) { return ((cell)obj - start) < size; } | 
					
						
							| 
									
										
										
										
											2013-05-11 21:45:44 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-21 04:34:23 -05:00
										 |  |  |   object* allot(cell size) { | 
					
						
							| 
									
										
										
										
											2013-05-11 21:45:44 -04:00
										 |  |  |     cell h = here; | 
					
						
							|  |  |  |     here = h + align(size, data_alignment); | 
					
						
							| 
									
										
										
										
											2014-11-21 04:34:23 -05:00
										 |  |  |     return (object*)h; | 
					
						
							| 
									
										
										
										
											2013-05-11 21:45:44 -04:00
										 |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   cell occupied_space() { return here - start; } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   cell free_space() { return end - here; } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-08-06 18:30:15 -04:00
										 |  |  |   void flush() { | 
					
						
							|  |  |  |     here = start; | 
					
						
							|  |  |  | #ifdef FACTOR_DEBUG
 | 
					
						
							|  |  |  |     /* In case of bugs, there may be bogus references pointing to the
 | 
					
						
							|  |  |  |        memory space after the gc has run. Filling it with a pattern | 
					
						
							|  |  |  |        makes accesses to such shadow data fail hard. */ | 
					
						
							|  |  |  |     memset_cell((void*)start, 0xbaadbaad, size); | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2009-10-07 12:59:59 -04:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | } |