ciArrayKlass.cpp revision 1472:c18cbe5936b8
1/*
2 * Copyright (c) 1999, 2005, 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 */
24
25#include "incls/_precompiled.incl"
26#include "incls/_ciArrayKlass.cpp.incl"
27
28// ciArrayKlass
29//
30// This class represents a klassOop in the HotSpot virtual machine
31// whose Klass part in an arrayKlass.
32
33// ------------------------------------------------------------------
34// ciArrayKlass::ciArrayKlass
35//
36// Loaded array klass.
37ciArrayKlass::ciArrayKlass(KlassHandle h_k) : ciKlass(h_k) {
38  assert(get_Klass()->oop_is_array(), "wrong type");
39  _dimension = get_arrayKlass()->dimension();
40}
41
42// ------------------------------------------------------------------
43// ciArrayKlass::ciArrayKlass
44//
45// Unloaded array klass.
46ciArrayKlass::ciArrayKlass(ciSymbol* name, int dimension, ciKlass* klass)
47  : ciKlass(name, klass) {
48  _dimension = dimension;
49}
50
51// ------------------------------------------------------------------
52// ciArrayKlass::element_type
53//
54// What type is obtained when this array is indexed once?
55ciType* ciArrayKlass::element_type() {
56  if (is_type_array_klass()) {
57    return ciType::make(as_type_array_klass()->element_type());
58  } else {
59    return as_obj_array_klass()->element_klass()->as_klass();
60  }
61}
62
63
64// ------------------------------------------------------------------
65// ciArrayKlass::base_element_type
66//
67// What type is obtained when this array is indexed as many times as possible?
68ciType* ciArrayKlass::base_element_type() {
69  if (is_type_array_klass()) {
70    return ciType::make(as_type_array_klass()->element_type());
71  } else {
72    ciKlass* ek = as_obj_array_klass()->base_element_klass();
73    if (ek->is_type_array_klass()) {
74      return ciType::make(ek->as_type_array_klass()->element_type());
75    }
76    return ek;
77  }
78}
79
80
81// ------------------------------------------------------------------
82// ciArrayKlass::is_leaf_type
83bool ciArrayKlass::is_leaf_type() {
84  if (is_type_array_klass()) {
85    return true;
86  } else {
87    return as_obj_array_klass()->base_element_klass()->is_leaf_type();
88  }
89}
90
91
92// ------------------------------------------------------------------
93// ciArrayKlass::base_element_type
94//
95// What type is obtained when this array is indexed as many times as possible?
96ciArrayKlass* ciArrayKlass::make(ciType* element_type) {
97  if (element_type->is_primitive_type()) {
98    return ciTypeArrayKlass::make(element_type->basic_type());
99  } else {
100    return ciObjArrayKlass::make(element_type->as_klass());
101  }
102}
103