Basic bignum2 hooks

This commit is contained in:
Justin Ethier 2022-06-01 21:40:28 -04:00
parent 79f4a1f4ea
commit 22c4f0277a
3 changed files with 32 additions and 0 deletions

29
gc.c
View file

@ -910,6 +910,15 @@ char *gc_copy_obj(object dest, char *obj, gc_thread_data * thd)
((bignum_type *)hp)->bn.dp = ((bignum_type *)obj)->bn.dp; ((bignum_type *)hp)->bn.dp = ((bignum_type *)obj)->bn.dp;
return (char *)hp; return (char *)hp;
} }
case bignum2_tag: {
bignum2_type *hp = dest;
mark(hp) = thd->gc_alloc_color;
type_of(hp) = bignum2_tag;
((bignum2_type *)hp)->num_digits = ((bignum2_type *)obj)->num_digits;
((bignum2_type *)hp)->sign = ((bignum2_type *)obj)->sign;
// Don't copy digits, caller will populate them
return (char *)hp;
}
case cvar_tag:{ case cvar_tag:{
cvar_type *hp = dest; cvar_type *hp = dest;
mark(hp) = thd->gc_alloc_color; mark(hp) = thd->gc_alloc_color;
@ -1308,6 +1317,24 @@ hrt_log_delta("gc sweep fixed size", tstamp);
return result; return result;
} }
/**
* @brief A convenience function for allocating bignums
* @param data The mutator's thread data object
* @return Pointer to a heap object for the bignum
*/
void *gc_alloc_bignum2(gc_thread_data *data)
{
int heap_grown, result;
bignum2_type *bn;
bignum2_type tmp;
// No need to do this since tmp is always local
//tmp.hdr.mark = gc_color_red;
//tmp.hdr.grayed = 0;
tmp.tag = bignum2_tag;
bn = gc_alloc(((gc_thread_data *)data)->heap, sizeof(bignum2_type), (char *)(&tmp), (gc_thread_data *)data, &heap_grown);
return bn;
}
/** /**
* @brief A convenience function for allocating bignums * @brief A convenience function for allocating bignums
* @param data The mutator's thread data object * @param data The mutator's thread data object
@ -1500,6 +1527,8 @@ size_t gc_allocated_bytes(object obj, gc_free_list * q, gc_free_list * r)
return gc_heap_align(sizeof(macro_type)); return gc_heap_align(sizeof(macro_type));
if (t == bignum_tag) if (t == bignum_tag)
return gc_heap_align(sizeof(bignum_type)); return gc_heap_align(sizeof(bignum_type));
if (t == bignum2_tag)
return gc_heap_align(sizeof(bignum2_type) + ((bignum2_type *)obj)->num_digits * sizeof(uint32_t));
if (t == port_tag) if (t == port_tag)
return gc_heap_align(sizeof(port_type)); return gc_heap_align(sizeof(port_type));
if (t == cvar_tag) if (t == cvar_tag)

View file

@ -71,6 +71,7 @@ enum object_tag {
, atomic_tag = 22 , atomic_tag = 22
, void_tag = 23 , void_tag = 23
, record_tag = 24 , record_tag = 24
, bignum2_tag = 25
}; };
/** /**
@ -414,6 +415,7 @@ void *gc_try_alloc_slow(gc_heap *h_passed, gc_heap *h, size_t size, char *obj, g
void *gc_alloc(gc_heap_root * h, size_t size, char *obj, gc_thread_data * thd, void *gc_alloc(gc_heap_root * h, size_t size, char *obj, gc_thread_data * thd,
int *heap_grown); int *heap_grown);
void *gc_alloc_bignum(gc_thread_data *data); void *gc_alloc_bignum(gc_thread_data *data);
void *gc_alloc_bignum2(gc_thread_data *data);
size_t gc_allocated_bytes(object obj, gc_free_list * q, gc_free_list * r); size_t gc_allocated_bytes(object obj, gc_free_list * q, gc_free_list * r);
gc_heap *gc_heap_last(gc_heap * h); gc_heap *gc_heap_last(gc_heap * h);

View file

@ -55,6 +55,7 @@ const char *tag_names[] = {
/*atomic_tag*/ , "atomic" /*atomic_tag*/ , "atomic"
/*void_tag*/ , "void" /*void_tag*/ , "void"
/*record_tag*/ , "record" /*record_tag*/ , "record"
/*bignum2_tag*/ , "bignum2"
, "Reserved for future use" , "Reserved for future use"
}; };