// generate a map of all the field types in this object int Array::generate_fieldmap(TypeArray* field_map) { int map_index = 0; // near map_index = Near::generate_fieldmap(field_map); //_length field_map->byte_at_put(map_index++, T_INT); // map size for the elements jint elements_map_size = length(); if (map_index + elements_map_size > field_map->length()) { // need more space return map_index + elements_map_size; } int type; if (is_obj_array()) { type = T_OBJECT; } else { TypeArrayClass::Raw cls = blueprint(); type = cls().type(); } for (int i = 0; i < elements_map_size; i++) { field_map->byte_at_put(map_index++, type); } return map_index; }
ReturnOop Array::shrink(int new_length) { GUARANTEE(new_length >= 0, "Negative array size prohibited"); int scale; if (is_type_array()) { TypeArrayClass::Raw array_class = blueprint(); scale = array_class().scale(); } else { GUARANTEE(is_obj_array(), "sanity"); scale = sizeof(OopDesc*); } Universe::shrink_object(this, ArrayDesc::allocation_size(new_length, scale)); set_length(new_length); return obj(); }
ciObjArray* as_obj_array() { assert(is_obj_array(), "bad cast"); return (ciObjArray*)this; }