< prev index next >

src/hotspot/share/ci/ciObjArrayKlass.cpp

Print this page




  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);


< prev index next >