void oop_Relocation::oops_do(void f(oop*)) { if (_oop_index == 0) { oop* addr = oop_addr(); if (*addr != Universe::non_oop_word()) f(addr); } }
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; }