comparison src/share/vm/oops/generateOopMap.cpp @ 726:be93aad57795

6655646: dynamic languages need dynamically linked call sites Summary: invokedynamic instruction (JSR 292 RI) Reviewed-by: twisti, never
author jrose
date Tue, 21 Apr 2009 23:21:04 -0700
parents 98cb887364d3
children bd02caa94611
comparison
equal deleted inserted replaced
725:928912ce8438 726:be93aad57795
1250 os->print(" %s", Bytecodes::name(currentBC->code())); 1250 os->print(" %s", Bytecodes::name(currentBC->code()));
1251 switch(currentBC->code()) { 1251 switch(currentBC->code()) {
1252 case Bytecodes::_invokevirtual: 1252 case Bytecodes::_invokevirtual:
1253 case Bytecodes::_invokespecial: 1253 case Bytecodes::_invokespecial:
1254 case Bytecodes::_invokestatic: 1254 case Bytecodes::_invokestatic:
1255 case Bytecodes::_invokedynamic:
1255 case Bytecodes::_invokeinterface: 1256 case Bytecodes::_invokeinterface:
1256 int idx = currentBC->get_index_big(); 1257 int idx = currentBC->get_index_int();
1257 constantPoolOop cp = method()->constants(); 1258 constantPoolOop cp = method()->constants();
1258 int nameAndTypeIdx = cp->name_and_type_ref_index_at(idx); 1259 int nameAndTypeIdx = cp->name_and_type_ref_index_at(idx);
1259 int signatureIdx = cp->signature_ref_index_at(nameAndTypeIdx); 1260 int signatureIdx = cp->signature_ref_index_at(nameAndTypeIdx);
1260 symbolOop signature = cp->symbol_at(signatureIdx); 1261 symbolOop signature = cp->symbol_at(signatureIdx);
1261 os->print("%s", signature->as_C_string()); 1262 os->print("%s", signature->as_C_string());
1281 } 1282 }
1282 switch(currentBC->code()) { 1283 switch(currentBC->code()) {
1283 case Bytecodes::_invokevirtual: 1284 case Bytecodes::_invokevirtual:
1284 case Bytecodes::_invokespecial: 1285 case Bytecodes::_invokespecial:
1285 case Bytecodes::_invokestatic: 1286 case Bytecodes::_invokestatic:
1287 case Bytecodes::_invokedynamic:
1286 case Bytecodes::_invokeinterface: 1288 case Bytecodes::_invokeinterface:
1287 int idx = currentBC->get_index_big(); 1289 int idx = currentBC->get_index_int();
1288 constantPoolOop cp = method()->constants(); 1290 constantPoolOop cp = method()->constants();
1289 int nameAndTypeIdx = cp->name_and_type_ref_index_at(idx); 1291 int nameAndTypeIdx = cp->name_and_type_ref_index_at(idx);
1290 int signatureIdx = cp->signature_ref_index_at(nameAndTypeIdx); 1292 int signatureIdx = cp->signature_ref_index_at(nameAndTypeIdx);
1291 symbolOop signature = cp->symbol_at(signatureIdx); 1293 symbolOop signature = cp->symbol_at(signatureIdx);
1292 os->print("%s", signature->as_C_string()); 1294 os->print("%s", signature->as_C_string());
1308 if (_report_result == true) { 1310 if (_report_result == true) {
1309 switch(itr->code()) { 1311 switch(itr->code()) {
1310 case Bytecodes::_invokevirtual: 1312 case Bytecodes::_invokevirtual:
1311 case Bytecodes::_invokespecial: 1313 case Bytecodes::_invokespecial:
1312 case Bytecodes::_invokestatic: 1314 case Bytecodes::_invokestatic:
1315 case Bytecodes::_invokedynamic:
1313 case Bytecodes::_invokeinterface: 1316 case Bytecodes::_invokeinterface:
1314 _itr_send = itr; 1317 _itr_send = itr;
1315 _report_result_for_send = true; 1318 _report_result_for_send = true;
1316 break; 1319 break;
1317 default: 1320 default:
1554 case Bytecodes::_putfield: do_field(false, false, itr->get_index_big(), itr->bci()); break; 1557 case Bytecodes::_putfield: do_field(false, false, itr->get_index_big(), itr->bci()); break;
1555 1558
1556 case Bytecodes::_invokevirtual: 1559 case Bytecodes::_invokevirtual:
1557 case Bytecodes::_invokespecial: do_method(false, false, itr->get_index_big(), itr->bci()); break; 1560 case Bytecodes::_invokespecial: do_method(false, false, itr->get_index_big(), itr->bci()); break;
1558 case Bytecodes::_invokestatic: do_method(true, false, itr->get_index_big(), itr->bci()); break; 1561 case Bytecodes::_invokestatic: do_method(true, false, itr->get_index_big(), itr->bci()); break;
1562 case Bytecodes::_invokedynamic: do_method(false, true, itr->get_index_int(), itr->bci()); break;
1559 case Bytecodes::_invokeinterface: do_method(false, true, itr->get_index_big(), itr->bci()); break; 1563 case Bytecodes::_invokeinterface: do_method(false, true, itr->get_index_big(), itr->bci()); break;
1560 case Bytecodes::_newarray: 1564 case Bytecodes::_newarray:
1561 case Bytecodes::_anewarray: pp_new_ref(vCTS, itr->bci()); break; 1565 case Bytecodes::_anewarray: pp_new_ref(vCTS, itr->bci()); break;
1562 case Bytecodes::_checkcast: do_checkcast(); break; 1566 case Bytecodes::_checkcast: do_checkcast(); break;
1563 case Bytecodes::_arraylength: 1567 case Bytecodes::_arraylength:
1897 1901
1898 void GenerateOopMap::do_method(int is_static, int is_interface, int idx, int bci) { 1902 void GenerateOopMap::do_method(int is_static, int is_interface, int idx, int bci) {
1899 // Dig up signature for field in constant pool 1903 // Dig up signature for field in constant pool
1900 constantPoolOop cp = _method->constants(); 1904 constantPoolOop cp = _method->constants();
1901 int nameAndTypeIdx = cp->name_and_type_ref_index_at(idx); 1905 int nameAndTypeIdx = cp->name_and_type_ref_index_at(idx);
1902 int signatureIdx = cp->signature_ref_index_at(nameAndTypeIdx); 1906 int signatureIdx = cp->signature_ref_index_at(nameAndTypeIdx); // @@@@@
1903 symbolOop signature = cp->symbol_at(signatureIdx); 1907 symbolOop signature = cp->symbol_at(signatureIdx);
1904 1908
1905 // Parse method signature 1909 // Parse method signature
1906 CellTypeState out[4]; 1910 CellTypeState out[4];
1907 CellTypeState in[MAXARGSIZE+1]; // Includes result 1911 CellTypeState in[MAXARGSIZE+1]; // Includes result