hotspot/src/share/vm/ci/ciField.cpp
changeset 20017 81eba62e9048
parent 19770 7cb9f982ea81
child 22551 9bf46d16dcc6
equal deleted inserted replaced
20014:b34a9fa1931a 20017:81eba62e9048
     1 /*
     1 /*
     2  * Copyright (c) 1999, 2012, Oracle and/or its affiliates. All rights reserved.
     2  * Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved.
     3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
     3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
     4  *
     4  *
     5  * This code is free software; you can redistribute it and/or modify it
     5  * This code is free software; you can redistribute it and/or modify it
     6  * under the terms of the GNU General Public License version 2 only, as
     6  * under the terms of the GNU General Public License version 2 only, as
     7  * published by the Free Software Foundation.
     7  * published by the Free Software Foundation.
    73 
    73 
    74   assert(ciObjectFactory::is_initialized(), "not a shared field");
    74   assert(ciObjectFactory::is_initialized(), "not a shared field");
    75 
    75 
    76   assert(klass->get_instanceKlass()->is_linked(), "must be linked before using its constan-pool");
    76   assert(klass->get_instanceKlass()->is_linked(), "must be linked before using its constan-pool");
    77 
    77 
    78   _cp_index = index;
       
    79   constantPoolHandle cpool(thread, klass->get_instanceKlass()->constants());
    78   constantPoolHandle cpool(thread, klass->get_instanceKlass()->constants());
    80 
    79 
    81   // Get the field's name, signature, and type.
    80   // Get the field's name, signature, and type.
    82   Symbol* name  = cpool->name_ref_at(index);
    81   Symbol* name  = cpool->name_ref_at(index);
    83   _name = ciEnv::current(thread)->get_symbol(name);
    82   _name = ciEnv::current(thread)->get_symbol(name);
   114                                                klass)->as_instance_klass();
   113                                                klass)->as_instance_klass();
   115 
   114 
   116   // The declared holder of this field may not have been loaded.
   115   // The declared holder of this field may not have been loaded.
   117   // Bail out with partial field information.
   116   // Bail out with partial field information.
   118   if (!holder_is_accessible) {
   117   if (!holder_is_accessible) {
   119     // _cp_index and _type have already been set.
   118     // _type has already been set.
   120     // The default values for _flags and _constant_value will suffice.
   119     // The default values for _flags and _constant_value will suffice.
   121     // We need values for _holder, _offset,  and _is_constant,
   120     // We need values for _holder, _offset,  and _is_constant,
   122     _holder = declared_holder;
   121     _holder = declared_holder;
   123     _offset = -1;
   122     _offset = -1;
   124     _is_constant = false;
   123     _is_constant = false;
   143   initialize_from(&field_desc);
   142   initialize_from(&field_desc);
   144 }
   143 }
   145 
   144 
   146 ciField::ciField(fieldDescriptor *fd): _known_to_link_with_put(NULL), _known_to_link_with_get(NULL) {
   145 ciField::ciField(fieldDescriptor *fd): _known_to_link_with_put(NULL), _known_to_link_with_get(NULL) {
   147   ASSERT_IN_VM;
   146   ASSERT_IN_VM;
   148 
       
   149   _cp_index = -1;
       
   150 
   147 
   151   // Get the field's name, signature, and type.
   148   // Get the field's name, signature, and type.
   152   ciEnv* env = CURRENT_ENV;
   149   ciEnv* env = CURRENT_ENV;
   153   _name = env->get_symbol(fd->name());
   150   _name = env->get_symbol(fd->name());
   154   _signature = env->get_symbol(fd->signature());
   151   _signature = env->get_symbol(fd->signature());
   349     if (_known_to_link_with_get == accessing_klass) {
   346     if (_known_to_link_with_get == accessing_klass) {
   350       return true;
   347       return true;
   351     }
   348     }
   352   }
   349   }
   353 
   350 
   354   FieldAccessInfo result;
   351   fieldDescriptor result;
   355   constantPoolHandle c_pool(THREAD,
   352   LinkResolver::resolve_field(result, _holder->get_instanceKlass(),
   356                          accessing_klass->get_instanceKlass()->constants());
   353                               _name->get_symbol(), _signature->get_symbol(),
   357   LinkResolver::resolve_field(result, c_pool, _cp_index,
   354                               accessing_klass->get_Klass(), bc, true, false,
   358                               Bytecodes::java_code(bc),
   355                               KILL_COMPILE_ON_FATAL_(false));
   359                               true, false, KILL_COMPILE_ON_FATAL_(false));
       
   360 
   356 
   361   // update the hit-cache, unless there is a problem with memory scoping:
   357   // update the hit-cache, unless there is a problem with memory scoping:
   362   if (accessing_klass->is_shared() || !is_shared()) {
   358   if (accessing_klass->is_shared() || !is_shared()) {
   363     if (is_put) {
   359     if (is_put) {
   364       _known_to_link_with_put = accessing_klass;
   360       _known_to_link_with_put = accessing_klass;