python: Teach PyBindMethod how to set return_value_policy.

Change-Id: Ia208e43672672556b36f905e8f71dce44b978d22
Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/17033
Reviewed-by: Andreas Sandberg <andreas.sandberg@arm.com>
Maintainer: Andreas Sandberg <andreas.sandberg@arm.com>
diff --git a/src/python/m5/util/pybind.py b/src/python/m5/util/pybind.py
index 4b5e03d..4664c16 100644
--- a/src/python/m5/util/pybind.py
+++ b/src/python/m5/util/pybind.py
@@ -58,10 +58,12 @@
         code('.${export}("${{self.name}}", &${cname}::${{self.cxx_name}})')
 
 class PyBindMethod(PyBindExport):
-    def __init__(self, name, cxx_name=None, args=None):
+    def __init__(self, name, cxx_name=None, args=None,
+                 return_value_policy=None):
         self.name = name
         self.cxx_name = cxx_name if cxx_name else name
         self.args = args
+        self.return_value_policy = return_value_policy
 
     def _conv_arg(self, value):
         if isinstance(value, bool):
@@ -72,6 +74,10 @@
             raise TypeError("Unsupported PyBind default value type")
 
     def export(self, code, cname):
+        arguments = [ '"${{self.name}}"', '&${cname}::${{self.cxx_name}}' ]
+        if self.return_value_policy:
+            arguments.append('pybind11::return_value_policy::'
+                             '${{self.return_value_policy}}')
         if self.args:
             def get_arg_decl(arg):
                 if isinstance(arg, tuple):
@@ -81,8 +87,5 @@
                 else:
                     return 'py::arg("%s")' % arg
 
-            code('.def("${{self.name}}", &${cname}::${{self.name}}, ')
-            code('    ' + \
-                 ', '.join([ get_arg_decl(a) for a in self.args ]) + ')')
-        else:
-            code('.def("${{self.name}}", &${cname}::${{self.cxx_name}})')
+            arguments.extend(list([ get_arg_decl(a) for a in self.args ]))
+        code('.def(' + ', '.join(arguments) + ')')