src/share/vm/oops/instanceKlass.cpp

changeset 1100
c89f86385056
parent 1040
98cb887364d3
child 1111
d3676b4cb78c
     1.1 --- a/src/share/vm/oops/instanceKlass.cpp	Thu Mar 19 09:13:24 2009 -0700
     1.2 +++ b/src/share/vm/oops/instanceKlass.cpp	Fri Mar 20 23:19:36 2009 -0700
     1.3 @@ -1,5 +1,5 @@
     1.4  /*
     1.5 - * Copyright 1997-2008 Sun Microsystems, Inc.  All Rights Reserved.
     1.6 + * Copyright 1997-2009 Sun Microsystems, Inc.  All Rights Reserved.
     1.7   * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
     1.8   *
     1.9   * This code is free software; you can redistribute it and/or modify it
    1.10 @@ -1813,6 +1813,8 @@
    1.11                                            oop class_loader2, symbolOop class_name2) {
    1.12    if (class_loader1 != class_loader2) {
    1.13      return false;
    1.14 +  } else if (class_name1 == class_name2) {
    1.15 +    return true;                // skip painful bytewise comparison
    1.16    } else {
    1.17      ResourceMark rm;
    1.18  
    1.19 @@ -1859,6 +1861,55 @@
    1.20    }
    1.21  }
    1.22  
    1.23 +/* defined for now in jvm.cpp, for historical reasons *--
    1.24 +klassOop instanceKlass::compute_enclosing_class_impl(instanceKlassHandle self,
    1.25 +                                                     symbolOop& simple_name_result, TRAPS) {
    1.26 +  ...
    1.27 +}
    1.28 +*/
    1.29 +
    1.30 +// tell if two classes have the same enclosing class (at package level)
    1.31 +bool instanceKlass::is_same_package_member_impl(instanceKlassHandle class1,
    1.32 +                                                klassOop class2_oop, TRAPS) {
    1.33 +  if (class2_oop == class1->as_klassOop())          return true;
    1.34 +  if (!Klass::cast(class2_oop)->oop_is_instance())  return false;
    1.35 +  instanceKlassHandle class2(THREAD, class2_oop);
    1.36 +
    1.37 +  // must be in same package before we try anything else
    1.38 +  if (!class1->is_same_class_package(class2->class_loader(), class2->name()))
    1.39 +    return false;
    1.40 +
    1.41 +  // As long as there is an outer1.getEnclosingClass,
    1.42 +  // shift the search outward.
    1.43 +  instanceKlassHandle outer1 = class1;
    1.44 +  for (;;) {
    1.45 +    // As we walk along, look for equalities between outer1 and class2.
    1.46 +    // Eventually, the walks will terminate as outer1 stops
    1.47 +    // at the top-level class around the original class.
    1.48 +    symbolOop ignore_name;
    1.49 +    klassOop next = outer1->compute_enclosing_class(ignore_name, CHECK_false);
    1.50 +    if (next == NULL)  break;
    1.51 +    if (next == class2())  return true;
    1.52 +    outer1 = instanceKlassHandle(THREAD, next);
    1.53 +  }
    1.54 +
    1.55 +  // Now do the same for class2.
    1.56 +  instanceKlassHandle outer2 = class2;
    1.57 +  for (;;) {
    1.58 +    symbolOop ignore_name;
    1.59 +    klassOop next = outer2->compute_enclosing_class(ignore_name, CHECK_false);
    1.60 +    if (next == NULL)  break;
    1.61 +    // Might as well check the new outer against all available values.
    1.62 +    if (next == class1())  return true;
    1.63 +    if (next == outer1())  return true;
    1.64 +    outer2 = instanceKlassHandle(THREAD, next);
    1.65 +  }
    1.66 +
    1.67 +  // If by this point we have not found an equality between the
    1.68 +  // two classes, we know they are in separate package members.
    1.69 +  return false;
    1.70 +}
    1.71 +
    1.72  
    1.73  jint instanceKlass::compute_modifier_flags(TRAPS) const {
    1.74    klassOop k = as_klassOop();
    1.75 @@ -1996,9 +2047,11 @@
    1.76  
    1.77  // Printing
    1.78  
    1.79 +#define BULLET  " - "
    1.80 +
    1.81  void FieldPrinter::do_field(fieldDescriptor* fd) {
    1.82 -   if (fd->is_static() == (_obj == NULL)) {
    1.83 -     _st->print("   - ");
    1.84 +  _st->print(BULLET);
    1.85 +   if (fd->is_static() || (_obj == NULL)) {
    1.86       fd->print_on(_st);
    1.87       _st->cr();
    1.88     } else {
    1.89 @@ -2019,7 +2072,7 @@
    1.90          value->is_typeArray() &&
    1.91          offset          <= (juint) value->length() &&
    1.92          offset + length <= (juint) value->length()) {
    1.93 -      st->print("string: ");
    1.94 +      st->print(BULLET"string: ");
    1.95        Handle h_obj(obj);
    1.96        java_lang_String::print(h_obj, st);
    1.97        st->cr();
    1.98 @@ -2027,23 +2080,26 @@
    1.99      }
   1.100    }
   1.101  
   1.102 -  st->print_cr("fields:");
   1.103 +  st->print_cr(BULLET"---- fields (total size %d words):", oop_size(obj));
   1.104    FieldPrinter print_nonstatic_field(st, obj);
   1.105    do_nonstatic_fields(&print_nonstatic_field);
   1.106  
   1.107    if (as_klassOop() == SystemDictionary::class_klass()) {
   1.108 +    st->print(BULLET"signature: ");
   1.109 +    java_lang_Class::print_signature(obj, st);
   1.110 +    st->cr();
   1.111      klassOop mirrored_klass = java_lang_Class::as_klassOop(obj);
   1.112 -    st->print("   - fake entry for mirror: ");
   1.113 +    st->print(BULLET"fake entry for mirror: ");
   1.114      mirrored_klass->print_value_on(st);
   1.115      st->cr();
   1.116 -    st->print("   - fake entry resolved_constructor: ");
   1.117 +    st->print(BULLET"fake entry resolved_constructor: ");
   1.118      methodOop ctor = java_lang_Class::resolved_constructor(obj);
   1.119      ctor->print_value_on(st);
   1.120      klassOop array_klass = java_lang_Class::array_klass(obj);
   1.121 -    st->print("   - fake entry for array: ");
   1.122 +    st->cr();
   1.123 +    st->print(BULLET"fake entry for array: ");
   1.124      array_klass->print_value_on(st);
   1.125      st->cr();
   1.126 -    st->cr();
   1.127    }
   1.128  }
   1.129  
   1.130 @@ -2051,6 +2107,28 @@
   1.131    st->print("a ");
   1.132    name()->print_value_on(st);
   1.133    obj->print_address_on(st);
   1.134 +  if (as_klassOop() == SystemDictionary::string_klass()
   1.135 +      && java_lang_String::value(obj) != NULL) {
   1.136 +    ResourceMark rm;
   1.137 +    int len = java_lang_String::length(obj);
   1.138 +    int plen = (len < 24 ? len : 12);
   1.139 +    char* str = java_lang_String::as_utf8_string(obj, 0, plen);
   1.140 +    st->print(" = \"%s\"", str);
   1.141 +    if (len > plen)
   1.142 +      st->print("...[%d]", len);
   1.143 +  } else if (as_klassOop() == SystemDictionary::class_klass()) {
   1.144 +    klassOop k = java_lang_Class::as_klassOop(obj);
   1.145 +    st->print(" = ");
   1.146 +    if (k != NULL) {
   1.147 +      k->print_value_on(st);
   1.148 +    } else {
   1.149 +      const char* tname = type2name(java_lang_Class::primitive_type(obj));
   1.150 +      st->print("%s", tname ? tname : "type?");
   1.151 +    }
   1.152 +  } else if (java_lang_boxing_object::is_instance(obj)) {
   1.153 +    st->print(" = ");
   1.154 +    java_lang_boxing_object::print(obj, st);
   1.155 +  }
   1.156  }
   1.157  
   1.158  #endif // ndef PRODUCT

mercurial