comparison src/share/vm/runtime/deoptimization.cpp @ 2177:3582bf76420e

6990754: Use native memory and reference counting to implement SymbolTable Summary: move symbols from permgen into C heap and reference count them Reviewed-by: never, acorn, jmasa, stefank
author coleenp
date Thu, 27 Jan 2011 16:11:27 -0800
parents 8012aa3ccede
children d25d4ca69222 b92c45f2bc75
comparison
equal deleted inserted replaced
2176:27e4ea99855d 2177:3582bf76420e
394 BasicType return_type; 394 BasicType return_type;
395 { 395 {
396 HandleMark hm; 396 HandleMark hm;
397 methodHandle method(thread, array->element(0)->method()); 397 methodHandle method(thread, array->element(0)->method());
398 Bytecode_invoke invoke = Bytecode_invoke_check(method, array->element(0)->bci()); 398 Bytecode_invoke invoke = Bytecode_invoke_check(method, array->element(0)->bci());
399 return_type = invoke.is_valid() ? invoke.result_type(thread) : T_ILLEGAL; 399 return_type = invoke.is_valid() ? invoke.result_type() : T_ILLEGAL;
400 } 400 }
401 401
402 // Compute information for handling adapters and adjusting the frame size of the caller. 402 // Compute information for handling adapters and adjusting the frame size of the caller.
403 int caller_adjustment = 0; 403 int caller_adjustment = 0;
404 404
599 if (cur_code == Bytecodes::_invokevirtual || 599 if (cur_code == Bytecodes::_invokevirtual ||
600 cur_code == Bytecodes::_invokespecial || 600 cur_code == Bytecodes::_invokespecial ||
601 cur_code == Bytecodes::_invokestatic || 601 cur_code == Bytecodes::_invokestatic ||
602 cur_code == Bytecodes::_invokeinterface) { 602 cur_code == Bytecodes::_invokeinterface) {
603 Bytecode_invoke invoke(mh, iframe->interpreter_frame_bci()); 603 Bytecode_invoke invoke(mh, iframe->interpreter_frame_bci());
604 symbolHandle signature(thread, invoke.signature()); 604 Symbol* signature = invoke.signature();
605 ArgumentSizeComputer asc(signature); 605 ArgumentSizeComputer asc(signature);
606 cur_invoke_parameter_size = asc.size(); 606 cur_invoke_parameter_size = asc.size();
607 if (cur_code != Bytecodes::_invokestatic) { 607 if (cur_code != Bytecodes::_invokestatic) {
608 // Add in receiver 608 // Add in receiver
609 ++cur_invoke_parameter_size; 609 ++cur_invoke_parameter_size;
1154 } 1154 }
1155 1155
1156 if (!constant_pool->tag_at(index).is_symbol()) return; 1156 if (!constant_pool->tag_at(index).is_symbol()) return;
1157 1157
1158 Handle class_loader (THREAD, instanceKlass::cast(constant_pool->pool_holder())->class_loader()); 1158 Handle class_loader (THREAD, instanceKlass::cast(constant_pool->pool_holder())->class_loader());
1159 symbolHandle symbol (THREAD, constant_pool->symbol_at(index)); 1159 Symbol* symbol = constant_pool->symbol_at(index);
1160 1160
1161 // class name? 1161 // class name?
1162 if (symbol->byte_at(0) != '(') { 1162 if (symbol->byte_at(0) != '(') {
1163 Handle protection_domain (THREAD, Klass::cast(constant_pool->pool_holder())->protection_domain()); 1163 Handle protection_domain (THREAD, Klass::cast(constant_pool->pool_holder())->protection_domain());
1164 SystemDictionary::resolve_or_null(symbol, class_loader, protection_domain, CHECK); 1164 SystemDictionary::resolve_or_null(symbol, class_loader, protection_domain, CHECK);
1165 return; 1165 return;
1166 } 1166 }
1167 1167
1168 // then it must be a signature! 1168 // then it must be a signature!
1169 ResourceMark rm(THREAD);
1169 for (SignatureStream ss(symbol); !ss.is_done(); ss.next()) { 1170 for (SignatureStream ss(symbol); !ss.is_done(); ss.next()) {
1170 if (ss.is_object()) { 1171 if (ss.is_object()) {
1171 symbolOop s = ss.as_symbol(CHECK); 1172 Symbol* class_name = ss.as_symbol(CHECK);
1172 symbolHandle class_name (THREAD, s);
1173 Handle protection_domain (THREAD, Klass::cast(constant_pool->pool_holder())->protection_domain()); 1173 Handle protection_domain (THREAD, Klass::cast(constant_pool->pool_holder())->protection_domain());
1174 SystemDictionary::resolve_or_null(class_name, class_loader, protection_domain, CHECK); 1174 SystemDictionary::resolve_or_null(class_name, class_loader, protection_domain, CHECK);
1175 } 1175 }
1176 } 1176 }
1177 } 1177 }
1244 xtty->begin_head("uncommon_trap thread='" UINTX_FORMAT"' %s", 1244 xtty->begin_head("uncommon_trap thread='" UINTX_FORMAT"' %s",
1245 os::current_thread_id(), 1245 os::current_thread_id(),
1246 format_trap_request(buf, sizeof(buf), trap_request)); 1246 format_trap_request(buf, sizeof(buf), trap_request));
1247 nm->log_identity(xtty); 1247 nm->log_identity(xtty);
1248 } 1248 }
1249 symbolHandle class_name; 1249 Symbol* class_name = NULL;
1250 bool unresolved = false; 1250 bool unresolved = false;
1251 if (unloaded_class_index >= 0) { 1251 if (unloaded_class_index >= 0) {
1252 constantPoolHandle constants (THREAD, trap_method->constants()); 1252 constantPoolHandle constants (THREAD, trap_method->constants());
1253 if (constants->tag_at(unloaded_class_index).is_unresolved_klass()) { 1253 if (constants->tag_at(unloaded_class_index).is_unresolved_klass()) {
1254 class_name = symbolHandle(THREAD, 1254 class_name = constants->klass_name_at(unloaded_class_index);
1255 constants->klass_name_at(unloaded_class_index));
1256 unresolved = true; 1255 unresolved = true;
1257 if (xtty != NULL) 1256 if (xtty != NULL)
1258 xtty->print(" unresolved='1'"); 1257 xtty->print(" unresolved='1'");
1259 } else if (constants->tag_at(unloaded_class_index).is_symbol()) { 1258 } else if (constants->tag_at(unloaded_class_index).is_symbol()) {
1260 class_name = symbolHandle(THREAD, 1259 class_name = constants->symbol_at(unloaded_class_index);
1261 constants->symbol_at(unloaded_class_index));
1262 } 1260 }
1263 if (xtty != NULL) 1261 if (xtty != NULL)
1264 xtty->name(class_name); 1262 xtty->name(class_name);
1265 } 1263 }
1266 if (xtty != NULL && trap_mdo.not_null()) { 1264 if (xtty != NULL && trap_mdo.not_null()) {
1292 fr.pc(), 1290 fr.pc(),
1293 (int) os::current_thread_id(), 1291 (int) os::current_thread_id(),
1294 trap_reason_name(reason), 1292 trap_reason_name(reason),
1295 trap_action_name(action), 1293 trap_action_name(action),
1296 unloaded_class_index); 1294 unloaded_class_index);
1297 if (class_name.not_null()) { 1295 if (class_name != NULL) {
1298 tty->print(unresolved ? " unresolved class: " : " symbol: "); 1296 tty->print(unresolved ? " unresolved class: " : " symbol: ");
1299 class_name->print_symbol_on(tty); 1297 class_name->print_symbol_on(tty);
1300 } 1298 }
1301 tty->cr(); 1299 tty->cr();
1302 } 1300 }