Ignore:
Timestamp:
Apr 19, 2016, 1:19:25 PM (8 years ago)
Author:
Thierry Delisle <tdelisle@…>
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
Message:

pre merge

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/examples/gc_no_raii/src/gcpointers.c

    r356bb95 r385c130  
    66#include "internal/state.h"
    77
    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 // }
     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
     86int gcpointer_equal(gcpointer_t* this, gcpointer_t* rhs)
     87{
     88        return this->ptr == rhs->ptr;
     89}
     90
     91int gcpointer_not_equal(gcpointer_t* this, gcpointer_t* rhs)
     92{
     93        return this->ptr != rhs->ptr;
     94}
     95
     96int gcpointer_null(gcpointer_t* this)
     97{
     98        return this->ptr == (intptr_t)NULL;
     99}
Note: See TracChangeset for help on using the changeset viewer.