--- old/src/hotspot/share/classfile/javaClasses.cpp 2018-04-20 00:46:44.000000000 +0100 +++ new/src/hotspot/share/classfile/javaClasses.cpp 2018-04-20 00:46:43.000000000 +0100 @@ -1565,6 +1565,7 @@ int java_lang_Thread::_stillborn_offset = 0; int java_lang_Thread::_stackSize_offset = 0; int java_lang_Thread::_tid_offset = 0; +int java_lang_Thread::_continuation_offset = 0; int java_lang_Thread::_thread_status_offset = 0; int java_lang_Thread::_park_blocker_offset = 0; int java_lang_Thread::_park_event_offset = 0 ; @@ -1582,7 +1583,8 @@ macro(_tid_offset, k, "tid", long_signature, false); \ macro(_thread_status_offset, k, "threadStatus", int_signature, false); \ macro(_park_blocker_offset, k, "parkBlocker", object_signature, false); \ - macro(_park_event_offset, k, "nativeParkEventPointer", long_signature, false) + macro(_park_event_offset, k, "nativeParkEventPointer", long_signature, false); \ + macro(_continuation_offset, k, "cont", continuation_signature, false) void java_lang_Thread::compute_offsets() { assert(_group_offset == 0, "offsets should be initialized only once"); @@ -1718,6 +1720,14 @@ } } +oop java_lang_Thread::continuation(oop java_thread) { + return java_thread->obj_field(_continuation_offset); +} + +void java_lang_Thread::set_continuation(oop java_thread, oop continuation) { + return java_thread->obj_field_put(_continuation_offset, continuation); +} + oop java_lang_Thread::park_blocker(oop java_thread) { assert(JDK_Version::current().supports_thread_park_blocker() && _park_blocker_offset != 0, "Must support parkBlocker field"); @@ -4195,6 +4205,20 @@ int java_lang_ref_Reference::discovered_offset; int java_lang_ref_SoftReference::timestamp_offset; int java_lang_ref_SoftReference::static_clock_offset; +int java_lang_Continuation::scope_offset; +int java_lang_Continuation::target_offset; +int java_lang_Continuation::stack_offset; +int java_lang_Continuation::refStack_offset; +int java_lang_Continuation::stackSize_offset; +int java_lang_Continuation::parent_offset; +int java_lang_Continuation::entrySP_offset; +int java_lang_Continuation::entryFP_offset; +int java_lang_Continuation::entryPC_offset; +int java_lang_Continuation::fp_offset; +int java_lang_Continuation::sp_offset; +int java_lang_Continuation::pc_offset; +int java_lang_Continuation::refSP_offset; +Method* java_lang_Continuation::stack_method; int java_lang_ClassLoader::parent_offset; int java_lang_System::static_in_offset; int java_lang_System::static_out_offset; @@ -4342,6 +4366,43 @@ o->bool_field_put(deflt_offset, val); } +// Support for java.lang.Continuation + +Method* java_lang_Continuation::get_stack_method() { + CallInfo callinfo; + Klass* recvrKlass = SystemDictionary::Continuation_klass(); // SystemDictionary::resolve_or_null(vmSymbols::java_lang_Continuation(), NULL); // + LinkInfo link_info(recvrKlass, vmSymbols::getStack_name(), vmSymbols::continuationGetStack_signature()); + LinkResolver::resolve_special_call(callinfo, Handle(), link_info, Thread::current()); + methodHandle method = callinfo.selected_method(); + assert(method.not_null(), "should have thrown exception"); + return method(); +} + +void java_lang_Continuation::compute_offsets() { + InstanceKlass* k = SystemDictionary::Continuation_klass(); + compute_offset(scope_offset, k, vmSymbols::scope_name(), vmSymbols::continuationscope_signature()); + compute_offset(target_offset, k, vmSymbols::target_name(), vmSymbols::runnable_signature()); + compute_offset(parent_offset, k, vmSymbols::parent_name(), vmSymbols::continuation_signature()); + compute_offset(stack_offset, k, vmSymbols::stack_name(), vmSymbols::int_array_signature()); + compute_offset(refStack_offset, k, vmSymbols::refStack_name(), vmSymbols::object_array_signature()); + compute_offset(stackSize_offset, k, vmSymbols::stackSize_name(), vmSymbols::int_signature()); + compute_offset(entrySP_offset, k, vmSymbols::entrySP_name(), vmSymbols::long_signature()); + compute_offset(entryFP_offset, k, vmSymbols::entryFP_name(), vmSymbols::long_signature()); + compute_offset(entryPC_offset, k, vmSymbols::entryPC_name(), vmSymbols::long_signature()); + compute_offset(fp_offset, k, vmSymbols::fp_name(), vmSymbols::int_signature()); + compute_offset(sp_offset, k, vmSymbols::sp_name(), vmSymbols::int_signature()); + compute_offset(pc_offset, k, vmSymbols::pc_name(), vmSymbols::long_signature()); + compute_offset(refSP_offset, k, vmSymbols::refSP_name(), vmSymbols::int_signature()); + + java_lang_Continuation::stack_method = java_lang_Continuation::get_stack_method(); +} + +bool java_lang_Continuation::on_local_stack(oop ref, address adr) { + arrayOop s = stack(ref); + void* base = s->base(T_INT); + return adr >= base && (char*)adr < ((char*)base + (s->length() * 4)); +} + // Support for intrinsification of java.nio.Buffer.checkIndex int java_nio_Buffer::limit_offset() { @@ -4395,6 +4456,16 @@ java_lang_ref_Reference::queue_offset = member_offset(java_lang_ref_Reference::hc_queue_offset); java_lang_ref_Reference::next_offset = member_offset(java_lang_ref_Reference::hc_next_offset); java_lang_ref_Reference::discovered_offset = member_offset(java_lang_ref_Reference::hc_discovered_offset); + + // // java_lang_Continuation Class + // java_lang_Continuation::target_offset = member_offset(java_lang_Continuation::hc_target_offset); + // java_lang_Continuation::parent_offset = member_offset(java_lang_Continuation::hc_parent_offset); + // java_lang_Continuation::entrySP_offset = member_offset(java_lang_Continuation::hc_entrySP_offset); + // java_lang_Continuation::entryFP_offset = member_offset(java_lang_Continuation::hc_entryFP_offset); + // java_lang_Continuation::entryPC_offset = member_offset(java_lang_Continuation::hc_entryPC_offset); + // java_lang_Continuation::stack_offset = member_offset(java_lang_Continuation::hc_stack_offset); + // java_lang_Continuation::lastFP_offset = member_offset(java_lang_Continuation::hc_lastFP_offset); + // java_lang_Continuation::lastSP_offset = member_offset(java_lang_Continuation::hc_lastSP_offset); } @@ -4437,6 +4508,7 @@ java_lang_StackTraceElement::compute_offsets(); java_lang_StackFrameInfo::compute_offsets(); java_lang_LiveStackFrameInfo::compute_offsets(); + java_lang_Continuation::compute_offsets(); // generated interpreter code wants to know about the offsets we just computed: AbstractAssembler::update_delayed_values(); @@ -4502,6 +4574,17 @@ // Fake field //CHECK_OFFSET("java/lang/ref/Reference", java_lang_ref_Reference, discovered, "Ljava/lang/ref/Reference;"); + // java.lang.Continuation + + // CHECK_OFFSET("java/lang/Continuation", java_lang_Continuation, target, "Ljava/lang/Runnable;"); + // CHECK_OFFSET("java/lang/Continuation", java_lang_Continuation, stack, "[I"); + // CHECK_OFFSET("java/lang/Continuation", java_lang_Continuation, parent, "Ljava/lang/Continuation;"); + // CHECK_OFFSET("java/lang/Continuation", java_lang_Continuation, entrySP, "J"); + // CHECK_OFFSET("java/lang/Continuation", java_lang_Continuation, entryFP, "J"); + // CHECK_OFFSET("java/lang/Continuation", java_lang_Continuation, entryPC, "J"); + // CHECK_OFFSET("java/lang/Continuation", java_lang_Continuation, lastFP, "I"); + // CHECK_OFFSET("java/lang/Continuation", java_lang_Continuation, lastSP, "I"); + if (!valid) vm_exit_during_initialization("Hard-coded field offset verification failed"); }