Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[smart_holder] Auto select return value policy for clif_automatic #4381

Merged
merged 9 commits into from
Dec 5, 2022

Conversation

wangxf123456
Copy link
Contributor

@wangxf123456 wangxf123456 commented Dec 2, 2022

Description

PyCLIF automatically chooses lifetime management of return values based on the properties of them: https://github.com/google/clif/tree/main/clif/python#pointers-references-and-object-ownership. This PR should make the return value policy selection consistent with PyCLIF.

Note that for const raw pointers, PyCLIF is also making a copy: https://github.com/google/clif/blob/main/clif/python/clif_types.py#L124. This is not mentioned in the link above.


struct nocopy {
std::string mtxt;
nocopy(const std::string &mtxt_) : mtxt(mtxt_) {}
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Don't you still need to delete the copy ctor?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for pointing this out. I forgot this. I deleted the copy ctor.

@@ -51,9 +53,13 @@ const obj &return_const_reference() {
return value;
}

std::shared_ptr<obj> return_shared_pointer() { return std::make_shared<obj>("shared_pointer"); }
std::shared_ptr<obj> return_shared_pointer() {
return std::shared_ptr<obj>(new obj("shared_pointer"));
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should be std::make_shared, right?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Initially I used std::make_shared and std::make_unqiue, but then I see errors note: ‘std::make_unique’ is only available from C++14 onwards, so I modified both of them. I should be able to use std::make_shared with C++11. I will update the PR.

#include "pybind11_tests.h"

namespace test_return_value_policy_override {

struct some_type {};

struct obj {
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

obj is usually used for instances, it's surprising as a type name.

The combinations of copyable/movable keep coming up, it would be good have some systematic naming that we could use throughout. What do you think about

struct type_cp1_mv1
struct type_cp1_mv0
struct type_cp0_mv1
struct type_cp0_mv0

?

With a comment like:

// cp = copyable, mv = movable, 1 = yes, 0 = no

Question that's maybe beyond this PR: do we have (or would it be safest) to add tests for the other two combinations?

IIUC here you have only type_cp1_mv1 and type_cp0_mv1, is that correct?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for your suggestions. I updated the PR with more tests.

@wangxf123456 wangxf123456 changed the title Auto select return value policy for clif_automatic [smart_holder] Auto select return value policy for clif_automatic Dec 5, 2022
@wangxf123456 wangxf123456 marked this pull request as ready for review December 5, 2022 22:31
@rwgk rwgk merged commit c1f14f0 into pybind:smart_holder Dec 5, 2022
@github-actions github-actions bot added the needs changelog Possibly needs a changelog entry label Dec 5, 2022
@wangxf123456 wangxf123456 deleted the apply-clif-automatic branch December 6, 2022 19:30
@henryiii henryiii removed the needs changelog Possibly needs a changelog entry label Dec 19, 2022
rwgk pushed a commit to rwgk/pybind11 that referenced this pull request Jun 11, 2024
…atic (pybind#4381)"

This reverts commit c1f14f0.

Conflicts resolved in:
    include/pybind11/detail/smart_holder_type_casters.h
    tests/test_return_value_policy_override.py
rwgk pushed a commit that referenced this pull request Jun 11, 2024
…atic (#4381)"

This reverts commit c1f14f0.

Conflicts resolved in:
    include/pybind11/detail/smart_holder_type_casters.h
    tests/test_return_value_policy_override.py
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants