Mercurial > hg > graal-jvmci-8
annotate src/share/vm/runtime/fieldDescriptor.cpp @ 3979:4dfb2df418f2
6484982: G1: process references during evacuation pauses
Summary: G1 now uses two reference processors - one is used by concurrent marking and the other is used by STW GCs (both full and incremental evacuation pauses). In an evacuation pause, the reference processor is embedded into the closures used to scan objects. Doing so causes causes reference objects to be 'discovered' by the reference processor. At the end of the evacuation pause, these discovered reference objects are processed - preserving (and copying) referent objects (and their reachable graphs) as appropriate.
Reviewed-by: ysr, jwilhelm, brutisso, stefank, tonyp
author | johnc |
---|---|
date | Thu, 22 Sep 2011 10:57:37 -0700 |
parents | e6b1331a51d2 |
children | 71afdabfd05b |
rev | line source |
---|---|
0 | 1 /* |
1972 | 2 * Copyright (c) 1997, 2010, 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:
665
diff
changeset
|
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
665
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:
665
diff
changeset
|
21 * questions. |
0 | 22 * |
23 */ | |
24 | |
1972 | 25 #include "precompiled.hpp" |
26 #include "classfile/systemDictionary.hpp" | |
27 #include "classfile/vmSymbols.hpp" | |
28 #include "memory/resourceArea.hpp" | |
29 #include "memory/universe.inline.hpp" | |
30 #include "oops/instanceKlass.hpp" | |
31 #include "runtime/fieldDescriptor.hpp" | |
32 #include "runtime/handles.inline.hpp" | |
33 #include "runtime/signature.hpp" | |
0 | 34 |
35 | |
36 oop fieldDescriptor::loader() const { | |
37 return instanceKlass::cast(_cp->pool_holder())->class_loader(); | |
38 } | |
39 | |
40 typeArrayOop fieldDescriptor::annotations() const { | |
41 instanceKlass* ik = instanceKlass::cast(field_holder()); | |
42 objArrayOop md = ik->fields_annotations(); | |
43 if (md == NULL) | |
44 return NULL; | |
3938 | 45 return typeArrayOop(md->obj_at(index())); |
0 | 46 } |
47 | |
48 constantTag fieldDescriptor::initial_value_tag() const { | |
3938 | 49 return constants()->tag_at(initial_value_index()); |
0 | 50 } |
51 | |
52 jint fieldDescriptor::int_initial_value() const { | |
3938 | 53 return constants()->int_at(initial_value_index()); |
0 | 54 } |
55 | |
56 jlong fieldDescriptor::long_initial_value() const { | |
3938 | 57 return constants()->long_at(initial_value_index()); |
0 | 58 } |
59 | |
60 jfloat fieldDescriptor::float_initial_value() const { | |
3938 | 61 return constants()->float_at(initial_value_index()); |
0 | 62 } |
63 | |
64 jdouble fieldDescriptor::double_initial_value() const { | |
3938 | 65 return constants()->double_at(initial_value_index()); |
0 | 66 } |
67 | |
68 oop fieldDescriptor::string_initial_value(TRAPS) const { | |
3938 | 69 return constants()->string_at(initial_value_index(), CHECK_0); |
0 | 70 } |
71 | |
72 void fieldDescriptor::initialize(klassOop k, int index) { | |
73 instanceKlass* ik = instanceKlass::cast(k); | |
74 _cp = ik->constants(); | |
3938 | 75 FieldInfo* f = ik->field(index); |
76 assert(!f->is_internal(), "regular Java fields only"); | |
0 | 77 |
3938 | 78 _access_flags = accessFlags_from(f->access_flags()); |
79 guarantee(f->name_index() != 0 && f->signature_index() != 0, "bad constant pool index for fieldDescriptor"); | |
0 | 80 _index = index; |
81 } | |
82 | |
83 #ifndef PRODUCT | |
84 | |
85 void fieldDescriptor::print_on(outputStream* st) const { | |
3938 | 86 access_flags().print_on(st); |
87 name()->print_value_on(st); | |
0 | 88 st->print(" "); |
3938 | 89 signature()->print_value_on(st); |
0 | 90 st->print(" @%d ", offset()); |
91 if (WizardMode && has_initial_value()) { | |
92 st->print("(initval "); | |
93 constantTag t = initial_value_tag(); | |
94 if (t.is_int()) { | |
95 st->print("int %d)", int_initial_value()); | |
96 } else if (t.is_long()){ | |
97 st->print_jlong(long_initial_value()); | |
98 } else if (t.is_float()){ | |
99 st->print("float %f)", float_initial_value()); | |
100 } else if (t.is_double()){ | |
101 st->print("double %lf)", double_initial_value()); | |
102 } | |
103 } | |
104 } | |
105 | |
106 void fieldDescriptor::print_on_for(outputStream* st, oop obj) { | |
107 print_on(st); | |
108 BasicType ft = field_type(); | |
665
c89f86385056
6814659: separable cleanups and subroutines for 6655638
jrose
parents:
0
diff
changeset
|
109 jint as_int = 0; |
0 | 110 switch (ft) { |
111 case T_BYTE: | |
112 as_int = (jint)obj->byte_field(offset()); | |
113 st->print(" %d", obj->byte_field(offset())); | |
114 break; | |
115 case T_CHAR: | |
665
c89f86385056
6814659: separable cleanups and subroutines for 6655638
jrose
parents:
0
diff
changeset
|
116 as_int = (jint)obj->char_field(offset()); |
0 | 117 { |
118 jchar c = obj->char_field(offset()); | |
119 as_int = c; | |
120 st->print(" %c %d", isprint(c) ? c : ' ', c); | |
121 } | |
122 break; | |
123 case T_DOUBLE: | |
124 st->print(" %lf", obj->double_field(offset())); | |
125 break; | |
126 case T_FLOAT: | |
127 as_int = obj->int_field(offset()); | |
128 st->print(" %f", obj->float_field(offset())); | |
129 break; | |
130 case T_INT: | |
665
c89f86385056
6814659: separable cleanups and subroutines for 6655638
jrose
parents:
0
diff
changeset
|
131 as_int = obj->int_field(offset()); |
0 | 132 st->print(" %d", obj->int_field(offset())); |
133 break; | |
134 case T_LONG: | |
135 st->print(" "); | |
136 st->print_jlong(obj->long_field(offset())); | |
137 break; | |
138 case T_SHORT: | |
139 as_int = obj->short_field(offset()); | |
140 st->print(" %d", obj->short_field(offset())); | |
141 break; | |
142 case T_BOOLEAN: | |
143 as_int = obj->bool_field(offset()); | |
144 st->print(" %s", obj->bool_field(offset()) ? "true" : "false"); | |
145 break; | |
146 case T_ARRAY: | |
147 st->print(" "); | |
665
c89f86385056
6814659: separable cleanups and subroutines for 6655638
jrose
parents:
0
diff
changeset
|
148 NOT_LP64(as_int = obj->int_field(offset())); |
0 | 149 obj->obj_field(offset())->print_value_on(st); |
150 break; | |
151 case T_OBJECT: | |
152 st->print(" "); | |
665
c89f86385056
6814659: separable cleanups and subroutines for 6655638
jrose
parents:
0
diff
changeset
|
153 NOT_LP64(as_int = obj->int_field(offset())); |
0 | 154 obj->obj_field(offset())->print_value_on(st); |
155 break; | |
156 default: | |
157 ShouldNotReachHere(); | |
158 break; | |
159 } | |
160 // Print a hint as to the underlying integer representation. This can be wrong for | |
161 // pointers on an LP64 machine | |
665
c89f86385056
6814659: separable cleanups and subroutines for 6655638
jrose
parents:
0
diff
changeset
|
162 if (ft == T_LONG || ft == T_DOUBLE LP64_ONLY(|| !is_java_primitive(ft)) ) { |
0 | 163 st->print(" (%x %x)", obj->int_field(offset()), obj->int_field(offset()+sizeof(jint))); |
665
c89f86385056
6814659: separable cleanups and subroutines for 6655638
jrose
parents:
0
diff
changeset
|
164 } else if (as_int < 0 || as_int > 9) { |
0 | 165 st->print(" (%x)", as_int); |
166 } | |
167 } | |
168 | |
169 #endif /* PRODUCT */ |