< prev index next >

src/hotspot/share/oops/instanceKlass.cpp

Print this page




3277                                                              InstanceKlass* k2, TRAPS) {
3278   if (signature->utf8_length() == 1) return;  // Primitive signature
3279   if (!(k1->has_value_types_attribute() || k2->has_value_types_attribute())) return;
3280   ResourceMark rm(THREAD);
3281   for (SignatureStream sstream(signature); !sstream.is_done(); sstream.next()) {
3282     if (sstream.is_object()) {
3283       Symbol* sym = sstream.as_symbol(THREAD);
3284       Symbol* name = sym;
3285       if (sstream.is_array()) {
3286         int i=0;
3287         while (sym->byte_at(i) == '[') i++;
3288         if (i == sym->utf8_length() - 1 ) continue; // primitive array
3289         assert(sym->byte_at(i) == 'L', "Must be a L-type");
3290         name = SymbolTable::lookup(sym->as_C_string() + i + 1,
3291                                            sym->utf8_length() - 2 - i, CHECK);
3292       }
3293       bool opinion1 = k1->is_declared_value_type(name);
3294       bool opinion2 = k2->is_declared_value_type(name);
3295       if (sym != name) name->decrement_refcount();
3296       if (opinion1 != opinion2) {
3297         THROW(vmSymbols::java_lang_IncompatibleClassChangeError());



3298       }
3299     }
3300   }
3301 }
3302 
3303 void InstanceKlass::check_symbol_for_value_types_consistency(Symbol* sym,
3304                                                              InstanceKlass* k1,
3305                                                              InstanceKlass* k2, TRAPS) {
3306   if (sym->utf8_length() == 1) return;  // Primitive signature
3307   if (!(k1->has_value_types_attribute() || k2->has_value_types_attribute())) return;
3308   assert(sym->byte_at(0) == 'L' || sym->byte_at(0) == '[', "Sanity check");
3309   ResourceMark rm(THREAD);
3310   Symbol* name;
3311   if (sym->byte_at(0) == 'L') {
3312     name = SymbolTable::lookup(sym->as_C_string() + 1,
3313                                sym->utf8_length() - 2, CHECK);
3314   } else {
3315     int i=0;
3316     while (sym->byte_at(i) == '[') i++;
3317     if (i == sym->utf8_length() - 1 ) return; // primitive array
3318     assert(sym->byte_at(i) == 'L', "Must be a L-type");
3319     name = SymbolTable::lookup(sym->as_C_string() + i + 1,
3320                                sym->utf8_length() - 2 - i, CHECK);
3321   }
3322   bool opinion1 = k1->is_declared_value_type(name);
3323   bool opinion2 = k2->is_declared_value_type(name);
3324   name->decrement_refcount();
3325   if (opinion1 != opinion2) {
3326     THROW(vmSymbols::java_lang_IncompatibleClassChangeError());



3327   }
3328 }
3329 
3330 void InstanceKlass::print_class_load_logging(ClassLoaderData* loader_data,
3331                                              const char* module_name,
3332                                              const ClassFileStream* cfs) const {
3333   if (!log_is_enabled(Info, class, load)) {
3334     return;
3335   }
3336 
3337   ResourceMark rm;
3338   LogMessage(class, load) msg;
3339   stringStream info_stream;
3340 
3341   // Name and class hierarchy info
3342   info_stream.print("%s", external_name());
3343 
3344   // Source
3345   if (cfs != NULL) {
3346     if (cfs->source() != NULL) {




3277                                                              InstanceKlass* k2, TRAPS) {
3278   if (signature->utf8_length() == 1) return;  // Primitive signature
3279   if (!(k1->has_value_types_attribute() || k2->has_value_types_attribute())) return;
3280   ResourceMark rm(THREAD);
3281   for (SignatureStream sstream(signature); !sstream.is_done(); sstream.next()) {
3282     if (sstream.is_object()) {
3283       Symbol* sym = sstream.as_symbol(THREAD);
3284       Symbol* name = sym;
3285       if (sstream.is_array()) {
3286         int i=0;
3287         while (sym->byte_at(i) == '[') i++;
3288         if (i == sym->utf8_length() - 1 ) continue; // primitive array
3289         assert(sym->byte_at(i) == 'L', "Must be a L-type");
3290         name = SymbolTable::lookup(sym->as_C_string() + i + 1,
3291                                            sym->utf8_length() - 2 - i, CHECK);
3292       }
3293       bool opinion1 = k1->is_declared_value_type(name);
3294       bool opinion2 = k2->is_declared_value_type(name);
3295       if (sym != name) name->decrement_refcount();
3296       if (opinion1 != opinion2) {
3297         stringStream ss;
3298         ss.print("signature %s inconsistent value type: %s %s",
3299             signature->as_C_string(), k1->external_name(), k2->external_name());
3300         THROW_MSG(vmSymbols::java_lang_IncompatibleClassChangeError(), ss.as_string());
3301       }
3302     }
3303   }
3304 }
3305 
3306 void InstanceKlass::check_symbol_for_value_types_consistency(Symbol* sym,
3307                                                              InstanceKlass* k1,
3308                                                              InstanceKlass* k2, TRAPS) {
3309   if (sym->utf8_length() == 1) return;  // Primitive signature
3310   if (!(k1->has_value_types_attribute() || k2->has_value_types_attribute())) return;
3311   assert(sym->byte_at(0) == 'L' || sym->byte_at(0) == '[', "Sanity check");
3312   ResourceMark rm(THREAD);
3313   Symbol* name;
3314   if (sym->byte_at(0) == 'L') {
3315     name = SymbolTable::lookup(sym->as_C_string() + 1,
3316                                sym->utf8_length() - 2, CHECK);
3317   } else {
3318     int i=0;
3319     while (sym->byte_at(i) == '[') i++;
3320     if (i == sym->utf8_length() - 1 ) return; // primitive array
3321     assert(sym->byte_at(i) == 'L', "Must be a L-type");
3322     name = SymbolTable::lookup(sym->as_C_string() + i + 1,
3323                                sym->utf8_length() - 2 - i, CHECK);
3324   }
3325   bool opinion1 = k1->is_declared_value_type(name);
3326   bool opinion2 = k2->is_declared_value_type(name);
3327   name->decrement_refcount();
3328   if (opinion1 != opinion2) {
3329     stringStream ss;
3330     ss.print("symbol %s inconsistent value type: %s %s",
3331             sym->as_C_string(), k1->external_name(), k2->external_name());
3332     THROW_MSG(vmSymbols::java_lang_IncompatibleClassChangeError(), ss.as_string());
3333   }
3334 }
3335 
3336 void InstanceKlass::print_class_load_logging(ClassLoaderData* loader_data,
3337                                              const char* module_name,
3338                                              const ClassFileStream* cfs) const {
3339   if (!log_is_enabled(Info, class, load)) {
3340     return;
3341   }
3342 
3343   ResourceMark rm;
3344   LogMessage(class, load) msg;
3345   stringStream info_stream;
3346 
3347   // Name and class hierarchy info
3348   info_stream.print("%s", external_name());
3349 
3350   // Source
3351   if (cfs != NULL) {
3352     if (cfs->source() != NULL) {


< prev index next >