< prev index next >

src/hotspot/share/gc/shared/barrierSet.cpp

Print this page

        

*** 23,32 **** --- 23,34 ---- */ #include "precompiled.hpp" #include "gc/shared/barrierSet.hpp" #include "gc/shared/barrierSetAssembler.hpp" + #include "memory/resourceArea.hpp" + #include "oops/objArrayKlass.inline.hpp" #include "runtime/thread.hpp" #include "utilities/debug.hpp" #include "utilities/macros.hpp" BarrierSet* BarrierSet::_barrier_set = NULL;
*** 47,56 **** --- 49,84 ---- assert(!JavaThread::current()->on_thread_list(), "Main thread already on thread list."); _barrier_set->on_thread_create(Thread::current()); } + void BarrierSet::throw_array_null_pointer_store_exception(arrayOop src, arrayOop dst, TRAPS) { + Klass* bound = ObjArrayKlass::cast(dst->klass())->element_klass(); + stringStream ss; + ss.print("arraycopy: can not copy null values into %s[]", + bound->external_name()); + THROW_MSG(vmSymbols::java_lang_NullPointerException(), ss.as_string()); + } + + void BarrierSet::throw_array_store_exception(arrayOop src, arrayOop dst, TRAPS) { + ResourceMark rm(THREAD); + Klass* bound = ObjArrayKlass::cast(dst->klass())->element_klass(); + Klass* stype = ObjArrayKlass::cast(src->klass())->element_klass(); + stringStream ss; + if (!bound->is_subtype_of(stype)) { + ss.print("arraycopy: type mismatch: can not copy %s[] into %s[]", + stype->external_name(), bound->external_name()); + } else { + // oop_arraycopy should return the index in the source array that + // contains the problematic oop. + ss.print("arraycopy: element type mismatch: can not cast one of the elements" + " of %s[] to the type of the destination array, %s", + stype->external_name(), bound->external_name()); + } + THROW_MSG(vmSymbols::java_lang_ArrayStoreException(), ss.as_string()); + } + // Called from init.cpp void gc_barrier_stubs_init() { BarrierSet* bs = BarrierSet::barrier_set(); #ifndef ZERO BarrierSetAssembler* bs_assembler = bs->barrier_set_assembler();
< prev index next >