RFR: 8299414: JVMTI FollowReferences should support references from VirtualThread stack [v9]
Serguei Spitsyn
sspitsyn at openjdk.org
Thu May 4 01:58:22 UTC 2023
On Wed, 3 May 2023 22:04:37 GMT, Alex Menkov <amenkov at openjdk.org> wrote:
>> src/hotspot/share/prims/jvmtiTagMap.cpp line 2319:
>>
>>> 2317: }
>>> 2318: }
>>> 2319: }
>>
>> The fragments 2289-2303 and 2305-2319 are based on the `StackValueCollection` and look very similar.
>> It can be worth to refactor these fragments into two function calls:
>>
>> bool report_stack_value_collection(jmethodID method, int idx_base,
>> StackValueCollection* elems, jlocation bci) {
>> for (int index = 0; index < exprs->size(); index++) {
>> if (exprs->at(index)->type() == T_OBJECT) {
>> oop obj = elems->obj_at(index)();
>> if (obj == nullptr) {
>> continue;
>> }
>> // stack reference
>> if (!CallbackInvoker::report_stack_ref_root(thread_tag, tid, depth, method,
>> bci, idx_base + index, obj)) {
>> return false;
>> }
>> }
>> }
>> return true; // ???
>>
>> . . . . .
>> jlocation bci = (jlocation)jvf->bci();
>> StackValueCollection* locals = jvf->locals();
>> if (!report_stack_value_collection(method, locals, 0 /* idx_base*/, bci)) {
>> return false;
>> }
>> StackValueCollection* exprs = jvf->expressions();
>> if (!report_stack_value_collection(method, exprs, locals->size(), bci)) {
>> return false;
>> }
>>
>> Other complete fragments can be also implemented as separate functions:
>> 2321-2328 (?), 2330-2351
>
> refactored.
It'd be nice to do even more factoring + renaming.
The lines 2326-2345 can be refactored to a function:
bool StackRootCollector::report_native_frame_refs(jmethodID method) {
_blk->set_context(_thread_tag, _tid, _depth, method);
if (_is_top_frame) {
// JNI locals for the top frame.
assert(_java_thread != nullptr, "sanity");
_java_thread->active_handles()->oops_do(_blk);
if (_blk->stopped()) {
return false;
}
} else {
if (_last_entry_frame != nullptr) {
// JNI locals for the entry frame
assert(_last_entry_frame->is_entry_frame(), "checking");
_last_entry_frame->entry_frame_call_wrapper()->handles()->oops_do(_blk);
if (_blk->stopped()) {
return false;
}
}
}
return true;
}
The function `report_stack_refs` can be renamed to `report_java_frame_refs`
to make function name more consistent.
-------------
PR Review Comment: https://git.openjdk.org/jdk/pull/13254#discussion_r1184463655
More information about the hotspot-dev
mailing list