int associationKlass::oop_scavenge_contents(oop obj) {
  int size = non_indexable_size();
  // header + instance variables
  memOop(obj)->scavenge_header();
  memOop(obj)->scavenge_body(memOopDesc::header_size(), size);
  return size;  
}
Beispiel #2
0
memOop MarkSweep::reverse(oop* p) {
  oop obj = *p;

  // Return NULL if non memOop
  if (!obj->is_mem()) return NULL;
  
  if (memOop(obj)->is_gc_marked()) {
    // Reverse pointer
    *p = oop(memOop(obj)->mark());
    memOop(obj)->set_mark(p);

    return NULL;
  } else {
    // Before the pointer reversal takes place the object size must be made accessible
    // without using the klass pointer. We store the object size partially in the 
    // age field and partially in the remembered set.
    memOop(obj)->gc_store_size();

    assert(memOop(obj)->size() == memOop(obj)->gc_retrieve_size(), "checking real against stored size");

    // Reverse pointer
    *p = oop(memOop(obj)->mark());
    memOop(obj)->set_mark(p);

    assert(memOop(obj)->klass()->is_mem(), "just checking");

    return memOop(obj);
  }
}
PRIM_DECL_2(doubleByteArrayPrimitives::allocateSize, oop receiver, oop argument) {
  PROLOGUE_2("allocateSize", receiver, argument)
  assert(receiver->is_klass() && klassOop(receiver)->klass_part()->oop_is_doubleByteArray(),
         "receiver must double byte array class");
  if (!argument->is_smi())
    markSymbol(vmSymbols::first_argument_has_wrong_type());

  if (smiOop(argument)->value() < 0)
    return markSymbol(vmSymbols::negative_size());

  klassOop k        = klassOop(receiver);
  int      ni_size  = k->klass_part()->non_indexable_size();
  int      obj_size = ni_size + 1 + roundTo(smiOop(argument)->value() * 2, oopSize) / oopSize;
  // allocate
  doubleByteArrayOop obj = as_doubleByteArrayOop(Universe::allocate(obj_size, (memOop*)&k));
  // header
  memOop(obj)->initialize_header(true, k);
  // instance variables
  memOop(obj)->initialize_body(memOopDesc::header_size(), ni_size);
  // indexables
  oop* base = (oop*) obj->addr();
  oop* end  = base + obj_size;
  // %optimized 'obj->set_length(size)'
  base[ni_size] = argument;
  // %optimized 'for (int index = 1; index <= size; index++)
  //               obj->doubleByte_at_put(index, 0)'
  base = &base[ni_size+1];
  while (base < end) *base++ = (oop) 0;
  return obj;
}
oop doubleByteArrayKlass::allocateObjectSize(int size, bool permit_scavenge, bool tenured) {
  klassOop k        = as_klassOop();
  int      ni_size  = non_indexable_size();
  int      obj_size = ni_size + 1 + roundTo(size * 2, oopSize) / oopSize;
  // allocate
  oop* result = tenured ?
    Universe::allocate_tenured(obj_size, permit_scavenge) :
    Universe::allocate(obj_size, (memOop*)&k, permit_scavenge);
  if (result == NULL) return NULL;
  doubleByteArrayOop obj = as_doubleByteArrayOop(result);
  // header
  memOop(obj)->initialize_header(true, k);
  // instance variables
  memOop(obj)->initialize_body(memOopDesc::header_size(), ni_size);
  // indexables
  oop* base = (oop*) obj->addr();
  oop* end  = base + obj_size;
  // %optimized 'obj->set_length(size)'
  base[ni_size] = as_smiOop(size);
  // %optimized 'for (int index = 1; index <= size; index++)
  //               obj->doubleByte_at_put(index, 0)'
  base = &base[ni_size+1];
  while (base < end) *base++ = (oop) 0;
  return obj;
}
PRIM_DECL_2(doubleValueArrayPrimitives::allocateSize, oop receiver, oop argument) {
  PROLOGUE_2("allocateSize", receiver, argument)
  assert(receiver->is_klass() && klassOop(receiver)->klass_part()->oop_is_doubleValueArray(),
         "receiver must double byte array class");
  if (!argument->is_smi())
    markSymbol(vmSymbols::first_argument_has_wrong_type());

  if (smiOop(argument)->value() < 0)
    return markSymbol(vmSymbols::negative_size());

  int length = smiOop(argument)->value();

  klassOop k        = klassOop(receiver);
  int      ni_size  = k->klass_part()->non_indexable_size();
  int      obj_size = ni_size + 1 + roundTo(length * sizeof(double), oopSize) / oopSize;
  // allocate
  doubleValueArrayOop obj = as_doubleValueArrayOop(Universe::allocate(obj_size, (memOop*)&k));
  // header
  memOop(obj)->initialize_header(true, k);
  // instance variables
  memOop(obj)->initialize_body(memOopDesc::header_size(), ni_size);
  obj->set_length(length);
  for (int index = 1; index <= length; index++) {
    obj->double_at_put(index, 0.0);
  }
  return obj;
}
int memOopKlass::oop_scavenge_tenured_contents(oop obj) {
  int size = non_indexable_size();
  // header
  memOop(obj)->scavenge_tenured_header();
  // instance variables
  memOop(obj)->scavenge_tenured_body(memOopDesc::header_size(), size);
  return size;
}
void associationKlass::oop_oop_iterate(oop obj, OopClosure* blk) {
  // header
  memOop(obj)->oop_iterate_header(blk);
  associationOop assoc = associationOop(obj);
  blk->do_oop((oop*) &assoc->addr()->_key);
  blk->do_oop((oop*) &assoc->addr()->_value);
  blk->do_oop((oop*) &assoc->addr()->_is_constant);
  // instance variables
  memOop(obj)->oop_iterate_body(blk, associationOopDesc::header_size(), non_indexable_size());
}
Beispiel #8
0
void mixinKlass::oop_layout_iterate(oop obj, ObjectLayoutClosure* blk) {
  // header
  memOop(obj)->layout_iterate_header(blk);
  blk->do_oop("methods",            (oop*)&mixinOop(obj)->addr()->_methods);
  blk->do_oop("instVars",           (oop*)&mixinOop(obj)->addr()->_inst_vars);
  blk->do_oop("classVars",          (oop*)&mixinOop(obj)->addr()->_class_vars);
  blk->do_oop("primary invocation", (oop*)&mixinOop(obj)->addr()->_primary_invocation);
  blk->do_oop("class mixin",        (oop*)&mixinOop(obj)->addr()->_class_mixin);
  // instance variables
  memOop(obj)->layout_iterate_body(blk, mixinOopDesc::header_size(), non_indexable_size());
}
Beispiel #9
0
void bootstrap::parse_file() {
  // Check version number
  int version_number = get_integer();

  if (version_number > 100) {
    _new_format = true;
    lprintf(", n");
    version_number -= 100;
  } else {
    _new_format = false;
  }

  if (Bytecodes::version() == version_number) {

  } else {
    lprintf("\n");
    lprintf("Bytecode version conflict\n");
    lprintf(" excpected: %d\n", Bytecodes::version());
    lprintf(" received:  %d\n", version_number);
    exit(-1);
  }

  Universe::_systemDictionaryObj         = objArrayOop(get_object());
  nilObj                                 = memOop(get_object());
  trueObj                                = memOop(get_object());
  falseObj                               = memOop(get_object());
  smiKlassObj                            = klassOop(get_object());
  Universe::_memOopKlassObj              = klassOop(get_object());
  Universe::_objArrayKlassObj            = klassOop(get_object());
  Universe::_byteArrayKlassObj           = klassOop(get_object());
  symbolKlassObj                         = klassOop(get_object());
  doubleKlassObj                         = klassOop(get_object());
  Universe::_methodKlassObj              = klassOop(get_object());
  Universe::_associationKlassObj         = klassOop(get_object());
  zeroArgumentBlockKlassObj              = klassOop(get_object());
  oneArgumentBlockKlassObj               = klassOop(get_object());
  twoArgumentBlockKlassObj               = klassOop(get_object());
  threeArgumentBlockKlassObj             = klassOop(get_object());
  fourArgumentBlockKlassObj              = klassOop(get_object());
  fiveArgumentBlockKlassObj              = klassOop(get_object());
  sixArgumentBlockKlassObj               = klassOop(get_object());
  sevenArgumentBlockKlassObj             = klassOop(get_object());
  eightArgumentBlockKlassObj             = klassOop(get_object());
  nineArgumentBlockKlassObj              = klassOop(get_object());
  contextKlassObj                        = klassOop(get_object());
  Universe::_asciiCharacters             = objArrayOop(get_object());
  Universe::_vframeKlassObj              = HasActivationClass ? klassOop(get_object()) : klassOop(nilObj);

  klassOop platform_klass = klassOop(Universe::find_global(os::platform_class_name()));
  associationOop assoc = Universe::find_global_association("Platform");
  if (platform_klass != NULL && assoc != NULL) {
    assoc->set_value(platform_klass);
  }
}
Beispiel #10
0
int32 MethodLookupKey::hash() {
    int32 i;

    // Coded for speed - called for every codeTable lookup

    // XOR the identity-hash values of the fields.  For efficiency, just
    // xor the marks and extract hash bits at the end instead of doing
    // this for every field.
    // Also, don't need to check for no_hash: real keys are guaranteed
    // to have an id hash value because init_hash is called before a
    // key is added to the table.  If a lookup key contains oops with
    // no_hash, we'll have a bogus hash value, but we won't find anything
    // anyway.
    i  = (int32)receiverMapOop()->mark();
    if (selector->is_mem())
        i ^= (int32)memOop(selector)->mark();

    // Can't do the optimization for the methodHolder - it might be
    // e.g. a smiOop in the lookupError glue method.

    // Not non-zero often enough to hash on
    // (an optimization for speed; Bay's idea)
    //  i ^= (int32)delegatee             ->mark();

    return   (lookupType & ~ImplicitSelfBit)
             ^ markOop(i)->hash()
             ^ methodHolder_or_map()->identity_hash();
}
Beispiel #11
0
void memOopClass::print_string(char* buf) {
  if (this == memOop(badOop)) {
    sprintf(buf, "badOop");
  }
  else
    map()->print_string(this, buf);
}
Beispiel #12
0
void memOopClass::print_oop() {
  if (this == memOop(badOop)) {
    lprintf("badOop");
  }
  else
    map()->print_oop(this);
}
Beispiel #13
0
objArrayOop objArrayKlass::allocate_tenured_pic(int size) {
  klassOop k        = Universe::objArrayKlassObj();
  int      ni_size  = k->klass_part()->non_indexable_size();
  int      obj_size = ni_size + 1 + size;
  // allocate
  objArrayOop obj = as_objArrayOop(Universe::allocate_tenured(obj_size));
  // header
  memOop(obj)->initialize_header(k->klass_part()->has_untagged_contents(), k);
  // instance variables
  memOop(obj)->initialize_body(memOopDesc::header_size(), ni_size);
    // indexables
  oop* base = (oop*) obj->addr();
  oop* end  = base + obj_size;
  // %optimized 'obj->set_length(size)'
  base[ni_size] = as_smiOop(size);
  memOop(obj)->initialize_body(ni_size+1, obj_size);
  return obj;
}
Beispiel #14
0
oop mixinKlass::allocateObject(bool permit_scavenge, bool tenured) {
  klassOop k    = as_klassOop();
  int      size = non_indexable_size();
  // allocate
  oop* result = basicAllocate(size, &k, permit_scavenge, tenured);
  if (result == NULL)
    return NULL;
  mixinOop obj = as_mixinOop(result);
  // header + instance variables
  memOop(obj)->initialize_header(true, k);
  memOop(obj)->initialize_body(memOopDesc::header_size(), size);
  objArrayOop filler = oopFactory::new_objArray(0);
  obj->set_methods(filler);
  obj->set_instVars(filler);
  obj->set_classVars(filler);
  obj->set_installed(falseObj);
  return obj;
}
Beispiel #15
0
oop byteArrayKlass::allocateObjectSize(int size) {
  klassOop k        = as_klassOop();
  int      ni_size  = non_indexable_size();
  int      obj_size = ni_size + 1 + roundTo(size, oopSize) / oopSize;
  // allocate
  byteArrayOop obj = as_byteArrayOop(Universe::allocate(obj_size, (memOop*)&k));
  // header
  memOop(obj)->initialize_header(true, k);
  // instance variables
  memOop(obj)->initialize_body(memOopDesc::header_size(), ni_size);
  // indexables
  oop* base = (oop*) obj->addr();
  oop* end  = base + obj_size;
  // %optimized 'obj->set_length(size)'
  base[ni_size] = as_smiOop(size);
  // %optimized 'for (int index = 1; index <= size; index++)
  //               obj->byte_at_put(index, '\000')'
  base = &base[ni_size+1];
  while (base < end) *base++ = (oop) 0;
  return obj;
}
Beispiel #16
0
void memOopKlass::oop_print_value_on(oop obj, outputStream* st) {
  if (obj == nilObj)   st->print("nil");
  else if (obj == trueObj)  st->print("true");
  else if (obj == falseObj) st->print("false");
  else {
    if (PrintObjectID) {
      memOop(obj)->print_id_on(st);
      st->print("-");
    }
    print_name_on(st);
  }
  if (PrintOopAddress) st->print(" (%#x)", this);
}
Beispiel #17
0
oop memOopKlass::oop_shallow_copy(oop obj, bool tenured) {
  // Do not copy oddballs (nil, true, false)
  if (obj == nilObj)   return obj;
  if (obj == trueObj)  return obj;
  if (obj == falseObj) return obj;

  int  len   = memOop(obj)->size();
  // Important to preserve obj (in case of scavenge).
  oop* clone = tenured ? Universe::allocate_tenured(len) : Universe::allocate(len, (memOop*)&obj);
  oop* to    = clone;
  oop* from  = (oop*) memOop(obj)->addr();
  oop* end   = to + len;
  while (to < end) *to++ = *from++;

  if (!as_memOop(clone)->is_new()) {
    // Remember to update the remembered set if the clone is in old space.
    // Note:
    //   should we do something special for arrays.
    Universe::remembered_set->record_store(clone);
  }
  return as_memOop(clone);
}
Beispiel #18
0
oop InterpretedIC::does_not_understand(oop receiver, InterpretedIC* ic, frame* f) {
  memOop msg;
  symbolOop sel;
  {
    // message not understood...
    BlockScavenge bs; // make sure that no scavenge happens
    klassOop msgKlass = klassOop(Universe::find_global("Message"));
    oop obj = msgKlass->klass_part()->allocateObject();
    assert(obj->is_mem(), "just checkin'...");
    msg = memOop(obj);
    int nofArgs = ic->selector()->number_of_arguments();
    objArrayOop args = oopFactory::new_objArray(nofArgs);
    for (int i = 1; i <= nofArgs; i++) {
      args->obj_at_put(i, f->expr(nofArgs - i));
    }
    // for now: assume instance variables are there...
    // later: should check this or use a VM interface:
    // msg->set_receiver(recv);
    // msg->set_selector(ic->selector());
    // msg->set_arguments(args);
    msg->raw_at_put(2, receiver);
    msg->raw_at_put(3, ic->selector());
    msg->raw_at_put(4, args);
    sel = oopFactory::new_symbol("doesNotUnderstand:");
    if (interpreter_normal_lookup(receiver->klass(), sel).is_empty()) {
      // doesNotUnderstand: not found ==> process error
      { ResourceMark rm;
      std->print("LOOKUP ERROR\n");
      sel->print_value(); std->print(" not found\n");
      }
      if (DeltaProcess::active()->is_scheduler()) {
        DeltaProcess::active()->trace_stack();
        fatal("lookup error in scheduler");
      } else {
        DeltaProcess::active()->suspend(::lookup_error);
      }
      ShouldNotReachHere();
    }
  }
  // return marked result of doesNotUnderstand: message
  return Delta::call(receiver, sel, msg);

  // Solution: use an nmethod-like stub-routine called from
  // within a (possibly one-element) PIC (in order to keep
  // the method selector in the IC. That stub does the
  // Delta:call and pops the right number of arguments
  // taken from the selector (the no. of arguments from
  // the selector can be optimized).
}
oop associationKlass::allocateObject(bool permit_scavenge, bool tenured) {
  klassOop k    = as_klassOop();
  int      size = non_indexable_size();
  // allocate
  oop* result = Universe::allocate_tenured(size, permit_scavenge);
  if (result == NULL && !permit_scavenge) return NULL;
  associationOop obj = as_associationOop(result);
  // header
  memOop(obj)->initialize_header(has_untagged_contents(), k);
  obj->set_key(symbolOop(nilObj));
  obj->set_value(nilObj);
  obj->set_is_constant(false);
  // instance variables
  obj->initialize_body(associationOopDesc::header_size(), size);
  return obj;
}
void WeakArrayRegister::scavenge_check_for_dying_objects() {
  NotificationQueue::mark_elements();
  for(int index = 0; index < weakArrays->length(); index++) {
    weakArrayOop w = weakArrays->at(index);
    bool encounted_near_death_objects = false;
    for(int i = 1; i <= w->length(); i++) {
      oop obj = w->obj_at(i);
      if (scavenge_is_near_death(obj)) {
        encounted_near_death_objects = true;
        memOop(obj)->mark_as_dying();
      }
    }
    if (encounted_near_death_objects && !w->is_queued())
      NotificationQueue::put(w);
  }
  NotificationQueue::clear_elements();
}
void WeakArrayRegister::mark_sweep_check_for_dying_objects() {
  for(int index = 0; index < weakArrays->length(); index++) {
    weakArrayOop w = weakArrays->at(index);
    int non_indexable_size = nis->at(index);
    bool encounted_near_death_objects = false;
    int length = smiOop(w->raw_at(non_indexable_size))->value();
    for(int i = 1; i <= length; i++) {
      oop obj = w->raw_at(non_indexable_size+i);
      if (mark_sweep_is_near_death(obj)) {
        encounted_near_death_objects = true;
        memOop(obj)->mark_as_dying();
      }
    }
    if (encounted_near_death_objects)
      NotificationQueue::put_if_absent(w);
  }
}
void associationKlass::oop_print_value_on(oop obj, outputStream* st) {
  associationOop assoc = associationOop(obj);
  if (PrintObjectID) {
    memOop(obj)->print_id_on(st);
    st->print("-");
  }
  print_name_on(st);
  st->print(" {"); 
  assoc->key()->print_symbol_on(st);
  st->print(", "); 
  assoc->value()->print_value_on(st);
  if (assoc->is_constant()) {
    st->print(" (constant)");
  }
  st->print("}");
  if (PrintOopAddress) st->print(" (%#x)", this);
}
bool associationKlass::oop_verify(oop obj) {
  bool flag = memOop(obj)->verify();
  return flag;
}
void associationKlass::oop_follow_contents(oop obj) {
  // header + instance variables
  memOop(obj)->follow_header();
  memOop(obj)->follow_body(memOopDesc::header_size(), non_indexable_size());
}
Beispiel #25
0
 memOop as_memOop() {
   assert(Handles::oop_at(index)->is_mem(), "type check");
   return memOop(Handles::oop_at(index));
 }
inline bool newGeneration::is_new(oop p, char *boundary) {
    return p->is_mem() && is_new(memOop(p), boundary);
}
Beispiel #27
0
void memOopKlass::oop_print_on(oop obj, outputStream* st) {
  PrintObjectClosure blk(st);
  blk.do_object(memOop(obj));
  memOop(obj)->layout_iterate(&blk);
}
Beispiel #28
0
void pr(void* m) {
  Command c("pr");
  Universe::remembered_set->print_set_for_object(memOop(m));
}
Beispiel #29
0
bool memOopKlass::oop_verify(oop obj) {
  return Universe::verify_oop(memOop(obj));
}
Beispiel #30
0
void memOopKlass::oop_oop_iterate(oop obj, OopClosure* blk) {
  // header
  memOop(obj)->oop_iterate_header(blk);
  // instance variables
  memOop(obj)->oop_iterate_body(blk, memOopDesc::header_size(), non_indexable_size());
}