Esempio n. 1
0
        internal jvmtiError GetClass(ReferenceTypeId classId, out jclass @class)
        {
            lock (_classes)
            {
                if (!_classes.TryGetValue(classId, out @class))
                {
                    return(jvmtiError.InvalidClass);
                }

                return(jvmtiError.None);
            }
        }
Esempio n. 2
0
        internal TaggedReferenceTypeId TrackLocalClassReference(jclass classHandle, JvmtiEnvironment environment, JniEnvironment nativeEnvironment, bool freeLocalReference)
        {
            if (classHandle == jclass.Null)
            {
                return(default(TaggedReferenceTypeId));
            }

            bool isArrayClass;

            JvmtiErrorHandler.ThrowOnFailure(environment.IsArrayClass(classHandle, out isArrayClass));
            bool isInterface;

            JvmtiErrorHandler.ThrowOnFailure(environment.IsInterface(classHandle, out isInterface));

            TypeTag typeTag = isArrayClass ? TypeTag.Array : (isInterface ? TypeTag.Interface : TypeTag.Class);

            int hashCode;

            JvmtiErrorHandler.ThrowOnFailure(environment.GetObjectHashCode(classHandle, out hashCode));

            ReferenceTypeId       typeId       = new ReferenceTypeId(hashCode);
            TaggedReferenceTypeId taggedTypeId = new TaggedReferenceTypeId(typeTag, typeId);

            lock (_classes)
            {
                if (!_classes.ContainsKey(typeId))
                {
                    jweak weak  = nativeEnvironment.NewWeakGlobalReference(classHandle);
                    bool  added = false;
                    if (!_classes.ContainsKey(typeId))
                    {
                        _classes.Add(typeId, new jclass(weak.Handle));
                        added = true;
                    }

                    if (!added)
                    {
                        nativeEnvironment.DeleteWeakGlobalReference(weak);
                    }
                }
            }

            if (freeLocalReference)
            {
                nativeEnvironment.DeleteLocalReference(classHandle);
            }

            return(taggedTypeId);
        }
Esempio n. 3
0
        internal LocalClassReferenceHolder GetLocalReferenceForClass(JniEnvironment nativeEnvironment, ReferenceTypeId classId)
        {
            LocalClassReferenceHolder thread;
            var error = GetLocalReferenceForClass(nativeEnvironment, classId, out thread);

            if (error != jvmtiError.None)
            {
                return(new LocalClassReferenceHolder());
            }

            return(thread);
        }
Esempio n. 4
0
        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);
        }