Mercurial > hg > truffle
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 |