예제 #1
0
 /**
  * Allocates a new InflatedHeader object for the specified obj ObjectHeader.
  *
  * /param obj The ObjectHeader that is to be inflated.
  * /returns the InflatedHeader representing the new inflated object header.
  */
 InflatedHeader* InflatedHeaders::allocate(ObjectHeader* obj) {
   bool needs_gc = false;
   InflatedHeader* header = allocator_->allocate(&needs_gc);
   header->set_object(obj);
   if(needs_gc) {
     state_->om->collect_mature_now = true;
   }
   return header;
 }
예제 #2
0
  /**
   * Allocates a new InflatedHeader object for the specified obj ObjectHeader.
   *
   * /param obj The ObjectHeader that is to be inflated.
   * /returns the InflatedHeader representing the new inflated object header.
   */
  InflatedHeader* InflatedHeaders::allocate(ObjectHeader* obj) {
    if(!free_list_) allocate_chunk();
    InflatedHeader* header = free_list_;
    free_list_ = header->next();

    in_use_++;
    header->set_object(obj);

    return header;
  }
예제 #3
0
    void set_forward(ObjectHeader* fwd) {
      // If the header is inflated, repoint it.
      if(inflated_header_p()) {
        InflatedHeader* ih = deflate_header();

        ih->set_object(fwd);
        fwd->set_inflated_header(ih);
      }

      flags().Forwarded = 1;

      // DO NOT USE klass() because we need to get around the
      // write barrier!
      ivars_ = reinterpret_cast<Object*>(fwd);
    }