Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
90 changes: 64 additions & 26 deletions io/io/src/TStreamerInfoActions.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -2497,7 +2497,10 @@ namespace TStreamerInfoActions
static INLINE_TEMPLATE_ARGS Int_t LoopOverCollection(TBuffer &buf, void *start, const void *end, const TConfiguration *config)
{
for(void *iter = start; iter != end; iter = (char*)iter + sizeof(void*) ) {
action(buf, *(void**)iter, config);
if (*(void**)iter)
action(buf, *(void**)iter, config);
Comment thread
ferdymercury marked this conversation as resolved.
else
buf << static_cast<const Char_t *>(nullptr);
}
return 0;
}
Expand All @@ -2517,8 +2520,10 @@ namespace TStreamerInfoActions
const Int_t offset = config->fOffset;

for(; iter != end; iter = (char*)iter + sizeof(void*) ) {
T *x = (T*)( ((char*) (*(void**)iter) ) + offset );
buf >> *x;
if (*(void**)iter) {
T *x = (T*)( ((char*) (*(void**)iter) ) + offset );
buf >> *x;
}
}
return 0;
}
Expand All @@ -2532,8 +2537,10 @@ namespace TStreamerInfoActions
const Int_t offset = config->fOffset;
for(; iter != end; iter = (char*)iter + sizeof(void*) ) {
buf >> temp;
To *x = (To*)( ((char*) (*(void**)iter) ) + offset );
*x = (To)temp;
if (*(void**)iter) {
To *x = (To*)( ((char*) (*(void**)iter) ) + offset );
*x = (To)temp;
}
}
return 0;
}
Expand All @@ -2549,12 +2556,15 @@ namespace TStreamerInfoActions
for(; iter != end; iter = (char*)iter + sizeof(void*) ) {
buf >> temp;

if ((temp & kIsReferenced) != 0) {
HandleReferencedTObject(buf,*(void**)iter,config);
}
if (*(void**)iter)
{
if ((temp & kIsReferenced) != 0) {
HandleReferencedTObject(buf,*(void**)iter,config);
}

To *x = (To*)( ((char*) (*(void**)iter) ) + offset );
*x = (To)temp;
To *x = (To*)( ((char*) (*(void**)iter) ) + offset );
*x = (To)temp;
}
}
return 0;
}
Expand All @@ -2570,8 +2580,10 @@ namespace TStreamerInfoActions
const Int_t offset = config->fOffset;
for(; iter != end; iter = (char*)iter + sizeof(void*) ) {
buf.ReadWithFactor(&temp, conf->fFactor, conf->fXmin);
To *x = (To*)( ((char*) (*(void**)iter) ) + offset );
*x = (To)temp;
if (*(void**)iter) {
To *x = (To*)( ((char*) (*(void**)iter) ) + offset );
*x = (To)temp;
}
}
return 0;
}
Expand All @@ -2587,8 +2599,10 @@ namespace TStreamerInfoActions
const Int_t offset = config->fOffset;
for(; iter != end; iter = (char*)iter + sizeof(void*) ) {
buf.ReadWithNbits(&temp, conf->fNbits);
To *x = (To*)( ((char*) (*(void**)iter) ) + offset );
*x = (To)temp;
if (*(void**)iter) {
To *x = (To*)( ((char*) (*(void**)iter) ) + offset );
*x = (To)temp;
}
}
return 0;
}
Expand All @@ -2600,8 +2614,12 @@ namespace TStreamerInfoActions
const Int_t offset = config->fOffset;

for(; iter != end; iter = (char*)iter + sizeof(void*) ) {
T *x = (T*)( ((char*) (*(void**)iter) ) + offset );
buf << *x;
if (*(void**)iter) {
T *x = (T*)( ((char*) (*(void**)iter) ) + offset );
buf << *x;
}
else
buf << static_cast<const Char_t *>(nullptr);
}
return 0;
}
Expand All @@ -2613,9 +2631,13 @@ namespace TStreamerInfoActions
const Int_t offset = config->fOffset;

for(; iter != end; iter = (char*)iter + sizeof(void*) ) {
From *from = (From*)( ((char*) (*(void**)iter) ) + offset );
To to = (To)(*from);
buf << to;
if (*(void**)iter) {
From *from = (From*)( ((char*) (*(void**)iter) ) + offset );
To to = (To)(*from);
buf << to;
} else {
buf << static_cast<const Char_t *>(nullptr);
}
}
return 0;
}
Expand All @@ -2630,8 +2652,13 @@ namespace TStreamerInfoActions

for(; iter != end; iter = (char*)iter + sizeof(void*) ) {
From *from = (From*)( ((char*) (*(void**)iter) ) + offset );
To to = (To)(*from);
WriteCompressed(buf, &to, elem);
if (*(void**)iter) {
To to = (To)(*from);
WriteCompressed(buf, &to, elem);
} else {
To to; // uninitialized value
WriteCompressed(buf, &to, elem);
}
}
return 0;
}
Expand All @@ -2644,9 +2671,14 @@ namespace TStreamerInfoActions
const TStreamerElement *elem = config->fCompInfo->fElem;

for(; iter != end; iter = (char*)iter + sizeof(void*) ) {
From *from = (From*)( ((char*) (*(void**)iter) ) + offset );
To to = (To)(*from);
WriteCompressed(buf, &to, elem);
if(*(void**)iter) {
From *from = (From*)( ((char*) (*(void**)iter) ) + offset );
To to = (To)(*from);
WriteCompressed(buf, &to, elem);
} else {
To to; // uninitialized value
WriteCompressed(buf, &to, elem);
}
}
return 0;
}
Expand Down Expand Up @@ -2693,14 +2725,20 @@ namespace TStreamerInfoActions
{
Int_t n = ( ((void**)end) - ((void**)iter) );
char **arr = (char**)iter;
return ((TStreamerInfo*)config->fInfo)->ReadBuffer(buf, arr, &(config->fCompInfo), /*first*/ 0, /*last*/ 1, /*narr*/ n, config->fOffset, 1|2 );
if (arr)
return ((TStreamerInfo*)config->fInfo)->ReadBuffer(buf, arr, &(config->fCompInfo), /*first*/ 0, /*last*/ 1, /*narr*/ n, config->fOffset, 1|2 );
else
return 0;
}

static INLINE_TEMPLATE_ARGS Int_t GenericWrite(TBuffer &buf, void *iter, const void *end, const TConfiguration *config)
{
Int_t n = ( ((void**)end) - ((void**)iter) );
char **arr = (char**)iter;
return ((TStreamerInfo*)config->fInfo)->WriteBufferAux(buf, arr, &(config->fCompInfo), /*first*/ 0, /*last*/ 1, n, config->fOffset, 1|2 );
if (arr)
return ((TStreamerInfo*)config->fInfo)->WriteBufferAux(buf, arr, &(config->fCompInfo), /*first*/ 0, /*last*/ 1, n, config->fOffset, 1|2 );
else
return 0;
}

};
Expand Down
21 changes: 21 additions & 0 deletions io/io/test/TBufferFileTests.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,12 @@

#include "TBufferFile.h"
#include "TClass.h"
#include "TClonesArray.h"
#include "TObjString.h"
#include <vector>
#include <iostream>
#include <iostream>


// Tests ROOT-8367
TEST(TBufferFile, ROOT_8367)
Expand All @@ -26,3 +30,20 @@ TEST(TBufferFile, ROOT_8367)
EXPECT_FLOAT_EQ(v2[6], 7.);
EXPECT_EQ(v2.size(), 7);
}

// https://its.cern.ch/jira/browse/ROOT-6788
TEST(TBufferFile, ROOT_6788)
{
TClonesArray clArray(TObjString::Class(), 100);
for (Int_t i=0; i<28; i++) {
new (clArray[i]) TObjString();
}
TBufferFile buf(TBuffer::kWrite, 10000);
for (Int_t i=0; i<27; i++) {
delete clArray.RemoveAt(i);
}
buf.SetBufferOffset(0);
buf.MapObject(&clArray);
clArray.Streamer(buf);
}

Loading