573 oop obj = ArrayKlass::cast(klass)->multi_allocate(nof_dims, dims, CHECK); 574 thread->set_vm_result(obj); 575 IRT_END 576 577 IRT_LEAF(void, InterpreterRuntime::recycle_vtbuffer(void* alloc_ptr)) 578 JavaThread* thread = (JavaThread*)Thread::current(); 579 VTBuffer::recycle_vtbuffer(thread, alloc_ptr); 580 IRT_END 581 582 IRT_ENTRY(void, InterpreterRuntime::recycle_buffered_values(JavaThread* thread)) 583 frame f = thread->last_frame(); 584 assert(f.is_interpreted_frame(), "recycling can only be triggered from interpreted frames"); 585 VTBuffer::recycle_vt_in_frame(thread, &f); 586 IRT_END 587 588 IRT_ENTRY(void, InterpreterRuntime::fix_frame_vt_alloc_ptr(JavaThread* thread)) 589 frame f = thread->last_frame(); 590 VTBuffer::fix_frame_vt_alloc_ptr(f, VTBufferChunk::chunk(thread->vt_alloc_ptr())); 591 IRT_END 592 593 IRT_ENTRY(void, InterpreterRuntime::return_value(JavaThread* thread, oopDesc* obj)) 594 if (!VTBuffer::is_in_vt_buffer(obj)) { 595 thread->set_vm_result(obj); 596 return; 597 } 598 assert(obj->klass()->is_value(), "Sanity check"); 599 ValueKlass* vk = ValueKlass::cast(obj->klass()); 600 RegisterMap reg_map(thread, false); 601 frame current_frame = thread->last_frame(); 602 frame caller_frame = current_frame.sender(®_map); 603 if (!caller_frame.is_interpreted_frame()) { 604 // caller is not an interpreted frame, creating a new value in Java heap 605 Handle obj_h(THREAD, obj); 606 instanceOop res = vk->allocate_instance(CHECK); 607 Handle res_h(THREAD, res); 608 // copy value 609 vk->value_store(vk->data_for_oop(obj_h()), 610 vk->data_for_oop(res_h()), true, false); 611 thread->set_vm_result(res_h()); 612 return; 613 } else { 614 // A buffered value is being returned to an interpreted frame, 615 // but the work has to be delayed to remove_activation() because 616 // the frame cannot be modified now (GC can run at the safepoint 617 // when exiting runtime, and frame layout must be kept consistent 618 // with the OopMap). 619 thread->set_return_buffered_value(obj); 620 thread->set_vm_result(obj); 621 } 622 IRT_END 623 624 IRT_LEAF(void, InterpreterRuntime::return_value_step2(oopDesc* obj, void* alloc_ptr)) 625 626 JavaThread* thread = (JavaThread*)Thread::current(); 627 assert(obj == thread->return_buffered_value(), "Consistency check"); 628 assert(!Universe::heap()->is_in_reserved(obj), "Should only apply to buffered values"); 629 630 oop dest = VTBuffer::relocate_return_value(thread, alloc_ptr, obj); 631 thread->set_return_buffered_value(NULL); 632 thread->set_vm_result(dest); 633 IRT_END 634 635 IRT_ENTRY(void, InterpreterRuntime::check_areturn(JavaThread* thread, oopDesc* obj)) 636 if (obj != NULL) { 637 Klass* k = obj->klass(); 638 if (k->is_value()) { 639 ResourceMark rm(thread); 640 tty->print_cr("areturn used on a value from %s", k->name()->as_C_string()); 641 } 642 assert(!k->is_value(), "areturn should never be used on values"); 643 } 644 thread->set_vm_result(obj); 645 IRT_END 646 647 IRT_ENTRY(void, InterpreterRuntime::register_finalizer(JavaThread* thread, oopDesc* obj)) 648 assert(oopDesc::is_oop(obj), "must be a valid oop"); 649 assert(obj->klass()->has_finalizer(), "shouldn't be here otherwise"); 650 InstanceKlass::register_finalizer(instanceOop(obj), CHECK); | 573 oop obj = ArrayKlass::cast(klass)->multi_allocate(nof_dims, dims, CHECK); 574 thread->set_vm_result(obj); 575 IRT_END 576 577 IRT_LEAF(void, InterpreterRuntime::recycle_vtbuffer(void* alloc_ptr)) 578 JavaThread* thread = (JavaThread*)Thread::current(); 579 VTBuffer::recycle_vtbuffer(thread, alloc_ptr); 580 IRT_END 581 582 IRT_ENTRY(void, InterpreterRuntime::recycle_buffered_values(JavaThread* thread)) 583 frame f = thread->last_frame(); 584 assert(f.is_interpreted_frame(), "recycling can only be triggered from interpreted frames"); 585 VTBuffer::recycle_vt_in_frame(thread, &f); 586 IRT_END 587 588 IRT_ENTRY(void, InterpreterRuntime::fix_frame_vt_alloc_ptr(JavaThread* thread)) 589 frame f = thread->last_frame(); 590 VTBuffer::fix_frame_vt_alloc_ptr(f, VTBufferChunk::chunk(thread->vt_alloc_ptr())); 591 IRT_END 592 593 IRT_ENTRY(void, InterpreterRuntime::reallocate_value_in_heap(JavaThread* thread, oopDesc* obj)) 594 assert(VTBuffer::is_in_vt_buffer(obj), "must be called on buffered value"); 595 assert(!ReturnValuesInThreadLocalBuffer, "Should re-allocate value if ReturnValuesInThreadLocalBuffer is true"); 596 597 Handle obj_h(THREAD, obj); 598 assert(obj->klass()->is_value(), "Sanity check"); 599 ValueKlass* vk = ValueKlass::cast(obj->klass()); 600 instanceOop res = vk->allocate_instance(CHECK); 601 Handle res_h(THREAD, res); 602 // copy value 603 vk->value_store(vk->data_for_oop(obj_h()), 604 vk->data_for_oop(res_h()), true, false); 605 thread->set_vm_result(res_h()); 606 IRT_END 607 608 IRT_LEAF(void, InterpreterRuntime::relocate_return_value(oopDesc* obj, void* alloc_ptr)) 609 JavaThread* thread = (JavaThread*)Thread::current(); 610 assert(obj == thread->return_buffered_value(), "Consistency check"); 611 assert(!Universe::heap()->is_in_reserved(obj), "Should only apply to buffered values"); 612 613 oop dest = VTBuffer::relocate_return_value(thread, alloc_ptr, obj); 614 ValueKlass* vklass = ValueKlass::cast(dest->klass()); 615 void* start = (char*)(oopDesc*)dest + vklass->size_helper() * wordSize; 616 VTBuffer::recycle_vtbuffer(thread, start); 617 thread->set_return_buffered_value(NULL); 618 thread->set_vm_result(dest); 619 IRT_END 620 621 IRT_ENTRY(void, InterpreterRuntime::check_areturn(JavaThread* thread, oopDesc* obj)) 622 if (obj != NULL) { 623 Klass* k = obj->klass(); 624 if (k->is_value()) { 625 ResourceMark rm(thread); 626 tty->print_cr("areturn used on a value from %s", k->name()->as_C_string()); 627 } 628 assert(!k->is_value(), "areturn should never be used on values"); 629 } 630 thread->set_vm_result(obj); 631 IRT_END 632 633 IRT_ENTRY(void, InterpreterRuntime::register_finalizer(JavaThread* thread, oopDesc* obj)) 634 assert(oopDesc::is_oop(obj), "must be a valid oop"); 635 assert(obj->klass()->has_finalizer(), "shouldn't be here otherwise"); 636 InstanceKlass::register_finalizer(instanceOop(obj), CHECK); |