Mercurial > emacs
comparison src/alloc.c @ 66777:25bf8ea82843
(valid_lisp_object_p): New function to validate that
an object is really a valid Lisp_Object.
| author | Kim F. Storm <storm@cua.dk> |
|---|---|
| date | Wed, 09 Nov 2005 23:14:12 +0000 |
| parents | 6ab8d86f8a2b |
| children | e485868e3caf |
comparison
equal
deleted
inserted
replaced
| 66776:2acb0afcc57a | 66777:25bf8ea82843 |
|---|---|
| 4482 #if GC_MARK_STACK == GC_MARK_STACK_CHECK_GCPROS | 4482 #if GC_MARK_STACK == GC_MARK_STACK_CHECK_GCPROS |
| 4483 check_gcpros (); | 4483 check_gcpros (); |
| 4484 #endif | 4484 #endif |
| 4485 } | 4485 } |
| 4486 | 4486 |
| 4487 | |
| 4488 #endif /* GC_MARK_STACK != 0 */ | 4487 #endif /* GC_MARK_STACK != 0 */ |
| 4488 | |
| 4489 | |
| 4490 | |
| 4491 /* Return 1 if OBJ is a valid lisp object. | |
| 4492 Return 0 if OBJ is NOT a valid lisp object. | |
| 4493 Return -1 if we cannot validate OBJ. | |
| 4494 */ | |
| 4495 | |
| 4496 int | |
| 4497 valid_lisp_object_p (obj) | |
| 4498 Lisp_Object obj; | |
| 4499 { | |
| 4500 #if !GC_MARK_STACK | |
| 4501 /* Cannot determine this. */ | |
| 4502 return -1; | |
| 4503 #else | |
| 4504 void *p; | |
| 4505 struct mem_node *m; | |
| 4506 | |
| 4507 if (INTEGERP (obj)) | |
| 4508 return 1; | |
| 4509 | |
| 4510 p = (void *) XPNTR (obj); | |
| 4511 | |
| 4512 if (PURE_POINTER_P (p)) | |
| 4513 return 1; | |
| 4514 | |
| 4515 m = mem_find (p); | |
| 4516 | |
| 4517 if (m == MEM_NIL) | |
| 4518 return 0; | |
| 4519 | |
| 4520 switch (m->type) | |
| 4521 { | |
| 4522 case MEM_TYPE_NON_LISP: | |
| 4523 return 0; | |
| 4524 | |
| 4525 case MEM_TYPE_BUFFER: | |
| 4526 return live_buffer_p (m, p); | |
| 4527 | |
| 4528 case MEM_TYPE_CONS: | |
| 4529 return live_cons_p (m, p); | |
| 4530 | |
| 4531 case MEM_TYPE_STRING: | |
| 4532 return live_string_p (m, p); | |
| 4533 | |
| 4534 case MEM_TYPE_MISC: | |
| 4535 return live_misc_p (m, p); | |
| 4536 | |
| 4537 case MEM_TYPE_SYMBOL: | |
| 4538 return live_symbol_p (m, p); | |
| 4539 | |
| 4540 case MEM_TYPE_FLOAT: | |
| 4541 return live_float_p (m, p); | |
| 4542 | |
| 4543 case MEM_TYPE_VECTOR: | |
| 4544 case MEM_TYPE_PROCESS: | |
| 4545 case MEM_TYPE_HASH_TABLE: | |
| 4546 case MEM_TYPE_FRAME: | |
| 4547 case MEM_TYPE_WINDOW: | |
| 4548 return live_vector_p (m, p); | |
| 4549 | |
| 4550 default: | |
| 4551 break; | |
| 4552 } | |
| 4553 | |
| 4554 return 0; | |
| 4555 #endif | |
| 4556 } | |
| 4557 | |
| 4489 | 4558 |
| 4490 | 4559 |
| 4491 | 4560 |
| 4492 /*********************************************************************** | 4561 /*********************************************************************** |
| 4493 Pure Storage Management | 4562 Pure Storage Management |
| 4965 total += total_string_size; | 5034 total += total_string_size; |
| 4966 total += total_vector_size * sizeof (Lisp_Object); | 5035 total += total_vector_size * sizeof (Lisp_Object); |
| 4967 total += total_floats * sizeof (struct Lisp_Float); | 5036 total += total_floats * sizeof (struct Lisp_Float); |
| 4968 total += total_intervals * sizeof (struct interval); | 5037 total += total_intervals * sizeof (struct interval); |
| 4969 total += total_strings * sizeof (struct Lisp_String); | 5038 total += total_strings * sizeof (struct Lisp_String); |
| 4970 | 5039 |
| 4971 gc_relative_threshold = total * XFLOAT_DATA (Vgc_cons_percentage); | 5040 gc_relative_threshold = total * XFLOAT_DATA (Vgc_cons_percentage); |
| 4972 } | 5041 } |
| 4973 else | 5042 else |
| 4974 gc_relative_threshold = 0; | 5043 gc_relative_threshold = 0; |
| 4975 | 5044 |
