Changeset 3676
- Timestamp:
- 04/10/05 17:51:25 (4 years ago)
- Files:
-
- branches/2.2/src/ChangeLog.Meadow (modified) (1 diff)
- branches/2.2/src/alloc.c (modified) (15 diffs)
- branches/2.2/src/fontset.c (modified) (2 diffs)
- branches/2.2/src/lisp.h (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
branches/2.2/src/ChangeLog.Meadow
r3675 r3676 1 2005-04-10 MIYOSHI Masanori <miyoshi@meadowy.org> 2 3 * lisp.h (struct Lisp_Float): New member `gcmarkbit'. This is a 4 hack for portable dumper. 5 6 * alloc.c (FLOAT_BLOCK_SIZE): Undo the last change. 7 (GETMARKBIT): Removed. 8 (SETMARKBIT): Ditto. 9 (UNSETMARKBIT): Ditto. 10 (FLOAT_BLOCK): Ditto. 11 (FLOAT_INDEX): Ditto. 12 (struct float_block): Undo the last change. 13 (FLOAT_MARKED_P): Refer to `gcmarkbit'. This is a hack for 14 portable dumper. 15 (FLOAT_MARK): Ditto. 16 (FLOAT_UNMARK): Ditto. 17 (make_float): Initialize the allocated memory to clean up 18 `gcmarkbit'. 19 (PDUMP_BLOCK_HASH_SIZE): Removed. 20 (struct pdump_block): Removed. 21 (pdump_block_hash): Ditto. 22 (pdump_block_hash_value): Ditto. 23 (pdump_put_block_hash): Ditto. 24 (pdump_get_block_hash): Ditto. 25 (initialize_block_hash): Ditto. 26 (pdump_float_blocks_size): Ditto. 27 (pdump_register_object): Undo the last change. 28 (pdump_forward_object): Ditto. 29 (pdump_write_objects): Ditto. 30 (pdump): Ditto. 31 (PDUMP_RELOCATE): Ditto. 32 (pdump_load): Ditto. 33 (pdump_relocate_objects): Ditto. 34 (unmark_pdumped_objects): Ditto. 35 36 * fontset.c (lookup_overriding_fontspec): Invalidate for Meadow. 37 1 38 2005-04-10 MIYOSHI Masanori <miyoshi@meadowy.org> 2 39 branches/2.2/src/alloc.c
r3671 r3676 2473 2473 any new float cells from the latest float_block. */ 2474 2474 2475 #define FLOAT_BLOCK_SIZE \ 2476 (((BLOCK_BYTES - sizeof (struct float_block *) \ 2477 /* The compiler might add padding at the end. */ \ 2478 - (sizeof (struct Lisp_Float) - sizeof (int))) * CHAR_BIT) \ 2479 / (sizeof (struct Lisp_Float) * CHAR_BIT + 1)) 2480 2481 #define GETMARKBIT(block,n) \ 2482 (((block)->gcmarkbits[(n) / (sizeof(int) * CHAR_BIT)] \ 2483 >> ((n) % (sizeof(int) * CHAR_BIT))) \ 2484 & 1) 2485 2486 #define SETMARKBIT(block,n) \ 2487 (block)->gcmarkbits[(n) / (sizeof(int) * CHAR_BIT)] \ 2488 |= 1 << ((n) % (sizeof(int) * CHAR_BIT)) 2489 2490 #define UNSETMARKBIT(block,n) \ 2491 (block)->gcmarkbits[(n) / (sizeof(int) * CHAR_BIT)] \ 2492 &= ~(1 << ((n) % (sizeof(int) * CHAR_BIT))) 2493 2494 #define FLOAT_BLOCK(fptr) \ 2495 ((struct float_block *)(((EMACS_UINT)(fptr)) & ~(BLOCK_ALIGN - 1))) 2496 2497 #define FLOAT_INDEX(fptr) \ 2498 ((((EMACS_UINT)(fptr)) & (BLOCK_ALIGN - 1)) / sizeof (struct Lisp_Float)) 2475 #define FLOAT_BLOCK_SIZE \ 2476 ((1020 - sizeof (struct float_block *)) / sizeof (struct Lisp_Float)) 2499 2477 2500 2478 struct float_block … … 2502 2480 /* Place `floats' at the beginning, to ease up FLOAT_INDEX's job. */ 2503 2481 struct Lisp_Float floats[FLOAT_BLOCK_SIZE]; 2504 int gcmarkbits[1 + FLOAT_BLOCK_SIZE / (sizeof(int) * CHAR_BIT)];2505 2482 struct float_block *next; 2506 2483 }; 2507 2484 2508 2485 #define FLOAT_MARKED_P(fptr) \ 2509 GETMARKBIT (FLOAT_BLOCK (fptr), FLOAT_INDEX ((fptr)))2486 ((fptr)->gcmarkbit) 2510 2487 2511 2488 #define FLOAT_MARK(fptr) \ 2512 SETMARKBIT (FLOAT_BLOCK (fptr), FLOAT_INDEX ((fptr)))2489 ((fptr)->gcmarkbit = 1) 2513 2490 2514 2491 #define FLOAT_UNMARK(fptr) \ 2515 UNSETMARKBIT (FLOAT_BLOCK (fptr), FLOAT_INDEX ((fptr)))2492 ((fptr)->gcmarkbit = 0) 2516 2493 2517 2494 /* Current float_block. */ … … 2578 2555 new = (struct float_block *) lisp_align_malloc (sizeof *new, 2579 2556 MEM_TYPE_FLOAT); 2557 bzero ((char *) new, sizeof (*new)); 2580 2558 new->next = float_block; 2581 bzero ((char *) new->gcmarkbits, sizeof new->gcmarkbits);2582 2559 float_block = new; 2583 2560 float_block_index = 0; … … 6097 6074 #define PDUMP_HASH_TABLE_SIZE 7 /* for Lisp_Hash_Table */ 6098 6075 #define PDUMP_OFFSET 12289 6099 #define PDUMP_BLOCK_HASH_SIZE 716100 6076 6101 6077 static pdump_forward **pdump_hash; … … 6303 6279 } 6304 6280 6305 /* Struct to hold a element of blocks in a hash table. */6306 typedef struct pdump_block6307 {6308 void *obj;6309 int block_index;6310 int element_index;6311 struct pdump_block *next;6312 } pdump_block;6313 6314 static pdump_block **pdump_block_hash;6315 6316 /* calculate hash value for Lisp_Object */6317 static int6318 pdump_block_hash_value (void *obj)6319 {6320 return ((unsigned long) obj >> 3) % PDUMP_BLOCK_HASH_SIZE;6321 }6322 6323 /* put given Lisp_Object to pdump_block_hash */6324 static void6325 pdump_put_block_hash (void *obj, int block_index, int element_index)6326 {6327 int idx = pdump_block_hash_value (obj);6328 pdump_block **prev = &pdump_block_hash[idx];6329 pdump_block *f = pdump_block_hash[idx];6330 6331 while (f != 0)6332 {6333 if (f->obj == obj)6334 return;6335 prev = &(*prev)->next;6336 f = f->next;6337 }6338 f = (pdump_block *) xmalloc (sizeof (*f));6339 f->obj = obj;6340 f->block_index = block_index;6341 f->element_index = element_index;6342 f->next = NULL;6343 *prev = f;6344 }6345 6346 /* retrieve pdump_forward entry of given Lisp_Object */6347 static pdump_block *6348 pdump_get_block_hash (void *obj)6349 {6350 pdump_block *f = pdump_block_hash[pdump_block_hash_value (obj)];6351 6352 while (f != 0)6353 {6354 if (f->obj == obj)6355 return f;6356 f = f->next;6357 }6358 return 0;6359 }6360 6361 static void6362 initialize_block_hash (void)6363 {6364 struct float_block *p = float_block;6365 int n = float_block_index;6366 int i, j = 0;6367 6368 while (p)6369 {6370 for (i = 0; i < n; i++)6371 {6372 pdump_put_block_hash ((void *) &p->floats[i], j, i);6373 }6374 p = p->next;6375 n = FLOAT_BLOCK_SIZE;6376 j++;6377 }6378 }6379 6380 static unsigned long6381 pdump_float_blocks_size (void)6382 {6383 return sizeof (struct float_block) * n_float_blocks + sizeof (pdump_block);6384 }6385 6386 6281 /* Register given object for pdump_hash and pdump_lisp_object[type] */ 6387 6282 static void … … 6390 6285 { 6391 6286 assert (pdump_get_hash (obj) == 0); 6392 6393 switch (type) 6394 { 6395 case PDUMP_FLOAT: 6396 { 6397 pdump_block *pb = pdump_get_block_hash (XFLOAT (obj)); 6398 unsigned long offset; 6399 6400 offset = (pb->block_index * sizeof (struct float_block) 6401 + pb->element_index * sizeof (struct Lisp_Float)); 6402 pdump_put_hash (obj, offset, size); 6403 } 6404 break; 6405 6406 default: 6407 pdump_put_hash (obj, pdump_lisp_object[type].size, size); 6408 pdump_lisp_object[type].size += size; 6409 pdump_lisp_object[type].objects[pdump_lisp_object[type].index++] = obj; 6410 if (pdump_lisp_object[type].index > pdump_lisp_object[type].objects_size) 6411 { 6412 pdump_lisp_object[type].objects_size *= 2; 6413 pdump_lisp_object[type].objects = 6414 xrealloc (pdump_lisp_object[type].objects, 6415 sizeof (Lisp_Object) * pdump_lisp_object[type].objects_size); 6416 } 6417 break; 6287 pdump_put_hash (obj, pdump_lisp_object[type].size, size); 6288 pdump_lisp_object[type].size += size; 6289 pdump_lisp_object[type].objects[pdump_lisp_object[type].index++] = obj; 6290 if (pdump_lisp_object[type].index > pdump_lisp_object[type].objects_size) 6291 { 6292 pdump_lisp_object[type].objects_size *= 2; 6293 pdump_lisp_object[type].objects = 6294 xrealloc (pdump_lisp_object[type].objects, 6295 sizeof (Lisp_Object) * pdump_lisp_object[type].objects_size); 6418 6296 } 6419 6297 } … … 6805 6683 6806 6684 addr = f->offset + PDUMP_OFFSET + sizeof (pdump_header_type); 6807 switch (type) 6808 { 6809 case PDUMP_FLOAT: 6810 for (i = 0; i < PDUMP_OBJECT_LIMIT; i++) 6811 addr += pdump_lisp_object[i].size; 6812 break; 6813 6814 default: 6815 for (i = 0; i < type; i++) 6816 addr += pdump_lisp_object[i].size; 6817 break; 6818 } 6685 for (i = 0; i < type; i++) 6686 addr += pdump_lisp_object[i].size; 6819 6687 XSET (new_obj, XTYPE (obj), addr); 6820 6688 return new_obj; … … 6951 6819 fwrite (&new, size, 1, pdump_stream); 6952 6820 } 6821 for (i = 0; i < pdump_lisp_object[PDUMP_FLOAT].index; i++) 6822 { 6823 Lisp_Object obj = pdump_lisp_object[PDUMP_FLOAT].objects[i]; 6824 int size = sizeof (struct Lisp_Float); 6825 fwrite (XFLOAT (obj), size, 1, pdump_stream); 6826 } 6953 6827 for (i = 0; i < pdump_lisp_object[PDUMP_HASH_TABLE].index; i ++) 6954 6828 { … … 7112 6986 bzero (pdump_hash_table, sizeof (*pdump_hash_table) * PDUMP_HASH_TABLE_SIZE); 7113 6987 7114 pdump_block_hash = (pdump_block **)7115 xmalloc (sizeof (*pdump_block_hash) * PDUMP_BLOCK_HASH_SIZE);7116 bzero (pdump_block_hash, sizeof (*pdump_block_hash) * PDUMP_BLOCK_HASH_SIZE);7117 initialize_block_hash ();7118 7119 6988 pdump_stream = fopen ("emacs.dmp", "w"); 7120 6989 … … 7167 7036 header.hash_table_length, header.hash_table_size, 7168 7037 header.vector_length, header.vector_size)); 7169 7170 /* write float blocks */7171 {7172 struct float_block *p = float_block;7173 unsigned long offset = PDUMP_OFFSET + sizeof (pdump_header_type);7174 struct pdump_block_table bt;7175 7176 for (i = 0; i < PDUMP_OBJECT_LIMIT; i++)7177 offset += pdump_lisp_object[i].size;7178 7179 bt.block = (struct float_block *) offset;7180 bt.block_index = float_block_index;7181 bt.n_blocks = n_float_blocks;7182 7183 while (p)7184 {7185 struct float_block fb = *p;7186 7187 if (fb.next)7188 fb.next = (struct float_block *) (offset7189 + sizeof (struct float_block));7190 fwrite (&fb, sizeof (fb), 1, pdump_stream);7191 p = p->next;7192 offset += sizeof (struct float_block);7193 }7194 fwrite (&bt, sizeof (bt), 1, pdump_stream);7195 }7196 7038 7197 7039 /* write misc */ … … 7300 7142 xfree (pdump_hash); 7301 7143 7302 for (i = 0; i < PDUMP_BLOCK_HASH_SIZE; i++)7303 {7304 pdump_block *f = pdump_block_hash[i], *next;7305 7306 while (f != 0)7307 {7308 next = f->next;7309 xfree (f);7310 f = next;7311 }7312 }7313 xfree (pdump_block_hash);7314 7315 7144 #ifdef PDUMP_DEBUG 7316 7145 assert (pure_bytes_used == 0); … … 7324 7153 if (! INTEGERP (obj) \ 7325 7154 && pdump_objects_start <= p_r_ptr \ 7326 && (p_r_ptr < pdump_objects_start + pdump_header.objects_size \ 7327 + pdump_float_blocks_size ())) \ 7155 && p_r_ptr < pdump_objects_start + pdump_header.objects_size) \ 7328 7156 XSET ((obj), XTYPE (obj), p_r_ptr); \ 7329 7157 } \ … … 7591 7419 PDUMP_MESSAGE (("Loading root objects... \n")); 7592 7420 lseek (fd, pdump_header.objects_size + sizeof (pdump_header_type), SEEK_SET); 7593 7594 /* load float blocks */7595 {7596 struct float_block fb, *p;7597 struct pdump_block_table bt;7598 int count = 0;7599 7600 do7601 {7602 read (fd, &fb, sizeof (fb));7603 }7604 while (fb.next);7605 7606 read (fd, &bt, sizeof (bt));7607 float_block = (struct float_block * )((unsigned long) bt.block7608 + offset);7609 float_block_index = bt.block_index;7610 n_float_blocks = bt.n_blocks;7611 7612 /* relocation */7613 p = float_block;7614 while (p)7615 {7616 if (p->next)7617 p->next = (struct float_block * ) ((unsigned long) p->next + offset);7618 p = p->next;7619 }7620 }7621 7622 7421 for (staticidx = 0; staticidx < pdump_header.root_objects_length; staticidx++) 7623 7422 { … … 7869 7668 obj_ptr += sizeof (struct Lisp_Symbol); 7870 7669 } 7670 for (i = 0; i < pdump_header.float_length; i++) 7671 obj_ptr += sizeof (struct Lisp_Float); 7871 7672 for (i = 0; i < pdump_header.hash_table_length; i ++) 7872 7673 obj_ptr += PDUMP_LISP_HASH_TABLE_SIZE; … … 7977 7778 assert (pdump_object_start_address (PDUMP_FLOAT) == obj_ptr); 7978 7779 #endif 7979 { 7980 struct float_block *p = float_block; 7981 int n = float_block_index; 7982 int i; 7983 7984 while (p) 7985 { 7986 for (i = 0; i < n; i++) 7987 { 7988 if (FLOAT_MARKED_P (&p->floats[i])) 7989 FLOAT_UNMARK (&p->floats[i]); 7990 } 7991 p = p->next; 7992 n = FLOAT_BLOCK_SIZE; 7993 } 7994 } 7995 7780 for (i = 0; i < pdump_header.float_length; i++) 7781 { 7782 struct Lisp_Float *ptr = (struct Lisp_Float *)obj_ptr; 7783 if (FLOAT_MARKED_P (ptr)) 7784 FLOAT_UNMARK (ptr); 7785 obj_ptr += sizeof (struct Lisp_Float); 7786 } 7996 7787 #ifdef PDUMP_DEBUG 7997 7788 assert (pdump_object_start_address (PDUMP_HASH_TABLE) == obj_ptr); branches/2.2/src/fontset.c
r3674 r3676 253 253 254 254 255 #ifndef MEADOW 255 256 static Lisp_Object 256 257 lookup_overriding_fontspec (frame, c) … … 292 293 return Qnil; 293 294 } 295 #endif /* not MEADOW */ 294 296 295 297 #define FONTSET_REF_VIA_BASE(fontset, c) fontset_ref_via_base (fontset, &c) branches/2.2/src/lisp.h
r3673 r3676 1271 1271 struct Lisp_Float 1272 1272 { 1273 #ifdef MEADOW 1274 /* Hack for portable dumper. This sholud be removed! */ 1275 unsigned gcmarkbit : 1; 1276 int spacer : 15; 1277 #endif 1273 1278 #ifdef HIDE_LISP_IMPLEMENTATION 1274 1279 double data_;
