Class JyAttribute

java.lang.Object
org.python.core.JyAttribute
All Implemented Interfaces:
Serializable

public abstract class JyAttribute extends Object implements 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:
  • Field Details

    • JAVA_PROXY_ATTR

      public static final byte JAVA_PROXY_ATTR
      See Also:
    • 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:
    • JYNI_HANDLE_ATTR

      public static final byte JYNI_HANDLE_ATTR
      Reserved for use by JyNI.
      See Also:
    • PY_ID_ATTR

      public static final byte PY_ID_ATTR
      Allows the id of a PyObject to persist resurrection of that object.
      See Also:
    • 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:
    • PYCLASS_PY2JY_CACHE_ATTR

      public static final byte PYCLASS_PY2JY_CACHE_ATTR
      Only used internally by Py.javaPyClass(PyObject, Class)
      See Also:
    • 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:
    • 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:
    • FINALIZE_TRIGGER_ATTR

      public static final byte FINALIZE_TRIGGER_ATTR
      See Also:
  • Method Details

    • 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 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, 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, 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).