diff --git a/Ghidra/Features/Decompiler/src/decompile/cpp/sleigh_arch.cc b/Ghidra/Features/Decompiler/src/decompile/cpp/sleigh_arch.cc index bc6cf65ddd..cb0848a4de 100644 --- a/Ghidra/Features/Decompiler/src/decompile/cpp/sleigh_arch.cc +++ b/Ghidra/Features/Decompiler/src/decompile/cpp/sleigh_arch.cc @@ -33,7 +33,7 @@ ElementId ELEM_DESCRIPTION = ElementId("description",233); ElementId ELEM_LANGUAGE = ElementId("language",234); ElementId ELEM_LANGUAGE_DEFINITIONS = ElementId("language_definitions",235); -map SleighArchitecture::translators; +map SleighArchitecture::translators; vector SleighArchitecture::description; FileManage SleighArchitecture::specpaths; // Global specfile manager @@ -174,17 +174,16 @@ bool SleighArchitecture::isTranslateReused(void) Translate *SleighArchitecture::buildTranslator(DocumentStorage &store) { // Build a sleigh translator - map::const_iterator iter; - Sleigh *sleigh; + map::iterator iter; + iter = translators.find(languageindex); if (iter != translators.end()) { - sleigh = (*iter).second; - sleigh->reset(loader,context); - return sleigh; + iter->second.reset(loader, context); + return &iter->second; } - sleigh = new Sleigh(loader,context); - translators[languageindex] = sleigh; - return sleigh; + pair::iterator,bool> res; + res = translators.emplace(piecewise_construct,forward_as_tuple(languageindex),forward_as_tuple(loader,context)); + return &(*res.first).second; } PcodeInjectLibrary *SleighArchitecture::buildPcodeInjectLibrary(void) @@ -627,10 +626,6 @@ const vector &SleighArchitecture::getDescriptions(void) void SleighArchitecture::shutdown(void) { - if (translators.empty()) return; // Already cleared - for(map::const_iterator iter=translators.begin();iter!=translators.end();++iter) - delete (*iter).second; - translators.clear(); // description.clear(); // static vector is destroyed by the normal exit handler } diff --git a/Ghidra/Features/Decompiler/src/decompile/cpp/sleigh_arch.hh b/Ghidra/Features/Decompiler/src/decompile/cpp/sleigh_arch.hh index a0f20d934f..3ee506bfa6 100644 --- a/Ghidra/Features/Decompiler/src/decompile/cpp/sleigh_arch.hh +++ b/Ghidra/Features/Decompiler/src/decompile/cpp/sleigh_arch.hh @@ -4,9 +4,9 @@ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at - * + * * http://www.apache.org/licenses/LICENSE-2.0 - * + * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. @@ -106,7 +106,7 @@ public: /// Generally a \e language \e id (i.e. x86:LE:64:default) is provided, then this /// object is able to automatically load in configuration and construct the Translate object. class SleighArchitecture : public Architecture { - static map translators; ///< Map from language index to instantiated translators + static map translators; ///< Map from language index to instantiated translators static vector description; ///< List of languages we know about int4 languageindex; ///< Index (within LanguageDescription array) of the active language string filename; ///< Name of active load-image file