void JNICALL RequestManager::HandleFieldModification()

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() << "]");
    }
}