source: src/examples/gc_no_raii/src/gcpointers.c@ f1e42c1

ADT aaron-thesis arm-eh ast-experimental cleanup-dtors ctor deferred_resn demangler enum forall-pointer-decay gc_noraii jacob/cs343-translation jenkins-sandbox memory new-ast new-ast-unique-expr new-env no_list persistent-indexer pthread-emulation qualifiedEnum resolv-new with_gc
Last change on this file since f1e42c1 was f1e42c1, checked in by Thierry Delisle <tdelisle@…>, 10 years ago

added some basic tests and modified compilation to support them

  • Property mode set to 100644
File size: 1.9 KB
Line 
1#include "gcpointers.h"
2
3#include "gc.h"
4#include "internal/collector.h"
5#include "internal/object_header.h"
6#include "internal/state.h"
7
8void 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
34void 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
44void gcpointer_ctor(gcpointer_t* this)
45{
46 this->ptr = (intptr_t)NULL;
47 this->next = NULL;
48}
49
50void 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
58void 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
66void gcpointer_dtor(gcpointer_t* this)
67{
68 unregister_ptr(this);
69}
70
71gcpointer_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
86bool gcpointer_equal(gcpointer_t* this, gcpointer_t* rhs)
87{
88 return this->ptr == rhs->ptr;
89}
90
91bool gcpointer_not_equal(gcpointer_t* this, gcpointer_t* rhs)
92{
93 return this->ptr != rhs->ptr;
94}
95
96bool gcpointer_null(gcpointer_t* this)
97{
98 return this->ptr == (intptr_t)NULL;
99}
Note: See TracBrowser for help on using the repository browser.