Minor fixes and markup.

This commit is contained in:
Georg Brandl 2007-07-21 09:18:45 +00:00
parent db53aa267c
commit 96eaa539cf
1 changed files with 19 additions and 19 deletions

View File

@ -14,7 +14,7 @@ Abstract
========
Python currently relies on undefined C behavior, with its
usage of PyObject_HEAD. This PEP proposes to change that
usage of ``PyObject_HEAD``. This PEP proposes to change that
into standard C.
Rationale
@ -43,18 +43,18 @@ code has undefined behavior::
}
The problem here is that the storage is both accessed as
if it where struct PyObject, and as struct FooObject.
if it where struct ``PyObject``, and as struct ``FooObject``.
Historically, compilers did not have any problems with this
code. However, modern compilers use that clause as an
optimization opportunity, finding that f->ob_refcnt and
o->ob_refcnt cannot possibly refer to the same memory, and
optimization opportunity, finding that ``f->ob_refcnt`` and
``o->ob_refcnt`` cannot possibly refer to the same memory, and
that therefore the function should return 0, without having
to fetch the value of ob_refcnt at all in the return
statement. For GCC, Python now uses -fno-strict-aliasing
statement. For GCC, Python now uses ``-fno-strict-aliasing``
to work around that problem; with other compilers, it
may just see undefined behavior. Even with GCC, using
-fno-strict-aliasing may pessimize the generated code
``-fno-strict-aliasing`` may pessimize the generated code
unnecessarily.
Specification
@ -63,12 +63,12 @@ Specification
Standard C has one specific exception to its aliasing rules precisely
designed to support the case of Python: a value of a struct type may
also be accessed through a pointer to the first field. E.g. if a
struct starts with an int, the struct\* may also be cast to an int\*,
allowing to write int values into the first field.
struct starts with an ``int``, the ``struct *`` may also be cast to
an ``int *``, allowing to write int values into the first field.
For Python, PyObject_HEAD and PyObject_VAR_HEAD will be changed
For Python, ``PyObject_HEAD`` and ``PyObject_VAR_HEAD`` will be changed
to not list all fields anymore, but list a single field of type
PyObject/PyVarObject::
``PyObject``/``PyVarObject``::
typedef struct _object {
_PyObject_HEAD_EXTRA
@ -92,14 +92,14 @@ as its first field; variable-sized objects PyVarObject. E.g.::
PyObject *start, *stop, *step;
} PySliceObject;
typedef struct{
typedef struct {
PyVarObject ob_base;
PyObject **ob_item;
Py_ssize_t allocated;
} PyListObject;
The above definitions of PyObject_HEAD is normative, so extension
authors MAY either use the macro, or put the ob_base field explicitly
The above definitions of ``PyObject_HEAD`` are normative, so extension
authors MAY either use the macro, or put the ``ob_base`` field explicitly
into their structs.
As a convention, the base field SHOULD be called ob_base. However, all
@ -112,7 +112,7 @@ ob_type, ob_refcnt, and ob_size, macros::
#define Py_Refcnt(o) (((PyObject*)(o))->ob_refcnt)
#define Py_Size(o) (((PyVarObject*)(o))->ob_size)
are added. E.g. the code blocks::
are added. E.g. the code blocks ::
#define PyList_CheckExact(op) ((op)->ob_type == &PyList_Type)
@ -124,12 +124,12 @@ needs to be changed to::
return Py_Type(func)->tp_name;
For initialization of type objects, the current sequence::
For initialization of type objects, the current sequence ::
PyObject_HEAD_INIT(NULL)
0, /* ob_size */
becomes incorrect, and must be replaced with
becomes incorrect, and must be replaced with ::
PyVarObject_HEAD_INIT(NULL, 0)
@ -137,9 +137,9 @@ Compatibility with Python 2.6
=============================
To support modules that compile with both Python 2.6 and Python 3.0,
the Py_* macros is added to Python 2.6. The macros Py_INCREF
and Py_DECREF will be changed to cast their argument to PyObject\*,
so that module authors can also explicitly declare the ob_base
the ``Py_*`` macros are added to Python 2.6. The macros ``Py_INCREF``
and ``Py_DECREF`` will be changed to cast their argument to ``PyObject *``,
so that module authors can also explicitly declare the ``ob_base``
field in modules designed for Python 2.6.
Copyright