summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorjacqueline <me@jacqueline.id.au>2024-01-17 17:31:45 +1100
committerjacqueline <me@jacqueline.id.au>2024-01-17 17:31:45 +1100
commitea8a7b0f93aa3b391e92d7b930f667d1ff439d04 (patch)
tree194f0be54ed67935378211364608507a9f9f8030 /src
parentc0ec19c496591efe970da26c819c2a0dc86c363d (diff)
downloadtangara-fw-ea8a7b0f93aa3b391e92d7b930f667d1ff439d04.tar.gz
allocate lua properties in spi ram
Diffstat (limited to 'src')
-rw-r--r--src/lua/include/property.hpp4
-rw-r--r--src/lua/property.cpp13
-rw-r--r--src/memory/include/memory_resource.hpp5
3 files changed, 16 insertions, 6 deletions
diff --git a/src/lua/include/property.hpp b/src/lua/include/property.hpp
index 425cc15c..03229bc1 100644
--- a/src/lua/include/property.hpp
+++ b/src/lua/include/property.hpp
@@ -35,7 +35,7 @@ class Property {
Property(const LuaValue&);
Property(const LuaValue&, std::function<bool(const LuaValue&)>);
- auto Get() -> const LuaValue& { return value_; }
+ auto Get() -> const LuaValue& { return *value_; }
auto IsTwoWay() -> bool { return cb_.has_value(); }
@@ -46,7 +46,7 @@ class Property {
auto AddLuaBinding(lua_State*, int ref) -> void;
private:
- LuaValue value_;
+ std::unique_ptr<LuaValue> value_;
std::optional<std::function<bool(const LuaValue&)>> cb_;
std::pmr::vector<std::pair<lua_State*, int>> bindings_;
};
diff --git a/src/lua/property.cpp b/src/lua/property.cpp
index 0c2e041b..c16434fa 100644
--- a/src/lua/property.cpp
+++ b/src/lua/property.cpp
@@ -9,6 +9,7 @@
#include <cmath>
#include <memory>
+#include <memory_resource>
#include <string>
#include <variant>
@@ -160,11 +161,15 @@ template <class... Ts>
inline constexpr bool always_false_v = false;
Property::Property(const LuaValue& val)
- : value_(val), cb_(), bindings_(&memory::kSpiRamResource) {}
+ : value_(memory::SpiRamAllocator<LuaValue>().new_object<LuaValue>(val)),
+ cb_(),
+ bindings_(&memory::kSpiRamResource) {}
Property::Property(const LuaValue& val,
std::function<bool(const LuaValue& val)> cb)
- : value_(val), cb_(cb), bindings_(&memory::kSpiRamResource) {}
+ : value_(memory::SpiRamAllocator<LuaValue>().new_object<LuaValue>(val)),
+ cb_(cb),
+ bindings_(&memory::kSpiRamResource) {}
static auto pushTagValue(lua_State* L, const database::TagValue& val) -> void {
std::visit(
@@ -273,7 +278,7 @@ auto Property::PushValue(lua_State& s) -> int {
static_assert(always_false_v<T>, "PushValue missing type");
}
},
- value_);
+ *value_);
return 1;
}
@@ -343,7 +348,7 @@ auto Property::PopValue(lua_State& s) -> bool {
}
auto Property::Update(const LuaValue& v) -> void {
- value_ = v;
+ *value_ = v;
for (int i = bindings_.size() - 1; i >= 0; i--) {
auto& b = bindings_[i];
diff --git a/src/memory/include/memory_resource.hpp b/src/memory/include/memory_resource.hpp
index ed4b1a1c..e41a1caf 100644
--- a/src/memory/include/memory_resource.hpp
+++ b/src/memory/include/memory_resource.hpp
@@ -40,4 +40,9 @@ class Resource : public std::pmr::memory_resource {
extern Resource kSpiRamResource;
+template <typename T>
+auto SpiRamAllocator() {
+ return std::pmr::polymorphic_allocator<T>{&kSpiRamResource};
+}
+
} // namespace memory