< prev index next >

src/hotspot/share/interpreter/interpreterRuntime.cpp

Print this page




 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(&reg_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);


< prev index next >