[ox/ptrarith] Fix Ptr type's derefernce operator

This commit is contained in:
Gary Talent 2019-11-03 16:44:22 -06:00
parent 693e7324ed
commit c30ef720c4
2 changed files with 41 additions and 33 deletions

View File

@ -93,9 +93,10 @@ class __attribute__((packed)) NodeBuffer {
Header m_header; Header m_header;
public: public:
NodeBuffer() = default; NodeBuffer() {
}
NodeBuffer(const NodeBuffer &other); NodeBuffer(const NodeBuffer &other, size_t size);
explicit NodeBuffer(size_t size); explicit NodeBuffer(size_t size);
@ -168,11 +169,13 @@ class __attribute__((packed)) NodeBuffer {
template<typename size_t, typename Item> template<typename size_t, typename Item>
NodeBuffer<size_t, Item>::NodeBuffer(size_t size) { NodeBuffer<size_t, Item>::NodeBuffer(size_t size) {
m_header.size = size; m_header.size = size;
oxTrace("ox::NodeBuffer::constructor") << m_header.firstItem;
} }
template<typename size_t, typename Item> template<typename size_t, typename Item>
NodeBuffer<size_t, Item>::NodeBuffer(const NodeBuffer &other) { NodeBuffer<size_t, Item>::NodeBuffer(const NodeBuffer &other, size_t size) {
ox_memcpy(this, &other, other.size()); oxTrace("ox::ptrarith::NodeBuffer::copy") << "other.m_header.firstItem:" << other.m_header.firstItem;
ox_memcpy(this, &other, size);
} }
template<typename size_t, typename Item> template<typename size_t, typename Item>
@ -270,39 +273,44 @@ typename NodeBuffer<size_t, Item>::ItemPtr NodeBuffer<size_t, Item>::malloc(size
oxTrace("ox::ptrarith::NodeBuffer::malloc") << "No first item, initializing."; oxTrace("ox::ptrarith::NodeBuffer::malloc") << "No first item, initializing.";
m_header.firstItem = sizeof(m_header); m_header.firstItem = sizeof(m_header);
addr = m_header.firstItem; addr = m_header.firstItem;
}
}
auto out = ItemPtr(this, m_header.size, addr, fullSize);
if (out.valid()) {
new (out) Item;
out->setSize(size);
auto first = firstItem();
auto oldLast = last;
out->next = first.offset();
if (first.valid()) {
first->prev = out.offset();
} else { } else {
oxTrace("ox::ptrarith::NodeBuffer::malloc::fail") << "NodeBuffer malloc failed due to invalid first element pointer."; oxTrace("ox::ptrarith::NodeBuffer::malloc::fail") << "NodeBuffer is in invalid state.";
return nullptr; return nullptr;
} }
}
if (oldLast.valid()) { oxTrace("ox::ptrarith::NodeBuffer::malloc") << "buffer size:" << m_header.size
out->prev = oldLast.offset(); << ";addr:" << addr
oldLast->next = out.offset(); << ";fullSize:" << fullSize;
} else { // check to see if this is the first allocation auto out = ItemPtr(this, m_header.size, addr, fullSize);
if (out.offset() != first.offset()) { if (!out.valid()) {
// if this is not the first allocation, there should be an oldLast
oxTrace("ox::ptrarith::NodeBuffer::malloc::fail") << "NodeBuffer malloc failed due to invalid last element pointer.";
return nullptr;
}
out->prev = out.offset();
}
m_header.bytesUsed += out.size();
} else {
oxTrace("ox::ptrarith::NodeBuffer::malloc::fail") << "Unknown"; oxTrace("ox::ptrarith::NodeBuffer::malloc::fail") << "Unknown";
return nullptr; return nullptr;
} }
new (out) Item;
out->setSize(size);
auto first = firstItem();
auto oldLast = last;
out->next = first.offset();
if (first.valid()) {
first->prev = out.offset();
} else {
oxTrace("ox::ptrarith::NodeBuffer::malloc::fail") << "NodeBuffer malloc failed due to invalid first element pointer.";
return nullptr;
}
if (oldLast.valid()) {
out->prev = oldLast.offset();
oldLast->next = out.offset();
} else { // check to see if this is the first allocation
if (out.offset() != first.offset()) {
// if this is not the first allocation, there should be an oldLast
oxTrace("ox::ptrarith::NodeBuffer::malloc::fail") << "NodeBuffer malloc failed due to invalid last element pointer.";
return nullptr;
}
out->prev = out.offset();
}
m_header.bytesUsed += out.size();
oxTrace("ox::ptrarith::NodeBuffer::malloc") << "Offset:" << out.offset(); oxTrace("ox::ptrarith::NodeBuffer::malloc") << "Offset:" << out.offset();
return out; return out;
} }

View File

@ -163,14 +163,14 @@ template<typename T, typename size_t, size_t minOffset>
inline const T &Ptr<T, size_t, minOffset>::operator*() const { inline const T &Ptr<T, size_t, minOffset>::operator*() const {
oxAssert(m_validated, "Unvalidated pointer dereference. (ox::fs::Ptr::operator*())"); oxAssert(m_validated, "Unvalidated pointer dereference. (ox::fs::Ptr::operator*())");
oxAssert(valid(), "Invalid pointer dereference. (ox::fs::Ptr::operator*())"); oxAssert(valid(), "Invalid pointer dereference. (ox::fs::Ptr::operator*())");
return *reinterpret_cast<T*>(this); return *reinterpret_cast<T*>(m_dataStart + m_itemOffset);
} }
template<typename T, typename size_t, size_t minOffset> template<typename T, typename size_t, size_t minOffset>
inline T &Ptr<T, size_t, minOffset>::operator*() { inline T &Ptr<T, size_t, minOffset>::operator*() {
oxAssert(m_validated, "Unvalidated pointer dereference. (ox::fs::Ptr::operator*())"); oxAssert(m_validated, "Unvalidated pointer dereference. (ox::fs::Ptr::operator*())");
oxAssert(valid(), "Invalid pointer dereference. (ox::fs::Ptr::operator*())"); oxAssert(valid(), "Invalid pointer dereference. (ox::fs::Ptr::operator*())");
return *reinterpret_cast<T*>(this); return *reinterpret_cast<T*>(m_dataStart + m_itemOffset);
} }
template<typename T, typename size_t, size_t minOffset> template<typename T, typename size_t, size_t minOffset>