Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
gaoqiong
pybind11
Commits
146695a9
Unverified
Commit
146695a9
authored
Mar 25, 2022
by
Aaron Gokaslan
Committed by
GitHub
Mar 25, 2022
Browse files
fix: better exception and error handling for capsules (#3825)
* Make capsule errors better match python
parent
47079b9e
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
21 additions
and
14 deletions
+21
-14
include/pybind11/numpy.h
include/pybind11/numpy.h
+2
-1
include/pybind11/pytypes.h
include/pybind11/pytypes.h
+19
-13
No files found.
include/pybind11/numpy.h
View file @
146695a9
...
...
@@ -1288,7 +1288,8 @@ public:
static
pybind11
::
dtype
dtype
()
{
list
shape
;
array_info
<
T
>::
append_extents
(
shape
);
return
pybind11
::
dtype
::
from_args
(
pybind11
::
make_tuple
(
base_descr
::
dtype
(),
shape
));
return
pybind11
::
dtype
::
from_args
(
pybind11
::
make_tuple
(
base_descr
::
dtype
(),
std
::
move
(
shape
)));
}
};
...
...
include/pybind11/pytypes.h
View file @
146695a9
...
...
@@ -1574,7 +1574,7 @@ public:
void
(
*
destructor
)(
PyObject
*
)
=
nullptr
)
:
object
(
PyCapsule_New
(
const_cast
<
void
*>
(
value
),
name
,
destructor
),
stolen_t
{})
{
if
(
!
m_ptr
)
{
pybind11_fail
(
"Could not allocate capsule object!"
);
throw
error_already_set
(
);
}
}
...
...
@@ -1582,34 +1582,42 @@ public:
capsule
(
const
void
*
value
,
void
(
*
destruct
)(
PyObject
*
))
:
object
(
PyCapsule_New
(
const_cast
<
void
*>
(
value
),
nullptr
,
destruct
),
stolen_t
{})
{
if
(
!
m_ptr
)
{
pybind11_fail
(
"Could not allocate capsule object!"
);
throw
error_already_set
(
);
}
}
capsule
(
const
void
*
value
,
void
(
*
destructor
)(
void
*
))
{
m_ptr
=
PyCapsule_New
(
const_cast
<
void
*>
(
value
),
nullptr
,
[](
PyObject
*
o
)
{
auto
destructor
=
reinterpret_cast
<
void
(
*
)(
void
*
)
>
(
PyCapsule_GetContext
(
o
));
if
(
destructor
==
nullptr
)
{
if
(
PyErr_Occurred
())
{
throw
error_already_set
();
}
pybind11_fail
(
"Unable to get capsule context"
);
}
void
*
ptr
=
PyCapsule_GetPointer
(
o
,
nullptr
);
if
(
ptr
==
nullptr
)
{
throw
error_already_set
();
}
destructor
(
ptr
);
});
if
(
!
m_ptr
)
{
pybind11_fail
(
"Could not allocate capsule object!"
);
}
if
(
PyCapsule_SetContext
(
m_ptr
,
(
void
*
)
destructor
)
!=
0
)
{
pybind11_fail
(
"Could not set capsule context!"
);
if
(
!
m_ptr
||
PyCapsule_SetContext
(
m_ptr
,
(
void
*
)
destructor
)
!=
0
)
{
throw
error_already_set
();
}
}
explicit
capsule
(
void
(
*
destructor
)())
{
m_ptr
=
PyCapsule_New
(
reinterpret_cast
<
void
*>
(
destructor
),
nullptr
,
[](
PyObject
*
o
)
{
auto
destructor
=
reinterpret_cast
<
void
(
*
)()
>
(
PyCapsule_GetPointer
(
o
,
nullptr
));
if
(
destructor
==
nullptr
)
{
throw
error_already_set
();
}
destructor
();
});
if
(
!
m_ptr
)
{
pybind11_fail
(
"Could not allocate capsule object!"
);
throw
error_already_set
(
);
}
}
...
...
@@ -1624,8 +1632,7 @@ public:
const
auto
*
name
=
this
->
name
();
T
*
result
=
static_cast
<
T
*>
(
PyCapsule_GetPointer
(
m_ptr
,
name
));
if
(
!
result
)
{
PyErr_Clear
();
pybind11_fail
(
"Unable to extract capsule contents!"
);
throw
error_already_set
();
}
return
result
;
}
...
...
@@ -1633,8 +1640,7 @@ public:
/// Replaces a capsule's pointer *without* calling the destructor on the existing one.
void
set_pointer
(
const
void
*
value
)
{
if
(
PyCapsule_SetPointer
(
m_ptr
,
const_cast
<
void
*>
(
value
))
!=
0
)
{
PyErr_Clear
();
pybind11_fail
(
"Could not set capsule pointer"
);
throw
error_already_set
();
}
}
...
...
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