annotate src/share/vm/classfile/genericSignatures.cpp @ 9126:bc26f978b0ce

HotSpotResolvedObjectType: implement hasFinalizeSubclass() correctly don't use the (wrong) cached value, but ask the runtime on each request. Fixes regression on xml.* benchmarks @ specjvm2008. The problem was: After the constructor of Object was deoptimized due to an assumption violation, it was recompiled again after some time. However, on recompilation, the value of hasFinalizeSubclass for the class was not updated and it was compiled again with a, now wrong, assumption, which then triggers deoptimization again. This was repeated until it hit the recompilation limit (defined by PerMethodRecompilationCutoff), and therefore only executed by the interpreter from now on, causing the performance regression.
author Bernhard Urban <bernhard.urban@jku.at>
date Mon, 15 Apr 2013 19:54:58 +0200
parents 4735d2c84362
children 41ed397cc0cd
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
6934
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1 /*
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
2 * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
4 *
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
7 * published by the Free Software Foundation.
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
8 *
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
13 * accompanied this code).
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
14 *
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
18 *
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
20 * or visit www.oracle.com if you need additional information or have any
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
21 * questions.
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
22 *
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
23 */
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
24
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
25 #include "precompiled.hpp"
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
26
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
27 #include "classfile/genericSignatures.hpp"
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
28 #include "classfile/symbolTable.hpp"
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
29 #include "classfile/systemDictionary.hpp"
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
30 #include "memory/resourceArea.hpp"
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
31
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
32 namespace generic {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
33
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
34 // Helper class for parsing the generic signature Symbol in klass and methods
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
35 class DescriptorStream : public ResourceObj {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
36 private:
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
37 Symbol* _symbol;
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
38 int _offset;
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
39 int _mark;
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
40 const char* _parse_error;
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
41
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
42 void set_parse_error(const char* error) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
43 assert(error != NULL, "Can't set NULL error string");
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
44 _parse_error = error;
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
45 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
46
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
47 public:
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
48 DescriptorStream(Symbol* sym)
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
49 : _symbol(sym), _offset(0), _mark(-1), _parse_error(NULL) {}
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
50
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
51 const char* parse_error() const {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
52 return _parse_error;
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
53 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
54
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
55 bool at_end() { return _offset >= _symbol->utf8_length(); }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
56
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
57 char peek() {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
58 if (at_end()) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
59 set_parse_error("Peeking past end of signature");
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
60 return '\0';
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
61 } else {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
62 return _symbol->byte_at(_offset);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
63 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
64 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
65
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
66 char read() {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
67 if (at_end()) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
68 set_parse_error("Reading past end of signature");
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
69 return '\0';
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
70 } else {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
71 return _symbol->byte_at(_offset++);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
72 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
73 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
74
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
75 void read(char expected) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
76 char c = read();
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
77 assert_char(c, expected, 0);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
78 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
79
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
80 void assert_char(char c, char expected, int pos = -1) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
81 if (c != expected) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
82 const char* fmt = "Parse error at %d: expected %c but got %c";
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
83 size_t len = strlen(fmt) + 5;
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
84 char* buffer = NEW_RESOURCE_ARRAY(char, len);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
85 jio_snprintf(buffer, len, fmt, _offset + pos, expected, c);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
86 set_parse_error(buffer);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
87 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
88 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
89
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
90 void push(char c) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
91 assert(c == _symbol->byte_at(_offset - 1), "Pushing back wrong value");
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
92 --_offset;
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
93 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
94
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
95 void expect_end() {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
96 if (!at_end()) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
97 set_parse_error("Unexpected data trailing signature");
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
98 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
99 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
100
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
101 bool has_mark() { return _mark != -1; }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
102
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
103 void set_mark() {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
104 _mark = _offset;
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
105 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
106
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
107 Identifier* identifier_from_mark() {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
108 assert(has_mark(), "Mark should be set");
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
109 if (!has_mark()) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
110 set_parse_error("Expected mark to be set");
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
111 return NULL;
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
112 } else {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
113 Identifier* id = new Identifier(_symbol, _mark, _offset - 1);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
114 _mark = -1;
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
115 return id;
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
116 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
117 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
118 };
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
119
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
120
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
121 #define CHECK_FOR_PARSE_ERROR() \
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
122 if (STREAM->parse_error() != NULL) { \
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
123 if (VerifyGenericSignatures) { \
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
124 fatal(STREAM->parse_error()); \
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
125 } \
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
126 return NULL; \
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
127 } 0
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
128
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
129 #define READ() STREAM->read(); CHECK_FOR_PARSE_ERROR()
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
130 #define PEEK() STREAM->peek(); CHECK_FOR_PARSE_ERROR()
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
131 #define PUSH(c) STREAM->push(c)
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
132 #define EXPECT(c) STREAM->read(c); CHECK_FOR_PARSE_ERROR()
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
133 #define EXPECTED(c, ch) STREAM->assert_char(c, ch); CHECK_FOR_PARSE_ERROR()
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
134 #define EXPECT_END() STREAM->expect_end(); CHECK_FOR_PARSE_ERROR()
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
135
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
136 #define CHECK_STREAM STREAM); CHECK_FOR_PARSE_ERROR(); (0
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
137
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
138 #ifndef PRODUCT
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
139 void Identifier::print_on(outputStream* str) const {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
140 for (int i = _begin; i < _end; ++i) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
141 str->print("%c", (char)_sym->byte_at(i));
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
142 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
143 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
144 #endif // ndef PRODUCT
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
145
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
146 bool Identifier::equals(Identifier* other) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
147 if (_sym == other->_sym && _begin == other->_begin && _end == other->_end) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
148 return true;
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
149 } else if (_end - _begin != other->_end - other->_begin) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
150 return false;
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
151 } else {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
152 size_t len = _end - _begin;
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
153 char* addr = ((char*)_sym->bytes()) + _begin;
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
154 char* oaddr = ((char*)other->_sym->bytes()) + other->_begin;
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
155 return strncmp(addr, oaddr, len) == 0;
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
156 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
157 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
158
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
159 bool Identifier::equals(Symbol* sym) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
160 Identifier id(sym, 0, sym->utf8_length());
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
161 return equals(&id);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
162 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
163
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
164 /**
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
165 * A formal type parameter may be found in the the enclosing class, but it could
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
166 * also come from an enclosing method or outer class, in the case of inner-outer
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
167 * classes or anonymous classes. For example:
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
168 *
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
169 * class Outer<T,V> {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
170 * class Inner<W> {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
171 * void m(T t, V v, W w);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
172 * }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
173 * }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
174 *
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
175 * In this case, the type variables in m()'s signature are not all found in the
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
176 * immediate enclosing class (Inner). class Inner has only type parameter W,
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
177 * but it's outer_class field will reference Outer's descriptor which contains
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
178 * T & V (no outer_method in this case).
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
179 *
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
180 * If you have an anonymous class, it has both an enclosing method *and* an
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
181 * enclosing class where type parameters can be declared:
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
182 *
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
183 * class MOuter<T> {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
184 * <V> void bar(V v) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
185 * Runnable r = new Runnable() {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
186 * public void run() {}
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
187 * public void foo(T t, V v) { ... }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
188 * };
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
189 * }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
190 * }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
191 *
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
192 * In this case, foo will be a member of some class, Runnable$1, which has no
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
193 * formal parameters itself, but has an outer_method (bar()) which provides
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
194 * type parameter V, and an outer class MOuter with type parameter T.
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
195 *
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
196 * It is also possible that the outer class is itself an inner class to some
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
197 * other class (or an anonymous class with an enclosing method), so we need to
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
198 * follow the outer_class/outer_method chain to it's end when looking for a
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
199 * type parameter.
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
200 */
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
201 TypeParameter* Descriptor::find_type_parameter(Identifier* id, int* depth) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
202
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
203 int current_depth = 0;
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
204
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
205 MethodDescriptor* outer_method = as_method_signature();
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
206 ClassDescriptor* outer_class = as_class_signature();
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
207
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
208 if (outer_class == NULL) { // 'this' is a method signature; use the holder
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
209 outer_class = outer_method->outer_class();
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
210 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
211
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
212 while (outer_method != NULL || outer_class != NULL) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
213 if (outer_method != NULL) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
214 for (int i = 0; i < outer_method->type_parameters().length(); ++i) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
215 TypeParameter* p = outer_method->type_parameters().at(i);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
216 if (p->identifier()->equals(id)) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
217 *depth = -1; // indicates this this is a method parameter
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
218 return p;
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
219 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
220 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
221 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
222 if (outer_class != NULL) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
223 for (int i = 0; i < outer_class->type_parameters().length(); ++i) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
224 TypeParameter* p = outer_class->type_parameters().at(i);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
225 if (p->identifier()->equals(id)) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
226 *depth = current_depth;
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
227 return p;
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
228 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
229 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
230 outer_method = outer_class->outer_method();
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
231 outer_class = outer_class->outer_class();
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
232 ++current_depth;
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
233 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
234 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
235
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
236 if (VerifyGenericSignatures) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
237 fatal("Could not resolve identifier");
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
238 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
239
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
240 return NULL;
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
241 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
242
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
243 ClassDescriptor* ClassDescriptor::parse_generic_signature(Klass* klass, TRAPS) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
244 return parse_generic_signature(klass, NULL, CHECK_NULL);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
245 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
246
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
247 ClassDescriptor* ClassDescriptor::parse_generic_signature(
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
248 Klass* klass, Symbol* original_name, TRAPS) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
249
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
250 InstanceKlass* ik = InstanceKlass::cast(klass);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
251 Symbol* sym = ik->generic_signature();
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
252
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
253 ClassDescriptor* spec;
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
254
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
255 if (sym == NULL || (spec = ClassDescriptor::parse_generic_signature(sym)) == NULL) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
256 spec = ClassDescriptor::placeholder(ik);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
257 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
258
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
259 u2 outer_index = get_outer_class_index(ik, CHECK_NULL);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
260 if (outer_index != 0) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
261 if (original_name == NULL) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
262 original_name = ik->name();
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
263 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
264 Handle class_loader = Handle(THREAD, ik->class_loader());
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
265 Handle protection_domain = Handle(THREAD, ik->protection_domain());
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
266
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
267 Symbol* outer_name = ik->constants()->klass_name_at(outer_index);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
268 Klass* outer = SystemDictionary::find(
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
269 outer_name, class_loader, protection_domain, CHECK_NULL);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
270 if (outer == NULL && !THREAD->is_Compiler_thread()) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
271 outer = SystemDictionary::resolve_super_or_fail(original_name,
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
272 outer_name, class_loader, protection_domain, false, CHECK_NULL);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
273 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
274
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
275 InstanceKlass* outer_ik;
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
276 ClassDescriptor* outer_spec = NULL;
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
277 if (outer == NULL) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
278 outer_spec = ClassDescriptor::placeholder(ik);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
279 assert(false, "Outer class not loaded and not loadable from here");
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
280 } else {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
281 outer_ik = InstanceKlass::cast(outer);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
282 outer_spec = parse_generic_signature(outer, original_name, CHECK_NULL);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
283 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
284 spec->set_outer_class(outer_spec);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
285
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
286 u2 encl_method_idx = ik->enclosing_method_method_index();
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
287 if (encl_method_idx != 0 && outer_ik != NULL) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
288 ConstantPool* cp = ik->constants();
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
289 u2 name_index = cp->name_ref_index_at(encl_method_idx);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
290 u2 sig_index = cp->signature_ref_index_at(encl_method_idx);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
291 Symbol* name = cp->symbol_at(name_index);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
292 Symbol* sig = cp->symbol_at(sig_index);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
293 Method* m = outer_ik->find_method(name, sig);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
294 if (m != NULL) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
295 Symbol* gsig = m->generic_signature();
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
296 if (gsig != NULL) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
297 MethodDescriptor* gms = MethodDescriptor::parse_generic_signature(gsig, outer_spec);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
298 spec->set_outer_method(gms);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
299 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
300 } else if (VerifyGenericSignatures) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
301 ResourceMark rm;
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
302 stringStream ss;
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
303 ss.print("Could not find method %s %s in class %s",
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
304 name->as_C_string(), sig->as_C_string(), outer_name->as_C_string());
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
305 fatal(ss.as_string());
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
306 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
307 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
308 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
309
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
310 spec->bind_variables_to_parameters();
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
311 return spec;
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
312 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
313
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
314 ClassDescriptor* ClassDescriptor::placeholder(InstanceKlass* klass) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
315 GrowableArray<TypeParameter*> formals;
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
316 GrowableArray<ClassType*> interfaces;
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
317 ClassType* super_type = NULL;
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
318
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
319 Klass* super_klass = klass->super();
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
320 if (super_klass != NULL) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
321 InstanceKlass* super = InstanceKlass::cast(super_klass);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
322 super_type = ClassType::from_symbol(super->name());
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
323 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
324
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
325 for (int i = 0; i < klass->local_interfaces()->length(); ++i) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
326 InstanceKlass* iface = InstanceKlass::cast(klass->local_interfaces()->at(i));
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
327 interfaces.append(ClassType::from_symbol(iface->name()));
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
328 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
329 return new ClassDescriptor(formals, super_type, interfaces);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
330 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
331
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
332 ClassDescriptor* ClassDescriptor::parse_generic_signature(Symbol* sym) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
333
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
334 DescriptorStream ds(sym);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
335 DescriptorStream* STREAM = &ds;
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
336
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
337 GrowableArray<TypeParameter*> parameters(8);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
338 char c = READ();
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
339 if (c == '<') {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
340 c = READ();
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
341 while (c != '>') {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
342 PUSH(c);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
343 TypeParameter* ftp = TypeParameter::parse_generic_signature(CHECK_STREAM);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
344 parameters.append(ftp);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
345 c = READ();
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
346 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
347 } else {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
348 PUSH(c);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
349 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
350
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
351 EXPECT('L');
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
352 ClassType* super = ClassType::parse_generic_signature(CHECK_STREAM);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
353
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
354 GrowableArray<ClassType*> signatures(2);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
355 while (!STREAM->at_end()) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
356 EXPECT('L');
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
357 ClassType* iface = ClassType::parse_generic_signature(CHECK_STREAM);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
358 signatures.append(iface);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
359 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
360
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
361 EXPECT_END();
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
362
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
363 return new ClassDescriptor(parameters, super, signatures);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
364 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
365
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
366 #ifndef PRODUCT
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
367 void ClassDescriptor::print_on(outputStream* str) const {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
368 str->indent().print_cr("ClassDescriptor {");
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
369 {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
370 streamIndentor si(str);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
371 if (_type_parameters.length() > 0) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
372 str->indent().print_cr("Formals {");
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
373 {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
374 streamIndentor si(str);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
375 for (int i = 0; i < _type_parameters.length(); ++i) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
376 _type_parameters.at(i)->print_on(str);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
377 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
378 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
379 str->indent().print_cr("}");
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
380 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
381 if (_super != NULL) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
382 str->indent().print_cr("Superclass: ");
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
383 {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
384 streamIndentor si(str);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
385 _super->print_on(str);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
386 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
387 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
388 if (_interfaces.length() > 0) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
389 str->indent().print_cr("SuperInterfaces: {");
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
390 {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
391 streamIndentor si(str);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
392 for (int i = 0; i < _interfaces.length(); ++i) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
393 _interfaces.at(i)->print_on(str);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
394 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
395 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
396 str->indent().print_cr("}");
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
397 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
398 if (_outer_method != NULL) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
399 str->indent().print_cr("Outer Method: {");
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
400 {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
401 streamIndentor si(str);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
402 _outer_method->print_on(str);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
403 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
404 str->indent().print_cr("}");
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
405 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
406 if (_outer_class != NULL) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
407 str->indent().print_cr("Outer Class: {");
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
408 {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
409 streamIndentor si(str);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
410 _outer_class->print_on(str);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
411 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
412 str->indent().print_cr("}");
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
413 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
414 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
415 str->indent().print_cr("}");
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
416 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
417 #endif // ndef PRODUCT
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
418
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
419 ClassType* ClassDescriptor::interface_desc(Symbol* sym) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
420 for (int i = 0; i < _interfaces.length(); ++i) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
421 if (_interfaces.at(i)->identifier()->equals(sym)) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
422 return _interfaces.at(i);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
423 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
424 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
425 if (VerifyGenericSignatures) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
426 fatal("Did not find expected interface");
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
427 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
428 return NULL;
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
429 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
430
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
431 void ClassDescriptor::bind_variables_to_parameters() {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
432 if (_outer_class != NULL) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
433 _outer_class->bind_variables_to_parameters();
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
434 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
435 if (_outer_method != NULL) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
436 _outer_method->bind_variables_to_parameters();
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
437 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
438 for (int i = 0; i < _type_parameters.length(); ++i) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
439 _type_parameters.at(i)->bind_variables_to_parameters(this, i);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
440 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
441 if (_super != NULL) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
442 _super->bind_variables_to_parameters(this);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
443 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
444 for (int i = 0; i < _interfaces.length(); ++i) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
445 _interfaces.at(i)->bind_variables_to_parameters(this);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
446 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
447 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
448
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
449 ClassDescriptor* ClassDescriptor::canonicalize(Context* ctx) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
450
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
451 GrowableArray<TypeParameter*> type_params(_type_parameters.length());
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
452 for (int i = 0; i < _type_parameters.length(); ++i) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
453 type_params.append(_type_parameters.at(i)->canonicalize(ctx, 0));
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
454 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
455
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
456 ClassDescriptor* outer = _outer_class == NULL ? NULL :
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
457 _outer_class->canonicalize(ctx);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
458
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
459 ClassType* super = _super == NULL ? NULL : _super->canonicalize(ctx, 0);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
460
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
461 GrowableArray<ClassType*> interfaces(_interfaces.length());
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
462 for (int i = 0; i < _interfaces.length(); ++i) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
463 interfaces.append(_interfaces.at(i)->canonicalize(ctx, 0));
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
464 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
465
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
466 MethodDescriptor* md = _outer_method == NULL ? NULL :
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
467 _outer_method->canonicalize(ctx);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
468
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
469 return new ClassDescriptor(type_params, super, interfaces, outer, md);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
470 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
471
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
472 u2 ClassDescriptor::get_outer_class_index(InstanceKlass* klass, TRAPS) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
473 int inner_index = InstanceKlass::inner_class_inner_class_info_offset;
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
474 int outer_index = InstanceKlass::inner_class_outer_class_info_offset;
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
475 int name_offset = InstanceKlass::inner_class_inner_name_offset;
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
476 int next_offset = InstanceKlass::inner_class_next_offset;
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
477
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
478 if (klass->inner_classes() == NULL || klass->inner_classes()->length() == 0) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
479 // No inner class info => no declaring class
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
480 return 0;
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
481 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
482
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
483 Array<u2>* i_icls = klass->inner_classes();
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
484 ConstantPool* i_cp = klass->constants();
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
485 int i_length = i_icls->length();
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
486
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
487 // Find inner_klass attribute
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
488 for (int i = 0; i + next_offset < i_length; i += next_offset) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
489 u2 ioff = i_icls->at(i + inner_index);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
490 u2 ooff = i_icls->at(i + outer_index);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
491 u2 noff = i_icls->at(i + name_offset);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
492 if (ioff != 0) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
493 // Check to see if the name matches the class we're looking for
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
494 // before attempting to find the class.
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
495 if (i_cp->klass_name_at_matches(klass, ioff) && ooff != 0) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
496 return ooff;
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
497 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
498 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
499 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
500
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
501 // It may be anonymous; try for that.
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
502 u2 encl_method_class_idx = klass->enclosing_method_class_index();
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
503 if (encl_method_class_idx != 0) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
504 return encl_method_class_idx;
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
505 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
506
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
507 return 0;
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
508 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
509
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
510 MethodDescriptor* MethodDescriptor::parse_generic_signature(Method* m, ClassDescriptor* outer) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
511 Symbol* generic_sig = m->generic_signature();
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
512 MethodDescriptor* md = NULL;
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
513 if (generic_sig == NULL || (md = parse_generic_signature(generic_sig, outer)) == NULL) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
514 md = parse_generic_signature(m->signature(), outer);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
515 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
516 assert(md != NULL, "Could not parse method signature");
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
517 md->bind_variables_to_parameters();
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
518 return md;
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
519 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
520
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
521 MethodDescriptor* MethodDescriptor::parse_generic_signature(Symbol* sym, ClassDescriptor* outer) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
522
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
523 DescriptorStream ds(sym);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
524 DescriptorStream* STREAM = &ds;
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
525
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
526 GrowableArray<TypeParameter*> params(8);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
527 char c = READ();
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
528 if (c == '<') {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
529 c = READ();
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
530 while (c != '>') {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
531 PUSH(c);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
532 TypeParameter* ftp = TypeParameter::parse_generic_signature(CHECK_STREAM);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
533 params.append(ftp);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
534 c = READ();
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
535 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
536 } else {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
537 PUSH(c);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
538 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
539
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
540 EXPECT('(');
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
541
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
542 GrowableArray<Type*> parameters(8);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
543 c = READ();
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
544 while (c != ')') {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
545 PUSH(c);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
546 Type* arg = Type::parse_generic_signature(CHECK_STREAM);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
547 parameters.append(arg);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
548 c = READ();
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
549 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
550
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
551 Type* rt = Type::parse_generic_signature(CHECK_STREAM);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
552
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
553 GrowableArray<Type*> throws;
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
554 while (!STREAM->at_end()) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
555 EXPECT('^');
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
556 Type* spec = Type::parse_generic_signature(CHECK_STREAM);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
557 throws.append(spec);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
558 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
559
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
560 return new MethodDescriptor(params, outer, parameters, rt, throws);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
561 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
562
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
563 void MethodDescriptor::bind_variables_to_parameters() {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
564 for (int i = 0; i < _type_parameters.length(); ++i) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
565 _type_parameters.at(i)->bind_variables_to_parameters(this, i);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
566 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
567 for (int i = 0; i < _parameters.length(); ++i) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
568 _parameters.at(i)->bind_variables_to_parameters(this);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
569 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
570 _return_type->bind_variables_to_parameters(this);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
571 for (int i = 0; i < _throws.length(); ++i) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
572 _throws.at(i)->bind_variables_to_parameters(this);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
573 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
574 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
575
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
576 bool MethodDescriptor::covariant_match(MethodDescriptor* other, Context* ctx) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
577
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
578 if (_parameters.length() == other->_parameters.length()) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
579 for (int i = 0; i < _parameters.length(); ++i) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
580 if (!_parameters.at(i)->covariant_match(other->_parameters.at(i), ctx)) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
581 return false;
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
582 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
583 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
584
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
585 if (_return_type->as_primitive() != NULL) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
586 return _return_type->covariant_match(other->_return_type, ctx);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
587 } else {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
588 // return type is a reference
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
589 return other->_return_type->as_class() != NULL ||
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
590 other->_return_type->as_variable() != NULL ||
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
591 other->_return_type->as_array() != NULL;
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
592 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
593 } else {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
594 return false;
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
595 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
596 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
597
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
598 MethodDescriptor* MethodDescriptor::canonicalize(Context* ctx) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
599
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
600 GrowableArray<TypeParameter*> type_params(_type_parameters.length());
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
601 for (int i = 0; i < _type_parameters.length(); ++i) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
602 type_params.append(_type_parameters.at(i)->canonicalize(ctx, 0));
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
603 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
604
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
605 ClassDescriptor* outer = _outer_class == NULL ? NULL :
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
606 _outer_class->canonicalize(ctx);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
607
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
608 GrowableArray<Type*> params(_parameters.length());
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
609 for (int i = 0; i < _parameters.length(); ++i) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
610 params.append(_parameters.at(i)->canonicalize(ctx, 0));
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
611 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
612
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
613 Type* rt = _return_type->canonicalize(ctx, 0);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
614
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
615 GrowableArray<Type*> throws(_throws.length());
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
616 for (int i = 0; i < _throws.length(); ++i) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
617 throws.append(_throws.at(i)->canonicalize(ctx, 0));
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
618 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
619
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
620 return new MethodDescriptor(type_params, outer, params, rt, throws);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
621 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
622
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
623 #ifndef PRODUCT
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
624 TempNewSymbol MethodDescriptor::reify_signature(Context* ctx, TRAPS) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
625 stringStream ss(256);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
626
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
627 ss.print("(");
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
628 for (int i = 0; i < _parameters.length(); ++i) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
629 _parameters.at(i)->reify_signature(&ss, ctx);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
630 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
631 ss.print(")");
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
632 _return_type->reify_signature(&ss, ctx);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
633 return SymbolTable::new_symbol(ss.base(), (int)ss.size(), THREAD);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
634 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
635
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
636 void MethodDescriptor::print_on(outputStream* str) const {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
637 str->indent().print_cr("MethodDescriptor {");
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
638 {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
639 streamIndentor si(str);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
640 if (_type_parameters.length() > 0) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
641 str->indent().print_cr("Formals: {");
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
642 {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
643 streamIndentor si(str);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
644 for (int i = 0; i < _type_parameters.length(); ++i) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
645 _type_parameters.at(i)->print_on(str);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
646 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
647 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
648 str->indent().print_cr("}");
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
649 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
650 str->indent().print_cr("Parameters: {");
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
651 {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
652 streamIndentor si(str);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
653 for (int i = 0; i < _parameters.length(); ++i) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
654 _parameters.at(i)->print_on(str);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
655 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
656 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
657 str->indent().print_cr("}");
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
658 str->indent().print_cr("Return Type: ");
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
659 {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
660 streamIndentor si(str);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
661 _return_type->print_on(str);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
662 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
663
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
664 if (_throws.length() > 0) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
665 str->indent().print_cr("Throws: {");
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
666 {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
667 streamIndentor si(str);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
668 for (int i = 0; i < _throws.length(); ++i) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
669 _throws.at(i)->print_on(str);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
670 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
671 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
672 str->indent().print_cr("}");
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
673 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
674 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
675 str->indent().print_cr("}");
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
676 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
677 #endif // ndef PRODUCT
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
678
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
679 TypeParameter* TypeParameter::parse_generic_signature(DescriptorStream* STREAM) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
680 STREAM->set_mark();
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
681 char c = READ();
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
682 while (c != ':') {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
683 c = READ();
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
684 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
685
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
686 Identifier* id = STREAM->identifier_from_mark();
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
687
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
688 ClassType* class_bound = NULL;
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
689 GrowableArray<ClassType*> interface_bounds(8);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
690
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
691 c = READ();
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
692 if (c != '>') {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
693 if (c != ':') {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
694 EXPECTED(c, 'L');
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
695 class_bound = ClassType::parse_generic_signature(CHECK_STREAM);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
696 c = READ();
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
697 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
698
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
699 while (c == ':') {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
700 EXPECT('L');
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
701 ClassType* fts = ClassType::parse_generic_signature(CHECK_STREAM);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
702 interface_bounds.append(fts);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
703 c = READ();
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
704 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
705 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
706 PUSH(c);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
707
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
708 return new TypeParameter(id, class_bound, interface_bounds);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
709 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
710
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
711 void TypeParameter::bind_variables_to_parameters(Descriptor* sig, int position) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
712 if (_class_bound != NULL) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
713 _class_bound->bind_variables_to_parameters(sig);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
714 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
715 for (int i = 0; i < _interface_bounds.length(); ++i) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
716 _interface_bounds.at(i)->bind_variables_to_parameters(sig);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
717 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
718 _position = position;
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
719 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
720
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
721 Type* TypeParameter::resolve(
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
722 Context* ctx, int inner_depth, int ctx_depth) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
723
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
724 if (inner_depth == -1) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
725 // This indicates that the parameter is a method type parameter, which
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
726 // isn't resolveable using the class hierarchy context
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
727 return bound();
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
728 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
729
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
730 ClassType* provider = ctx->at_depth(ctx_depth);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
731 if (provider != NULL) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
732 for (int i = 0; i < inner_depth && provider != NULL; ++i) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
733 provider = provider->outer_class();
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
734 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
735 if (provider != NULL) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
736 TypeArgument* arg = provider->type_argument_at(_position);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
737 if (arg != NULL) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
738 Type* value = arg->lower_bound();
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
739 return value->canonicalize(ctx, ctx_depth + 1);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
740 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
741 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
742 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
743
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
744 return bound();
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
745 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
746
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
747 TypeParameter* TypeParameter::canonicalize(Context* ctx, int ctx_depth) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
748 ClassType* bound = _class_bound == NULL ? NULL :
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
749 _class_bound->canonicalize(ctx, ctx_depth);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
750
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
751 GrowableArray<ClassType*> ifaces(_interface_bounds.length());
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
752 for (int i = 0; i < _interface_bounds.length(); ++i) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
753 ifaces.append(_interface_bounds.at(i)->canonicalize(ctx, ctx_depth));
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
754 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
755
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
756 TypeParameter* ret = new TypeParameter(_identifier, bound, ifaces);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
757 ret->_position = _position;
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
758 return ret;
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
759 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
760
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
761 ClassType* TypeParameter::bound() {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
762 if (_class_bound != NULL) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
763 return _class_bound;
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
764 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
765
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
766 if (_interface_bounds.length() == 1) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
767 return _interface_bounds.at(0);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
768 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
769
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
770 return ClassType::java_lang_Object(); // TODO: investigate this case
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
771 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
772
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
773 #ifndef PRODUCT
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
774 void TypeParameter::print_on(outputStream* str) const {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
775 str->indent().print_cr("Formal: {");
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
776 {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
777 streamIndentor si(str);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
778
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
779 str->indent().print("Identifier: ");
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
780 _identifier->print_on(str);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
781 str->print_cr("");
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
782 if (_class_bound != NULL) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
783 str->indent().print_cr("Class Bound: ");
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
784 streamIndentor si(str);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
785 _class_bound->print_on(str);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
786 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
787 if (_interface_bounds.length() > 0) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
788 str->indent().print_cr("Interface Bounds: {");
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
789 {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
790 streamIndentor si(str);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
791 for (int i = 0; i < _interface_bounds.length(); ++i) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
792 _interface_bounds.at(i)->print_on(str);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
793 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
794 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
795 str->indent().print_cr("}");
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
796 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
797 str->indent().print_cr("Ordinal Position: %d", _position);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
798 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
799 str->indent().print_cr("}");
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
800 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
801 #endif // ndef PRODUCT
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
802
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
803 Type* Type::parse_generic_signature(DescriptorStream* STREAM) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
804 char c = READ();
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
805 switch (c) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
806 case 'L':
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
807 return ClassType::parse_generic_signature(CHECK_STREAM);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
808 case 'T':
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
809 return TypeVariable::parse_generic_signature(CHECK_STREAM);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
810 case '[':
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
811 return ArrayType::parse_generic_signature(CHECK_STREAM);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
812 default:
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
813 return new PrimitiveType(c);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
814 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
815 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
816
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
817 Identifier* ClassType::parse_generic_signature_simple(GrowableArray<TypeArgument*>* args,
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
818 bool* has_inner, DescriptorStream* STREAM) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
819 STREAM->set_mark();
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
820
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
821 char c = READ();
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
822 while (c != ';' && c != '.' && c != '<') { c = READ(); }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
823 Identifier* id = STREAM->identifier_from_mark();
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
824
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
825 if (c == '<') {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
826 c = READ();
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
827 while (c != '>') {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
828 PUSH(c);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
829 TypeArgument* arg = TypeArgument::parse_generic_signature(CHECK_STREAM);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
830 args->append(arg);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
831 c = READ();
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
832 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
833 c = READ();
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
834 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
835
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
836 *has_inner = (c == '.');
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
837 if (!(*has_inner)) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
838 EXPECTED(c, ';');
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
839 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
840
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
841 return id;
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
842 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
843
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
844 ClassType* ClassType::parse_generic_signature(DescriptorStream* STREAM) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
845 return parse_generic_signature(NULL, CHECK_STREAM);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
846 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
847
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
848 ClassType* ClassType::parse_generic_signature(ClassType* outer, DescriptorStream* STREAM) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
849 GrowableArray<TypeArgument*> args;
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
850 ClassType* gct = NULL;
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
851 bool has_inner = false;
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
852
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
853 Identifier* id = parse_generic_signature_simple(&args, &has_inner, STREAM);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
854 if (id != NULL) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
855 gct = new ClassType(id, args, outer);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
856
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
857 if (has_inner) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
858 gct = parse_generic_signature(gct, CHECK_STREAM);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
859 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
860 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
861 return gct;
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
862 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
863
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
864 ClassType* ClassType::from_symbol(Symbol* sym) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
865 assert(sym != NULL, "Must not be null");
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
866 GrowableArray<TypeArgument*> args;
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
867 Identifier* id = new Identifier(sym, 0, sym->utf8_length());
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
868 return new ClassType(id, args, NULL);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
869 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
870
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
871 ClassType* ClassType::java_lang_Object() {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
872 return from_symbol(vmSymbols::java_lang_Object());
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
873 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
874
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
875 void ClassType::bind_variables_to_parameters(Descriptor* sig) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
876 for (int i = 0; i < _type_arguments.length(); ++i) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
877 _type_arguments.at(i)->bind_variables_to_parameters(sig);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
878 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
879 if (_outer_class != NULL) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
880 _outer_class->bind_variables_to_parameters(sig);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
881 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
882 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
883
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
884 TypeArgument* ClassType::type_argument_at(int i) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
885 if (i >= 0 && i < _type_arguments.length()) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
886 return _type_arguments.at(i);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
887 } else {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
888 return NULL;
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
889 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
890 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
891
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
892 #ifndef PRODUCT
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
893 void ClassType::reify_signature(stringStream* ss, Context* ctx) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
894 ss->print("L");
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
895 _identifier->print_on(ss);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
896 ss->print(";");
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
897 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
898
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
899 void ClassType::print_on(outputStream* str) const {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
900 str->indent().print_cr("Class {");
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
901 {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
902 streamIndentor si(str);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
903 str->indent().print("Name: ");
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
904 _identifier->print_on(str);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
905 str->print_cr("");
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
906 if (_type_arguments.length() != 0) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
907 str->indent().print_cr("Type Arguments: {");
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
908 {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
909 streamIndentor si(str);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
910 for (int j = 0; j < _type_arguments.length(); ++j) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
911 _type_arguments.at(j)->print_on(str);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
912 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
913 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
914 str->indent().print_cr("}");
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
915 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
916 if (_outer_class != NULL) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
917 str->indent().print_cr("Outer Class: ");
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
918 streamIndentor sir(str);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
919 _outer_class->print_on(str);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
920 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
921 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
922 str->indent().print_cr("}");
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
923 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
924 #endif // ndef PRODUCT
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
925
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
926 bool ClassType::covariant_match(Type* other, Context* ctx) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
927
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
928 if (other == this) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
929 return true;
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
930 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
931
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
932 TypeVariable* variable = other->as_variable();
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
933 if (variable != NULL) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
934 other = variable->resolve(ctx, 0);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
935 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
936
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
937 ClassType* outer = outer_class();
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
938 ClassType* other_class = other->as_class();
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
939
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
940 if (other_class == NULL ||
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
941 (outer == NULL) != (other_class->outer_class() == NULL)) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
942 return false;
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
943 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
944
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
945 if (!_identifier->equals(other_class->_identifier)) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
946 return false;
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
947 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
948
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
949 if (outer != NULL && !outer->covariant_match(other_class->outer_class(), ctx)) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
950 return false;
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
951 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
952
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
953 return true;
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
954 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
955
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
956 ClassType* ClassType::canonicalize(Context* ctx, int ctx_depth) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
957
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
958 GrowableArray<TypeArgument*> args(_type_arguments.length());
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
959 for (int i = 0; i < _type_arguments.length(); ++i) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
960 args.append(_type_arguments.at(i)->canonicalize(ctx, ctx_depth));
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
961 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
962
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
963 ClassType* outer = _outer_class == NULL ? NULL :
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
964 _outer_class->canonicalize(ctx, ctx_depth);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
965
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
966 return new ClassType(_identifier, args, outer);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
967 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
968
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
969 TypeVariable* TypeVariable::parse_generic_signature(DescriptorStream* STREAM) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
970 STREAM->set_mark();
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
971 char c = READ();
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
972 while (c != ';') {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
973 c = READ();
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
974 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
975 Identifier* id = STREAM->identifier_from_mark();
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
976
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
977 return new TypeVariable(id);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
978 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
979
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
980 void TypeVariable::bind_variables_to_parameters(Descriptor* sig) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
981 _parameter = sig->find_type_parameter(_id, &_inner_depth);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
982 if (VerifyGenericSignatures && _parameter == NULL) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
983 fatal("Could not find formal parameter");
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
984 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
985 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
986
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
987 Type* TypeVariable::resolve(Context* ctx, int ctx_depth) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
988 if (parameter() != NULL) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
989 return parameter()->resolve(ctx, inner_depth(), ctx_depth);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
990 } else {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
991 if (VerifyGenericSignatures) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
992 fatal("Type variable matches no parameter");
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
993 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
994 return NULL;
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
995 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
996 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
997
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
998 bool TypeVariable::covariant_match(Type* other, Context* ctx) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
999
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1000 if (other == this) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1001 return true;
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1002 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1003
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1004 Context my_context(NULL); // empty, results in erasure
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1005 Type* my_type = resolve(&my_context, 0);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1006 if (my_type == NULL) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1007 return false;
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1008 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1009
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1010 return my_type->covariant_match(other, ctx);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1011 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1012
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1013 Type* TypeVariable::canonicalize(Context* ctx, int ctx_depth) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1014 return resolve(ctx, ctx_depth);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1015 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1016
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1017 #ifndef PRODUCT
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1018 void TypeVariable::reify_signature(stringStream* ss, Context* ctx) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1019 Type* type = resolve(ctx, 0);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1020 if (type != NULL) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1021 type->reify_signature(ss, ctx);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1022 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1023 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1024
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1025 void TypeVariable::print_on(outputStream* str) const {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1026 str->indent().print_cr("Type Variable {");
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1027 {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1028 streamIndentor si(str);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1029 str->indent().print("Name: ");
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1030 _id->print_on(str);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1031 str->print_cr("");
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1032 str->indent().print_cr("Inner depth: %d", _inner_depth);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1033 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1034 str->indent().print_cr("}");
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1035 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1036 #endif // ndef PRODUCT
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1037
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1038 ArrayType* ArrayType::parse_generic_signature(DescriptorStream* STREAM) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1039 Type* base = Type::parse_generic_signature(CHECK_STREAM);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1040 return new ArrayType(base);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1041 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1042
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1043 void ArrayType::bind_variables_to_parameters(Descriptor* sig) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1044 assert(_base != NULL, "Invalid base");
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1045 _base->bind_variables_to_parameters(sig);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1046 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1047
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1048 bool ArrayType::covariant_match(Type* other, Context* ctx) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1049 assert(_base != NULL, "Invalid base");
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1050
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1051 if (other == this) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1052 return true;
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1053 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1054
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1055 ArrayType* other_array = other->as_array();
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1056 return (other_array != NULL && _base->covariant_match(other_array->_base, ctx));
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1057 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1058
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1059 ArrayType* ArrayType::canonicalize(Context* ctx, int ctx_depth) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1060 assert(_base != NULL, "Invalid base");
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1061 return new ArrayType(_base->canonicalize(ctx, ctx_depth));
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1062 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1063
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1064 #ifndef PRODUCT
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1065 void ArrayType::reify_signature(stringStream* ss, Context* ctx) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1066 assert(_base != NULL, "Invalid base");
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1067 ss->print("[");
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1068 _base->reify_signature(ss, ctx);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1069 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1070
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1071 void ArrayType::print_on(outputStream* str) const {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1072 str->indent().print_cr("Array {");
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1073 {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1074 streamIndentor si(str);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1075 _base->print_on(str);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1076 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1077 str->indent().print_cr("}");
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1078 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1079 #endif // ndef PRODUCT
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1080
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1081 bool PrimitiveType::covariant_match(Type* other, Context* ctx) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1082
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1083 PrimitiveType* other_prim = other->as_primitive();
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1084 return (other_prim != NULL && _type == other_prim->_type);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1085 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1086
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1087 PrimitiveType* PrimitiveType::canonicalize(Context* ctx, int ctxd) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1088 return this;
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1089 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1090
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1091 #ifndef PRODUCT
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1092 void PrimitiveType::reify_signature(stringStream* ss, Context* ctx) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1093 ss->print("%c", _type);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1094 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1095
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1096 void PrimitiveType::print_on(outputStream* str) const {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1097 str->indent().print_cr("Primitive: '%c'", _type);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1098 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1099 #endif // ndef PRODUCT
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1100
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1101 void PrimitiveType::bind_variables_to_parameters(Descriptor* sig) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1102 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1103
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1104 TypeArgument* TypeArgument::parse_generic_signature(DescriptorStream* STREAM) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1105 char c = READ();
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1106 Type* type = NULL;
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1107
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1108 switch (c) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1109 case '*':
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1110 return new TypeArgument(ClassType::java_lang_Object(), NULL);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1111 break;
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1112 default:
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1113 PUSH(c);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1114 // fall-through
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1115 case '+':
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1116 case '-':
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1117 type = Type::parse_generic_signature(CHECK_STREAM);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1118 if (c == '+') {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1119 return new TypeArgument(type, NULL);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1120 } else if (c == '-') {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1121 return new TypeArgument(ClassType::java_lang_Object(), type);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1122 } else {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1123 return new TypeArgument(type, type);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1124 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1125 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1126 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1127
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1128 void TypeArgument::bind_variables_to_parameters(Descriptor* sig) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1129 assert(_lower_bound != NULL, "Invalid lower bound");
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1130 _lower_bound->bind_variables_to_parameters(sig);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1131 if (_upper_bound != NULL && _upper_bound != _lower_bound) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1132 _upper_bound->bind_variables_to_parameters(sig);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1133 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1134 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1135
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1136 bool TypeArgument::covariant_match(TypeArgument* other, Context* ctx) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1137 assert(_lower_bound != NULL, "Invalid lower bound");
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1138
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1139 if (other == this) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1140 return true;
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1141 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1142
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1143 if (!_lower_bound->covariant_match(other->lower_bound(), ctx)) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1144 return false;
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1145 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1146 return true;
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1147 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1148
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1149 TypeArgument* TypeArgument::canonicalize(Context* ctx, int ctx_depth) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1150 assert(_lower_bound != NULL, "Invalid lower bound");
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1151 Type* lower = _lower_bound->canonicalize(ctx, ctx_depth);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1152 Type* upper = NULL;
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1153
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1154 if (_upper_bound == _lower_bound) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1155 upper = lower;
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1156 } else if (_upper_bound != NULL) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1157 upper = _upper_bound->canonicalize(ctx, ctx_depth);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1158 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1159
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1160 return new TypeArgument(lower, upper);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1161 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1162
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1163 #ifndef PRODUCT
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1164 void TypeArgument::print_on(outputStream* str) const {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1165 str->indent().print_cr("TypeArgument {");
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1166 {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1167 streamIndentor si(str);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1168 if (_lower_bound != NULL) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1169 str->indent().print("Lower bound: ");
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1170 _lower_bound->print_on(str);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1171 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1172 if (_upper_bound != NULL) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1173 str->indent().print("Upper bound: ");
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1174 _upper_bound->print_on(str);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1175 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1176 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1177 str->indent().print_cr("}");
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1178 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1179 #endif // ndef PRODUCT
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1180
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1181 void Context::Mark::destroy() {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1182 if (is_active()) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1183 _context->reset_to_mark(_marked_size);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1184 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1185 deactivate();
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1186 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1187
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1188 void Context::apply_type_arguments(
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1189 InstanceKlass* current, InstanceKlass* super, TRAPS) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1190 assert(_cache != NULL, "Cannot use an empty context");
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1191 ClassType* spec = NULL;
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1192 if (current != NULL) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1193 ClassDescriptor* descriptor = _cache->descriptor_for(current, CHECK);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1194 if (super == current->super()) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1195 spec = descriptor->super();
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1196 } else {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1197 spec = descriptor->interface_desc(super->name());
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1198 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1199 if (spec != NULL) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1200 _type_arguments.push(spec);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1201 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1202 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1203 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1204
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1205 void Context::reset_to_mark(int size) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1206 _type_arguments.trunc_to(size);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1207 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1208
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1209 ClassType* Context::at_depth(int i) const {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1210 if (i < _type_arguments.length()) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1211 return _type_arguments.at(_type_arguments.length() - 1 - i);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1212 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1213 return NULL;
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1214 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1215
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1216 #ifndef PRODUCT
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1217 void Context::print_on(outputStream* str) const {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1218 str->indent().print_cr("Context {");
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1219 for (int i = 0; i < _type_arguments.length(); ++i) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1220 streamIndentor si(str);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1221 str->indent().print("leval %d: ", i);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1222 ClassType* ct = at_depth(i);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1223 if (ct == NULL) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1224 str->print_cr("<empty>");
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1225 continue;
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1226 } else {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1227 str->print_cr("{");
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1228 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1229
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1230 for (int j = 0; j < ct->type_arguments_length(); ++j) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1231 streamIndentor si(str);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1232 TypeArgument* ta = ct->type_argument_at(j);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1233 Type* bound = ta->lower_bound();
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1234 bound->print_on(str);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1235 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1236 str->indent().print_cr("}");
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1237 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1238 str->indent().print_cr("}");
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1239 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1240 #endif // ndef PRODUCT
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1241
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1242 ClassDescriptor* DescriptorCache::descriptor_for(InstanceKlass* ik, TRAPS) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1243
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1244 ClassDescriptor** existing = _class_descriptors.get(ik);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1245 if (existing == NULL) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1246 ClassDescriptor* cd = ClassDescriptor::parse_generic_signature(ik, CHECK_NULL);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1247 _class_descriptors.put(ik, cd);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1248 return cd;
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1249 } else {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1250 return *existing;
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1251 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1252 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1253
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1254 MethodDescriptor* DescriptorCache::descriptor_for(
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1255 Method* mh, ClassDescriptor* cd, TRAPS) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1256 assert(mh != NULL && cd != NULL, "Should not be NULL");
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1257 MethodDescriptor** existing = _method_descriptors.get(mh);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1258 if (existing == NULL) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1259 MethodDescriptor* md = MethodDescriptor::parse_generic_signature(mh, cd);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1260 _method_descriptors.put(mh, md);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1261 return md;
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1262 } else {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1263 return *existing;
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1264 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1265 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1266 MethodDescriptor* DescriptorCache::descriptor_for(Method* mh, TRAPS) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1267 ClassDescriptor* cd = descriptor_for(
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1268 InstanceKlass::cast(mh->method_holder()), CHECK_NULL);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1269 return descriptor_for(mh, cd, THREAD);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1270 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1271
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1272 } // namespace generic