mirror of
https://github.com/WerWolv/ImHex.git
synced 2026-03-28 07:47:03 -05:00
fix: fixes for various errors related to shared_from_this. (#2297)
A while back there were some changes to the pattern language library that changed the way shared_pointers are created using shared_from_this(). Unfortunatelly the changes were not complete and various bugs were created among them 2234, json type not working, unable to export files, static arrays of bitfields,... The cause of the errors was that in class Pattern the member m_parent was left as a raw pointer and it needs to be handled by shared pointers. Also there were some cases in which share pointers were needed but unique pointers were used instead. Both cause crashes when shared_from_this is used on pointers that are not managed by shared_ptr. Another source of errors were infinite loops of clone and reference that caused stack overflow. The fixes include making m_parent a weak pointer, turning unique pointers into shared pointers and moving codefrom the copy constructors into clone to break the infinite loops.These changes are the bare minimum needed to bring the pattern language back to the full functionality that it had before shared_from_this was introduced or at least thats the hope.
This commit is contained in:
2
lib/external/pattern_language
vendored
2
lib/external/pattern_language
vendored
Submodule lib/external/pattern_language updated: 7a741cef11...cbea338a05
@@ -197,8 +197,8 @@ namespace hex::plugin::builtin {
|
||||
}
|
||||
|
||||
|
||||
std::unique_ptr<pl::ptrn::Pattern> jsonToPattern(pl::core::Evaluator *evaluator, auto function) {
|
||||
auto object = std::make_unique<pl::ptrn::PatternStruct>(evaluator, 0, 0, 0);
|
||||
std::shared_ptr<pl::ptrn::Pattern> jsonToPattern(pl::core::Evaluator *evaluator, auto function) {
|
||||
auto object = std::make_shared<pl::ptrn::PatternStruct>(evaluator, 0, 0, 0);
|
||||
std::vector<std::shared_ptr<pl::ptrn::Pattern>> patterns;
|
||||
|
||||
try {
|
||||
@@ -221,7 +221,7 @@ namespace hex::plugin::builtin {
|
||||
const pl::api::Namespace nsHexDec = { "builtin", "hex", "dec" };
|
||||
|
||||
/* Json<data_pattern> */
|
||||
ContentRegistry::PatternLanguage::addType(nsHexDec, "Json", FunctionParameterCount::exactly(1), [](Evaluator *evaluator, auto params) -> std::unique_ptr<pl::ptrn::Pattern> {
|
||||
ContentRegistry::PatternLanguage::addType(nsHexDec, "Json", FunctionParameterCount::exactly(1), [](Evaluator *evaluator, auto params) -> std::shared_ptr<pl::ptrn::Pattern> {
|
||||
auto data = params[0].toBytes();
|
||||
|
||||
auto result = jsonToPattern(evaluator, [&] { return nlohmann::json::parse(data); });
|
||||
@@ -230,7 +230,7 @@ namespace hex::plugin::builtin {
|
||||
});
|
||||
|
||||
/* Bson<data_pattern> */
|
||||
ContentRegistry::PatternLanguage::addType(nsHexDec, "Bson", FunctionParameterCount::exactly(1), [](Evaluator *evaluator, auto params) -> std::unique_ptr<pl::ptrn::Pattern> {
|
||||
ContentRegistry::PatternLanguage::addType(nsHexDec, "Bson", FunctionParameterCount::exactly(1), [](Evaluator *evaluator, auto params) -> std::shared_ptr<pl::ptrn::Pattern> {
|
||||
auto data = params[0].toBytes();
|
||||
|
||||
auto result = jsonToPattern(evaluator, [&] { return nlohmann::json::from_bson(data); });
|
||||
@@ -239,7 +239,7 @@ namespace hex::plugin::builtin {
|
||||
});
|
||||
|
||||
/* Cbor<data_pattern> */
|
||||
ContentRegistry::PatternLanguage::addType(nsHexDec, "Cbor", FunctionParameterCount::exactly(1), [](Evaluator *evaluator, auto params) -> std::unique_ptr<pl::ptrn::Pattern> {
|
||||
ContentRegistry::PatternLanguage::addType(nsHexDec, "Cbor", FunctionParameterCount::exactly(1), [](Evaluator *evaluator, auto params) -> std::shared_ptr<pl::ptrn::Pattern> {
|
||||
auto data = params[0].toBytes();
|
||||
|
||||
auto result = jsonToPattern(evaluator, [&] { return nlohmann::json::from_cbor(data); });
|
||||
@@ -248,7 +248,7 @@ namespace hex::plugin::builtin {
|
||||
});
|
||||
|
||||
/* Bjdata<data_pattern> */
|
||||
ContentRegistry::PatternLanguage::addType(nsHexDec, "Bjdata", FunctionParameterCount::exactly(1), [](Evaluator *evaluator, auto params) -> std::unique_ptr<pl::ptrn::Pattern> {
|
||||
ContentRegistry::PatternLanguage::addType(nsHexDec, "Bjdata", FunctionParameterCount::exactly(1), [](Evaluator *evaluator, auto params) -> std::shared_ptr<pl::ptrn::Pattern> {
|
||||
auto data = params[0].toBytes();
|
||||
|
||||
auto result = jsonToPattern(evaluator, [&] { return nlohmann::json::from_bjdata(data); });
|
||||
@@ -257,7 +257,7 @@ namespace hex::plugin::builtin {
|
||||
});
|
||||
|
||||
/* Msgpack<data_pattern> */
|
||||
ContentRegistry::PatternLanguage::addType(nsHexDec, "Msgpack", FunctionParameterCount::exactly(1), [](Evaluator *evaluator, auto params) -> std::unique_ptr<pl::ptrn::Pattern> {
|
||||
ContentRegistry::PatternLanguage::addType(nsHexDec, "Msgpack", FunctionParameterCount::exactly(1), [](Evaluator *evaluator, auto params) -> std::shared_ptr<pl::ptrn::Pattern> {
|
||||
auto data = params[0].toBytes();
|
||||
|
||||
auto result = jsonToPattern(evaluator, [&] { return nlohmann::json::from_msgpack(data); });
|
||||
@@ -266,7 +266,7 @@ namespace hex::plugin::builtin {
|
||||
});
|
||||
|
||||
/* Ubjson<data_pattern> */
|
||||
ContentRegistry::PatternLanguage::addType(nsHexDec, "Ubjson", FunctionParameterCount::exactly(1), [](Evaluator *evaluator, auto params) -> std::unique_ptr<pl::ptrn::Pattern> {
|
||||
ContentRegistry::PatternLanguage::addType(nsHexDec, "Ubjson", FunctionParameterCount::exactly(1), [](Evaluator *evaluator, auto params) -> std::shared_ptr<pl::ptrn::Pattern> {
|
||||
auto data = params[0].toBytes();
|
||||
|
||||
auto result = jsonToPattern(evaluator, [&] { return nlohmann::json::from_ubjson(data); });
|
||||
@@ -276,14 +276,14 @@ namespace hex::plugin::builtin {
|
||||
|
||||
|
||||
/* EncodedString<data_pattern> */
|
||||
ContentRegistry::PatternLanguage::addType(nsHexDec, "EncodedString", FunctionParameterCount::exactly(2), [](Evaluator *evaluator, auto params) -> std::unique_ptr<pl::ptrn::Pattern> {
|
||||
ContentRegistry::PatternLanguage::addType(nsHexDec, "EncodedString", FunctionParameterCount::exactly(2), [](Evaluator *evaluator, auto params) -> std::shared_ptr<pl::ptrn::Pattern> {
|
||||
auto bytes = params[0].toBytes();
|
||||
auto encodingDefinition = params[1].toString();
|
||||
|
||||
std::string value;
|
||||
EncodingFile encodingFile(EncodingFile::Type::Thingy, encodingDefinition);
|
||||
|
||||
auto pattern = std::make_unique<PatternEncodedString>(evaluator, evaluator->getReadOffset(), bytes.size(), 0);
|
||||
auto pattern = std::make_shared<PatternEncodedString>(evaluator, evaluator->getReadOffset(), bytes.size(), 0);
|
||||
pattern->setEncodedString(encodingFile, bytes);
|
||||
|
||||
return pattern;
|
||||
|
||||
Reference in New Issue
Block a user