graceful dynamic cast failures
parent
b8d3292da3
commit
869dc811b0
|
@ -798,10 +798,13 @@ void Class::pyxDynamicCast(FileWriter& pyxFile, const Class& curLevel,
|
||||||
parentCythonClass = curLevel.parentClass->pxd_class_in_pyx();
|
parentCythonClass = curLevel.parentClass->pxd_class_in_pyx();
|
||||||
pyxFile.oss << "def dynamic_cast_" << me << "_" << parent << "(" << parent
|
pyxFile.oss << "def dynamic_cast_" << me << "_" << parent << "(" << parent
|
||||||
<< " parent):\n";
|
<< " parent):\n";
|
||||||
|
pyxFile.oss << " try:\n";
|
||||||
pyxFile.oss << " return " << me << ".cyCreateFromShared(<" << sharedMe
|
pyxFile.oss << " return " << me << ".cyCreateFromShared(<" << sharedMe
|
||||||
<< ">dynamic_pointer_cast[" << pxd_class_in_pyx() << ","
|
<< ">dynamic_pointer_cast[" << pxd_class_in_pyx() << ","
|
||||||
<< parentCythonClass << "](parent." << parentObj
|
<< parentCythonClass << "](parent." << parentObj
|
||||||
<< "))\n";
|
<< "))\n";
|
||||||
|
pyxFile.oss << " except:\n";
|
||||||
|
pyxFile.oss << " raise TypeError('dynamic cast failed!')\n";
|
||||||
// Move up higher to one level: Find the parent class with name "parentClass"
|
// Move up higher to one level: Find the parent class with name "parentClass"
|
||||||
auto parent_it = find_if(allClasses.begin(), allClasses.end(),
|
auto parent_it = find_if(allClasses.begin(), allClasses.end(),
|
||||||
[&curLevel](const Class& cls) {
|
[&curLevel](const Class& cls) {
|
||||||
|
@ -850,6 +853,8 @@ void Class::emit_cython_pyx(FileWriter& pyxFile, const std::vector<Class>& allCl
|
||||||
pyxFile.oss << " @staticmethod\n";
|
pyxFile.oss << " @staticmethod\n";
|
||||||
pyxFile.oss << " cdef " << pyxClassName() << " cyCreateFromShared(const "
|
pyxFile.oss << " cdef " << pyxClassName() << " cyCreateFromShared(const "
|
||||||
<< shared_pxd_class_in_pyx() << "& other):\n"
|
<< shared_pxd_class_in_pyx() << "& other):\n"
|
||||||
|
<< " if other.get() == NULL:\n"
|
||||||
|
<< " raise RuntimeError('Cannot create object from a nullptr!')\n"
|
||||||
<< " cdef " << pyxClassName() << " ret = " << pyxClassName() << "(cyCreateFromShared=True)\n"
|
<< " cdef " << pyxClassName() << " ret = " << pyxClassName() << "(cyCreateFromShared=True)\n"
|
||||||
<< " ret." << shared_pxd_obj_in_pyx() << " = other\n";
|
<< " ret." << shared_pxd_obj_in_pyx() << " = other\n";
|
||||||
pyxInitParentObj(pyxFile, " ret", "other", allClasses);
|
pyxInitParentObj(pyxFile, " ret", "other", allClasses);
|
||||||
|
|
Loading…
Reference in New Issue