Mercurial > hg > graal-compiler
annotate src/share/vm/ci/ciSignature.cpp @ 1766:02f0a9b6f654
6969586: OptimizeStringConcat: SIGSEGV in LoadNode::Value()
Reviewed-by: kvn
author | never |
---|---|
date | Mon, 30 Aug 2010 17:27:35 -0700 |
parents | c18cbe5936b8 |
children | f95d63e2154a |
rev | line source |
---|---|
0 | 1 /* |
1552
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
0
diff
changeset
|
2 * Copyright (c) 1999, 2007, Oracle and/or its affiliates. All rights reserved. |
0 | 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
4 * | |
5 * This code is free software; you can redistribute it and/or modify it | |
6 * under the terms of the GNU General Public License version 2 only, as | |
7 * published by the Free Software Foundation. | |
8 * | |
9 * This code is distributed in the hope that it will be useful, but WITHOUT | |
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
12 * version 2 for more details (a copy is included in the LICENSE file that | |
13 * accompanied this code). | |
14 * | |
15 * You should have received a copy of the GNU General Public License version | |
16 * 2 along with this work; if not, write to the Free Software Foundation, | |
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. | |
18 * | |
1552
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
0
diff
changeset
|
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
0
diff
changeset
|
20 * or visit www.oracle.com if you need additional information or have any |
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
0
diff
changeset
|
21 * questions. |
0 | 22 * |
23 */ | |
24 | |
25 #include "incls/_precompiled.incl" | |
26 #include "incls/_ciSignature.cpp.incl" | |
27 | |
28 // ciSignature | |
29 // | |
30 // This class represents the signature of a method. | |
31 | |
32 // ------------------------------------------------------------------ | |
33 // ciSignature::ciSignature | |
34 ciSignature::ciSignature(ciKlass* accessing_klass, ciSymbol* symbol) { | |
35 ASSERT_IN_VM; | |
36 EXCEPTION_CONTEXT; | |
37 _accessing_klass = accessing_klass; | |
38 _symbol = symbol; | |
39 | |
40 ciEnv* env = CURRENT_ENV; | |
41 Arena* arena = env->arena(); | |
42 _types = new (arena) GrowableArray<ciType*>(arena, 8, 0, NULL); | |
43 | |
44 int size = 0; | |
45 int count = 0; | |
46 symbolHandle sh (THREAD, symbol->get_symbolOop()); | |
47 SignatureStream ss(sh); | |
48 for (; ; ss.next()) { | |
49 // Process one element of the signature | |
50 ciType* type; | |
51 if (!ss.is_object()) { | |
52 type = ciType::make(ss.type()); | |
53 } else { | |
54 symbolOop name = ss.as_symbol(THREAD); | |
55 if (HAS_PENDING_EXCEPTION) { | |
56 type = ss.is_array() ? (ciType*)ciEnv::unloaded_ciobjarrayklass() | |
57 : (ciType*)ciEnv::unloaded_ciinstance_klass(); | |
58 env->record_out_of_memory_failure(); | |
59 CLEAR_PENDING_EXCEPTION; | |
60 } else { | |
61 ciSymbol* klass_name = env->get_object(name)->as_symbol(); | |
62 type = env->get_klass_by_name_impl(_accessing_klass, klass_name, false); | |
63 } | |
64 } | |
65 _types->append(type); | |
66 if (ss.at_return_type()) { | |
67 // Done processing the return type; do not add it into the count. | |
68 break; | |
69 } | |
70 size += type->size(); | |
71 count++; | |
72 } | |
73 _size = size; | |
74 _count = count; | |
75 } | |
76 | |
77 // ------------------------------------------------------------------ | |
78 // ciSignature::return_ciType | |
79 // | |
80 // What is the return type of this signature? | |
81 ciType* ciSignature::return_type() const { | |
82 return _types->at(_count); | |
83 } | |
84 | |
85 // ------------------------------------------------------------------ | |
86 // ciSignature::ciType_at | |
87 // | |
88 // What is the type of the index'th element of this | |
89 // signature? | |
90 ciType* ciSignature::type_at(int index) const { | |
91 assert(index < _count, "out of bounds"); | |
92 // The first _klasses element holds the return klass. | |
93 return _types->at(index); | |
94 } | |
95 | |
96 // ------------------------------------------------------------------ | |
97 // ciSignature::print_signature | |
98 void ciSignature::print_signature() { | |
99 _symbol->print_symbol(); | |
100 } | |
101 | |
102 // ------------------------------------------------------------------ | |
103 // ciSignature::print | |
104 void ciSignature::print() { | |
105 tty->print("<ciSignature symbol="); | |
106 print_signature(); | |
107 tty->print(" accessing_klass="); | |
108 _accessing_klass->print(); | |
109 tty->print(" address=0x%x>", (address)this); | |
110 } |