comparison src/share/vm/oops/methodKlass.cpp @ 6123:2fe087c3e814

7172967: Eliminate constMethod's _method backpointer to methodOop. Summary: Eliminate constMethod's _method backpointer to methodOop, and move the _constant field from methodOop to constMethod. Reviewed-by: roland, bdelsart, kamg
author jiangli
date Wed, 06 Jun 2012 14:33:43 -0400
parents 94ec88ca68e2
children 1d7922586cf6
comparison
equal deleted inserted replaced
6115:6e2633440960 6123:2fe087c3e814
1 /* 1 /*
2 * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved. 2 * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 * 4 *
5 * This code is free software; you can redistribute it and/or modify it 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 6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. 7 * published by the Free Software Foundation.
110 m->set_prev_time(0); 110 m->set_prev_time(0);
111 #endif 111 #endif
112 112
113 assert(m->is_parsable(), "must be parsable here."); 113 assert(m->is_parsable(), "must be parsable here.");
114 assert(m->size() == size, "wrong size for object"); 114 assert(m->size() == size, "wrong size for object");
115 // We should not publish an uprasable object's reference
116 // into one that is parsable, since that presents problems
117 // for the concurrent parallel marking and precleaning phases
118 // of concurrent gc (CMS).
119 xconst->set_method(m);
120 return m; 115 return m;
121 } 116 }
122 117
123 118
124 void methodKlass::oop_follow_contents(oop obj) { 119 void methodKlass::oop_follow_contents(oop obj) {
125 assert (obj->is_method(), "object must be method"); 120 assert (obj->is_method(), "object must be method");
126 methodOop m = methodOop(obj); 121 methodOop m = methodOop(obj);
127 // Performance tweak: We skip iterating over the klass pointer since we 122 // Performance tweak: We skip iterating over the klass pointer since we
128 // know that Universe::methodKlassObj never moves. 123 // know that Universe::methodKlassObj never moves.
129 MarkSweep::mark_and_push(m->adr_constMethod()); 124 MarkSweep::mark_and_push(m->adr_constMethod());
130 MarkSweep::mark_and_push(m->adr_constants());
131 if (m->method_data() != NULL) { 125 if (m->method_data() != NULL) {
132 MarkSweep::mark_and_push(m->adr_method_data()); 126 MarkSweep::mark_and_push(m->adr_method_data());
133 } 127 }
134 } 128 }
135 129
139 assert (obj->is_method(), "object must be method"); 133 assert (obj->is_method(), "object must be method");
140 methodOop m = methodOop(obj); 134 methodOop m = methodOop(obj);
141 // Performance tweak: We skip iterating over the klass pointer since we 135 // Performance tweak: We skip iterating over the klass pointer since we
142 // know that Universe::methodKlassObj never moves. 136 // know that Universe::methodKlassObj never moves.
143 PSParallelCompact::mark_and_push(cm, m->adr_constMethod()); 137 PSParallelCompact::mark_and_push(cm, m->adr_constMethod());
144 PSParallelCompact::mark_and_push(cm, m->adr_constants());
145 #ifdef COMPILER2 138 #ifdef COMPILER2
146 if (m->method_data() != NULL) { 139 if (m->method_data() != NULL) {
147 PSParallelCompact::mark_and_push(cm, m->adr_method_data()); 140 PSParallelCompact::mark_and_push(cm, m->adr_method_data());
148 } 141 }
149 #endif // COMPILER2 142 #endif // COMPILER2
157 // Don't call size() or oop_size() since that is a virtual call. 150 // Don't call size() or oop_size() since that is a virtual call.
158 int size = m->object_size(); 151 int size = m->object_size();
159 // Performance tweak: We skip iterating over the klass pointer since we 152 // Performance tweak: We skip iterating over the klass pointer since we
160 // know that Universe::methodKlassObj never moves 153 // know that Universe::methodKlassObj never moves
161 blk->do_oop(m->adr_constMethod()); 154 blk->do_oop(m->adr_constMethod());
162 blk->do_oop(m->adr_constants());
163 if (m->method_data() != NULL) { 155 if (m->method_data() != NULL) {
164 blk->do_oop(m->adr_method_data()); 156 blk->do_oop(m->adr_method_data());
165 } 157 }
166 return size; 158 return size;
167 } 159 }
176 // Performance tweak: We skip iterating over the klass pointer since we 168 // Performance tweak: We skip iterating over the klass pointer since we
177 // know that Universe::methodKlassObj never moves. 169 // know that Universe::methodKlassObj never moves.
178 oop* adr; 170 oop* adr;
179 adr = m->adr_constMethod(); 171 adr = m->adr_constMethod();
180 if (mr.contains(adr)) blk->do_oop(adr); 172 if (mr.contains(adr)) blk->do_oop(adr);
181 adr = m->adr_constants();
182 if (mr.contains(adr)) blk->do_oop(adr);
183 if (m->method_data() != NULL) { 173 if (m->method_data() != NULL) {
184 adr = m->adr_method_data(); 174 adr = m->adr_method_data();
185 if (mr.contains(adr)) blk->do_oop(adr); 175 if (mr.contains(adr)) blk->do_oop(adr);
186 } 176 }
187 return size; 177 return size;
195 // Don't call size() or oop_size() since that is a virtual call. 185 // Don't call size() or oop_size() since that is a virtual call.
196 int size = m->object_size(); 186 int size = m->object_size();
197 // Performance tweak: We skip iterating over the klass pointer since we 187 // Performance tweak: We skip iterating over the klass pointer since we
198 // know that Universe::methodKlassObj never moves. 188 // know that Universe::methodKlassObj never moves.
199 MarkSweep::adjust_pointer(m->adr_constMethod()); 189 MarkSweep::adjust_pointer(m->adr_constMethod());
200 MarkSweep::adjust_pointer(m->adr_constants());
201 if (m->method_data() != NULL) { 190 if (m->method_data() != NULL) {
202 MarkSweep::adjust_pointer(m->adr_method_data()); 191 MarkSweep::adjust_pointer(m->adr_method_data());
203 } 192 }
204 return size; 193 return size;
205 } 194 }
211 200
212 int methodKlass::oop_update_pointers(ParCompactionManager* cm, oop obj) { 201 int methodKlass::oop_update_pointers(ParCompactionManager* cm, oop obj) {
213 assert(obj->is_method(), "should be method"); 202 assert(obj->is_method(), "should be method");
214 methodOop m = methodOop(obj); 203 methodOop m = methodOop(obj);
215 PSParallelCompact::adjust_pointer(m->adr_constMethod()); 204 PSParallelCompact::adjust_pointer(m->adr_constMethod());
216 PSParallelCompact::adjust_pointer(m->adr_constants());
217 #ifdef COMPILER2 205 #ifdef COMPILER2
218 if (m->method_data() != NULL) { 206 if (m->method_data() != NULL) {
219 PSParallelCompact::adjust_pointer(m->adr_method_data()); 207 PSParallelCompact::adjust_pointer(m->adr_method_data());
220 } 208 }
221 #endif // COMPILER2 209 #endif // COMPILER2
337 Klass::oop_verify_on(obj, st); 325 Klass::oop_verify_on(obj, st);
338 guarantee(obj->is_method(), "object must be method"); 326 guarantee(obj->is_method(), "object must be method");
339 if (!obj->partially_loaded()) { 327 if (!obj->partially_loaded()) {
340 methodOop m = methodOop(obj); 328 methodOop m = methodOop(obj);
341 guarantee(m->is_perm(), "should be in permspace"); 329 guarantee(m->is_perm(), "should be in permspace");
342 guarantee(m->constants()->is_perm(), "should be in permspace");
343 guarantee(m->constants()->is_constantPool(), "should be constant pool");
344 guarantee(m->constMethod()->is_constMethod(), "should be constMethodOop"); 330 guarantee(m->constMethod()->is_constMethod(), "should be constMethodOop");
345 guarantee(m->constMethod()->is_perm(), "should be in permspace"); 331 guarantee(m->constMethod()->is_perm(), "should be in permspace");
346 methodDataOop method_data = m->method_data(); 332 methodDataOop method_data = m->method_data();
347 guarantee(method_data == NULL || 333 guarantee(method_data == NULL ||
348 method_data->is_perm(), "should be in permspace"); 334 method_data->is_perm(), "should be in permspace");