void oop_Relocation::oops_do(void f(oop*)) {
  if (_oop_index == 0) {
    oop* addr = oop_addr();
    if (*addr != Universe::non_oop_word())
      f(addr);
  }
}
Beispiel #2
0
oop_t ActivationObj::send(bool isImplicitSelf, oop_t sel, bool isUndirected, oop_t delegatee, fint arg_count, oop_t this_act) {
  DECLARE_STACK;
  sp_limit; // unused
  sp -= arg_count;
  smi args_offset = sp;
  oop_t* argsp = oop_addr(io + args_offset);
  oop_t  rcvr = isImplicitSelf  ?  get_self_quickly(io)  :  pop();
  put_sp_quickly(io, sp);

  // todo optimize time slow? -- dmu 1/06
  for (smi i = 0;  i < arg_count;  ++i )
    read_barrier(io + args_offset + i);
  
  oop_t new_act = NULL;

  StringObj* sel_addr = StringObj::from(sel);
  
  // I use this printf so often that I'd like to leave it here (commented out). -- Adam, 5/06
  // printf("sending "); sel_addr->string_print(); printf("\n");
  
  if (sel_addr->bytes()[0] == '_')  {
 
    oop_t result = primitive_send(sel, rcvr, argsp, arg_count, this_act, &new_act);
    // todo optimize time mightHaveScavengedTheActivation:
    // Use a boolean flag to tell if the activation has moved?
    // Look for other places tagged mightHaveScavengedTheActivation. -- Adam, 5/06
    if (!is_mark(result)) {
      ActivationObj* possibly_moved_act_addr = ActivationObj::from(this_act);
      possibly_moved_act_addr->remote_push(result);
    }
  }
  else {
    non_primitive_send(rcvr, argsp, arg_count, isImplicitSelf, sel, isUndirected, delegatee, this_act, &new_act);
  }
  return new_act ? new_act : this_act;
}
oop oop_Relocation::oop_value() {
  oop v = *oop_addr();
  if (v == (oop)Universe::non_oop_word())  v = NULL;
  return v;
}