Browse Source

interrogate: support implicit typecast operators in some cases

For example, this will let us pass a ConfigVariableFilename to anything that accepts a Filename, just like in C++.

Does not work if the return value if the typecast operator requires management.
rdb 7 years ago
parent
commit
c4b657b5b2
1 changed files with 21 additions and 0 deletions
  1. 21 0
      dtool/src/interrogate/interfaceMakerPythonNative.cxx

+ 21 - 0
dtool/src/interrogate/interfaceMakerPythonNative.cxx

@@ -1089,6 +1089,27 @@ write_class_details(ostream &out, Object *obj) {
       }
       }
     }
     }
 
 
+    // Are there any implicit cast operators that can cast this object to our
+    // desired pointer?
+    for (Function *func : obj->_methods) {
+      for (FunctionRemap *remap : func->_remaps) {
+        if (remap->_type == FunctionRemap::T_typecast_method &&
+            is_remap_legal(remap) &&
+            !remap->_return_type->return_value_needs_management() &&
+            (remap->_cppfunc->_storage_class & CPPInstance::SC_explicit) == 0 &&
+            TypeManager::is_pointer(remap->_return_type->get_new_type())) {
+
+          CPPType *cast_type = remap->_return_type->get_orig_type();
+          CPPType *obj_type = TypeManager::unwrap(TypeManager::resolve_type(remap->_return_type->get_new_type()));
+          string return_expr = "(" + cast_type->get_local_name(&parser) + ")*local_this";
+          out << "  // " << *remap->_cppfunc << "\n";
+          out << "  if (requested_type == Dtool_Ptr_" << make_safe_name(obj_type->get_local_name(&parser)) << ") {\n";
+          out << "    return (void *)(" << remap->_return_type->get_return_expr(return_expr) << ");\n";
+          out << "  }\n";
+        }
+      }
+    }
+
     out << "  return nullptr;\n";
     out << "  return nullptr;\n";
     out << "}\n\n";
     out << "}\n\n";