Ho appena scritto questo codice che utilizza un'istruzione goto.
if (PyMethod_Check(attrib_value)) {
PyObject *im_self = PyObject_GetAttrString(attrib_value, "im_self");
if (im_self == Py_None) {
js_value = FunctionTemplate::New(isolate, py_class_method_callback, js_name, signature);
} else {
goto method_counts_as_function;
}
Py_DECREF(im_self);
} else if (PyFunction_Check(attrib_value)) {
method_counts_as_function:
js_value = ((py_function *) py_function_to_template(attrib_value))->js_template->Get(isolate);
templ->Set(js_name, js_value);
} else {
js_value = js_from_py(attrib_value, no_ctx);
templ->Set(js_name, js_value);
}
L'intenzione è di trattare determinati metodi come le funzioni. Normalmente userei un &&
nell'istruzione if, qualcosa come questo:
if (PyMethod_Check(attrib_value) &&
PyObject_GetAttrString(attrib_value, "im_self) != Py_None)
Sfortunatamente, PyObject_GetAttrString
restituisce un oggetto con un conteggio di riferimento incrementato. Non riesco a decrementare il conteggio dei riferimenti su un valore che potrebbe o meno essere esistito nella seconda parte del cortocircuito e.
Mi sento piuttosto male perché le dichiarazioni goto sono considerate dannose, ma non riesco a pensare a un buon modo per riscrivere questo senza gotos. Va bene?