src/share/vm/ci/ciInstance.cpp

Mon, 07 Oct 2013 10:41:56 -0700

author
twisti
date
Mon, 07 Oct 2013 10:41:56 -0700
changeset 5907
c775af091fe9
parent 5658
edb5ab0f3fe5
child 6198
55fb97c4c58d
permissions
-rw-r--r--

8025566: EXCEPTION_ACCESS_VIOLATION in compiled by C1 String.valueOf method
Reviewed-by: kvn

     1 /*
     2  * Copyright (c) 1999, 2012, Oracle and/or its affiliates. All rights reserved.
     3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
     4  *
     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
     7  * published by the Free Software Foundation.
     8  *
     9  * This code is distributed in the hope that it will be useful, but WITHOUT
    10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    12  * version 2 for more details (a copy is included in the LICENSE file that
    13  * accompanied this code).
    14  *
    15  * You should have received a copy of the GNU General Public License version
    16  * 2 along with this work; if not, write to the Free Software Foundation,
    17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    18  *
    19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    20  * or visit www.oracle.com if you need additional information or have any
    21  * questions.
    22  *
    23  */
    25 #include "precompiled.hpp"
    26 #include "ci/ciConstant.hpp"
    27 #include "ci/ciField.hpp"
    28 #include "ci/ciInstance.hpp"
    29 #include "ci/ciInstanceKlass.hpp"
    30 #include "ci/ciUtilities.hpp"
    31 #include "classfile/systemDictionary.hpp"
    32 #include "oops/oop.inline.hpp"
    34 // ciInstance
    35 //
    36 // This class represents an instanceOop in the HotSpot virtual
    37 // machine.
    39 // ------------------------------------------------------------------
    40 // ciObject::java_mirror_type
    41 ciType* ciInstance::java_mirror_type() {
    42   VM_ENTRY_MARK;
    43   oop m = get_oop();
    44   // Return NULL if it is not java.lang.Class.
    45   if (m == NULL || m->klass() != SystemDictionary::Class_klass()) {
    46     return NULL;
    47   }
    48   // Return either a primitive type or a klass.
    49   if (java_lang_Class::is_primitive(m)) {
    50     return ciType::make(java_lang_Class::primitive_type(m));
    51   } else {
    52     Klass* k = java_lang_Class::as_Klass(m);
    53     assert(k != NULL, "");
    54     return CURRENT_THREAD_ENV->get_klass(k);
    55   }
    56 }
    58 // ------------------------------------------------------------------
    59 // ciInstance::field_value
    60 //
    61 // Constant value of a field.
    62 ciConstant ciInstance::field_value(ciField* field) {
    63   assert(is_loaded(), "invalid access - must be loaded");
    64   assert(field->holder()->is_loaded(), "invalid access - holder must be loaded");
    65   assert(klass()->is_subclass_of(field->holder()), "invalid access - must be subclass");
    67   VM_ENTRY_MARK;
    68   ciConstant result;
    69   Handle obj = get_oop();
    70   assert(!obj.is_null(), "bad oop");
    71   BasicType field_btype = field->type()->basic_type();
    72   int offset = field->offset();
    74   switch(field_btype) {
    75   case T_BYTE:
    76     return ciConstant(field_btype, obj->byte_field(offset));
    77     break;
    78   case T_CHAR:
    79     return ciConstant(field_btype, obj->char_field(offset));
    80     break;
    81   case T_SHORT:
    82     return ciConstant(field_btype, obj->short_field(offset));
    83     break;
    84   case T_BOOLEAN:
    85     return ciConstant(field_btype, obj->bool_field(offset));
    86     break;
    87   case T_INT:
    88     return ciConstant(field_btype, obj->int_field(offset));
    89     break;
    90   case T_FLOAT:
    91     return ciConstant(obj->float_field(offset));
    92     break;
    93   case T_DOUBLE:
    94     return ciConstant(obj->double_field(offset));
    95     break;
    96   case T_LONG:
    97     return ciConstant(obj->long_field(offset));
    98     break;
    99   case T_OBJECT:
   100   case T_ARRAY:
   101     {
   102       oop o = obj->obj_field(offset);
   104       // A field will be "constant" if it is known always to be
   105       // a non-null reference to an instance of a particular class,
   106       // or to a particular array.  This can happen even if the instance
   107       // or array is not perm.  In such a case, an "unloaded" ciArray
   108       // or ciInstance is created.  The compiler may be able to use
   109       // information about the object's class (which is exact) or length.
   111       if (o == NULL) {
   112         return ciConstant(field_btype, ciNullObject::make());
   113       } else {
   114         return ciConstant(field_btype, CURRENT_ENV->get_object(o));
   115       }
   116     }
   117   }
   118   ShouldNotReachHere();
   119   // to shut up the compiler
   120   return ciConstant();
   121 }
   123 // ------------------------------------------------------------------
   124 // ciInstance::field_value_by_offset
   125 //
   126 // Constant value of a field at the specified offset.
   127 ciConstant ciInstance::field_value_by_offset(int field_offset) {
   128   ciInstanceKlass* ik = klass()->as_instance_klass();
   129   ciField* field = ik->get_field_by_offset(field_offset, false);
   130   if (field == NULL)
   131     return ciConstant();  // T_ILLEGAL
   132   return field_value(field);
   133 }
   135 // ------------------------------------------------------------------
   136 // ciInstance::print_impl
   137 //
   138 // Implementation of the print method.
   139 void ciInstance::print_impl(outputStream* st) {
   140   st->print(" type=");
   141   klass()->print(st);
   142 }
   145 ciKlass* ciInstance::java_lang_Class_klass() {
   146   VM_ENTRY_MARK;
   147   return CURRENT_ENV->get_metadata(java_lang_Class::as_Klass(get_oop()))->as_klass();
   148 }

mercurial