Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Z
zope-container
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Boxiang Sun
zope-container
Commits
7fac324f
Commit
7fac324f
authored
Feb 15, 2013
by
Albertas Agejevas
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Replaced _zope_proxy_proxy.c with a new version.
This one comes from zope.proxy commit 2938c335, version 4.1.2dev.
parent
000a5a03
Changes
1
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
331 additions
and
173 deletions
+331
-173
src/zope/container/_zope_proxy_proxy.c
src/zope/container/_zope_proxy_proxy.c
+331
-173
No files found.
src/zope/container/_zope_proxy_proxy.c
View file @
7fac324f
...
@@ -14,7 +14,7 @@
...
@@ -14,7 +14,7 @@
/*
/*
* This file is also used as a really extensive macro in
* This file is also used as a really extensive macro in
* ../
app/
container/_zope_container_contained.c. If you need to
* ../container/_zope_container_contained.c. If you need to
* change this file, you need to "svn copy" it to ../container/.
* change this file, you need to "svn copy" it to ../container/.
*
*
* This approach is taken to allow the sources for the two packages
* This approach is taken to allow the sources for the two packages
...
@@ -28,7 +28,7 @@
...
@@ -28,7 +28,7 @@
#include "modsupport.h"
#include "modsupport.h"
#define PROXY_MODULE
#define PROXY_MODULE
#include "
zope.proxy/
proxy.h"
#include "proxy.h"
static
PyTypeObject
ProxyType
;
static
PyTypeObject
ProxyType
;
...
@@ -38,6 +38,47 @@ static PyObject *
...
@@ -38,6 +38,47 @@ static PyObject *
empty_tuple
=
NULL
;
empty_tuple
=
NULL
;
#if PY_VERSION_HEX < 0x02070000
#define PyCapsule_New(pointer, name, destr) \
PyCObject_FromVoidPtr(pointer, destr)
#endif
// Compatibility with Python 2
#if PY_MAJOR_VERSION < 3
#define IS_STRING PyString_Check
#define MAKE_STRING(name) PyString_AS_STRING(name)
#define MOD_ERROR_VAL
#define MOD_SUCCESS_VAL(val)
#define MOD_INIT(name) void init##name(void)
#define MOD_DEF(ob, name, doc, methods) \
ob = Py_InitModule3(name, methods, doc);
#else
#define IS_STRING PyUnicode_Check
#define MAKE_STRING(name) PyBytes_AS_STRING( \
PyUnicode_AsUTF8String(name))
#define MOD_ERROR_VAL NULL
#define MOD_SUCCESS_VAL(val) val
#define MOD_INIT(name) PyMODINIT_FUNC PyInit_##name(void)
#define MOD_DEF(ob, name, doc, methods) \
static struct PyModuleDef moduledef = { \
PyModuleDef_HEAD_INIT, name, doc, -1, methods, }; \
ob = PyModule_Create(&moduledef);
#endif
/*
/*
* Slot methods.
* Slot methods.
*/
*/
...
@@ -173,12 +214,16 @@ WrapperType_Lookup(PyTypeObject *type, PyObject *name)
...
@@ -173,12 +214,16 @@ WrapperType_Lookup(PyTypeObject *type, PyObject *name)
base
=
PyTuple_GET_ITEM
(
mro
,
i
);
base
=
PyTuple_GET_ITEM
(
mro
,
i
);
if
(((
PyTypeObject
*
)
base
)
!=
&
ProxyType
)
{
if
(((
PyTypeObject
*
)
base
)
!=
&
ProxyType
)
{
#if PY_MAJOR_VERSION < 3
if
(
PyClass_Check
(
base
))
if
(
PyClass_Check
(
base
))
dict
=
((
PyClassObject
*
)
base
)
->
cl_dict
;
dict
=
((
PyClassObject
*
)
base
)
->
cl_dict
;
else
{
else
#endif
{
assert
(
PyType_Check
(
base
));
assert
(
PyType_Check
(
base
));
dict
=
((
PyTypeObject
*
)
base
)
->
tp_dict
;
dict
=
((
PyTypeObject
*
)
base
)
->
tp_dict
;
}
}
assert
(
dict
&&
PyDict_Check
(
dict
));
assert
(
dict
&&
PyDict_Check
(
dict
));
res
=
PyDict_GetItem
(
dict
,
name
);
res
=
PyDict_GetItem
(
dict
,
name
);
if
(
res
!=
NULL
)
if
(
res
!=
NULL
)
...
@@ -195,13 +240,13 @@ wrap_getattro(PyObject *self, PyObject *name)
...
@@ -195,13 +240,13 @@ wrap_getattro(PyObject *self, PyObject *name)
PyObject
*
wrapped
;
PyObject
*
wrapped
;
PyObject
*
descriptor
;
PyObject
*
descriptor
;
PyObject
*
res
=
NULL
;
PyObject
*
res
=
NULL
;
char
*
name_as_string
;
c
onst
c
har
*
name_as_string
;
int
maybe_special_name
;
int
maybe_special_name
;
#if
def Py_USING_UNICODE
#if
PY_MAJOR_VERSION < 3 && defined(Py_USING_UNICODE)
/* The Unicode to string conversion is done here because the
/* The Unicode to string conversion is done here because the
existing tp_
g
etattro slots expect a string object as name
existing tp_
s
etattro slots expect a string object as name
and we wouldn't want to break those. */
(except under Python 3)
and we wouldn't want to break those. */
if
(
PyUnicode_Check
(
name
))
{
if
(
PyUnicode_Check
(
name
))
{
name
=
PyUnicode_AsEncodedString
(
name
,
NULL
,
NULL
);
name
=
PyUnicode_AsEncodedString
(
name
,
NULL
,
NULL
);
if
(
name
==
NULL
)
if
(
name
==
NULL
)
...
@@ -209,14 +254,16 @@ wrap_getattro(PyObject *self, PyObject *name)
...
@@ -209,14 +254,16 @@ wrap_getattro(PyObject *self, PyObject *name)
}
}
else
else
#endif
#endif
if
(
!
PyString_Check
(
name
)){
if
(
!
IS_STRING
(
name
)){
PyErr_SetString
(
PyExc_TypeError
,
"attribute name must be string"
);
PyErr_SetString
(
PyExc_TypeError
,
"attribute name must be string"
);
return
NULL
;
return
NULL
;
}
}
else
else
Py_INCREF
(
name
);
Py_INCREF
(
name
);
name_as_string
=
PyString_AS_STRING
(
name
);
name_as_string
=
MAKE_STRING
(
name
);
wrapped
=
Proxy_GET_OBJECT
(
self
);
wrapped
=
Proxy_GET_OBJECT
(
self
);
if
(
wrapped
==
NULL
)
{
if
(
wrapped
==
NULL
)
{
PyErr_Format
(
PyExc_RuntimeError
,
PyErr_Format
(
PyExc_RuntimeError
,
...
@@ -232,16 +279,33 @@ wrap_getattro(PyObject *self, PyObject *name)
...
@@ -232,16 +279,33 @@ wrap_getattro(PyObject *self, PyObject *name)
descriptor
=
WrapperType_Lookup
(
self
->
ob_type
,
name
);
descriptor
=
WrapperType_Lookup
(
self
->
ob_type
,
name
);
if
(
descriptor
!=
NULL
)
{
if
(
descriptor
!=
NULL
)
{
if
(
PyType_HasFeature
(
descriptor
->
ob_type
,
Py_TPFLAGS_HAVE_CLASS
)
if
(
descriptor
->
ob_type
->
tp_descr_get
!=
NULL
&&
descriptor
->
ob_type
->
tp_descr_get
!=
NULL
)
{
#if PY_MAJOR_VERSION < 3 // Always true in Python 3
&&
PyType_HasFeature
(
descriptor
->
ob_type
,
Py_TPFLAGS_HAVE_CLASS
)
#endif
){
if
(
descriptor
->
ob_type
->
tp_descr_set
==
NULL
)
{
res
=
PyObject_GetAttr
(
wrapped
,
name
);
if
(
res
!=
NULL
)
goto
finally
;
if
(
PyErr_ExceptionMatches
(
PyExc_AttributeError
))
PyErr_Clear
();
else
goto
finally
;
}
res
=
descriptor
->
ob_type
->
tp_descr_get
(
res
=
descriptor
->
ob_type
->
tp_descr_get
(
descriptor
,
descriptor
,
self
,
self
,
(
PyObject
*
)
self
->
ob_type
);
(
PyObject
*
)
self
->
ob_type
);
}
else
{
}
else
{
Py_INCREF
(
descriptor
);
Py_INCREF
(
descriptor
);
res
=
descriptor
;
res
=
descriptor
;
}
}
goto
finally
;
goto
finally
;
}
}
}
}
...
@@ -257,12 +321,14 @@ wrap_setattro(PyObject *self, PyObject *name, PyObject *value)
...
@@ -257,12 +321,14 @@ wrap_setattro(PyObject *self, PyObject *name, PyObject *value)
{
{
PyObject
*
wrapped
;
PyObject
*
wrapped
;
PyObject
*
descriptor
;
PyObject
*
descriptor
;
const
char
*
name_as_string
;
int
res
=
-
1
;
int
res
=
-
1
;
#if
def Py_USING_UNICODE
#if
PY_MAJOR_VERSION < 3 && defined(Py_USING_UNICODE)
/* The Unicode to string conversion is done here because the
/* The Unicode to string conversion is done here because the
existing tp_setattro slots expect a string object as name
existing tp_setattro slots expect a string object as name
and we wouldn't want to break those. */
(except under Python 3) and we wouldn't want to break those. */
if
(
PyUnicode_Check
(
name
))
{
if
(
PyUnicode_Check
(
name
))
{
name
=
PyUnicode_AsEncodedString
(
name
,
NULL
,
NULL
);
name
=
PyUnicode_AsEncodedString
(
name
,
NULL
,
NULL
);
if
(
name
==
NULL
)
if
(
name
==
NULL
)
...
@@ -270,7 +336,8 @@ wrap_setattro(PyObject *self, PyObject *name, PyObject *value)
...
@@ -270,7 +336,8 @@ wrap_setattro(PyObject *self, PyObject *name, PyObject *value)
}
}
else
else
#endif
#endif
if
(
!
PyString_Check
(
name
)){
if
(
!
IS_STRING
(
name
)){
PyErr_SetString
(
PyExc_TypeError
,
"attribute name must be string"
);
PyErr_SetString
(
PyExc_TypeError
,
"attribute name must be string"
);
return
-
1
;
return
-
1
;
}
}
...
@@ -278,23 +345,24 @@ wrap_setattro(PyObject *self, PyObject *name, PyObject *value)
...
@@ -278,23 +345,24 @@ wrap_setattro(PyObject *self, PyObject *name, PyObject *value)
Py_INCREF
(
name
);
Py_INCREF
(
name
);
descriptor
=
WrapperType_Lookup
(
self
->
ob_type
,
name
);
descriptor
=
WrapperType_Lookup
(
self
->
ob_type
,
name
);
if
(
descriptor
!=
NULL
)
{
if
(
PyType_HasFeature
(
descriptor
->
ob_type
,
Py_TPFLAGS_HAVE_CLASS
)
&&
if
(
descriptor
!=
NULL
descriptor
->
ob_type
->
tp_descr_set
!=
NULL
)
{
#if PY_MAJOR_VERSION < 3 // This is always true in Python 3 (I think)
&&
PyType_HasFeature
(
descriptor
->
ob_type
,
Py_TPFLAGS_HAVE_CLASS
)
#endif
&&
descriptor
->
ob_type
->
tp_descr_set
!=
NULL
)
{
res
=
descriptor
->
ob_type
->
tp_descr_set
(
descriptor
,
self
,
value
);
res
=
descriptor
->
ob_type
->
tp_descr_set
(
descriptor
,
self
,
value
);
}
else
{
PyErr_Format
(
PyExc_TypeError
,
"Tried to set attribute '%s' on wrapper, but it is not"
" a data descriptor"
,
PyString_AS_STRING
(
name
));
}
goto
finally
;
goto
finally
;
}
}
name_as_string
=
MAKE_STRING
(
name
);
wrapped
=
Proxy_GET_OBJECT
(
self
);
wrapped
=
Proxy_GET_OBJECT
(
self
);
if
(
wrapped
==
NULL
)
{
if
(
wrapped
==
NULL
)
{
PyErr_Format
(
PyExc_RuntimeError
,
PyErr_Format
(
PyExc_RuntimeError
,
"object is NULL; requested to set attribute '%s'"
,
"object is NULL; requested to set attribute '%s'"
,
PyString_AS_STRING
(
name
)
);
name_as_string
);
goto
finally
;
goto
finally
;
}
}
res
=
PyObject_SetAttr
(
wrapped
,
name
,
value
);
res
=
PyObject_SetAttr
(
wrapped
,
name
,
value
);
...
@@ -321,12 +389,13 @@ wrap_repr(PyObject *wrapper)
...
@@ -321,12 +389,13 @@ wrap_repr(PyObject *wrapper)
return
PyObject_Repr
(
Proxy_GET_OBJECT
(
wrapper
));
return
PyObject_Repr
(
Proxy_GET_OBJECT
(
wrapper
));
}
}
#if PY_MAJOR_VERSION < 3
static
int
static
int
wrap_compare
(
PyObject
*
wrapper
,
PyObject
*
v
)
wrap_compare
(
PyObject
*
wrapper
,
PyObject
*
v
)
{
{
return
PyObject_Compare
(
Proxy_GET_OBJECT
(
wrapper
),
v
);
return
PyObject_Compare
(
Proxy_GET_OBJECT
(
wrapper
),
v
);
}
}
#endif
static
long
static
long
wrap_hash
(
PyObject
*
self
)
wrap_hash
(
PyObject
*
self
)
...
@@ -344,10 +413,6 @@ wrap_call(PyObject *self, PyObject *args, PyObject *kw)
...
@@ -344,10 +413,6 @@ wrap_call(PyObject *self, PyObject *args, PyObject *kw)
return
PyObject_CallObject
(
Proxy_GET_OBJECT
(
self
),
args
);
return
PyObject_CallObject
(
Proxy_GET_OBJECT
(
self
),
args
);
}
}
/*
* Number methods
*/
/*
/*
* Number methods.
* Number methods.
*/
*/
...
@@ -364,6 +429,7 @@ call_int(PyObject *self)
...
@@ -364,6 +429,7 @@ call_int(PyObject *self)
return
nb
->
nb_int
(
self
);
return
nb
->
nb_int
(
self
);
}
}
#if PY_MAJOR_VERSION < 3 // Python 3 has no long, oct or hex methods.
static
PyObject
*
static
PyObject
*
call_long
(
PyObject
*
self
)
call_long
(
PyObject
*
self
)
{
{
...
@@ -376,18 +442,6 @@ call_long(PyObject *self)
...
@@ -376,18 +442,6 @@ call_long(PyObject *self)
return
nb
->
nb_long
(
self
);
return
nb
->
nb_long
(
self
);
}
}
static
PyObject
*
call_float
(
PyObject
*
self
)
{
PyNumberMethods
*
nb
=
self
->
ob_type
->
tp_as_number
;
if
(
nb
==
NULL
||
nb
->
nb_float
==
NULL
)
{
PyErr_SetString
(
PyExc_TypeError
,
"object can't be converted to float"
);
return
NULL
;
}
return
nb
->
nb_float
(
self
);
}
static
PyObject
*
static
PyObject
*
call_oct
(
PyObject
*
self
)
call_oct
(
PyObject
*
self
)
{
{
...
@@ -412,6 +466,32 @@ call_hex(PyObject *self)
...
@@ -412,6 +466,32 @@ call_hex(PyObject *self)
return
nb
->
nb_hex
(
self
);
return
nb
->
nb_hex
(
self
);
}
}
#endif
static
PyObject
*
call_index
(
PyObject
*
self
)
{
PyNumberMethods
*
nb
=
self
->
ob_type
->
tp_as_number
;
if
(
nb
==
NULL
||
nb
->
nb_index
==
NULL
)
{
PyErr_SetString
(
PyExc_TypeError
,
"object can't be converted to index"
);
return
NULL
;
}
return
nb
->
nb_index
(
self
);
}
static
PyObject
*
call_float
(
PyObject
*
self
)
{
PyNumberMethods
*
nb
=
self
->
ob_type
->
tp_as_number
;
if
(
nb
==
NULL
||
nb
->
nb_float
==
NULL
)
{
PyErr_SetString
(
PyExc_TypeError
,
"object can't be converted to float"
);
return
NULL
;
}
return
nb
->
nb_float
(
self
);
}
static
PyObject
*
static
PyObject
*
call_ipow
(
PyObject
*
self
,
PyObject
*
other
)
call_ipow
(
PyObject
*
self
,
PyObject
*
other
)
{
{
...
@@ -500,7 +580,9 @@ check2i(ProxyObject *self, PyObject *other,
...
@@ -500,7 +580,9 @@ check2i(ProxyObject *self, PyObject *other,
BINOP
(
add
,
PyNumber_Add
)
BINOP
(
add
,
PyNumber_Add
)
BINOP
(
sub
,
PyNumber_Subtract
)
BINOP
(
sub
,
PyNumber_Subtract
)
BINOP
(
mul
,
PyNumber_Multiply
)
BINOP
(
mul
,
PyNumber_Multiply
)
#if PY_MAJOR_VERSION < 3 // Python 3 doesn't support the old integer division
BINOP
(
div
,
PyNumber_Divide
)
BINOP
(
div
,
PyNumber_Divide
)
#endif
BINOP
(
mod
,
PyNumber_Remainder
)
BINOP
(
mod
,
PyNumber_Remainder
)
BINOP
(
divmod
,
PyNumber_Divmod
)
BINOP
(
divmod
,
PyNumber_Divmod
)
...
@@ -535,6 +617,7 @@ BINOP(and, PyNumber_And)
...
@@ -535,6 +617,7 @@ BINOP(and, PyNumber_And)
BINOP
(
xor
,
PyNumber_Xor
)
BINOP
(
xor
,
PyNumber_Xor
)
BINOP
(
or
,
PyNumber_Or
)
BINOP
(
or
,
PyNumber_Or
)
#if PY_MAJOR_VERSION < 3 // Coercion is gone in Python 3
static
int
static
int
wrap_coerce
(
PyObject
**
p_self
,
PyObject
**
p_other
)
wrap_coerce
(
PyObject
**
p_self
,
PyObject
**
p_other
)
{
{
...
@@ -573,6 +656,7 @@ wrap_coerce(PyObject **p_self, PyObject **p_other)
...
@@ -573,6 +656,7 @@ wrap_coerce(PyObject **p_self, PyObject **p_other)
*
p_other
=
right
;
*
p_other
=
right
;
return
0
;
return
0
;
}
}
#endif
UNOP
(
neg
,
PyNumber_Negative
)
UNOP
(
neg
,
PyNumber_Negative
)
UNOP
(
pos
,
PyNumber_Positive
)
UNOP
(
pos
,
PyNumber_Positive
)
...
@@ -580,15 +664,19 @@ UNOP(abs, PyNumber_Absolute)
...
@@ -580,15 +664,19 @@ UNOP(abs, PyNumber_Absolute)
UNOP
(
invert
,
PyNumber_Invert
)
UNOP
(
invert
,
PyNumber_Invert
)
UNOP
(
int
,
call_int
)
UNOP
(
int
,
call_int
)
UNOP
(
long
,
call_long
)
UNOP
(
float
,
call_float
)
UNOP
(
float
,
call_float
)
#if PY_MAJOR_VERSION < 3 // Python 3 has no long, oct or hex methods
UNOP
(
long
,
call_long
)
UNOP
(
oct
,
call_oct
)
UNOP
(
oct
,
call_oct
)
UNOP
(
hex
,
call_hex
)
UNOP
(
hex
,
call_hex
)
#endif
INPLACE
(
add
,
PyNumber_InPlaceAdd
)
INPLACE
(
add
,
PyNumber_InPlaceAdd
)
INPLACE
(
sub
,
PyNumber_InPlaceSubtract
)
INPLACE
(
sub
,
PyNumber_InPlaceSubtract
)
INPLACE
(
mul
,
PyNumber_InPlaceMultiply
)
INPLACE
(
mul
,
PyNumber_InPlaceMultiply
)
#if PY_MAJOR_VERSION < 3 // The old integer division operator is gone in Python 3
INPLACE
(
div
,
PyNumber_InPlaceDivide
)
INPLACE
(
div
,
PyNumber_InPlaceDivide
)
#endif
INPLACE
(
mod
,
PyNumber_InPlaceRemainder
)
INPLACE
(
mod
,
PyNumber_InPlaceRemainder
)
INPLACE
(
pow
,
call_ipow
)
INPLACE
(
pow
,
call_ipow
)
INPLACE
(
lshift
,
PyNumber_InPlaceLshift
)
INPLACE
(
lshift
,
PyNumber_InPlaceLshift
)
...
@@ -601,6 +689,7 @@ BINOP(floordiv, PyNumber_FloorDivide)
...
@@ -601,6 +689,7 @@ BINOP(floordiv, PyNumber_FloorDivide)
BINOP
(
truediv
,
PyNumber_TrueDivide
)
BINOP
(
truediv
,
PyNumber_TrueDivide
)
INPLACE
(
floordiv
,
PyNumber_InPlaceFloorDivide
)
INPLACE
(
floordiv
,
PyNumber_InPlaceFloorDivide
)
INPLACE
(
truediv
,
PyNumber_InPlaceTrueDivide
)
INPLACE
(
truediv
,
PyNumber_InPlaceTrueDivide
)
UNOP
(
index
,
call_index
)
static
int
static
int
wrap_nonzero
(
PyObject
*
self
)
wrap_nonzero
(
PyObject
*
self
)
...
@@ -621,13 +710,28 @@ wrap_length(PyObject *self)
...
@@ -621,13 +710,28 @@ wrap_length(PyObject *self)
static
PyObject
*
static
PyObject
*
wrap_slice
(
PyObject
*
self
,
Py_ssize_t
start
,
Py_ssize_t
end
)
wrap_slice
(
PyObject
*
self
,
Py_ssize_t
start
,
Py_ssize_t
end
)
{
{
return
PySequence_GetSlice
(
Proxy_GET_OBJECT
(
self
),
start
,
end
);
PyObject
*
obj
=
Proxy_GET_OBJECT
(
self
);
if
(
PyList_Check
(
obj
))
{
return
PyList_GetSlice
(
obj
,
start
,
end
);
}
else
if
(
PyTuple_Check
(
obj
))
{
return
PyTuple_GetSlice
(
obj
,
start
,
end
);
}
else
{
return
PySequence_GetSlice
(
obj
,
start
,
end
);
}
}
}
static
int
static
int
wrap_ass_slice
(
PyObject
*
self
,
Py_ssize_t
i
,
Py_ssize_t
j
,
PyObject
*
value
)
wrap_ass_slice
(
PyObject
*
self
,
Py_ssize_t
i
,
Py_ssize_t
j
,
PyObject
*
value
)
{
{
return
PySequence_SetSlice
(
Proxy_GET_OBJECT
(
self
),
i
,
j
,
value
);
PyObject
*
obj
=
Proxy_GET_OBJECT
(
self
);
if
(
PyList_Check
(
obj
))
{
return
PyList_SetSlice
(
obj
,
i
,
j
,
value
);
}
else
{
return
PySequence_SetSlice
(
obj
,
i
,
j
,
value
);
}
}
}
static
int
static
int
...
@@ -692,7 +796,9 @@ wrap_as_number = {
...
@@ -692,7 +796,9 @@ wrap_as_number = {
wrap_add
,
/* nb_add */
wrap_add
,
/* nb_add */
wrap_sub
,
/* nb_subtract */
wrap_sub
,
/* nb_subtract */
wrap_mul
,
/* nb_multiply */
wrap_mul
,
/* nb_multiply */
#if PY_MAJOR_VERSION < 3
wrap_div
,
/* nb_divide */
wrap_div
,
/* nb_divide */
#endif
wrap_mod
,
/* nb_remainder */
wrap_mod
,
/* nb_remainder */
wrap_divmod
,
/* nb_divmod */
wrap_divmod
,
/* nb_divmod */
wrap_pow
,
/* nb_power */
wrap_pow
,
/* nb_power */
...
@@ -706,19 +812,29 @@ wrap_as_number = {
...
@@ -706,19 +812,29 @@ wrap_as_number = {
wrap_and
,
/* nb_and */
wrap_and
,
/* nb_and */
wrap_xor
,
/* nb_xor */
wrap_xor
,
/* nb_xor */
wrap_or
,
/* nb_or */
wrap_or
,
/* nb_or */
#if PY_MAJOR_VERSION < 3
wrap_coerce
,
/* nb_coerce */
wrap_coerce
,
/* nb_coerce */
#endif
wrap_int
,
/* nb_int */
wrap_int
,
/* nb_int */
#if PY_MAJOR_VERSION < 3
wrap_long
,
/* nb_long */
wrap_long
,
/* nb_long */
#else
0
,
/* formerly known as nb_long */
#endif
wrap_float
,
/* nb_float */
wrap_float
,
/* nb_float */
#if PY_MAJOR_VERSION < 3
wrap_oct
,
/* nb_oct */
wrap_oct
,
/* nb_oct */
wrap_hex
,
/* nb_hex */
wrap_hex
,
/* nb_hex */
#endif
/* Added in release 2.0 */
/* Added in release 2.0 */
/* These require the Py_TPFLAGS_HAVE_INPLACEOPS flag */
/* These require the Py_TPFLAGS_HAVE_INPLACEOPS flag */
wrap_iadd
,
/* nb_inplace_add */
wrap_iadd
,
/* nb_inplace_add */
wrap_isub
,
/* nb_inplace_subtract */
wrap_isub
,
/* nb_inplace_subtract */
wrap_imul
,
/* nb_inplace_multiply */
wrap_imul
,
/* nb_inplace_multiply */
#if PY_MAJOR_VERSION < 3
wrap_idiv
,
/* nb_inplace_divide */
wrap_idiv
,
/* nb_inplace_divide */
#endif
wrap_imod
,
/* nb_inplace_remainder */
wrap_imod
,
/* nb_inplace_remainder */
(
ternaryfunc
)
wrap_ipow
,
/* nb_inplace_power */
(
ternaryfunc
)
wrap_ipow
,
/* nb_inplace_power */
wrap_ilshift
,
/* nb_inplace_lshift */
wrap_ilshift
,
/* nb_inplace_lshift */
...
@@ -733,6 +849,7 @@ wrap_as_number = {
...
@@ -733,6 +849,7 @@ wrap_as_number = {
wrap_truediv
,
/* nb_true_divide */
wrap_truediv
,
/* nb_true_divide */
wrap_ifloordiv
,
/* nb_inplace_floor_divide */
wrap_ifloordiv
,
/* nb_inplace_floor_divide */
wrap_itruediv
,
/* nb_inplace_true_divide */
wrap_itruediv
,
/* nb_inplace_true_divide */
wrap_index
,
/* nb_index */
};
};
static
PySequenceMethods
static
PySequenceMethods
...
@@ -770,10 +887,10 @@ wrap_methods[] = {
...
@@ -770,10 +887,10 @@ wrap_methods[] = {
* be associated with the wrapper itself.
* be associated with the wrapper itself.
*/
*/
statichere
PyTypeObject
static
PyTypeObject
ProxyType
=
{
ProxyType
=
{
PyObject_HEAD_INIT
(
NULL
)
/* PyObject_HEAD_INIT(&PyType_Type) */
PyVarObject_HEAD_INIT
(
NULL
,
0
)
0
,
"zope.proxy.ProxyBase"
,
"zope.proxy.ProxyBase"
,
sizeof
(
ProxyObject
),
sizeof
(
ProxyObject
),
0
,
0
,
...
@@ -781,7 +898,11 @@ ProxyType = {
...
@@ -781,7 +898,11 @@ ProxyType = {
wrap_print
,
/* tp_print */
wrap_print
,
/* tp_print */
0
,
/* tp_getattr */
0
,
/* tp_getattr */
0
,
/* tp_setattr */
0
,
/* tp_setattr */
#if PY_MAJOR_VERSION < 3
wrap_compare
,
/* tp_compare */
wrap_compare
,
/* tp_compare */
#else
0
,
/* tp_reserved */
#endif
wrap_repr
,
/* tp_repr */
wrap_repr
,
/* tp_repr */
&
wrap_as_number
,
/* tp_as_number */
&
wrap_as_number
,
/* tp_as_number */
&
wrap_as_sequence
,
/* tp_as_sequence */
&
wrap_as_sequence
,
/* tp_as_sequence */
...
@@ -792,8 +913,16 @@ ProxyType = {
...
@@ -792,8 +913,16 @@ ProxyType = {
wrap_getattro
,
/* tp_getattro */
wrap_getattro
,
/* tp_getattro */
wrap_setattro
,
/* tp_setattro */
wrap_setattro
,
/* tp_setattro */
0
,
/* tp_as_buffer */
0
,
/* tp_as_buffer */
Py_TPFLAGS_DEFAULT
|
Py_TPFLAGS_HAVE_GC
#if PY_MAJOR_VERSION < 3
|
Py_TPFLAGS_CHECKTYPES
|
Py_TPFLAGS_BASETYPE
,
/* tp_flags */
Py_TPFLAGS_DEFAULT
|
Py_TPFLAGS_HAVE_GC
|
Py_TPFLAGS_CHECKTYPES
|
Py_TPFLAGS_BASETYPE
,
/* tp_flags */
#else // Py_TPFLAGS_CHECKTYPES is always true in Python 3 and removed.
Py_TPFLAGS_DEFAULT
|
Py_TPFLAGS_HAVE_GC
|
Py_TPFLAGS_BASETYPE
,
/* tp_flags */
#endif
0
,
/* tp_doc */
0
,
/* tp_doc */
wrap_traverse
,
/* tp_traverse */
wrap_traverse
,
/* tp_traverse */
wrap_clear
,
/* tp_clear */
wrap_clear
,
/* tp_clear */
...
@@ -812,7 +941,7 @@ ProxyType = {
...
@@ -812,7 +941,7 @@ ProxyType = {
wrap_init
,
/* tp_init */
wrap_init
,
/* tp_init */
0
,
/* tp_alloc */
0
,
/* tp_alloc */
wrap_new
,
/* tp_new */
wrap_new
,
/* tp_new */
0
,
/*
_PyObject_GC_Del,*/
/* tp_free */
0
,
/*
PyObject_GC_Del,*/
/* tp_free */
};
};
static
PyObject
*
static
PyObject
*
...
@@ -896,6 +1025,28 @@ wrapper_getobject(PyObject *unused, PyObject *obj)
...
@@ -896,6 +1025,28 @@ wrapper_getobject(PyObject *unused, PyObject *obj)
return
obj
;
return
obj
;
}
}
static
char
setobject__doc__
[]
=
"setProxiedObject(proxy, object) --> object
\n
"
"
\n
"
"Set the underlying object for proxy, returning the old proxied object.
\n
"
"Raises TypeError if proxy is not a proxy.
\n
"
;
static
PyObject
*
wrapper_setobject
(
PyObject
*
unused
,
PyObject
*
args
)
{
PyObject
*
proxy
;
PyObject
*
object
;
PyObject
*
result
=
NULL
;
if
(
PyArg_ParseTuple
(
args
,
"O!O:setProxiedObject"
,
&
ProxyType
,
&
proxy
,
&
object
))
{
result
=
Proxy_GET_OBJECT
(
proxy
);
Py_INCREF
(
object
);
((
ProxyObject
*
)
proxy
)
->
proxy_object
=
object
;
}
return
result
;
}
static
char
static
char
isProxy__doc__
[]
=
isProxy__doc__
[]
=
"Check whether the given object is a proxy
\n
"
"Check whether the given object is a proxy
\n
"
...
@@ -1045,6 +1196,8 @@ wrapper_queryInnerProxy(PyObject *unused, PyObject *args)
...
@@ -1045,6 +1196,8 @@ wrapper_queryInnerProxy(PyObject *unused, PyObject *args)
return
result
;
return
result
;
}
}
/* Module initialization */
static
char
static
char
module___doc__
[]
=
module___doc__
[]
=
"Association between an object, a context object, and a dictionary.
\n
\
"Association between an object, a context object, and a dictionary.
\n
\
...
@@ -1057,6 +1210,7 @@ act as proxies for the original object.";
...
@@ -1057,6 +1210,7 @@ act as proxies for the original object.";
static
PyMethodDef
static
PyMethodDef
module_functions
[]
=
{
module_functions
[]
=
{
{
"getProxiedObject"
,
wrapper_getobject
,
METH_O
,
getobject__doc__
},
{
"getProxiedObject"
,
wrapper_getobject
,
METH_O
,
getobject__doc__
},
{
"setProxiedObject"
,
wrapper_setobject
,
METH_VARARGS
,
setobject__doc__
},
{
"isProxy"
,
wrapper_isProxy
,
METH_VARARGS
,
isProxy__doc__
},
{
"isProxy"
,
wrapper_isProxy
,
METH_VARARGS
,
isProxy__doc__
},
{
"sameProxiedObjects"
,
wrapper_sameProxiedObjects
,
METH_VARARGS
,
{
"sameProxiedObjects"
,
wrapper_sameProxiedObjects
,
METH_VARARGS
,
sameProxiedObjects__doc__
},
sameProxiedObjects__doc__
},
...
@@ -1068,31 +1222,35 @@ module_functions[] = {
...
@@ -1068,31 +1222,35 @@ module_functions[] = {
{
NULL
}
{
NULL
}
};
};
void
MOD_INIT
(
_zope_proxy_proxy
)
init_zope_proxy_proxy
(
void
)
{
{
PyObject
*
m
=
Py_InitModule3
(
"_zope_proxy_proxy"
,
PyObject
*
m
;
module_functions
,
module___doc__
);
MOD_DEF
(
m
,
"_zope_proxy_proxy"
,
module___doc__
,
module_functions
)
if
(
m
==
NULL
)
if
(
m
==
NULL
)
return
;
return
MOD_ERROR_VAL
;
if
(
empty_tuple
==
NULL
)
if
(
empty_tuple
==
NULL
)
empty_tuple
=
PyTuple_New
(
0
);
empty_tuple
=
PyTuple_New
(
0
);
ProxyType
.
tp_free
=
_
PyObject_GC_Del
;
ProxyType
.
tp_free
=
PyObject_GC_Del
;
if
(
PyType_Ready
(
&
ProxyType
)
<
0
)
if
(
PyType_Ready
(
&
ProxyType
)
<
0
)
return
;
return
MOD_ERROR_VAL
;
Py_INCREF
(
&
ProxyType
);
Py_INCREF
(
&
ProxyType
);
PyModule_AddObject
(
m
,
"ProxyBase"
,
(
PyObject
*
)
&
ProxyType
);
PyModule_AddObject
(
m
,
"ProxyBase"
,
(
PyObject
*
)
&
ProxyType
);
if
(
api_object
==
NULL
)
{
if
(
api_object
==
NULL
)
{
api_object
=
PyC
Object_FromVoidPtr
(
&
wrapper_capi
,
NULL
);
api_object
=
PyC
apsule_New
(
&
wrapper_capi
,
NULL
,
NULL
);
if
(
api_object
==
NULL
)
if
(
api_object
==
NULL
)
return
;
return
MOD_ERROR_VAL
;
}
}
Py_INCREF
(
api_object
);
Py_INCREF
(
api_object
);
PyModule_AddObject
(
m
,
"_CAPI"
,
api_object
);
PyModule_AddObject
(
m
,
"_CAPI"
,
api_object
);
return
MOD_SUCCESS_VAL
(
m
);
}
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment