91 // element klass by name. 92 _element_klass = CURRENT_THREAD_ENV->get_klass_by_name_impl( 93 this, 94 constantPoolHandle(), 95 construct_array_name(base_element_klass()->name(), 96 dimension() - 1), 97 false); 98 } 99 } 100 return _element_klass; 101 } 102 103 // ------------------------------------------------------------------ 104 // ciObjArrayKlass::construct_array_name 105 // 106 // Build an array name from an element name and a dimension. 107 ciSymbol* ciObjArrayKlass::construct_array_name(ciSymbol* element_name, 108 int dimension) { 109 EXCEPTION_CONTEXT; 110 int element_len = element_name->utf8_length(); 111 112 Symbol* base_name_sym = element_name->get_symbol(); 113 char* name; 114 115 if (base_name_sym->char_at(0) == JVM_SIGNATURE_ARRAY || 116 (base_name_sym->char_at(0) == JVM_SIGNATURE_CLASS && // watch package name 'Lxx' 117 base_name_sym->char_at(element_len-1) == JVM_SIGNATURE_ENDCLASS)) { 118 119 int new_len = element_len + dimension + 1; // for the ['s and '\0' 120 name = CURRENT_THREAD_ENV->name_buffer(new_len); 121 122 int pos = 0; 123 for ( ; pos < dimension; pos++) { 124 name[pos] = JVM_SIGNATURE_ARRAY; 125 } 126 strncpy(name+pos, (char*)element_name->base(), element_len); 127 name[new_len-1] = '\0'; 128 } else { 129 int new_len = 3 // for L, ;, and '\0' 130 + dimension // for ['s 131 + element_len; 132 133 name = CURRENT_THREAD_ENV->name_buffer(new_len); 134 int pos = 0; 135 for ( ; pos < dimension; pos++) { 136 name[pos] = JVM_SIGNATURE_ARRAY; 137 } 138 name[pos++] = JVM_SIGNATURE_CLASS; 139 strncpy(name+pos, (char*)element_name->base(), element_len); 140 name[new_len-2] = JVM_SIGNATURE_ENDCLASS; 141 name[new_len-1] = '\0'; 142 } 143 return ciSymbol::make(name); 144 } 145 146 // ------------------------------------------------------------------ 147 // ciObjArrayKlass::make_impl 148 // 149 // Implementation of make. 150 ciObjArrayKlass* ciObjArrayKlass::make_impl(ciKlass* element_klass) { 151 152 if (element_klass->is_loaded()) { 153 EXCEPTION_CONTEXT; 154 // The element klass is loaded 155 Klass* array = element_klass->get_Klass()->array_klass(THREAD); 156 if (HAS_PENDING_EXCEPTION) { 157 CLEAR_PENDING_EXCEPTION; 158 CURRENT_THREAD_ENV->record_out_of_memory_failure(); 159 return ciEnv::unloaded_ciobjarrayklass(); 160 } 161 return CURRENT_THREAD_ENV->get_obj_array_klass(array); | 91 // element klass by name. 92 _element_klass = CURRENT_THREAD_ENV->get_klass_by_name_impl( 93 this, 94 constantPoolHandle(), 95 construct_array_name(base_element_klass()->name(), 96 dimension() - 1), 97 false); 98 } 99 } 100 return _element_klass; 101 } 102 103 // ------------------------------------------------------------------ 104 // ciObjArrayKlass::construct_array_name 105 // 106 // Build an array name from an element name and a dimension. 107 ciSymbol* ciObjArrayKlass::construct_array_name(ciSymbol* element_name, 108 int dimension) { 109 EXCEPTION_CONTEXT; 110 int element_len = element_name->utf8_length(); 111 int buflen = dimension + element_len + 3; // '['+ + 'L'? + (element) + ';'? + '\0' 112 char* name = CURRENT_THREAD_ENV->name_buffer(buflen); 113 int pos = 0; 114 for ( ; pos < dimension; pos++) { 115 name[pos] = JVM_SIGNATURE_ARRAY; 116 } 117 Symbol* base_name_sym = element_name->get_symbol(); 118 119 if (Signature::is_array(base_name_sym) || 120 Signature::has_envelope(base_name_sym)) { 121 strncpy(&name[pos], (char*)element_name->base(), element_len); 122 name[pos + element_len] = '\0'; 123 } else { 124 name[pos++] = JVM_SIGNATURE_CLASS; 125 strncpy(&name[pos], (char*)element_name->base(), element_len); 126 name[pos + element_len] = JVM_SIGNATURE_ENDCLASS; 127 name[pos + element_len + 1] = '\0'; 128 } 129 return ciSymbol::make(name); 130 } 131 132 // ------------------------------------------------------------------ 133 // ciObjArrayKlass::make_impl 134 // 135 // Implementation of make. 136 ciObjArrayKlass* ciObjArrayKlass::make_impl(ciKlass* element_klass) { 137 138 if (element_klass->is_loaded()) { 139 EXCEPTION_CONTEXT; 140 // The element klass is loaded 141 Klass* array = element_klass->get_Klass()->array_klass(THREAD); 142 if (HAS_PENDING_EXCEPTION) { 143 CLEAR_PENDING_EXCEPTION; 144 CURRENT_THREAD_ENV->record_out_of_memory_failure(); 145 return ciEnv::unloaded_ciobjarrayklass(); 146 } 147 return CURRENT_THREAD_ENV->get_obj_array_klass(array); |