@@ -565,13 +565,32 @@ Cppyy::TCppScope_t Cppyy::GetUnderlyingScope(TCppScope_t scope)
565565Cppyy::TCppScope_t Cppyy::GetScope (const std::string& name,
566566 TCppScope_t parent_scope)
567567{
568- # ifndef NDEBUG
569- if (name. find ( " :: " ) != std::string::npos)
570- throw std::runtime_error ( " Calling Cppyy::GetScope with qualified name ' "
571- + name + " ' \n " );
572- # endif // NDEBUG
568+ if (Cppyy::TCppScope_t scope = Cpp::GetScope (name, parent_scope))
569+ return scope;
570+ if (!parent_scope || parent_scope == Cpp::GetGlobalScope ())
571+ if (Cppyy::TCppScope_t scope = Cpp::GetScopeFromCompleteName ( name))
572+ return scope;
573573
574- return Cpp::GetScope (name, parent_scope);
574+ // FIXME: avoid string parsing here
575+ if (name.find (' <' ) != std::string::npos) {
576+ // Templated Type; May need instantiation
577+ size_t start = name.find (' <' );
578+ size_t end = name.rfind (' >' );
579+ std::string params = name.substr (start + 1 , end - start - 1 );
580+
581+ std::string pure_name = name.substr (0 , start);
582+ Cppyy::TCppScope_t scope = Cpp::GetScope (pure_name, parent_scope);
583+ if (!scope && (!parent_scope || parent_scope == Cpp::GetGlobalScope ()))
584+ scope = Cpp::GetScopeFromCompleteName (pure_name);
585+
586+ if (Cppyy::IsTemplate (scope)) {
587+ std::vector<Cpp::TemplateArgInfo> templ_params;
588+ if (!Cppyy::AppendTypesSlow (params, templ_params))
589+ return Cpp::InstantiateTemplate (scope, templ_params.data (),
590+ templ_params.size ());
591+ }
592+ }
593+ return nullptr ;
575594}
576595
577596Cppyy::TCppScope_t Cppyy::GetFullScope (const std::string& name)
0 commit comments