Package org.python.core

# 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 `PyObject`s. This method replaces the formerly used method of maintaining weak hash-maps (`WeakHashMap`) for such cases. These weak hash-maps were used to map `PyObject`s 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 `PyObject`s, the fields for `FinalizeTrigger`s 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 Summary

Fields
Modifier and Type
Field
Description
`static final byte`
`FINALIZE_TRIGGER_ATTR`
`static final byte`
`GC_CYCLE_MARK_ATTR`
Used by `gc`-module to mark cyclic trash.
`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.
`static final byte`
`JAVA_PROXY_ATTR`
`static final byte`
`JYNI_HANDLE_ATTR`
Reserved for use by JyNI.
`static final byte`
`PY_ID_ATTR`
Allows the id of a `PyObject` to persist resurrection of that object.
`static final byte`
`PYCLASS_PY2JY_CACHE_ATTR`
Only used internally by `Py.javaPyClass(PyObject, Class)`
`static final byte`
`WEAK_REF_ATTR`
Stores list of weak references linking to this `PyObject`.
`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.

## Method Summary

Modifier and Type
Method
Description
`static void`
`debugPrintAttributes(PyObject o, PrintStream out)`
Prints the current state of the attribute-list of the given object to the given stream.
`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).
`static Object`
`getAttr(PyObject ob, byte attr_type)`
Retrieves the attribute of the given type from the given `PyObject`.
`static boolean`
`hasAttr(PyObject ob, byte attr_type)`
Checks whether the given `PyObject` has an attribute of the given type attached.
`static byte`
`reserveCustomAttrType()`
Reserves and returns a new non-transient attr type for custom use.
`static byte`
`reserveTransientCustomAttrType()`
Reserves and returns a new transient attr type for custom use.
`static void`
`setAttr(PyObject ob, byte attr_type, Object value)`
Sets the attribute of type `attr_type` in `ob` to `value`.

### Methods inherited from class java.lang.Object

`equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait`

## Field Details

### JAVA_PROXY_ATTR

public static final byte JAVA_PROXY_ATTR

See Also:
  - Constant Field Values

### 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

### JYNI_HANDLE_ATTR

public static final byte JYNI_HANDLE_ATTR
Reserved for use by JyNI.

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 `Py.javaPyClass(PyObject, Class)`

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

### FINALIZE_TRIGGER_ATTR

public static final byte FINALIZE_TRIGGER_ATTR

See Also:
  - Constant Field Values

## 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)`.