mirror of
https://github.com/justinethier/cyclone.git
synced 2025-07-06 20:56:36 +02:00
WIP version of share_object()
This commit is contained in:
parent
784e722843
commit
d4479d5ee7
1 changed files with 59 additions and 0 deletions
59
runtime.c
59
runtime.c
|
@ -462,6 +462,65 @@ void Cyc_set_globals_changed(gc_thread_data *thd)
|
||||||
|
|
||||||
/* END Global table */
|
/* END Global table */
|
||||||
|
|
||||||
|
/** new write barrier
|
||||||
|
* @param data
|
||||||
|
* @param var Object being mutated
|
||||||
|
* @param value New value being associated to var
|
||||||
|
*
|
||||||
|
* TODO: caller can inspect return value and determine if it needs to initiate GC
|
||||||
|
*/
|
||||||
|
object share_object(gc_thread_data *data, object var, object value)
|
||||||
|
{
|
||||||
|
char tmp;
|
||||||
|
gc_heap_root *heap = data->heap;
|
||||||
|
int tmp, *heap_grown = &tmp;
|
||||||
|
|
||||||
|
// Nothing needs to be done unless we are mutating
|
||||||
|
// a heap variable to point to a stack var.
|
||||||
|
if (!gc_is_stack_obj(&tmp, data, var) && gc_is_stack_obj(&tmp, data, value)) {
|
||||||
|
/* TODO:
|
||||||
|
- need to transport value to heap
|
||||||
|
- if value is mutable or has children, may need to do minor GC to transport
|
||||||
|
- else can just copy it
|
||||||
|
return obj (copied) or boolean_f (need minor GC;
|
||||||
|
*/
|
||||||
|
|
||||||
|
switch(type_of(value)) {
|
||||||
|
case string_tag:
|
||||||
|
case bytevector_tag:
|
||||||
|
if (immutable(value)) {
|
||||||
|
// Safe to transport
|
||||||
|
object hp = gc_alloc(heap, gc_allocated_bytes(value, NULL, NULL), value, data, heap_grown);
|
||||||
|
return hp;
|
||||||
|
|
||||||
|
}
|
||||||
|
// Need to GC if obj is mutable, EG: a string could be mutated so we can't
|
||||||
|
// have multiple copies of the object running around
|
||||||
|
return boolean_f
|
||||||
|
case double_tag:
|
||||||
|
case port_tag:
|
||||||
|
case c_opaque_tag:
|
||||||
|
case complex_num_tag: {
|
||||||
|
object hp = gc_alloc(heap, gc_allocated_bytes(value, NULL, NULL), value, data, heap_grown);
|
||||||
|
return hp;
|
||||||
|
}
|
||||||
|
// Objs w/children force minor GC to guarantee everything is relocated:
|
||||||
|
case cvar_tag:
|
||||||
|
case closure1_tag:
|
||||||
|
case closureN_tag:
|
||||||
|
case pair_tag:
|
||||||
|
case vector_tag:
|
||||||
|
return boolean_f;
|
||||||
|
default:
|
||||||
|
printf("Invalid shared object type %d\n", type_of(value));
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return NULL; // Nothing to do
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Mutation table functions
|
/* Mutation table functions
|
||||||
*
|
*
|
||||||
* Keep track of mutations (EG: set-car!) so we can avoid having heap
|
* Keep track of mutations (EG: set-car!) so we can avoid having heap
|
||||||
|
|
Loading…
Add table
Reference in a new issue