static void writeExceptionEvent(JNIEnv *env, PacketOutputStream *out, EventInfo *evinfo) { (void)outStream_writeObjectRef(env, out, evinfo->thread); writeCodeLocation(out, evinfo->clazz, evinfo->method, evinfo->location); (void)outStream_writeObjectTag(env, out, evinfo->object); (void)outStream_writeObjectRef(env, out, evinfo->object); writeCodeLocation(out, evinfo->u.exception.catch_clazz, evinfo->u.exception.catch_method, evinfo->u.exception.catch_location); }
static void writeFieldAccessEvent(JNIEnv *env, PacketOutputStream *out, EventInfo *evinfo) { jbyte fieldClassTag; fieldClassTag = referenceTypeTag(evinfo->u.field_access.field_clazz); (void)outStream_writeObjectRef(env, out, evinfo->thread); writeCodeLocation(out, evinfo->clazz, evinfo->method, evinfo->location); (void)outStream_writeByte(out, fieldClassTag); (void)outStream_writeObjectRef(env, out, evinfo->u.field_access.field_clazz); (void)outStream_writeFieldID(out, evinfo->u.field_access.field); (void)outStream_writeObjectTag(env, out, evinfo->object); (void)outStream_writeObjectRef(env, out, evinfo->object); }
static void handleReportVMInitCommand(JNIEnv* env, ReportVMInitCommand *command) { PacketOutputStream out; if (command->suspendPolicy == JDWP_SUSPEND_POLICY(ALL)) { (void)threadControl_suspendAll(); } else if (command->suspendPolicy == JDWP_SUSPEND_POLICY(EVENT_THREAD)) { (void)threadControl_suspendThread(command->thread, JNI_FALSE); } outStream_initCommand(&out, uniqueID(), 0x0, JDWP_COMMAND_SET(Event), JDWP_COMMAND(Event, Composite)); (void)outStream_writeByte(&out, command->suspendPolicy); (void)outStream_writeInt(&out, 1); /* Always one component */ (void)outStream_writeByte(&out, JDWP_EVENT(VM_INIT)); (void)outStream_writeInt(&out, 0); /* Not in response to an event req. */ (void)outStream_writeObjectRef(env, &out, command->thread); outStream_sendCommand(&out); outStream_destroy(&out); /* Why aren't we tossing this: tossGlobalRef(env, &(command->thread)); */ }
static jboolean reflectedType(PacketInputStream *in, PacketOutputStream *out) { jbyte tag; jobject object; JNIEnv *env; env = getEnv(); object = inStream_readObjectRef(env, in); if (inStream_error(in)) { return JNI_TRUE; } /* * In our implementation, the reference type id is the same as the * class object id, so we bounce it right back. * */ tag = referenceTypeTag(object); (void)outStream_writeByte(out, tag); (void)outStream_writeObjectRef(env, out, object); return JNI_TRUE; }
static void writeFieldModificationEvent(JNIEnv *env, PacketOutputStream *out, EventInfo *evinfo) { jbyte fieldClassTag; fieldClassTag = referenceTypeTag(evinfo->u.field_modification.field_clazz); (void)outStream_writeObjectRef(env, out, evinfo->thread); writeCodeLocation(out, evinfo->clazz, evinfo->method, evinfo->location); (void)outStream_writeByte(out, fieldClassTag); (void)outStream_writeObjectRef(env, out, evinfo->u.field_modification.field_clazz); (void)outStream_writeFieldID(out, evinfo->u.field_modification.field); (void)outStream_writeObjectTag(env, out, evinfo->object); (void)outStream_writeObjectRef(env, out, evinfo->object); (void)outStream_writeValue(env, out, (jbyte)evinfo->u.field_modification.signature_type, evinfo->u.field_modification.new_value); }
static void writeMonitorEvent(JNIEnv *env, PacketOutputStream *out, EventInfo *evinfo) { (void)outStream_writeObjectRef(env, out, evinfo->thread); (void)outStream_writeObjectTag(env, out, evinfo->object); (void)outStream_writeObjectRef(env, out, evinfo->object); if (evinfo->ei == EI_MONITOR_WAIT || evinfo->ei == EI_MONITOR_WAITED) { /* clazz was set to class of monitor object for monitor wait event class filtering. * See cbMonitorWait() and cbMonitorWaited() function in eventHandler.c. */ evinfo->clazz=getMethodClass(gdata->jvmti, evinfo->method); } writeCodeLocation(out, evinfo->clazz, evinfo->method, evinfo->location); if (evinfo->ei == EI_MONITOR_WAIT) { (void)outStream_writeLong(out, evinfo->u.monitor.timeout); } else if (evinfo->ei == EI_MONITOR_WAITED) { (void)outStream_writeBoolean(out, evinfo->u.monitor.timed_out); } }
static void writeClassEvent(JNIEnv *env, PacketOutputStream *out, EventInfo *evinfo) { jbyte classTag; jint status; char *signature = NULL; jvmtiError error; classTag = referenceTypeTag(evinfo->clazz); error = classSignature(evinfo->clazz, &signature, NULL); if (error != JVMTI_ERROR_NONE) { EXIT_ERROR(error,"signature"); } status = classStatus(evinfo->clazz); (void)outStream_writeObjectRef(env, out, evinfo->thread); (void)outStream_writeByte(out, classTag); (void)outStream_writeObjectRef(env, out, evinfo->clazz); (void)outStream_writeString(out, signature); (void)outStream_writeInt(out, map2jdwpClassStatus(status)); jvmtiDeallocate(signature); }
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); }
WITH_LOCAL_REFS(env, length) { int i; jobject component; for (i = 0; i < length; i++) { component = JNI_FUNC_PTR(env,GetObjectArrayElement)(env, array, index + i); if (JNI_FUNC_PTR(env,ExceptionOccurred)(env)) { /* cleared by caller */ break; } (void)outStream_writeByte(out, specificTypeKey(env, component)); (void)outStream_writeObjectRef(env, out, component); } } END_WITH_LOCAL_REFS(env);
static void handleFrameEventCommandSingle(JNIEnv* env, PacketOutputStream *out, FrameEventCommandSingle *command) { if (command->typeKey) { (void)outStream_writeByte(out, JDWP_EVENT(METHOD_EXIT_WITH_RETURN_VALUE)); } else { (void)outStream_writeByte(out, eventIndex2jdwp(command->ei)); } (void)outStream_writeInt(out, command->id); (void)outStream_writeObjectRef(env, out, command->thread); writeCodeLocation(out, command->clazz, command->method, command->location); if (command->typeKey) { (void)outStream_writeValue(env, out, command->typeKey, command->returnValue); if (isObjectTag(command->typeKey) && command->returnValue.l != NULL) { tossGlobalRef(env, &(command->returnValue.l)); } } tossGlobalRef(env, &(command->thread)); tossGlobalRef(env, &(command->clazz)); }
static void writeThreadEvent(JNIEnv *env, PacketOutputStream *out, EventInfo *evinfo) { (void)outStream_writeObjectRef(env, out, evinfo->thread); }
static void writeBreakpointEvent(JNIEnv *env, PacketOutputStream *out, EventInfo *evinfo) { (void)outStream_writeObjectRef(env, out, evinfo->thread); writeCodeLocation(out, evinfo->clazz, evinfo->method, evinfo->location); }
jint outStream_writeClassRef(PacketOutputStream *stream, jclass val) { return outStream_writeObjectRef(stream, val); }