jdwpError outStream_writeValue(JNIEnv *env, PacketOutputStream *out, jbyte typeKey, jvalue value) { if (typeKey == JDWP_TAG(OBJECT)) { (void)outStream_writeByte(out, specificTypeKey(env, value.l)); } else { (void)outStream_writeByte(out, typeKey); } if (isObjectTag(typeKey)) { (void)outStream_writeObjectRef(env, out, value.l); } else { switch (typeKey) { case JDWP_TAG(BYTE): return outStream_writeByte(out, value.b); case JDWP_TAG(CHAR): return outStream_writeChar(out, value.c); case JDWP_TAG(FLOAT): return outStream_writeFloat(out, value.f); case JDWP_TAG(DOUBLE): return outStream_writeDouble(out, value.d); case JDWP_TAG(INT): return outStream_writeInt(out, value.i); case JDWP_TAG(LONG): return outStream_writeLong(out, value.j); case JDWP_TAG(SHORT): return outStream_writeShort(out, value.s); case JDWP_TAG(BOOLEAN): return outStream_writeBoolean(out, value.z); case JDWP_TAG(VOID): /* happens with function return values */ /* write nothing */ return JDWP_ERROR(NONE); default: EXIT_ERROR(AGENT_ERROR_INVALID_OBJECT,"Invalid type key"); break; } } return JDWP_ERROR(NONE); }
jvalue inStream_readValue(PacketInputStream *stream, jbyte *typeKeyPtr) { jvalue value; jbyte typeKey = inStream_readByte(stream); if (stream->error) { value.j = 0L; return value; } if (isObjectTag(typeKey)) { value.l = inStream_readObjectRef(stream); } else { switch (typeKey) { case JDWP_TAG(BYTE): value.b = inStream_readByte(stream); break; case JDWP_TAG(CHAR): value.c = inStream_readChar(stream); break; case JDWP_TAG(FLOAT): value.f = inStream_readFloat(stream); break; case JDWP_TAG(DOUBLE): value.d = inStream_readDouble(stream); break; case JDWP_TAG(INT): value.i = inStream_readInt(stream); break; case JDWP_TAG(LONG): value.j = inStream_readLong(stream); break; case JDWP_TAG(SHORT): value.s = inStream_readShort(stream); break; case JDWP_TAG(BOOLEAN): value.z = inStream_readBoolean(stream); break; default: stream->error = JDWP_ERROR(INVALID_TAG); break; } } if (typeKeyPtr) { *typeKeyPtr = typeKey; } return value; }
static void tossEventInfoRefs(JNIEnv *env, EventInfo *evinfo) { char sig; if ( evinfo->thread != NULL ) { tossGlobalRef(env, &(evinfo->thread)); } if ( evinfo->clazz != NULL ) { tossGlobalRef(env, &(evinfo->clazz)); } if ( evinfo->object != NULL ) { tossGlobalRef(env, &(evinfo->object)); } switch (evinfo->ei) { case EI_FIELD_MODIFICATION: if ( evinfo->u.field_modification.field_clazz != NULL ) { tossGlobalRef(env, &(evinfo->u.field_modification.field_clazz)); } sig = evinfo->u.field_modification.signature_type; if ((sig == JDWP_TAG(ARRAY)) || (sig == JDWP_TAG(OBJECT))) { if ( evinfo->u.field_modification.new_value.l != NULL ) { tossGlobalRef(env, &(evinfo->u.field_modification.new_value.l)); } } break; case EI_FIELD_ACCESS: if ( evinfo->u.field_access.field_clazz != NULL ) { tossGlobalRef(env, &(evinfo->u.field_access.field_clazz)); } break; case EI_EXCEPTION: if ( evinfo->u.exception.catch_clazz != NULL ) { tossGlobalRef(env, &(evinfo->u.exception.catch_clazz)); } break; default: break; } }
/* Change all references to global in the EventInfo struct */ static void saveEventInfoRefs(JNIEnv *env, EventInfo *evinfo) { jthread *pthread; jclass *pclazz; jobject *pobject; jthread thread; jclass clazz; jobject object; char sig; JNI_FUNC_PTR(env,ExceptionClear)(env); if ( evinfo->thread != NULL ) { pthread = &(evinfo->thread); thread = *pthread; *pthread = NULL; saveGlobalRef(env, thread, pthread); } if ( evinfo->clazz != NULL ) { pclazz = &(evinfo->clazz); clazz = *pclazz; *pclazz = NULL; saveGlobalRef(env, clazz, pclazz); } if ( evinfo->object != NULL ) { pobject = &(evinfo->object); object = *pobject; *pobject = NULL; saveGlobalRef(env, object, pobject); } switch (evinfo->ei) { case EI_FIELD_MODIFICATION: if ( evinfo->u.field_modification.field_clazz != NULL ) { pclazz = &(evinfo->u.field_modification.field_clazz); clazz = *pclazz; *pclazz = NULL; saveGlobalRef(env, clazz, pclazz); } sig = evinfo->u.field_modification.signature_type; if ((sig == JDWP_TAG(ARRAY)) || (sig == JDWP_TAG(OBJECT))) { if ( evinfo->u.field_modification.new_value.l != NULL ) { pobject = &(evinfo->u.field_modification.new_value.l); object = *pobject; *pobject = NULL; saveGlobalRef(env, object, pobject); } } break; case EI_FIELD_ACCESS: if ( evinfo->u.field_access.field_clazz != NULL ) { pclazz = &(evinfo->u.field_access.field_clazz); clazz = *pclazz; *pclazz = NULL; saveGlobalRef(env, clazz, pclazz); } break; case EI_EXCEPTION: if ( evinfo->u.exception.catch_clazz != NULL ) { pclazz = &(evinfo->u.exception.catch_clazz); clazz = *pclazz; *pclazz = NULL; saveGlobalRef(env, clazz, pclazz); } break; default: break; } if (JNI_FUNC_PTR(env,ExceptionOccurred)(env)) { EXIT_ERROR(AGENT_ERROR_INVALID_EVENT_TYPE,"ExceptionOccurred"); } }