Changeset 385c130 for src/examples/gc_no_raii/src/gcpointers.c
- Timestamp:
- Apr 19, 2016, 1:19:25 PM (8 years ago)
- Branches:
- ADT, aaron-thesis, arm-eh, ast-experimental, cleanup-dtors, ctor, deferred_resn, demangler, enum, forall-pointer-decay, gc_noraii, jacob/cs343-translation, jenkins-sandbox, master, memory, new-ast, new-ast-unique-expr, new-env, no_list, persistent-indexer, pthread-emulation, qualifiedEnum, resolv-new, with_gc
- Children:
- 9026b4b
- Parents:
- 356bb95
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/examples/gc_no_raii/src/gcpointers.c
r356bb95 r385c130 6 6 #include "internal/state.h" 7 7 8 // void register_ptr(gcpointer_t* this) 9 // { 10 // if(gcpointer_null(this)) return; 11 // 12 // _Bool managed = gc_is_managed(this); 13 // 14 // 15 // gc_state* state = gc_get_state(); 16 // gc_object_header* obj = 0; 17 // if(managed) 18 // { 19 // obj = gc_get_object_for_ref(state, (void*)this); 20 // check(obj); 21 // check(gc_obj_is_valide(obj)); 22 // check(gc_is_managed(this) == gc_is_managed(obj->type_chain) || obj->type_chain == NULL); 23 // this->next = obj->type_chain; 24 // obj->type_chain = this; 25 // check(obj->is_valide()); 26 // } 27 // else 28 // { 29 // obj = gc_get_object_ptr(state, (void*)this->ptr); 30 // check(obj); 31 // check(gc_obj_is_valide(obj)); 32 // check(gc_is_managed(this) == gc_is_managed(obj->root_chain) || obj->root_chain == NULL); 33 // this->next = obj->root_chain; 34 // obj->root_chain = this; 35 // check(gc_obj_is_valide(obj)); 36 // } 37 // } 38 // 39 // void unregister_ptr(gcpointer_t* this) 40 // { 41 // if(gcpointer_null(this)) return; 42 // 43 // gcpointer_t** prev_next_ptr = gc_find_previous_ref(this); 44 // check((*prev_next_ptr) == this); 45 // 46 // (*prev_next_ptr) = this->next; 47 // } 48 // 49 // void gcpointer_ctor(gcpointer_t* this) 50 // { 51 // this->ptr = (intptr_t)NULL; 52 // this->next = NULL; 53 // } 54 // 55 // void gcpointer_ctor(gcpointer_t* this, void* address) 56 // { 57 // this->ptr = (intptr_t)address; 58 // this->next = NULL; 59 // 60 // register_ptr(this); 61 // } 62 // 63 // void gcpointer_ctor(gcpointer_t* this, gcpointer_t* other) 64 // { 65 // this->ptr = other->ptr; 66 // this->next = NULL; 67 // 68 // register_ptr(this); 69 // } 70 // 71 // void gcpointer_dtor(gcpointer_t* this) 72 // { 73 // unregister_ptr(this); 74 // } 75 // 76 // gcpointer_t* gcpointer_assign(gcpointer_t* this, gcpointer_t* rhs) 77 // { 78 // if(this != rhs) 79 // { 80 // unregister_ptr(this); 81 // 82 // this->ptr = rhs->ptr; 83 // 84 // register_ptr(this); 85 // } 86 // 87 // return this; 88 // } 89 // 90 // //Logical operators 91 // int gcpointer_equal(gcpointer_t* this, gcpointer_t* rhs) 92 // { 93 // return this->ptr == rhs->ptr; 94 // } 95 // 96 // int gcpointer_not_equal(gcpointer_t* this, gcpointer_t* rhs) 97 // { 98 // return this->ptr != rhs->ptr; 99 // } 100 // 101 // int gcpointer_null(gcpointer_t* this) 102 // { 103 // return this->ptr == (intptr_t)NULL; 104 // } 8 void register_ptr(gcpointer_t* this) 9 { 10 if(gcpointer_null(this)) return; 11 12 if(gc_is_managed(this)) 13 { 14 gc_object_header* obj = gc_get_object_for_ref(gc_get_state(), (void*)this); 15 check(obj); 16 check(gc_obj_is_valide(obj)); 17 check(gc_is_managed(this) == gc_is_managed(obj->type_chain) || obj->type_chain == NULL); 18 this->next = obj->type_chain; 19 obj->type_chain = this; 20 check(obj->is_valide()); 21 } 22 else 23 { 24 gc_object_header* obj = gc_get_object_ptr((void*)this->ptr); 25 check(obj); 26 check(gc_obj_is_valide(obj)); 27 check(gc_is_managed(this) == gc_is_managed(obj->root_chain) || obj->root_chain == NULL); 28 this->next = obj->root_chain; 29 obj->root_chain = this; 30 check(gc_obj_is_valide(obj)); 31 } 32 } 33 34 void unregister_ptr(gcpointer_t* this) 35 { 36 if(gcpointer_null(this)) return; 37 38 gcpointer_t** prev_next_ptr = gc_find_previous_ref(this); 39 check((*prev_next_ptr) == this); 40 41 (*prev_next_ptr) = this->next; 42 } 43 44 void gcpointer_ctor(gcpointer_t* this) 45 { 46 this->ptr = (intptr_t)NULL; 47 this->next = NULL; 48 } 49 50 void gcpointer_ctor(gcpointer_t* this, void* address) 51 { 52 this->ptr = (intptr_t)address; 53 this->next = NULL; 54 55 register_ptr(this); 56 } 57 58 void gcpointer_ctor(gcpointer_t* this, gcpointer_t* other) 59 { 60 this->ptr = other->ptr; 61 this->next = NULL; 62 63 register_ptr(this); 64 } 65 66 void gcpointer_dtor(gcpointer_t* this) 67 { 68 unregister_ptr(this); 69 } 70 71 gcpointer_t* gcpointer_assign(gcpointer_t* this, gcpointer_t* rhs) 72 { 73 if(this != rhs) 74 { 75 unregister_ptr(this); 76 77 this->ptr = rhs->ptr; 78 79 register_ptr(this); 80 } 81 82 return this; 83 } 84 85 //Logical operators 86 int gcpointer_equal(gcpointer_t* this, gcpointer_t* rhs) 87 { 88 return this->ptr == rhs->ptr; 89 } 90 91 int gcpointer_not_equal(gcpointer_t* this, gcpointer_t* rhs) 92 { 93 return this->ptr != rhs->ptr; 94 } 95 96 int gcpointer_null(gcpointer_t* this) 97 { 98 return this->ptr == (intptr_t)NULL; 99 }
Note: See TracChangeset
for help on using the changeset viewer.