void stringTable::switch_pointers(oop from, oop to) { if (! from->is_string()) return; assert(to->is_string(), "cannot replace a string with a non-string"); findSlotCache.clear(); stringTableEntry* e; FOR_ALL_ENTRIES(e) { stringOop* addr; FOR_ALL_STRING_ADDR(e, addr, SWITCH_POINTERS_TEMPLATE(addr)); } }
oop slotsMap::change_slot(oop obj, slotDesc* slot, slotType type, oop contents, oop anno, bool mustAllocate) { assert(slot != NULL, "cannot change the contents of a non-existent slot"); assert(!obj->is_string(), "cannot clone strings!"); assert_slots(obj, "object isn't a slotsOop"); slotsOop new_obj= slotsOop(obj->clone(mustAllocate)); if (oop(new_obj) == failedAllocationOop) return failedAllocationOop; switch (slot->type->slot_type()) { case obj_slot_type: assert(NakedMethods || !contents->has_code() || slot->type->is_vm_slot(), "adding an assignable slot with code"); assert_smi(slot->data, "data slot contents isn't an offset"); new_obj->at_put(smiOop(slot->data)->value(), contents); break; case map_slot_type: break; case arg_slot_type: assert_smi(contents, "argument index isn't a smiOop"); break; default: ShouldNotReachHere(); // unexpected slot type } if ( slot->data == contents && slot->type == type && slot->get_annotation() == anno) { // no change (to the map, at least)! return new_obj; } // create a new map for this object slotsMap* new_map= copy_for_changing(mustAllocate); if (new_map == NULL) return failedAllocationOop; slot = slot->shift(this, new_map); slot->type = type; slot->set_annotation(anno); if (!slot->is_obj_slot()) { Memory->store(&slot->data, contents); } new_obj->set_canonical_map(new_map); return new_obj; }
void abstract_interpreter::check_selector_string(abstract_interpreter *ai, oop s) { if ( s->is_string() ) return; ai->set_error_msg( "selector must be a string"); }