From 869dc811b0973792f91d2fe8d0c3b983f2629aed Mon Sep 17 00:00:00 2001 From: Duy-Nguyen Ta Date: Tue, 21 Mar 2017 02:34:04 -0400 Subject: [PATCH] graceful dynamic cast failures --- wrap/Class.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/wrap/Class.cpp b/wrap/Class.cpp index 97d57616f..a2e42cb1c 100644 --- a/wrap/Class.cpp +++ b/wrap/Class.cpp @@ -798,10 +798,13 @@ void Class::pyxDynamicCast(FileWriter& pyxFile, const Class& curLevel, parentCythonClass = curLevel.parentClass->pxd_class_in_pyx(); pyxFile.oss << "def dynamic_cast_" << me << "_" << parent << "(" << parent << " parent):\n"; - pyxFile.oss << " return " << me << ".cyCreateFromShared(<" << sharedMe + pyxFile.oss << " try:\n"; + pyxFile.oss << " return " << me << ".cyCreateFromShared(<" << sharedMe << ">dynamic_pointer_cast[" << pxd_class_in_pyx() << "," << parentCythonClass << "](parent." << parentObj << "))\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" auto parent_it = find_if(allClasses.begin(), allClasses.end(), [&curLevel](const Class& cls) { @@ -850,6 +853,8 @@ void Class::emit_cython_pyx(FileWriter& pyxFile, const std::vector& allCl pyxFile.oss << " @staticmethod\n"; pyxFile.oss << " cdef " << pyxClassName() << " cyCreateFromShared(const " << 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" << " ret." << shared_pxd_obj_in_pyx() << " = other\n"; pyxInitParentObj(pyxFile, " ret", "other", allClasses);