in modules/jpda/src/main/native/jdwp/common/agent/core/RequestManager.cpp [1912:2008]
void JNICALL RequestManager::HandleFieldModification(jvmtiEnv* jvmti,
JNIEnv* jni, jthread thread, jmethodID method, jlocation location,
jclass field_class, jobject object, jfieldID field,
char value_sig, jvalue value)
{
JDWP_TRACE_ENTRY("HandleFieldModification(" << jvmti << ',' << jni << ',' << thread
<< ',' << method << ',' << location
<< ',' << field_class << ',' << object << ',' << field
<< ',' << value_sig << ',' << &value << ')');
// must be non-agent thread
if (GetThreadManager().IsAgentThread(jni, thread)) {
return;
}
try {
jvmtiError err;
EventInfo eInfo;
memset(&eInfo, 0, sizeof(eInfo));
eInfo.kind = JDWP_EVENT_FIELD_MODIFICATION;
eInfo.thread = thread;
eInfo.method = method;
eInfo.location = location;
eInfo.field = field;
eInfo.instance = object;
eInfo.auxClass = field_class;
JVMTI_TRACE(err, GetJvmtiEnv()->GetMethodDeclaringClass(method,
&eInfo.cls));
if (err != JVMTI_ERROR_NONE) {
throw AgentException(err);
}
JVMTI_TRACE(err, GetJvmtiEnv()->GetClassSignature(eInfo.cls,
&eInfo.signature, 0));
JvmtiAutoFree jafSignature(eInfo.signature);
if (err != JVMTI_ERROR_NONE) {
throw AgentException(err);
}
#ifndef NDEBUG
if (JDWP_TRACE_ENABLED(LOG_KIND_EVENT)) {
char* fieldName = 0;
JVMTI_TRACE(err, GetJvmtiEnv()->GetMethodName(eInfo.method, &fieldName, 0, 0));
char* methodName = 0;
JVMTI_TRACE(err, GetJvmtiEnv()->GetFieldName(field_class, field, &fieldName, 0, 0));
jvmtiThreadInfo info;
JVMTI_TRACE(err, GetJvmtiEnv()->GetThreadInfo(thread, &info));
JDWP_TRACE_EVENT("FIELD_MODIFICATION event:"
<< " class=" << JDWP_CHECK_NULL(eInfo.signature)
<< " method=" << JDWP_CHECK_NULL(methodName)
<< " loc=" << eInfo.location
<< " field=" << JDWP_CHECK_NULL(fieldName)
<< " thread=" << JDWP_CHECK_NULL(info.name));
}
#endif // NDEBUG
jint eventCount = 0;
RequestID *eventList = 0;
jdwpSuspendPolicy sp = JDWP_SUSPEND_NONE;
GetRequestManager().GenerateEvents(jni, eInfo, eventCount, eventList, sp);
AgentAutoFree aafEL(eventList JDWP_FILE_LINE);
// post generated events
if (eventCount > 0) {
jdwpTypeTag typeTag = GetClassManager().GetJdwpTypeTag(eInfo.cls);
jdwpTypeTag fieldTypeTag =
GetClassManager().GetJdwpTypeTag(field_class);
EventComposer *ec = new EventComposer(GetEventDispatcher().NewId(),
JDWP_COMMAND_SET_EVENT, JDWP_COMMAND_E_COMPOSITE, sp);
ec->event.WriteInt(eventCount);
for (jint i = 0; i < eventCount; i++) {
ec->event.WriteByte(JDWP_EVENT_FIELD_MODIFICATION);
ec->event.WriteInt(eventList[i]);
ec->WriteThread(jni, thread);
ec->event.WriteLocation(jni,
typeTag, eInfo.cls, method, location);
ec->event.WriteByte(fieldTypeTag);
ec->event.WriteReferenceTypeID(jni, field_class);
ec->event.WriteFieldID(jni, field);
ec->event.WriteTaggedObjectID(jni, object);
jdwpTag valueTag = static_cast<jdwpTag>(value_sig);
if (valueTag == JDWP_TAG_OBJECT) {
valueTag = GetClassManager().GetJdwpTag(jni, value.l);
}
ec->event.WriteValue(jni, valueTag, value);
}
JDWP_TRACE_EVENT("FieldModification: post set of "
<< eventCount << " events");
GetEventDispatcher().PostEventSet(jni, ec, JDWP_EVENT_FIELD_MODIFICATION);
}
} catch (AgentException& e) {
JDWP_INFO("JDWP error in FIELD_MODIFICATION: " << e.what() << " [" << e.ErrCode() << "]");
}
}