コードオブジェクト

コードオブジェクト(Code objects)は CPython 実装の低レベルな詳細部分です。各オブジェクトは関数に束縛されていない実行可能コードの塊を表現しています。

type PyCodeObject

コードオブジェクトを表現するために利用されるC構造体。この型のフィールドは何時でも変更され得ます。

PyTypeObject PyCode_Type

これは Python の code 型を表現する PyTypeObject のインスタンスです。

int PyCode_Check(PyObject *co)

cocode オブジェクトの場合に真を返します。この関数は常に成功します。

int PyCode_GetNumFree(PyCodeObject *co)

co 内の自由変数(free variables)の数を返します。

PyCodeObject *PyCode_New(int argcount, int kwonlyargcount, int nlocals, int stacksize, int flags, PyObject *code, PyObject *consts, PyObject *names, PyObject *varnames, PyObject *freevars, PyObject *cellvars, PyObject *filename, PyObject *name, int firstlineno, PyObject *linetable, PyObject *exceptiontable)
Return value: New reference.

Return a new code object. If you need a dummy code object to create a frame, use PyCode_NewEmpty() instead. Calling PyCode_New() directly will bind you to a precise Python version since the definition of the bytecode changes often. The many arguments of this function are inter-dependent in complex ways, meaning that subtle changes to values are likely to result in incorrect execution or VM crashes. Use this function only with extreme care.

バージョン 3.11 で変更: Added exceptiontable parameter.

PyCodeObject *PyCode_NewWithPosOnlyArgs(int argcount, int posonlyargcount, int kwonlyargcount, int nlocals, int stacksize, int flags, PyObject *code, PyObject *consts, PyObject *names, PyObject *varnames, PyObject *freevars, PyObject *cellvars, PyObject *filename, PyObject *name, int firstlineno, PyObject *linetable, PyObject *exceptiontable)
Return value: New reference.

Similar to PyCode_New(), but with an extra "posonlyargcount" for positional-only arguments. The same caveats that apply to PyCode_New also apply to this function.

バージョン 3.8 で追加.

バージョン 3.11 で変更: Added exceptiontable parameter.

PyCodeObject *PyCode_NewEmpty(const char *filename, const char *funcname, int firstlineno)
Return value: New reference.

Return a new empty code object with the specified filename, function name, and first line number. The resulting code object will raise an Exception if executed.

int PyCode_Addr2Line(PyCodeObject *co, int byte_offset)

Return the line number of the instruction that occurs on or before byte_offset and ends after it. If you just need the line number of a frame, use PyFrame_GetLineNumber() instead.

For efficiently iterating over the line numbers in a code object, use the API described in PEP 626.

int PyCode_Addr2Location(PyObject *co, int byte_offset, int *start_line, int *start_column, int *end_line, int *end_column)

Sets the passed int pointers to the source code line and column numbers for the instruction at byte_offset. Sets the value to 0 when information is not available for any particular element.

Returns 1 if the function succeeds and 0 otherwise.

バージョン 3.11 で追加.

PyObject *PyCode_GetCode(PyCodeObject *co)

Equivalent to the Python code getattr(co, 'co_code'). Returns a strong reference to a PyBytesObject representing the bytecode in a code object. On error, NULL is returned and an exception is raised.

This PyBytesObject may be created on-demand by the interpreter and does not necessarily represent the bytecode actually executed by CPython. The primary use case for this function is debuggers and profilers.

バージョン 3.11 で追加.

PyObject *PyCode_GetVarnames(PyCodeObject *co)

Equivalent to the Python code getattr(co, 'co_varnames'). Returns a new reference to a PyTupleObject containing the names of the local variables. On error, NULL is returned and an exception is raised.

バージョン 3.11 で追加.

PyObject *PyCode_GetCellvars(PyCodeObject *co)

Equivalent to the Python code getattr(co, 'co_cellvars'). Returns a new reference to a PyTupleObject containing the names of the local variables that are referenced by nested functions. On error, NULL is returned and an exception is raised.

バージョン 3.11 で追加.

PyObject *PyCode_GetFreevars(PyCodeObject *co)

Equivalent to the Python code getattr(co, 'co_freevars'). Returns a new reference to a PyTupleObject containing the names of the free variables. On error, NULL is returned and an exception is raised.

バージョン 3.11 で追加.

int PyCode_AddWatcher(PyCode_WatchCallback callback)

Register callback as a code object watcher for the current interpreter. Return an ID which may be passed to PyCode_ClearWatcher(). In case of error (e.g. no more watcher IDs available), return -1 and set an exception.

バージョン 3.12 で追加.

int PyCode_ClearWatcher(int watcher_id)

Clear watcher identified by watcher_id previously returned from PyCode_AddWatcher() for the current interpreter. Return 0 on success, or -1 and set an exception on error (e.g. if the given watcher_id was never registered.)

バージョン 3.12 で追加.

type PyCodeEvent

Enumeration of possible code object watcher events: - PY_CODE_EVENT_CREATE - PY_CODE_EVENT_DESTROY

バージョン 3.12 で追加.

typedef int (*PyCode_WatchCallback)(PyCodeEvent event, PyCodeObject *co)

Type of a code object watcher callback function.

If event is PY_CODE_EVENT_CREATE, then the callback is invoked after co has been fully initialized. Otherwise, the callback is invoked before the destruction of co takes place, so the prior state of co can be inspected.

Users of this API should not rely on internal runtime implementation details. Such details may include, but are not limited to, the exact order and timing of creation and destruction of code objects. While changes in these details may result in differences observable by watchers (including whether a callback is invoked or not), it does not change the semantics of the Python code being executed.

If the callback returns with an exception set, it must return -1; this exception will be printed as an unraisable exception using PyErr_WriteUnraisable(). Otherwise it should return 0.

バージョン 3.12 で追加.