Keep C++ pref value in memory longer

This commit is contained in:
Paul Rouget 2020-08-05 16:33:27 +02:00
parent a019db648c
commit 3b8773940a

View file

@ -185,9 +185,18 @@ Servo::Servo(std::optional<hstring> initUrl, hstring args, GLsizei width,
std::vector<capi::CPref> cprefs; std::vector<capi::CPref> cprefs;
// Ensure few things stay in memories long enough as we send raw
// pointers to Rust.
std::vector<std::unique_ptr<char *>> memChar;
std::vector<std::unique_ptr<bool>> memBool;
std::vector<std::unique_ptr<int64_t>> memInt;
std::vector<std::unique_ptr<double>> memDouble;
for (auto pref : prefs.Values()) { for (auto pref : prefs.Values()) {
auto key = *hstring2char(pref.Key()); auto charkey = hstring2char(pref.Key());
auto key = *charkey.get();
memChar.push_back(std::move(charkey));
auto value = pref.Value(); auto value = pref.Value();
auto type = value.as<Windows::Foundation::IPropertyValue>().Type(); auto type = value.as<Windows::Foundation::IPropertyValue>().Type();
@ -197,20 +206,24 @@ Servo::Servo(std::optional<hstring> initUrl, hstring args, GLsizei width,
cpref.value = NULL; cpref.value = NULL;
if (type == Windows::Foundation::PropertyType::Boolean) { if (type == Windows::Foundation::PropertyType::Boolean) {
cpref.pref_type = capi::CPrefType::Bool; cpref.pref_type = capi::CPrefType::Bool;
auto val = unbox_value<bool>(value); auto val = std::make_unique<bool>(unbox_value<bool>(value));
cpref.value = &val; cpref.value = val.get();
memBool.push_back(std::move(val));
} else if (type == Windows::Foundation::PropertyType::String) { } else if (type == Windows::Foundation::PropertyType::String) {
cpref.pref_type = capi::CPrefType::Str; cpref.pref_type = capi::CPrefType::Str;
auto val = unbox_value<hstring>(value); auto val = hstring2char(unbox_value<hstring>(value));
cpref.value = *hstring2char(val); cpref.value = *val.get();
memChar.push_back(std::move(val));
} else if (type == Windows::Foundation::PropertyType::Int64) { } else if (type == Windows::Foundation::PropertyType::Int64) {
cpref.pref_type = capi::CPrefType::Int; cpref.pref_type = capi::CPrefType::Int;
auto val = unbox_value<int64_t>(value); auto val = std::make_unique<int64_t>(unbox_value<int64_t>(value));
cpref.value = &val; cpref.value = val.get();
memInt.push_back(std::move(val));
} else if (type == Windows::Foundation::PropertyType::Double) { } else if (type == Windows::Foundation::PropertyType::Double) {
cpref.pref_type = capi::CPrefType::Float; cpref.pref_type = capi::CPrefType::Float;
auto val = unbox_value<double>(value); auto val = std::make_unique<double>(unbox_value<double>(value));
cpref.value = &val; cpref.value = val.get();
memDouble.push_back(std::move(val));
} else if (type == Windows::Foundation::PropertyType::Empty) { } else if (type == Windows::Foundation::PropertyType::Empty) {
cpref.pref_type = capi::CPrefType::Missing; cpref.pref_type = capi::CPrefType::Missing;
} else { } else {