shrink union header size
This commit is contained in:
		
							parent
							
								
									470eaa485d
								
							
						
					
					
						commit
						fae4e28396
					
				|  | @ -8,7 +8,6 @@ union header { | |||
|   struct { | ||||
|     union header *ptr; | ||||
|     size_t size; | ||||
|     char mark; | ||||
|   } s; | ||||
| }; | ||||
| 
 | ||||
|  | @ -262,21 +261,13 @@ static void gc_mark_object(pic_state *, union object *); | |||
| static bool | ||||
| gc_obj_is_marked(struct pic_object *obj) | ||||
| { | ||||
|   union header *p; | ||||
| 
 | ||||
|   p = ((union header *)obj) - 1; | ||||
| 
 | ||||
|   return p->s.mark == PIC_GC_MARK; | ||||
|   return obj->gc_mark == PIC_GC_MARK; | ||||
| } | ||||
| 
 | ||||
| static void | ||||
| gc_unmark_object(struct pic_object *obj) | ||||
| { | ||||
|   union header *p; | ||||
| 
 | ||||
|   p = ((union header *)obj) - 1; | ||||
| 
 | ||||
|   p->s.mark = PIC_GC_UNMARK; | ||||
|   obj->gc_mark = PIC_GC_UNMARK; | ||||
| } | ||||
| 
 | ||||
| static void | ||||
|  | @ -291,15 +282,11 @@ gc_mark(pic_state *pic, pic_value v) | |||
| static void | ||||
| gc_mark_object(pic_state *pic, union object *obj) | ||||
| { | ||||
|   union header *p; | ||||
| 
 | ||||
|  loop: | ||||
| 
 | ||||
|   p = ((union header *)obj) - 1; | ||||
| 
 | ||||
|   if (p->s.mark == PIC_GC_MARK) | ||||
|   if (obj->obj.gc_mark == PIC_GC_MARK) | ||||
|     return; | ||||
|   p->s.mark = PIC_GC_MARK; | ||||
|   obj->obj.gc_mark = PIC_GC_MARK; | ||||
| 
 | ||||
| #define LOOP(o) obj = (union object *)(o); goto loop | ||||
| 
 | ||||
|  | @ -638,6 +625,7 @@ static size_t | |||
| gc_sweep_page(pic_state *pic, struct heap_page *page) | ||||
| { | ||||
|   union header *bp, *p, *head = NULL, *tail = NULL; | ||||
|   union object *obj; | ||||
|   size_t alive = 0; | ||||
| 
 | ||||
|   for (bp = page->basep; ; bp = bp->s.ptr) { | ||||
|  | @ -646,8 +634,9 @@ gc_sweep_page(pic_state *pic, struct heap_page *page) | |||
|       if (p < page->basep || page->endp <= p) { | ||||
|         goto escape; | ||||
|       } | ||||
|       if (p->s.mark == PIC_GC_MARK) { | ||||
|         p->s.mark = PIC_GC_UNMARK; | ||||
|       obj = (union object *)(p + 1); | ||||
|       if (obj->obj.gc_mark == PIC_GC_MARK) { | ||||
|         obj->obj.gc_mark = PIC_GC_UNMARK; | ||||
|         alive += p->s.size; | ||||
|       } else { | ||||
|         if (head == NULL) { | ||||
|  |  | |||
|  | @ -162,7 +162,8 @@ enum pic_tt { | |||
| }; | ||||
| 
 | ||||
| #define PIC_OBJECT_HEADER			\ | ||||
|   enum pic_tt tt; | ||||
|   enum pic_tt tt;                               \ | ||||
|   char gc_mark; | ||||
| 
 | ||||
| struct pic_object { | ||||
|   PIC_OBJECT_HEADER | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	 Yuichi Nishiwaki
						Yuichi Nishiwaki