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; }
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; }
jarray inStream_readArrayRef(PacketInputStream *stream) { jobject object = inStream_readObjectRef(stream); if (object == NULL) { /* * Could be error or just the null reference. In either case, * stop now. */ return NULL; } if (!isArray(object)) { stream->error = JDWP_ERROR(INVALID_ARRAY); return NULL; } return object; }
jclass inStream_readClassLoaderRef(PacketInputStream *stream) { jobject object = inStream_readObjectRef(stream); if (object == NULL) { /* * Could be error or just the null reference. In either case, * stop now. */ return NULL; } if (!isClassLoader(object)) { stream->error = JDWP_ERROR(INVALID_CLASS_LOADER); return NULL; } return object; }
jstring inStream_readStringRef(PacketInputStream *stream) { jobject object = inStream_readObjectRef(stream); if (object == NULL) { /* * Could be error or just the null reference. In either case, * stop now. */ return NULL; } if (!isString(object)) { stream->error = JDWP_ERROR(INVALID_STRING); return NULL; } return object; }
jthreadGroup inStream_readThreadGroupRef(PacketInputStream *stream) { jobject object = inStream_readObjectRef(stream); if (object == NULL) { /* * Could be error or just the null reference. In either case, * stop now. */ return NULL; } if (!isThreadGroup(object)) { stream->error = JDWP_ERROR(INVALID_THREAD_GROUP); return NULL; } return object; }
jthread inStream_readThreadRef(JNIEnv *env, PacketInputStream *stream) { jobject object = inStream_readObjectRef(env, stream); if (object == NULL) { /* * Could be error or just the null reference. In either case, * stop now. */ return NULL; } if (!isThread(object)) { stream->error = JDWP_ERROR(INVALID_THREAD); return NULL; } return object; }
/** * Take JDWP "modifiers" (which are JDI explicit filters, like * addCountFilter(), and implicit filters, like the LocationOnly * filter that goes with breakpoints) and add them as filters * (eventFilter) to the HandlerNode (eventHandler). */ static jdwpError readAndSetFilters(JNIEnv *env, PacketInputStream *in, HandlerNode *node, jint filterCount) { int i; jdwpError serror = JDWP_ERROR(NONE); for (i = 0; i < filterCount; ++i) { jbyte modifier; modifier = inStream_readByte(in); if ( (serror = inStream_error(in)) != JDWP_ERROR(NONE) ) break; switch (modifier) { case JDWP_REQUEST_MODIFIER(Conditional): { jint exprID; exprID = inStream_readInt(in); if ( (serror = inStream_error(in)) != JDWP_ERROR(NONE) ) break; serror = map2jdwpError( eventFilter_setConditionalFilter(node, i, exprID)); break; } case JDWP_REQUEST_MODIFIER(Count): { jint count; count = inStream_readInt(in); if ( (serror = inStream_error(in)) != JDWP_ERROR(NONE) ) break; serror = map2jdwpError( eventFilter_setCountFilter(node, i, count)); break; } case JDWP_REQUEST_MODIFIER(ThreadOnly): { jthread thread; thread = inStream_readThreadRef(env, in); if ( (serror = inStream_error(in)) != JDWP_ERROR(NONE) ) break; serror = map2jdwpError( eventFilter_setThreadOnlyFilter(node, i, thread)); break; } case JDWP_REQUEST_MODIFIER(LocationOnly): { jbyte tag; jclass clazz; jmethodID method; jlocation location; tag = inStream_readByte(in); /* not currently used */ tag = tag; /* To shut up lint */ if ( (serror = inStream_error(in)) != JDWP_ERROR(NONE) ) break; clazz = inStream_readClassRef(env, in); if ( (serror = inStream_error(in)) != JDWP_ERROR(NONE) ) break; method = inStream_readMethodID(in); if ( (serror = inStream_error(in)) != JDWP_ERROR(NONE) ) break; location = inStream_readLocation(in); if ( (serror = inStream_error(in)) != JDWP_ERROR(NONE) ) break; serror = map2jdwpError( eventFilter_setLocationOnlyFilter(node, i, clazz, method, location)); break; } case JDWP_REQUEST_MODIFIER(FieldOnly): { jclass clazz; jfieldID field; clazz = inStream_readClassRef(env, in); if ( (serror = inStream_error(in)) != JDWP_ERROR(NONE) ) break; field = inStream_readFieldID(in); if ( (serror = inStream_error(in)) != JDWP_ERROR(NONE) ) break; serror = map2jdwpError( eventFilter_setFieldOnlyFilter(node, i, clazz, field)); break; } case JDWP_REQUEST_MODIFIER(ClassOnly): { jclass clazz; clazz = inStream_readClassRef(env, in); if ( (serror = inStream_error(in)) != JDWP_ERROR(NONE) ) break; serror = map2jdwpError( eventFilter_setClassOnlyFilter(node, i, clazz)); break; } case JDWP_REQUEST_MODIFIER(ExceptionOnly): { jclass exception; jboolean caught; jboolean uncaught; exception = inStream_readClassRef(env, in); if ( (serror = inStream_error(in)) != JDWP_ERROR(NONE) ) break; caught = inStream_readBoolean(in); if ( (serror = inStream_error(in)) != JDWP_ERROR(NONE) ) break; uncaught = inStream_readBoolean(in); if ( (serror = inStream_error(in)) != JDWP_ERROR(NONE) ) break; serror = map2jdwpError( eventFilter_setExceptionOnlyFilter(node, i, exception, caught, uncaught)); break; } case JDWP_REQUEST_MODIFIER(InstanceOnly): { jobject instance; instance = inStream_readObjectRef(env, in); if ( (serror = inStream_error(in)) != JDWP_ERROR(NONE) ) break; serror = map2jdwpError( eventFilter_setInstanceOnlyFilter(node, i, instance)); break; } case JDWP_REQUEST_MODIFIER(ClassMatch): { char *pattern; pattern = inStream_readString(in); if ( (serror = inStream_error(in)) != JDWP_ERROR(NONE) ) break; serror = map2jdwpError( eventFilter_setClassMatchFilter(node, i, pattern)); break; } case JDWP_REQUEST_MODIFIER(ClassExclude): { char *pattern; pattern = inStream_readString(in); if ( (serror = inStream_error(in)) != JDWP_ERROR(NONE) ) break; serror = map2jdwpError( eventFilter_setClassExcludeFilter(node, i, pattern)); break; } case JDWP_REQUEST_MODIFIER(Step): { jthread thread; jint size; jint depth; thread = inStream_readThreadRef(env, in); if ( (serror = inStream_error(in)) != JDWP_ERROR(NONE) ) break; size = inStream_readInt(in); if ( (serror = inStream_error(in)) != JDWP_ERROR(NONE) ) break; depth = inStream_readInt(in); if ( (serror = inStream_error(in)) != JDWP_ERROR(NONE) ) break; serror = map2jdwpError( eventFilter_setStepFilter(node, i, thread, size, depth)); break; } case JDWP_REQUEST_MODIFIER(SourceNameMatch): { char *sourceNamePattern; sourceNamePattern = inStream_readString(in); if ( (serror = inStream_error(in)) != JDWP_ERROR(NONE) ) { break; } serror = map2jdwpError( eventFilter_setSourceNameMatchFilter(node, i, sourceNamePattern)); break; } default: serror = JDWP_ERROR(ILLEGAL_ARGUMENT); break; } if ( serror != JDWP_ERROR(NONE) ) break; } return serror; }