Class JyAttribute

  • All Implemented Interfaces:
    java.io.Serializable

    public abstract class JyAttribute
    extends java.lang.Object
    implements java.io.Serializable

    Manages a linked list of general purpose Object-attributes that can be attached to arbitrary PyObjects. This method replaces the formerly used method of maintaining weak hash-maps (WeakHashMap) for such cases. These weak hash-maps were used to map PyObjects to such attributes, for instance to attach GlobalRef-objects in the WeakrefModule.

    Attributes attached via the weak hash-map-method break, if the PyObject is resurrected in its finalizer. The JyAttribute-method is resurrection-safe.

    To reduce memory footprint of PyObjects, the fields for FinalizeTriggers and javaProxy are included in the list; javaProxy always on top so there is no speed-regression, FinalizeTrigger on bottom, as it is usually never accessed.

    See Also:
    Serialized Form
    • Field Detail

      • WEAK_REF_ATTR

        public static final byte WEAK_REF_ATTR
        Stores list of weak references linking to this PyObject. This list is weakref-based, so it does not keep the weakrefs alive. This is the only way to find out which weakrefs (i.e. AbstractReference) linked to the object after a resurrection. A weak hash-map-based approach for this purpose would break on resurrection.
        See Also:
        Constant Field Values
      • PY_ID_ATTR

        public static final byte PY_ID_ATTR
        Allows the id of a PyObject to persist resurrection of that object.
        See Also:
        Constant Field Values
      • WEAKREF_PENDING_GET_ATTR

        public static final byte WEAKREF_PENDING_GET_ATTR
        Holds the current thread for an AbstractReference while referent-retrieval is pending due to a potentially restored-by-resurrection weak reference. After the restore has happened or the clear was confirmed, the thread is interrupted and the attribute is cleared.
        See Also:
        Constant Field Values
      • PYCLASS_PY2JY_CACHE_ATTR

        public static final byte PYCLASS_PY2JY_CACHE_ATTR
        Only used internally by
        See Also:
        Constant Field Values
      • GC_CYCLE_MARK_ATTR

        public static final byte GC_CYCLE_MARK_ATTR
        Used by gc-module to mark cyclic trash. Searching for cyclic trash is usually not required by Jython. It is only done if gc-features are enabled that mimic CPython behavior.
        See Also:
        Constant Field Values
      • GC_DELAYED_FINALIZE_CRITICAL_MARK_ATTR

        public static final byte GC_DELAYED_FINALIZE_CRITICAL_MARK_ATTR
        Used by gc-module to mark finalizable objects that might have been resurrected during a delayed finalization process.
        See Also:
        Constant Field Values
    • Method Detail

      • reserveCustomAttrType

        public static byte reserveCustomAttrType()
        Reserves and returns a new non-transient attr type for custom use.
        Returns:
        a non-transient attr type for custom use
      • reserveTransientCustomAttrType

        public static byte reserveTransientCustomAttrType()
        Reserves and returns a new transient attr type for custom use.
        Returns:
        a transient attr type for custom use
      • hasAttr

        public static boolean hasAttr​(PyObject ob,
                                      byte attr_type)
        Checks whether the given PyObject has an attribute of the given type attached.
      • getAttr

        public static java.lang.Object getAttr​(PyObject ob,
                                               byte attr_type)
        Retrieves the attribute of the given type from the given PyObject. If no attribute of the given type is attached, null is returned.
      • debugPrintAttributes

        public static void debugPrintAttributes​(PyObject o,
                                                java.io.PrintStream out)
        Prints the current state of the attribute-list of the given object to the given stream. (Intended for debugging)
      • setAttr

        public static void setAttr​(PyObject ob,
                                   byte attr_type,
                                   java.lang.Object value)
        Sets the attribute of type attr_type in ob to value. If no corresponding attribute exists yet, one is created. If {@value == null}, the attribute is removed (if it existed at all).
      • delAttr

        public static void delAttr​(PyObject ob,
                                   byte attr_type)
        Removes the attribute of given type from the given object's attribute-list (if it existed at all). This is equivalent to calling setAttr(ob, attr_type, null).