@@ -102,6 +102,8 @@ static int py_loader_impl_discover_func_args_count(PyObject * func);
102102
103103static int py_loader_impl_discover_func (loader_impl impl , PyObject * func , function f );
104104
105+ static void py_loader_impl_value_owner_finalize (value v , void * owner );
106+
105107static PyMethodDef py_loader_impl_function_type_invoke_defs [] =
106108{
107109 {
@@ -126,6 +128,21 @@ static struct PyModuleDef py_loader_impl_function_type_invoke_module =
126128 NULL
127129};
128130
131+ static void * py_loader_impl_value_ownership = NULL ;
132+
133+ void py_loader_impl_value_owner_finalize (value v , void * owner )
134+ {
135+ type_id id = value_type_id (v );
136+
137+ if (owner == & py_loader_impl_value_ownership )
138+ {
139+ if (id == TYPE_PTR )
140+ {
141+ Py_XDECREF (value_to_ptr (v ));
142+ }
143+ }
144+ }
145+
129146int type_py_interface_create (type t , type_impl impl )
130147{
131148 (void )t ;
@@ -498,7 +515,19 @@ value py_loader_impl_capi_to_value(loader_impl impl, PyObject * obj, type_id id)
498515 }
499516 else
500517 {
501- log_write ("metacall" , LOG_LEVEL_ERROR , "Unrecognized python type" );
518+ /* Return the value as opaque pointer */
519+ v = value_create_ptr (obj );
520+
521+ /* Set up the ownership to python loader */
522+ value_own (v , & py_loader_impl_value_ownership );
523+
524+ /* Create reference to the value so it does not get garbage collected */
525+ Py_INCREF (obj );
526+
527+ /* Set up finalizer in order to free the value */
528+ value_finalizer (v , & py_loader_impl_value_owner_finalize );
529+
530+ log_write ("metacall" , LOG_LEVEL_WARNING , "Unrecognized python type" );
502531 }
503532
504533 return v ;
@@ -598,13 +627,21 @@ PyObject * py_loader_impl_value_to_capi(loader_impl impl, loader_impl_py py_impl
598627 {
599628 void * ptr = value_to_ptr (v );
600629
601- #if PY_MAJOR_VERSION == 2
630+ if (value_owner (v ) == & py_loader_impl_value_ownership )
631+ {
632+ return ptr ;
633+ }
634+ else
635+ {
636+ #if PY_MAJOR_VERSION == 2
602637
603- /* TODO */
638+ /* TODO */
639+
640+ #elif PY_MAJOR_VERSION == 3
641+ return PyCapsule_New (ptr , NULL , NULL );
642+ #endif
643+ }
604644
605- #elif PY_MAJOR_VERSION == 3
606- return PyCapsule_New (ptr , NULL , NULL );
607- #endif
608645 }
609646 else if (id == TYPE_FUNCTION )
610647 {
0 commit comments