コード例 #1
0
ファイル: JavaVM.cs プロジェクト: weizhengwei/LangSvcV2
        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);
        }
コード例 #2
0
        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;
            }
        }
コード例 #3
0
        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;
            }
        }