mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-06-17 09:10:22 +02:00
Merged Whippet into libguile/whippet
This commit is contained in:
commit
db181e67ff
112 changed files with 18115 additions and 0 deletions
50
libguile/whippet/api/gc-ref.h
Normal file
50
libguile/whippet/api/gc-ref.h
Normal file
|
@ -0,0 +1,50 @@
|
|||
#ifndef GC_REF_H
|
||||
#define GC_REF_H
|
||||
|
||||
#include "gc-assert.h"
|
||||
#include "gc-config.h"
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
struct gc_ref {
|
||||
uintptr_t value;
|
||||
};
|
||||
|
||||
static inline struct gc_ref gc_ref(uintptr_t value) {
|
||||
return (struct gc_ref){value};
|
||||
}
|
||||
static inline uintptr_t gc_ref_value(struct gc_ref ref) {
|
||||
return ref.value;
|
||||
}
|
||||
|
||||
static inline struct gc_ref gc_ref_null(void) {
|
||||
return gc_ref(0);
|
||||
}
|
||||
static inline int gc_ref_is_null(struct gc_ref ref) {
|
||||
return ref.value == 0;
|
||||
}
|
||||
static inline int gc_ref_is_immediate(struct gc_ref ref) {
|
||||
GC_ASSERT(!gc_ref_is_null(ref));
|
||||
return GC_HAS_IMMEDIATES && (ref.value & (sizeof(void*) - 1));
|
||||
}
|
||||
static inline struct gc_ref gc_ref_immediate(uintptr_t val) {
|
||||
GC_ASSERT(val & (sizeof(void*) - 1));
|
||||
GC_ASSERT(GC_HAS_IMMEDIATES);
|
||||
return gc_ref(val);
|
||||
}
|
||||
static inline int gc_ref_is_heap_object(struct gc_ref ref) {
|
||||
return !gc_ref_is_immediate(ref);
|
||||
}
|
||||
static inline struct gc_ref gc_ref_from_heap_object_or_null(void *obj) {
|
||||
return gc_ref((uintptr_t) obj);
|
||||
}
|
||||
static inline struct gc_ref gc_ref_from_heap_object(void *obj) {
|
||||
GC_ASSERT(obj);
|
||||
return gc_ref_from_heap_object_or_null(obj);
|
||||
}
|
||||
static inline void* gc_ref_heap_object(struct gc_ref ref) {
|
||||
GC_ASSERT(gc_ref_is_heap_object(ref));
|
||||
return (void *) gc_ref_value(ref);
|
||||
}
|
||||
|
||||
#endif // GC_REF_H
|
Loading…
Add table
Add a link
Reference in a new issue