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