projects
/
sbcl.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
0.8.16.2: TYPE-ERROR for ERROR
[sbcl.git]
/
src
/
runtime
/
gc-internal.h
diff --git
a/src/runtime/gc-internal.h
b/src/runtime/gc-internal.h
index
8928f2b
..
78aeaa0
100644
(file)
--- a/
src/runtime/gc-internal.h
+++ b/
src/runtime/gc-internal.h
@@
-33,9
+33,18
@@
static inline unsigned int
NWORDS(unsigned int x, unsigned int n_bits)
{
static inline unsigned int
NWORDS(unsigned int x, unsigned int n_bits)
{
- unsigned int elements_per_word = N_WORD_BITS/n_bits;
+ /* A good compiler should be able to constant-fold this whole thing,
+ even with the conditional. */
+ if(n_bits <= N_WORD_BITS) {
+ unsigned int elements_per_word = N_WORD_BITS/n_bits;
- return CEILING(x, elements_per_word)/elements_per_word;
+ return CEILING(x, elements_per_word)/elements_per_word;
+ }
+ else {
+ /* FIXME: should have some sort of assertion that N_WORD_BITS
+ evenly divides n_bits */
+ return x * (n_bits/N_WORD_BITS);
+ }
}
/* FIXME: Shouldn't this be defined in sbcl.h? */
}
/* FIXME: Shouldn't this be defined in sbcl.h? */
@@
-71,6
+80,8
@@
lispobj *search_read_only_space(void *pointer);
lispobj *search_static_space(void *pointer);
lispobj *search_dynamic_space(void *pointer);
lispobj *search_static_space(void *pointer);
lispobj *search_dynamic_space(void *pointer);
+#include "fixnump.h"
+
/* Scan an area looking for an object which encloses the given pointer.
* Return the object start on success or NULL on failure. */
static lispobj *
/* Scan an area looking for an object which encloses the given pointer.
* Return the object start on success or NULL on failure. */
static lispobj *
@@
-82,7
+93,7
@@
search_space(lispobj *start, size_t words, lispobj *pointer)
/* If thing is an immediate then this is a cons. */
if (is_lisp_pointer(thing)
/* If thing is an immediate then this is a cons. */
if (is_lisp_pointer(thing)
- || ((thing & 3) == 0) /* fixnum */
+ || (fixnump(thing))
|| (widetag_of(thing) == BASE_CHAR_WIDETAG)
|| (widetag_of(thing) == UNBOUND_MARKER_WIDETAG))
count = 2;
|| (widetag_of(thing) == BASE_CHAR_WIDETAG)
|| (widetag_of(thing) == UNBOUND_MARKER_WIDETAG))
count = 2;