hotspot/src/share/vm/shark/sharkConstant.cpp
changeset 14622 8e94e4186d35
parent 7397 5b173b4ca846
child 15207 86fd7c602ddf
equal deleted inserted replaced
14621:fd9265ab0f67 14622:8e94e4186d35
    35 SharkConstant* SharkConstant::for_ldc(ciBytecodeStream *iter) {
    35 SharkConstant* SharkConstant::for_ldc(ciBytecodeStream *iter) {
    36   ciConstant constant = iter->get_constant();
    36   ciConstant constant = iter->get_constant();
    37   ciType *type = NULL;
    37   ciType *type = NULL;
    38   if (constant.basic_type() == T_OBJECT) {
    38   if (constant.basic_type() == T_OBJECT) {
    39     ciEnv *env = ciEnv::current();
    39     ciEnv *env = ciEnv::current();
    40     if (constant.as_object()->is_klass())
    40     assert(constant.as_object()->klass() == env->String_klass() || constant.as_object()->klass() == env->Class_klass(), "should be");
    41       type = env->Class_klass();
    41     type = constant.as_object()->klass();
    42     else
       
    43       type = env->String_klass();
       
    44   }
    42   }
    45   return new SharkConstant(constant, type);
    43   return new SharkConstant(constant, type);
    46 }
    44 }
    47 
    45 
    48 SharkConstant* SharkConstant::for_field(ciBytecodeStream *iter) {
    46 SharkConstant* SharkConstant::for_field(ciBytecodeStream *iter) {
   106   // ciObjects are psuedo-objects that refer to oops which
   104   // ciObjects are psuedo-objects that refer to oops which
   107   // have yet to be created.  We need to spot the unloaded
   105   // have yet to be created.  We need to spot the unloaded
   108   // objects (which differ between ldc* and get*, thanks!)
   106   // objects (which differ between ldc* and get*, thanks!)
   109   ciObject *object = constant.as_object();
   107   ciObject *object = constant.as_object();
   110   assert(type != NULL, "shouldn't be");
   108   assert(type != NULL, "shouldn't be");
   111   if (object->is_klass()) {
   109 
   112     // The constant returned for a klass is the ciKlass
   110   if ((! object->is_null_object()) && object->klass() == ciEnv::current()->Class_klass()) {
   113     // for the entry, but we want the java_mirror.
   111     ciKlass *klass = object->klass();
   114     ciKlass *klass = object->as_klass();
   112     if (! klass->is_loaded()) {
   115     if (!klass->is_loaded()) {
       
   116       _is_loaded = false;
   113       _is_loaded = false;
   117       return;
   114       return;
   118     }
   115     }
   119     object = klass->java_mirror();
       
   120   }
   116   }
   121   if (object->is_null_object() || !object->can_be_constant()) {
   117 
       
   118   if (object->is_null_object() || ! object->can_be_constant() || ! object->is_loaded()) {
   122     _is_loaded = false;
   119     _is_loaded = false;
   123     return;
   120     return;
   124   }
   121   }
   125 
   122 
   126   _value       = NULL;
   123   _value       = NULL;