1 /*
 2  * Copyright (c) 2017, 2019, 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 #ifndef SHARE_VM_CI_CIINLINEKLASS_HPP
26 #define SHARE_VM_CI_CIINLINEKLASS_HPP
27 
28 #include "ci/ciConstantPoolCache.hpp"
29 #include "ci/ciEnv.hpp"
30 #include "ci/ciFlags.hpp"
31 #include "ci/ciInstanceKlass.hpp"
32 #include "ci/ciSymbol.hpp"
33 #include "oops/inlineKlass.hpp"
34 
35 // ciInlineKlass
36 //
37 // Specialized ciInstanceKlass for inline types.
38 class ciInlineKlass : public ciInstanceKlass {
39   CI_PACKAGE_ACCESS
40 
41 private:
42   // Fields declared in the bytecode (without flattened inline type fields)
43   GrowableArray<ciField*>* _declared_nonstatic_fields;
44 
45   InlineKlass* to_InlineKlass() const {
46     return InlineKlass::cast(get_Klass());
47   }
48 
49 protected:
50   ciInlineKlass(Klass* h_k) : ciInstanceKlass(h_k), _declared_nonstatic_fields(NULL) {
51     assert(is_final(), "InlineKlass must be final");
52   };
53 
54   ciInlineKlass(ciSymbol* name, jobject loader, jobject protection_domain) :
55     ciInstanceKlass(name, loader, protection_domain, T_INLINE_TYPE) {}
56 
57   int compute_nonstatic_fields();
58   const char* type_string() { return "ciInlineKlass"; }
59 
60 public:
61   bool is_inlinetype() const { return true; }
62 
63   int nof_declared_nonstatic_fields() {
64     if (_declared_nonstatic_fields == NULL) {
65       compute_nonstatic_fields();
66     }
67     return _declared_nonstatic_fields->length();
68   }
69 
70   // ith non-static declared field (presented by ascending address)
71   ciField* declared_nonstatic_field_at(int i) {
72     assert(_declared_nonstatic_fields != NULL, "should be initialized");
73     return _declared_nonstatic_fields->at(i);
74   }
75 
76   // Inline type fields
77   int first_field_offset() const;
78   int field_index_by_offset(int offset);
79 
80   bool flatten_array() const;
81   bool can_be_passed_as_fields() const;
82   bool can_be_returned_as_fields() const;
83   bool is_empty();
84   int inline_arg_slots();
85   int default_value_offset() const;
86   ciInstance* default_instance() const;
87   ciInstance* ref_instance() const;
88   ciInstance* val_instance() const;
89   bool contains_oops() const;
90   int oop_count() const;
91   address pack_handler() const;
92   address unpack_handler() const;
93   InlineKlass* get_InlineKlass() const;
94   ciInstance* ref_mirror();
95   ciInstance* val_mirror();
96 };
97 
98 #endif // SHARE_VM_CI_CIINLINEKLASS_HPP