interrogate: fix crash when calling functions returning TypedWritable

This commit is contained in:
rdb 2017-11-08 00:04:00 +01:00
parent 1b1d80cd27
commit b8bf8bd641

View File

@ -745,11 +745,31 @@ write_python_instance(ostream &out, int indent_level, const string &return_expr,
<< " return Py_None;\n";
indent(out, indent_level)
<< "} else {\n";
indent(out, indent_level)
<< " return DTool_CreatePyInstanceTyped((void *)" << return_expr
<< ", *Dtool_Ptr_" << make_safe_name(class_name) << ", "
<< owns_memory << ", " << is_const << ", "
<< return_expr << "->as_typed_object()->get_type_index());\n";
// Special exception if we are returning TypedWritable, which might
// actually be a derived class that inherits from ReferenceCount.
if (!owns_memory && !is_const && class_name == "TypedWritable") {
indent(out, indent_level)
<< " ReferenceCount *rc = " << return_expr << "->as_reference_count();\n";
indent(out, indent_level)
<< " bool is_refcount = (rc != (ReferenceCount *)NULL);\n";
indent(out, indent_level)
<< " if (is_refcount) {\n";
indent(out, indent_level)
<< " rc->ref();\n";
indent(out, indent_level)
<< " }\n";
indent(out, indent_level)
<< " return DTool_CreatePyInstanceTyped((void *)" << return_expr
<< ", *Dtool_Ptr_" << make_safe_name(class_name) << ", is_refcount, "
<< is_const << ", " << return_expr
<< "->get_type_index());\n";
} else {
indent(out, indent_level)
<< " return DTool_CreatePyInstanceTyped((void *)" << return_expr
<< ", *Dtool_Ptr_" << make_safe_name(class_name) << ", "
<< owns_memory << ", " << is_const << ", "
<< return_expr << "->as_typed_object()->get_type_index());\n";
}
indent(out, indent_level)
<< "}\n";
} else {