Skip to content
Snippets Groups Projects
Commit c180983a authored by Frederich Munch's avatar Frederich Munch Committed by Axel Naumann
Browse files

Destroy elements in reverse order of construction.

Prevents possibility of last element referencing now invalid first element.
parent 29044dfd
No related branches found
No related tags found
No related merge requests found
...@@ -86,9 +86,11 @@ namespace { ...@@ -86,9 +86,11 @@ namespace {
assert (m_RefCnt > 0 && "Reference count is already zero."); assert (m_RefCnt > 0 && "Reference count is already zero.");
if (--m_RefCnt == 0) { if (--m_RefCnt == 0) {
if (m_DtorFunc) { if (m_DtorFunc) {
char* payload = getPayload(); assert(m_NElements && "No elements!");
for (size_t el = 0; el < m_NElements; ++el) char* Payload = getPayload();
(*m_DtorFunc)(payload + el * m_AllocSize / m_NElements); const auto Skip = m_AllocSize / m_NElements;
while (m_NElements-- != 0)
(*m_DtorFunc)(Payload + m_NElements * Skip);
} }
delete [] (char*)this; delete [] (char*)this;
} }
......
...@@ -208,6 +208,18 @@ gCling->evaluate("arrV", V); ...@@ -208,6 +208,18 @@ gCling->evaluate("arrV", V);
V // CHECK-NEXT: (cling::Value &) boxes [(Tracer [3]) { @{{.*}}, @{{.*}}, @{{.*}} }] V // CHECK-NEXT: (cling::Value &) boxes [(Tracer [3]) { @{{.*}}, @{{.*}}, @{{.*}} }]
// Explicitly destory the copies
V = cling::Value()
//CHECK-NEXT: MADE+{10}:dtor
//CHECK-NEXT: MADE+{9}:dtor
//CHECK-NEXT: MADE+{8}:dtor
//CHECK-NEXT: (cling::Value &) <<<invalid>>> @0x{{.*}}
gCling->evaluate("arrV", V);
//CHECK-NEXT: MADE+{11}:copy
//CHECK-NEXT: MADE+{12}:copy
//CHECK-NEXT: MADE+{13}:copy
// Destruct the variables with static storage: // Destruct the variables with static storage:
// Destruct arrV: // Destruct arrV:
//CHECK-NEXT: MADE{7}:dtor //CHECK-NEXT: MADE{7}:dtor
...@@ -217,7 +229,7 @@ V // CHECK-NEXT: (cling::Value &) boxes [(Tracer [3]) { @{{.*}}, @{{.*}}, @{{.*} ...@@ -217,7 +229,7 @@ V // CHECK-NEXT: (cling::Value &) boxes [(Tracer [3]) { @{{.*}}, @{{.*}}, @{{.*}
// CHECK-NEXT: VAR{3}:dtor // CHECK-NEXT: VAR{3}:dtor
// CHECK-NEXT: REF{1}:dtor // CHECK-NEXT: REF{1}:dtor
//CHECK-NEXT: MADE+{8}:dtor // V going out of scope
//CHECK-NEXT: MADE+{9}:dtor //CHECK-NEXT: MADE+{13}:dtor
//CHECK-NEXT: MADE+{10}:dtor //CHECK-NEXT: MADE+{12}:dtor
//CHECK-NEXT: MADE+{11}:dtor
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment