patterns: Refactor creation of default runtime
This commit is contained in:
parent
42f5c0f484
commit
66d64cf020
2
lib/external/pattern_language
vendored
2
lib/external/pattern_language
vendored
@ -1 +1 @@
|
|||||||
Subproject commit 6c4d5d3a6c5618e841d425471e1359efda4de8d3
|
Subproject commit 24456df3284af42b5589099d67f56648a8a50092
|
@ -136,7 +136,7 @@ namespace hex {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
std::unique_ptr<pl::PatternLanguage> createDefaultRuntime(prv::Provider *provider);
|
void configureRuntime(pl::PatternLanguage &runtime, prv::Provider *provider);
|
||||||
|
|
||||||
void addPragma(const std::string &name, const pl::api::PragmaHandler &handler);
|
void addPragma(const std::string &name, const pl::api::PragmaHandler &handler);
|
||||||
|
|
||||||
|
@ -241,29 +241,30 @@ namespace hex {
|
|||||||
return functionName;
|
return functionName;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::unique_ptr<pl::PatternLanguage> createDefaultRuntime(prv::Provider *provider) {
|
void configureRuntime(pl::PatternLanguage &runtime, prv::Provider *provider) {
|
||||||
auto runtime = std::make_unique<pl::PatternLanguage>();
|
runtime.reset();
|
||||||
|
|
||||||
if (provider != nullptr) {
|
if (provider != nullptr) {
|
||||||
runtime->setDataSource([provider](u64 offset, u8 *buffer, size_t size) {
|
runtime.setDataSource([provider](u64 offset, u8 *buffer, size_t size) {
|
||||||
provider->read(offset, buffer, size);
|
provider->read(offset, buffer, size);
|
||||||
}, provider->getBaseAddress(), provider->getActualSize());
|
}, provider->getBaseAddress(), provider->getActualSize());
|
||||||
}
|
}
|
||||||
|
|
||||||
runtime->setIncludePaths(fs::getDefaultPaths(fs::ImHexPath::PatternsInclude) | fs::getDefaultPaths(fs::ImHexPath::Patterns));
|
runtime.setIncludePaths(fs::getDefaultPaths(fs::ImHexPath::PatternsInclude) | fs::getDefaultPaths(fs::ImHexPath::Patterns));
|
||||||
|
|
||||||
for (const auto &func : getFunctions()) {
|
for (const auto &func : getFunctions()) {
|
||||||
if (func.dangerous)
|
if (func.dangerous)
|
||||||
runtime->addDangerousFunction(func.ns, func.name, func.parameterCount, func.callback);
|
runtime.addDangerousFunction(func.ns, func.name, func.parameterCount, func.callback);
|
||||||
else
|
else
|
||||||
runtime->addFunction(func.ns, func.name, func.parameterCount, func.callback);
|
runtime.addFunction(func.ns, func.name, func.parameterCount, func.callback);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (const auto &[name, callback] : getPragmas()) {
|
for (const auto &[name, callback] : getPragmas()) {
|
||||||
runtime->addPragma(name, callback);
|
runtime.addPragma(name, callback);
|
||||||
}
|
}
|
||||||
|
|
||||||
return runtime;
|
runtime.addDefine("__IMHEX__");
|
||||||
|
runtime.addDefine("__IMHEX_VERSION__", IMHEX_VERSION);
|
||||||
}
|
}
|
||||||
|
|
||||||
void addPragma(const std::string &name, const pl::api::PragmaHandler &handler) {
|
void addPragma(const std::string &name, const pl::api::PragmaHandler &handler) {
|
||||||
|
@ -80,7 +80,8 @@ namespace hex::plugin::builtin {
|
|||||||
|
|
||||||
|
|
||||||
ViewPatternEditor::ViewPatternEditor() : View("hex.builtin.view.pattern_editor.name") {
|
ViewPatternEditor::ViewPatternEditor() : View("hex.builtin.view.pattern_editor.name") {
|
||||||
this->m_parserRuntime = ContentRegistry::PatternLanguage::createDefaultRuntime(nullptr);
|
this->m_parserRuntime = std::make_unique<pl::PatternLanguage>();
|
||||||
|
ContentRegistry::PatternLanguage::configureRuntime(*this->m_parserRuntime, nullptr);
|
||||||
|
|
||||||
this->m_textEditor.SetLanguageDefinition(PatternLanguage());
|
this->m_textEditor.SetLanguageDefinition(PatternLanguage());
|
||||||
this->m_textEditor.SetShowWhitespaces(false);
|
this->m_textEditor.SetShowWhitespaces(false);
|
||||||
@ -110,7 +111,8 @@ namespace hex::plugin::builtin {
|
|||||||
|
|
||||||
EventManager::subscribe<EventProviderOpened>(this, [this](prv::Provider *provider) {
|
EventManager::subscribe<EventProviderOpened>(this, [this](prv::Provider *provider) {
|
||||||
auto &patternLanguageData = ProviderExtraData::get(provider).patternLanguage;
|
auto &patternLanguageData = ProviderExtraData::get(provider).patternLanguage;
|
||||||
patternLanguageData.runtime = ContentRegistry::PatternLanguage::createDefaultRuntime(provider);
|
patternLanguageData.runtime = std::make_unique<pl::PatternLanguage>();
|
||||||
|
ContentRegistry::PatternLanguage::configureRuntime(*patternLanguageData.runtime, provider);
|
||||||
|
|
||||||
if (!this->m_autoLoadPatterns)
|
if (!this->m_autoLoadPatterns)
|
||||||
return;
|
return;
|
||||||
@ -775,6 +777,7 @@ namespace hex::plugin::builtin {
|
|||||||
void ViewPatternEditor::parsePattern(const std::string &code) {
|
void ViewPatternEditor::parsePattern(const std::string &code) {
|
||||||
this->m_runningParsers++;
|
this->m_runningParsers++;
|
||||||
|
|
||||||
|
ContentRegistry::PatternLanguage::configureRuntime(*this->m_parserRuntime, nullptr);
|
||||||
auto ast = this->m_parserRuntime->parseString(code);
|
auto ast = this->m_parserRuntime->parseString(code);
|
||||||
|
|
||||||
this->m_patternVariables.clear();
|
this->m_patternVariables.clear();
|
||||||
@ -815,10 +818,7 @@ namespace hex::plugin::builtin {
|
|||||||
auto provider = ImHexApi::Provider::get();
|
auto provider = ImHexApi::Provider::get();
|
||||||
auto &runtime = ProviderExtraData::get(provider).patternLanguage.runtime;
|
auto &runtime = ProviderExtraData::get(provider).patternLanguage.runtime;
|
||||||
|
|
||||||
runtime->reset();
|
ContentRegistry::PatternLanguage::configureRuntime(*runtime, provider);
|
||||||
runtime->setIncludePaths(fs::getDefaultPaths(fs::ImHexPath::PatternsInclude) | fs::getDefaultPaths(fs::ImHexPath::Patterns));
|
|
||||||
runtime->setDataBaseAddress(provider->getBaseAddress());
|
|
||||||
runtime->setDataSize(provider->getActualSize());
|
|
||||||
|
|
||||||
EventManager::post<EventHighlightingChanged>();
|
EventManager::post<EventHighlightingChanged>();
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user