equal
deleted
inserted
replaced
399 Thread* THREAD = Thread::current(); |
399 Thread* THREAD = Thread::current(); |
400 ConstantPool::throw_resolution_error(cpool, encoded_index, THREAD); |
400 ConstantPool::throw_resolution_error(cpool, encoded_index, THREAD); |
401 return; |
401 return; |
402 } |
402 } |
403 |
403 |
404 const methodHandle adapter = call_info.resolved_method(); |
404 Method* adapter = call_info.resolved_method(); |
405 const Handle appendix = call_info.resolved_appendix(); |
405 const Handle appendix = call_info.resolved_appendix(); |
406 const bool has_appendix = appendix.not_null(); |
406 const bool has_appendix = appendix.not_null(); |
407 |
407 |
408 // Write the flags. |
408 // Write the flags. |
409 // MHs and indy are always sig-poly and have a local signature. |
409 // MHs and indy are always sig-poly and have a local signature. |
417 ttyLocker ttyl; |
417 ttyLocker ttyl; |
418 tty->print_cr("set_method_handle bc=%d appendix=" PTR_FORMAT "%s method=" PTR_FORMAT " (local signature) ", |
418 tty->print_cr("set_method_handle bc=%d appendix=" PTR_FORMAT "%s method=" PTR_FORMAT " (local signature) ", |
419 invoke_code, |
419 invoke_code, |
420 p2i(appendix()), |
420 p2i(appendix()), |
421 (has_appendix ? "" : " (unused)"), |
421 (has_appendix ? "" : " (unused)"), |
422 p2i(adapter())); |
422 p2i(adapter)); |
423 adapter->print(); |
423 adapter->print(); |
424 if (has_appendix) appendix()->print(); |
424 if (has_appendix) appendix()->print(); |
425 } |
425 } |
426 |
426 |
427 // Method handle invokes and invokedynamic sites use both cp cache words. |
427 // Method handle invokes and invokedynamic sites use both cp cache words. |
449 assert(appendix_index >= 0 && appendix_index < resolved_references->length(), "oob"); |
449 assert(appendix_index >= 0 && appendix_index < resolved_references->length(), "oob"); |
450 assert(resolved_references->obj_at(appendix_index) == NULL, "init just once"); |
450 assert(resolved_references->obj_at(appendix_index) == NULL, "init just once"); |
451 resolved_references->obj_at_put(appendix_index, appendix()); |
451 resolved_references->obj_at_put(appendix_index, appendix()); |
452 } |
452 } |
453 |
453 |
454 release_set_f1(adapter()); // This must be the last one to set (see NOTE above)! |
454 release_set_f1(adapter); // This must be the last one to set (see NOTE above)! |
455 |
455 |
456 // The interpreter assembly code does not check byte_2, |
456 // The interpreter assembly code does not check byte_2, |
457 // but it is used by is_resolved, method_if_resolved, etc. |
457 // but it is used by is_resolved, method_if_resolved, etc. |
458 set_bytecode_1(invoke_code); |
458 set_bytecode_1(invoke_code); |
459 NOT_PRODUCT(verify(tty)); |
459 NOT_PRODUCT(verify(tty)); |
721 |
721 |
722 InstanceKlass* ik = constant_pool()->pool_holder(); |
722 InstanceKlass* ik = constant_pool()->pool_holder(); |
723 bool* f2_used = NEW_RESOURCE_ARRAY(bool, length()); |
723 bool* f2_used = NEW_RESOURCE_ARRAY(bool, length()); |
724 memset(f2_used, 0, sizeof(bool) * length()); |
724 memset(f2_used, 0, sizeof(bool) * length()); |
725 |
725 |
|
726 Thread* THREAD = Thread::current(); |
|
727 |
726 // Find all the slots that we need to preserve f2 |
728 // Find all the slots that we need to preserve f2 |
727 for (int i = 0; i < ik->methods()->length(); i++) { |
729 for (int i = 0; i < ik->methods()->length(); i++) { |
728 Method* m = ik->methods()->at(i); |
730 Method* m = ik->methods()->at(i); |
729 RawBytecodeStream bcs(m); |
731 RawBytecodeStream bcs(methodHandle(THREAD, m)); |
730 while (!bcs.is_last_bytecode()) { |
732 while (!bcs.is_last_bytecode()) { |
731 Bytecodes::Code opcode = bcs.raw_next(); |
733 Bytecodes::Code opcode = bcs.raw_next(); |
732 switch (opcode) { |
734 switch (opcode) { |
733 case Bytecodes::_invokedynamic: { |
735 case Bytecodes::_invokedynamic: { |
734 int index = Bytes::get_native_u4(bcs.bcp() + 1); |
736 int index = Bytes::get_native_u4(bcs.bcp() + 1); |