1270 case Bytecodes::_invokespecial: |
1270 case Bytecodes::_invokespecial: |
1271 case Bytecodes::_invokestatic: |
1271 case Bytecodes::_invokestatic: |
1272 case Bytecodes::_invokedynamic: |
1272 case Bytecodes::_invokedynamic: |
1273 case Bytecodes::_invokeinterface: |
1273 case Bytecodes::_invokeinterface: |
1274 int idx = currentBC->has_index_u4() ? currentBC->get_index_u4() : currentBC->get_index_u2_cpcache(); |
1274 int idx = currentBC->has_index_u4() ? currentBC->get_index_u4() : currentBC->get_index_u2_cpcache(); |
1275 constantPoolOop cp = method()->constants(); |
1275 ConstantPool* cp = method()->constants(); |
1276 int nameAndTypeIdx = cp->name_and_type_ref_index_at(idx); |
1276 int nameAndTypeIdx = cp->name_and_type_ref_index_at(idx); |
1277 int signatureIdx = cp->signature_ref_index_at(nameAndTypeIdx); |
1277 int signatureIdx = cp->signature_ref_index_at(nameAndTypeIdx); |
1278 Symbol* signature = cp->symbol_at(signatureIdx); |
1278 Symbol* signature = cp->symbol_at(signatureIdx); |
1279 os->print("%s", signature->as_C_string()); |
1279 os->print("%s", signature->as_C_string()); |
1280 } |
1280 } |
1302 case Bytecodes::_invokespecial: |
1302 case Bytecodes::_invokespecial: |
1303 case Bytecodes::_invokestatic: |
1303 case Bytecodes::_invokestatic: |
1304 case Bytecodes::_invokedynamic: |
1304 case Bytecodes::_invokedynamic: |
1305 case Bytecodes::_invokeinterface: |
1305 case Bytecodes::_invokeinterface: |
1306 int idx = currentBC->has_index_u4() ? currentBC->get_index_u4() : currentBC->get_index_u2_cpcache(); |
1306 int idx = currentBC->has_index_u4() ? currentBC->get_index_u4() : currentBC->get_index_u2_cpcache(); |
1307 constantPoolOop cp = method()->constants(); |
1307 ConstantPool* cp = method()->constants(); |
1308 int nameAndTypeIdx = cp->name_and_type_ref_index_at(idx); |
1308 int nameAndTypeIdx = cp->name_and_type_ref_index_at(idx); |
1309 int signatureIdx = cp->signature_ref_index_at(nameAndTypeIdx); |
1309 int signatureIdx = cp->signature_ref_index_at(nameAndTypeIdx); |
1310 Symbol* signature = cp->symbol_at(signatureIdx); |
1310 Symbol* signature = cp->symbol_at(signatureIdx); |
1311 os->print("%s", signature->as_C_string()); |
1311 os->print("%s", signature->as_C_string()); |
1312 } |
1312 } |
1844 |
1844 |
1845 |
1845 |
1846 |
1846 |
1847 void GenerateOopMap::do_ldc(int bci) { |
1847 void GenerateOopMap::do_ldc(int bci) { |
1848 Bytecode_loadconstant ldc(method(), bci); |
1848 Bytecode_loadconstant ldc(method(), bci); |
1849 constantPoolOop cp = method()->constants(); |
1849 ConstantPool* cp = method()->constants(); |
|
1850 constantTag tag = cp->tag_at(ldc.pool_index()); // idx is index in resolved_references |
1850 BasicType bt = ldc.result_type(); |
1851 BasicType bt = ldc.result_type(); |
1851 CellTypeState cts = (bt == T_OBJECT) ? CellTypeState::make_line_ref(bci) : valCTS; |
1852 CellTypeState cts; |
1852 // Make sure bt==T_OBJECT is the same as old code (is_pointer_entry). |
1853 if (tag.is_klass() || |
1853 // Note that CONSTANT_MethodHandle entries are u2 index pairs, not pointer-entries, |
1854 tag.is_unresolved_klass() || |
1854 // and they are processed by _fast_aldc and the CP cache. |
1855 tag.is_string() || |
1855 assert((ldc.has_cache_index() || cp->is_object_entry(ldc.pool_index())) |
1856 tag.is_object() || |
1856 ? (bt == T_OBJECT) : true, "expected object type"); |
1857 tag.is_method_handle() || |
|
1858 tag.is_method_type()) { |
|
1859 assert(bt == T_OBJECT, "Guard is incorrect"); |
|
1860 cts = CellTypeState::make_line_ref(bci); |
|
1861 } else { |
|
1862 assert(bt != T_OBJECT, "Guard is incorrect"); |
|
1863 cts = valCTS; |
|
1864 } |
1857 ppush1(cts); |
1865 ppush1(cts); |
1858 } |
1866 } |
1859 |
1867 |
1860 void GenerateOopMap::do_multianewarray(int dims, int bci) { |
1868 void GenerateOopMap::do_multianewarray(int dims, int bci) { |
1861 assert(dims >= 1, "sanity check"); |
1869 assert(dims >= 1, "sanity check"); |
1887 return idx; |
1895 return idx; |
1888 } |
1896 } |
1889 |
1897 |
1890 void GenerateOopMap::do_field(int is_get, int is_static, int idx, int bci) { |
1898 void GenerateOopMap::do_field(int is_get, int is_static, int idx, int bci) { |
1891 // Dig up signature for field in constant pool |
1899 // Dig up signature for field in constant pool |
1892 constantPoolOop cp = method()->constants(); |
1900 ConstantPool* cp = method()->constants(); |
1893 int nameAndTypeIdx = cp->name_and_type_ref_index_at(idx); |
1901 int nameAndTypeIdx = cp->name_and_type_ref_index_at(idx); |
1894 int signatureIdx = cp->signature_ref_index_at(nameAndTypeIdx); |
1902 int signatureIdx = cp->signature_ref_index_at(nameAndTypeIdx); |
1895 Symbol* signature = cp->symbol_at(signatureIdx); |
1903 Symbol* signature = cp->symbol_at(signatureIdx); |
1896 |
1904 |
1897 // Parse signature (espcially simple for fields) |
1905 // Parse signature (espcially simple for fields) |
1917 pp(in, out); |
1925 pp(in, out); |
1918 } |
1926 } |
1919 |
1927 |
1920 void GenerateOopMap::do_method(int is_static, int is_interface, int idx, int bci) { |
1928 void GenerateOopMap::do_method(int is_static, int is_interface, int idx, int bci) { |
1921 // Dig up signature for field in constant pool |
1929 // Dig up signature for field in constant pool |
1922 constantPoolOop cp = _method->constants(); |
1930 ConstantPool* cp = _method->constants(); |
1923 Symbol* signature = cp->signature_ref_at(idx); |
1931 Symbol* signature = cp->signature_ref_at(idx); |
1924 |
1932 |
1925 // Parse method signature |
1933 // Parse method signature |
1926 CellTypeState out[4]; |
1934 CellTypeState out[4]; |
1927 CellTypeState in[MAXARGSIZE+1]; // Includes result |
1935 CellTypeState in[MAXARGSIZE+1]; // Includes result |
2300 // during rewriting a new method oop is going to be used, and the next time |
2308 // during rewriting a new method oop is going to be used, and the next time |
2301 // around we want to use that. |
2309 // around we want to use that. |
2302 BytecodeStream bcs(_method); |
2310 BytecodeStream bcs(_method); |
2303 startOver = false; |
2311 startOver = false; |
2304 |
2312 |
2305 while( bcs.next() >=0 && !startOver && !_got_error) { |
2313 while( !startOver && !_got_error && |
|
2314 // test bcs in case method changed and it became invalid |
|
2315 bcs.next() >=0) { |
2306 startOver = rewrite_refval_conflict_inst(&bcs, from, to); |
2316 startOver = rewrite_refval_conflict_inst(&bcs, from, to); |
2307 } |
2317 } |
2308 } while (startOver && !_got_error); |
2318 } while (startOver && !_got_error); |
2309 } |
2319 } |
2310 |
2320 |
2381 bcp = (address)inst_buffer; |
2391 bcp = (address)inst_buffer; |
2382 } else { |
2392 } else { |
2383 bcp = _method->bcp_from(bcs->bci()); |
2393 bcp = _method->bcp_from(bcs->bci()); |
2384 } |
2394 } |
2385 |
2395 |
2386 // Patch either directly in methodOop or in temp. buffer |
2396 // Patch either directly in Method* or in temp. buffer |
2387 if (newIlen == 1) { |
2397 if (newIlen == 1) { |
2388 assert(varNo < 4, "varNo too large"); |
2398 assert(varNo < 4, "varNo too large"); |
2389 *bcp = bc0 + varNo; |
2399 *bcp = bc0 + varNo; |
2390 } else if (newIlen == 2) { |
2400 } else if (newIlen == 2) { |
2391 assert(varNo < 256, "2-byte index needed!"); |
2401 assert(varNo < 256, "2-byte index needed!"); |