@@ -59,11 +59,11 @@ static PyObject* _allocate_grad_output(output_info_type& info, AutoGPU& gpu_guar
5959 gpu_guard.setDevice (std::get<1 >(info));
6060 std::vector<long > &sizes = std::get<2 >(info);
6161
62- THPObjectPtr grad_size = THPSize_New (sizes.size (), sizes.data ());
62+ THPObjectPtr grad_size ( THPSize_New (sizes.size (), sizes.data () ));
6363 if (!grad_size) throw python_error ();
64- THPObjectPtr new_grad = PyObject_CallFunctionObjArgs (tensor_cls, grad_size.get (), NULL );
64+ THPObjectPtr new_grad ( PyObject_CallFunctionObjArgs (tensor_cls, grad_size.get (), NULL ) );
6565 if (!new_grad) throw python_error ();
66- THPObjectPtr result = PyObject_CallMethod (new_grad.get (), " zero_" , " " );
66+ THPObjectPtr result ( PyObject_CallMethod (new_grad.get (), " zero_" , " " ) );
6767 if (!result) throw python_error ();
6868 return new_grad.release ();
6969}
@@ -73,7 +73,7 @@ namespace torch { namespace autograd {
7373auto PyFunction::legacy_apply (const variable_list& inputs) -> variable_list {
7474 AutoGIL gil;
7575
76- THPObjectPtr pyInputs = PyTuple_New (inputs.size ());
76+ THPObjectPtr pyInputs ( PyTuple_New (inputs.size () ));
7777 if (!pyInputs) throw python_error ();
7878
7979 for (size_t i = 0 ; i != inputs.size (); ++i) {
@@ -88,8 +88,8 @@ auto PyFunction::legacy_apply(const variable_list& inputs) -> variable_list {
8888 PyTuple_SET_ITEM (pyInputs.get (), i, input);
8989 }
9090
91- THPObjectPtr r = PyObject_CallMethod (
92- obj, " _do_backward" , " OO" , pyInputs.get (), Py_True);
91+ THPObjectPtr r ( PyObject_CallMethod (
92+ obj, " _do_backward" , " OO" , pyInputs.get (), Py_True)) ;
9393 if (!r) throw python_error ();
9494
9595 auto num_outputs = PyTuple_GET_SIZE (r.get ());
@@ -126,32 +126,32 @@ auto PyFunction::apply(const variable_list& inputs) -> variable_list {
126126 AutoGPU _gpu_guard (-1 );
127127 THPFunction* py_fn = (THPFunction*)obj;
128128
129- THPObjectPtr _legacy = PyObject_GetAttrString (obj, " _is_legacy" );
129+ THPObjectPtr _legacy ( PyObject_GetAttrString (obj, " _is_legacy" ) );
130130 if (_legacy == Py_True) {
131131 return legacy_apply (inputs);
132132 }
133133
134134 // Massage a C++ variable_list into a Python arguments tuple
135135 auto num_inputs = inputs.size ();
136- THPObjectPtr pyInputs = PyTuple_New (num_inputs);
136+ THPObjectPtr pyInputs ( PyTuple_New (num_inputs) );
137137 if (!pyInputs) throw python_error ();
138138 auto & output_info = *py_fn->output_info ;
139139 for (size_t i = 0 ; i < num_inputs; ++i) {
140140 PyObject* input;
141141 if (inputs[i]) {
142142 input = THPVariable_Wrap (inputs[i]);
143143 } else {
144- THPObjectPtr tensor = _allocate_grad_output (output_info[i], _gpu_guard);
144+ THPObjectPtr tensor ( _allocate_grad_output (output_info[i], _gpu_guard) );
145145 input = THPVariable_NewLeaf (tensor);
146146 }
147147 if (!input) throw python_error ();
148148 PyTuple_SET_ITEM (pyInputs.get (), i, input);
149149 }
150150
151151 // TODO: theoretically we could take a shortcut here and call apply directly
152- THPObjectPtr apply_fn = PyObject_GetAttrString (obj, " apply" );
152+ THPObjectPtr apply_fn ( PyObject_GetAttrString (obj, " apply" ) );
153153 if (!apply_fn) throw python_error ();
154- THPObjectPtr r = PyObject_CallObject (apply_fn, pyInputs.get ());
154+ THPObjectPtr r ( PyObject_CallObject (apply_fn, pyInputs.get () ));
155155 if (!r) throw python_error ();
156156 _ensure_tuple (r);
157157
@@ -625,12 +625,12 @@ std::pair<UnpackedInput, InputFlags> unpack_input(PyObject *args) {
625625 return std::make_pair (std::move (unpacked), std::move (flags));
626626}
627627
628- PyObject* process_outputs (THPFunction* grad_fn, const UnpackedInput& unpacked, THPObjectPtr raw_output, bool is_volatile) {
628+ PyObject* process_outputs (THPFunction* grad_fn, const UnpackedInput& unpacked, THPObjectPtr&& raw_output, bool is_volatile) {
629629 bool unpack_output = _ensure_tuple (raw_output);
630630
631631 auto num_outputs = PyTuple_GET_SIZE (raw_output.get ());
632632
633- THPObjectPtr outputs = PyTuple_New (num_outputs);
633+ THPObjectPtr outputs ( PyTuple_New (num_outputs) );
634634 if (!outputs) throw python_error ();
635635
636636 grad_fn->cdata .num_inputs = num_outputs;
@@ -678,9 +678,9 @@ PyObject *THPFunction_do_forward(THPFunction *self, PyObject *_inputs)
678678 self->needs_input_grad = input_info.needs_input_grad .release ();
679679
680680 // Now we're ready to call a forward (implemented in Python)
681- THPObjectPtr forward_fn = PyObject_GetAttrString ((PyObject*)self, " forward" );
681+ THPObjectPtr forward_fn ( PyObject_GetAttrString ((PyObject*)self, " forward" ) );
682682 if (!forward_fn) return NULL ;
683- THPObjectPtr raw_output = PyObject_CallObject (forward_fn, unpacked_input.tensor_input );
683+ THPObjectPtr raw_output ( PyObject_CallObject (forward_fn, unpacked_input.tensor_input ) );
684684 if (!raw_output) return NULL ;
685685
686686 return process_outputs (self, unpacked_input, std::move (raw_output), is_volatile);
@@ -691,9 +691,9 @@ PyObject *THPFunction_apply(PyObject *cls, PyObject *_inputs)
691691{
692692 HANDLE_TH_ERRORS
693693
694- THPObjectPtr backward_cls = PyObject_GetAttrString (cls, " _backward_cls" );
694+ THPObjectPtr backward_cls ( PyObject_GetAttrString (cls, " _backward_cls" ) );
695695 if (!backward_cls) return NULL ;
696- THPObjectPtr ctx_obj = PyObject_CallFunctionObjArgs (backward_cls, NULL );
696+ THPObjectPtr ctx_obj ( PyObject_CallFunctionObjArgs (backward_cls, NULL ) );
697697 if (!ctx_obj) return NULL ;
698698 THPFunction* ctx = (THPFunction*)ctx_obj.get ();
699699
@@ -708,7 +708,7 @@ PyObject *THPFunction_apply(PyObject *cls, PyObject *_inputs)
708708
709709 // Prepend ctx to tensor_input, in preparation for static method call
710710 auto num_args = PyTuple_GET_SIZE (_inputs);
711- THPObjectPtr ctx_tensor_input = PyTuple_New (num_args + 1 );
711+ THPObjectPtr ctx_tensor_input ( PyTuple_New (num_args + 1 ) );
712712 PyTuple_SET_ITEM (ctx_tensor_input.get (), 0 , ctx_obj.release ());
713713 for (int i = 0 ; i < num_args; ++i) {
714714 PyObject *arg = PyTuple_GET_ITEM (unpacked_input.tensor_input .get (), i);
@@ -717,9 +717,9 @@ PyObject *THPFunction_apply(PyObject *cls, PyObject *_inputs)
717717 }
718718
719719 // Call forward
720- THPObjectPtr forward_fn = PyObject_GetAttrString (cls, " forward" );
720+ THPObjectPtr forward_fn ( PyObject_GetAttrString (cls, " forward" ) );
721721 if (!forward_fn) return NULL ;
722- THPObjectPtr tensor_outputs = PyObject_CallObject (forward_fn, ctx_tensor_input);
722+ THPObjectPtr tensor_outputs ( PyObject_CallObject (forward_fn, ctx_tensor_input) );
723723 if (!tensor_outputs) return NULL ;
724724
725725 return process_outputs (ctx, unpacked_input, std::move (tensor_outputs), is_volatile);
@@ -800,14 +800,14 @@ PyObject * THPFunction_do_backward(THPFunction *self, PyObject *args)
800800 // Some of the output might have been unused, so we have to allocate
801801 // zero-filled buffers instead
802802 Py_INCREF (raw_grad_output);
803- THPObjectPtr grad_output = raw_grad_output;
803+ THPObjectPtr grad_output ( raw_grad_output) ;
804804 _prepare_grad_output (self, grad_output);
805805
806806 // self.backward(*grad_output)
807- THPObjectPtr backward_fn = PyObject_GetAttrString ((PyObject*)self, " backward" );
807+ THPObjectPtr backward_fn ( PyObject_GetAttrString ((PyObject*)self, " backward" ) );
808808 THPUtils_assert (backward_fn.get (), " function %s doesn't implement a required "
809809 " 'backward' method" , THPUtils_typename ((PyObject*)self));
810- THPObjectPtr grad_input = PyObject_CallObject (backward_fn, grad_output.get ());
810+ THPObjectPtr grad_input ( PyObject_CallObject (backward_fn, grad_output.get () ));
811811 if (!grad_input) return NULL ;
812812 _ensure_tuple (grad_input);
813813
@@ -854,7 +854,7 @@ PyObject *THPFunction_saved_tensors(THPFunction *self, void *_unused)
854854 return PyTuple_New (0 );
855855
856856 int num_saved = self->saved_variables ->size ();
857- THPObjectPtr saved_tensors = PyTuple_New (num_saved);
857+ THPObjectPtr saved_tensors ( PyTuple_New (num_saved) );
858858 if (!saved_tensors)
859859 return NULL ;
860860 auto & saved_variables = *self->saved_variables ;
@@ -879,7 +879,7 @@ PyObject *THPFunction_saved_variables(THPFunction *self, void *_unused)
879879 return PyTuple_New (0 );
880880
881881 int num_saved = self->saved_variables ->size ();
882- THPObjectPtr py_saved_variables = PyTuple_New (num_saved);
882+ THPObjectPtr py_saved_variables ( PyTuple_New (num_saved) );
883883 if (!py_saved_variables) return NULL ;
884884 auto & saved_variables = *self->saved_variables ;
885885 for (int i = 0 ; i < num_saved; i++) {
@@ -901,11 +901,11 @@ PyObject *THPFunction_next_functions(THPFunction *self, void *_unused)
901901{
902902 auto & next_fns = self->cdata .next_functions ;
903903 int size = next_fns.size ();
904- THPObjectPtr result = PyTuple_New (size);
904+ THPObjectPtr result ( PyTuple_New (size) );
905905 if (!result)
906906 return NULL ;
907907 for (int i = 0 ; i < size; i++) {
908- THPObjectPtr fn_tuple = PyTuple_New (2 );
908+ THPObjectPtr fn_tuple ( PyTuple_New (2 ) );
909909 if (!fn_tuple) return NULL ;
910910 PyObject* fn = functionToPyObject (next_fns[i].first );
911911 if (!fn) return NULL ;
0 commit comments