internal jvmtiError GetLocalReferenceForClass(JniEnvironment nativeEnvironment, ReferenceTypeId typeId, out LocalClassReferenceHolder thread) { thread = default(LocalClassReferenceHolder); jclass threadHandle; jvmtiError error = GetClass(typeId, out threadHandle); if (error != jvmtiError.None) { return(error); } thread = new LocalClassReferenceHolder(nativeEnvironment, threadHandle); return(jvmtiError.None); }
public Error GetArrayValues(ArrayId arrayObject, int firstIndex, int length, out Value[] values) { values = null; try { JniEnvironment nativeEnvironment; JvmtiEnvironment environment; jvmtiError error = GetEnvironment(out environment, out nativeEnvironment); if (error != jvmtiError.None) return GetStandardError(error); using (LocalObjectReferenceHolder objectHandle = VirtualMachine.GetLocalReferenceForObject(nativeEnvironment, arrayObject)) { if (!objectHandle.IsAlive) return Error.InvalidObject; Value[] valuesArray = new Value[length]; using (LocalClassReferenceHolder declaringType = new LocalClassReferenceHolder(nativeEnvironment, nativeEnvironment.GetObjectClass(objectHandle.Value))) { string signature; string genericSignature; error = environment.GetClassSignature(declaringType.Value, out signature, out genericSignature); if (error != jvmtiError.None) return GetStandardError(error); // the array element type signature starts after the '[' Contract.Assert(signature[0] == '['); switch (signature[1]) { case 'Z': { bool[] buffer = new bool[length]; nativeEnvironment.GetBooleanArrayRegion(objectHandle.Value, firstIndex, length, buffer); for (int i = 0; i < length; i++) valuesArray[i] = (Value)buffer[i]; break; } case 'B': { byte[] buffer = new byte[length]; nativeEnvironment.GetByteArrayRegion(objectHandle.Value, firstIndex, length, buffer); for (int i = 0; i < length; i++) valuesArray[i] = (Value)buffer[i]; break; } case 'C': { char[] buffer = new char[length]; nativeEnvironment.GetCharArrayRegion(objectHandle.Value, firstIndex, length, buffer); for (int i = 0; i < length; i++) valuesArray[i] = (Value)buffer[i]; break; } case 'D': { double[] buffer = new double[length]; nativeEnvironment.GetDoubleArrayRegion(objectHandle.Value, firstIndex, length, buffer); for (int i = 0; i < length; i++) valuesArray[i] = (Value)buffer[i]; break; } case 'F': { float[] buffer = new float[length]; nativeEnvironment.GetFloatArrayRegion(objectHandle.Value, firstIndex, length, buffer); for (int i = 0; i < length; i++) valuesArray[i] = (Value)buffer[i]; break; } case 'I': { int[] buffer = new int[length]; nativeEnvironment.GetIntArrayRegion(objectHandle.Value, firstIndex, length, buffer); for (int i = 0; i < length; i++) valuesArray[i] = (Value)buffer[i]; break; } case 'J': { long[] buffer = new long[length]; nativeEnvironment.GetLongArrayRegion(objectHandle.Value, firstIndex, length, buffer); for (int i = 0; i < length; i++) valuesArray[i] = (Value)buffer[i]; break; } case 'S': { short[] buffer = new short[length]; nativeEnvironment.GetShortArrayRegion(objectHandle.Value, firstIndex, length, buffer); for (int i = 0; i < length; i++) valuesArray[i] = (Value)buffer[i]; break; } case 'V': return Error.InvalidFieldid; case '[': case 'L': { for (int i = 0; i < length; i++) { jobject value = nativeEnvironment.GetObjectArrayElement(objectHandle.Value, firstIndex + i); valuesArray[i] = (Value)VirtualMachine.TrackLocalObjectReference(value, environment, nativeEnvironment, true); } break; } default: throw new FormatException(); } } values = valuesArray; return Error.None; } } catch (Exception) { return Error.Internal; } }
public Error GetObjectValues(ObjectId @object, FieldId[] fields, out Value[] values) { values = null; try { JniEnvironment nativeEnvironment; JvmtiEnvironment environment; jvmtiError error = GetEnvironment(out environment, out nativeEnvironment); if (error != jvmtiError.None) return GetStandardError(error); using (LocalObjectReferenceHolder objectHandle = VirtualMachine.GetLocalReferenceForObject(nativeEnvironment, @object)) { if (!objectHandle.IsAlive) return Error.InvalidObject; Value[] valuesArray = new Value[fields.Length]; for (int i = 0; i < valuesArray.Length; i++) { string name; string signature; string genericSignature; using (LocalClassReferenceHolder declaringType = new LocalClassReferenceHolder(nativeEnvironment, nativeEnvironment.GetObjectClass(objectHandle.Value))) { error = environment.GetFieldName(declaringType.Value, fields[i], out name, out signature, out genericSignature); if (error != jvmtiError.None) return GetStandardError(error); switch (signature[0]) { case 'Z': valuesArray[i] = nativeEnvironment.GetBooleanField(objectHandle.Value, fields[i]); break; case 'B': valuesArray[i] = nativeEnvironment.GetByteField(objectHandle.Value, fields[i]); break; case 'C': valuesArray[i] = nativeEnvironment.GetCharField(objectHandle.Value, fields[i]); break; case 'D': valuesArray[i] = nativeEnvironment.GetDoubleField(objectHandle.Value, fields[i]); break; case 'F': valuesArray[i] = nativeEnvironment.GetFloatField(objectHandle.Value, fields[i]); break; case 'I': valuesArray[i] = nativeEnvironment.GetIntField(objectHandle.Value, fields[i]); break; case 'J': valuesArray[i] = nativeEnvironment.GetLongField(objectHandle.Value, fields[i]); break; case 'S': valuesArray[i] = nativeEnvironment.GetShortField(objectHandle.Value, fields[i]); break; case 'V': return Error.InvalidFieldid; case '[': case 'L': jobject value = nativeEnvironment.GetObjectField(objectHandle.Value, fields[i]); valuesArray[i] = VirtualMachine.TrackLocalObjectReference(value, environment, nativeEnvironment, true); break; default: throw new FormatException(); } } } values = valuesArray; return Error.None; } } catch (Exception) { return Error.Internal; } }