< prev index next >

src/hotspot/share/ci/ciField.cpp

Print this page




  51 // This allows non-static field lists to be cached on shared types.
  52 // Because the _type field is lazily initialized, however, there is a
  53 // special restriction that a shared field cannot cache an unshared type.
  54 // This puts a small performance penalty on shared fields with unshared
  55 // types, such as StackTraceElement[] Throwable.stackTrace.
  56 // (Throwable is shared because ClassCastException is shared, but
  57 // StackTraceElement is not presently shared.)
  58 
  59 // It is not a vicious circularity for a ciField to recursively create
  60 // the ciSymbols necessary to represent its name and signature.
  61 // Therefore, these items are created eagerly, and the name and signature
  62 // of a shared field are themselves shared symbols.  This somewhat
  63 // pollutes the set of shared CI objects:  It grows from 50 to 93 items,
  64 // with all of the additional 43 being uninteresting shared ciSymbols.
  65 // This adds at most one step to the binary search, an amount which
  66 // decreases for complex compilation tasks.
  67 
  68 // ------------------------------------------------------------------
  69 // ciField::ciField
  70 ciField::ciField(ciInstanceKlass* klass, int index) :
  71     _known_to_link_with_put(NULL), _known_to_link_with_get(NULL) {
  72   ASSERT_IN_VM;
  73   CompilerThread *THREAD = CompilerThread::current();
  74 
  75   assert(ciObjectFactory::is_initialized(), "not a shared field");
  76 
  77   assert(klass->get_instanceKlass()->is_linked(), "must be linked before using its constant-pool");
  78 
  79   constantPoolHandle cpool(THREAD, klass->get_instanceKlass()->constants());
  80 
  81   // Get the field's name, signature, and type.
  82   Symbol* name  = cpool->name_ref_at(index);
  83   _name = ciEnv::current(THREAD)->get_symbol(name);
  84 
  85   int nt_index = cpool->name_and_type_ref_index_at(index);
  86   int sig_index = cpool->signature_ref_index_at(nt_index);
  87   Symbol* signature = cpool->symbol_at(sig_index);
  88   _signature = ciEnv::current(THREAD)->get_symbol(signature);
  89 
  90   BasicType field_type = FieldType::basic_type(signature);
  91 




  51 // This allows non-static field lists to be cached on shared types.
  52 // Because the _type field is lazily initialized, however, there is a
  53 // special restriction that a shared field cannot cache an unshared type.
  54 // This puts a small performance penalty on shared fields with unshared
  55 // types, such as StackTraceElement[] Throwable.stackTrace.
  56 // (Throwable is shared because ClassCastException is shared, but
  57 // StackTraceElement is not presently shared.)
  58 
  59 // It is not a vicious circularity for a ciField to recursively create
  60 // the ciSymbols necessary to represent its name and signature.
  61 // Therefore, these items are created eagerly, and the name and signature
  62 // of a shared field are themselves shared symbols.  This somewhat
  63 // pollutes the set of shared CI objects:  It grows from 50 to 93 items,
  64 // with all of the additional 43 being uninteresting shared ciSymbols.
  65 // This adds at most one step to the binary search, an amount which
  66 // decreases for complex compilation tasks.
  67 
  68 // ------------------------------------------------------------------
  69 // ciField::ciField
  70 ciField::ciField(ciInstanceKlass* klass, int index) :
  71   _is_flattened(false), _known_to_link_with_put(NULL), _known_to_link_with_get(NULL) {
  72   ASSERT_IN_VM;
  73   CompilerThread *THREAD = CompilerThread::current();
  74 
  75   assert(ciObjectFactory::is_initialized(), "not a shared field");
  76 
  77   assert(klass->get_instanceKlass()->is_linked(), "must be linked before using its constant-pool");
  78 
  79   constantPoolHandle cpool(THREAD, klass->get_instanceKlass()->constants());
  80 
  81   // Get the field's name, signature, and type.
  82   Symbol* name  = cpool->name_ref_at(index);
  83   _name = ciEnv::current(THREAD)->get_symbol(name);
  84 
  85   int nt_index = cpool->name_and_type_ref_index_at(index);
  86   int sig_index = cpool->signature_ref_index_at(nt_index);
  87   Symbol* signature = cpool->symbol_at(sig_index);
  88   _signature = ciEnv::current(THREAD)->get_symbol(signature);
  89 
  90   BasicType field_type = FieldType::basic_type(signature);
  91 


< prev index next >