38 39 // ------------------------------------------------------------------ 40 // ciValueArrayKlass::ciValueArrayKlass 41 // 42 // Constructor for loaded value array klasses. 43 ciValueArrayKlass::ciValueArrayKlass(Klass* h_k) : ciArrayKlass(h_k) { 44 assert(get_Klass()->is_valueArray_klass(), "wrong type"); 45 ValueKlass* element_Klass = get_ValueArrayKlass()->element_klass(); 46 _base_element_klass = CURRENT_ENV->get_klass(element_Klass); 47 assert(_base_element_klass->is_valuetype(), "bad base klass"); 48 if (dimension() == 1) { 49 _element_klass = _base_element_klass; 50 } else { 51 _element_klass = NULL; 52 } 53 if (!ciObjectFactory::is_initialized()) { 54 assert(_element_klass->is_java_lang_Object(), "only arrays of object are shared"); 55 } 56 } 57 58 // ------------------------------------------------------------------ 59 // ciValueArrayKlass::element_klass 60 // 61 // What is the one-level element type of this array? 62 ciKlass* ciValueArrayKlass::element_klass() { 63 if (_element_klass == NULL) { 64 assert(dimension() > 1, "_element_klass should not be NULL"); 65 // Produce the element klass. 66 if (is_loaded()) { 67 VM_ENTRY_MARK; 68 Klass* element_Klass = get_ValueArrayKlass()->element_klass(); 69 _element_klass = CURRENT_THREAD_ENV->get_klass(element_Klass); 70 } else { 71 // TODO handle this 72 guarantee(false, "unloaded array klass"); 73 VM_ENTRY_MARK; 74 // We are an unloaded array klass. Attempt to fetch our 75 // element klass by name. 76 _element_klass = CURRENT_THREAD_ENV->get_klass_by_name_impl( 77 this, 131 // ciValueArrayKlass::make_impl 132 // 133 // Implementation of make. 134 ciValueArrayKlass* ciValueArrayKlass::make_impl(ciKlass* element_klass) { 135 assert(ValueArrayFlatten, "should only be used for flattened value type arrays"); 136 assert(element_klass->is_valuetype(), "element type must be value type"); 137 if (element_klass->is_loaded()) { 138 EXCEPTION_CONTEXT; 139 // The element klass is loaded 140 Klass* array = element_klass->get_Klass()->array_klass(THREAD); 141 if (HAS_PENDING_EXCEPTION) { 142 CLEAR_PENDING_EXCEPTION; 143 CURRENT_THREAD_ENV->record_out_of_memory_failure(); 144 // TODO handle this 145 guarantee(false, "out of memory"); 146 return NULL; 147 } 148 return CURRENT_THREAD_ENV->get_value_array_klass(array); 149 } 150 151 // TODO handle this 152 guarantee(false, "klass not loaded"); 153 return NULL; 154 } 155 156 // ------------------------------------------------------------------ 157 // ciValueArrayKlass::make 158 // 159 // Make an array klass corresponding to the specified primitive type. 160 ciValueArrayKlass* ciValueArrayKlass::make(ciKlass* element_klass) { 161 GUARDED_VM_ENTRY(return make_impl(element_klass);) 162 } 163 164 ciKlass* ciValueArrayKlass::exact_klass() { 165 assert(element_klass()->is_valuetype(), "element type must be value type"); 166 if (element_klass()->is_loaded()) { 167 assert(element_klass()->as_value_klass()->exact_klass() != NULL, "must be"); 168 return this; 169 } 170 171 // TODO handle this 172 guarantee(false, "klass not loaded"); 173 return NULL; | 38 39 // ------------------------------------------------------------------ 40 // ciValueArrayKlass::ciValueArrayKlass 41 // 42 // Constructor for loaded value array klasses. 43 ciValueArrayKlass::ciValueArrayKlass(Klass* h_k) : ciArrayKlass(h_k) { 44 assert(get_Klass()->is_valueArray_klass(), "wrong type"); 45 ValueKlass* element_Klass = get_ValueArrayKlass()->element_klass(); 46 _base_element_klass = CURRENT_ENV->get_klass(element_Klass); 47 assert(_base_element_klass->is_valuetype(), "bad base klass"); 48 if (dimension() == 1) { 49 _element_klass = _base_element_klass; 50 } else { 51 _element_klass = NULL; 52 } 53 if (!ciObjectFactory::is_initialized()) { 54 assert(_element_klass->is_java_lang_Object(), "only arrays of object are shared"); 55 } 56 } 57 58 ciValueArrayKlass::ciValueArrayKlass(ciSymbol* array_name, 59 ciValueKlass* base_element_klass, 60 int dimension) 61 : ciArrayKlass(array_name, dimension, T_VALUETYPE) { 62 _base_element_klass = base_element_klass; 63 _element_klass = base_element_klass; 64 } 65 66 // ------------------------------------------------------------------ 67 // ciValueArrayKlass::element_klass 68 // 69 // What is the one-level element type of this array? 70 ciKlass* ciValueArrayKlass::element_klass() { 71 if (_element_klass == NULL) { 72 assert(dimension() > 1, "_element_klass should not be NULL"); 73 // Produce the element klass. 74 if (is_loaded()) { 75 VM_ENTRY_MARK; 76 Klass* element_Klass = get_ValueArrayKlass()->element_klass(); 77 _element_klass = CURRENT_THREAD_ENV->get_klass(element_Klass); 78 } else { 79 // TODO handle this 80 guarantee(false, "unloaded array klass"); 81 VM_ENTRY_MARK; 82 // We are an unloaded array klass. Attempt to fetch our 83 // element klass by name. 84 _element_klass = CURRENT_THREAD_ENV->get_klass_by_name_impl( 85 this, 139 // ciValueArrayKlass::make_impl 140 // 141 // Implementation of make. 142 ciValueArrayKlass* ciValueArrayKlass::make_impl(ciKlass* element_klass) { 143 assert(ValueArrayFlatten, "should only be used for flattened value type arrays"); 144 assert(element_klass->is_valuetype(), "element type must be value type"); 145 if (element_klass->is_loaded()) { 146 EXCEPTION_CONTEXT; 147 // The element klass is loaded 148 Klass* array = element_klass->get_Klass()->array_klass(THREAD); 149 if (HAS_PENDING_EXCEPTION) { 150 CLEAR_PENDING_EXCEPTION; 151 CURRENT_THREAD_ENV->record_out_of_memory_failure(); 152 // TODO handle this 153 guarantee(false, "out of memory"); 154 return NULL; 155 } 156 return CURRENT_THREAD_ENV->get_value_array_klass(array); 157 } 158 159 // The array klass was unable to be made or the element klass was 160 // not loaded. 161 ciSymbol* array_name = construct_array_name(element_klass->name(), 1); 162 if (array_name == ciEnv::unloaded_cisymbol()) { 163 //return ciEnv::unloaded_ciobjarrayklass(); 164 assert(0, "FIXME"); 165 } 166 return 167 CURRENT_ENV->get_unloaded_klass(element_klass, array_name, false) 168 ->as_value_array_klass(); 169 } 170 171 // ------------------------------------------------------------------ 172 // ciValueArrayKlass::make 173 // 174 // Make an array klass corresponding to the specified primitive type. 175 ciValueArrayKlass* ciValueArrayKlass::make(ciKlass* element_klass) { 176 GUARDED_VM_ENTRY(return make_impl(element_klass);) 177 } 178 179 ciKlass* ciValueArrayKlass::exact_klass() { 180 assert(element_klass()->is_valuetype(), "element type must be value type"); 181 if (element_klass()->is_loaded()) { 182 assert(element_klass()->as_value_klass()->exact_klass() != NULL, "must be"); 183 return this; 184 } 185 186 // TODO handle this 187 guarantee(false, "klass not loaded"); 188 return NULL; |