- fixed: To get the final error handling from the serializer, Close must be called before the destructor gets invoked.

- added line feeds to all error messages in the serializer.
This commit is contained in:
Christoph Oelckers 2017-02-27 15:16:03 +01:00
parent 78538ed9ef
commit cc598dfdde
3 changed files with 34 additions and 30 deletions

View file

@ -1624,6 +1624,7 @@ void G_UnSnapshotLevel (bool hubLoad)
}
}
}
arc.Close();
}
// No reason to keep the snapshot around once the level's been entered.
level.info->Snapshot.Clean();

View file

@ -486,6 +486,8 @@ bool FSerializer::OpenReader(FCompressedBuffer *input)
void FSerializer::Close()
{
if (w == nullptr && r == nullptr) return; // double close? This should skip the I_Error at the bottom.
if (w != nullptr)
{
delete w;
@ -590,7 +592,7 @@ bool FSerializer::BeginObject(const char *name)
}
else
{
Printf(TEXTCOLOR_RED "Object expected for '%s'", name);
Printf(TEXTCOLOR_RED "Object expected for '%s'\n", name);
mErrors++;
return false;
}
@ -656,7 +658,7 @@ bool FSerializer::BeginArray(const char *name)
}
else
{
Printf(TEXTCOLOR_RED "Array expected for '%s'", name);
Printf(TEXTCOLOR_RED "Array expected for '%s'\n", name);
mErrors++;
return false;
}
@ -748,7 +750,7 @@ FSerializer &FSerializer::Args(const char *key, int *args, int *defargs, int spe
else
{
assert(false && "Integer expected");
Printf(TEXTCOLOR_RED "Integer expected for '%s[%d]'", key, i);
Printf(TEXTCOLOR_RED "Integer expected for '%s[%d]'\n", key, i);
mErrors++;
}
}
@ -756,7 +758,7 @@ FSerializer &FSerializer::Args(const char *key, int *args, int *defargs, int spe
else
{
assert(false && "array expected");
Printf(TEXTCOLOR_RED "array expected for '%s'", key);
Printf(TEXTCOLOR_RED "array expected for '%s'\n", key);
mErrors++;
}
}
@ -800,7 +802,7 @@ FSerializer &FSerializer::ScriptNum(const char *key, int &num)
else
{
assert(false && "Integer expected");
Printf(TEXTCOLOR_RED "Integer expected for '%s'", key);
Printf(TEXTCOLOR_RED "Integer expected for '%s'\n", key);
mErrors++;
}
}
@ -1005,7 +1007,7 @@ void FSerializer::ReadObjects(bool hubtravel)
PClass *cls = PClass::FindClass(clsname);
if (cls == nullptr)
{
Printf("Unknown object class '%s' in savegame", clsname.GetChars());
Printf(TEXTCOLOR_RED "Unknown object class '%s' in savegame\n", clsname.GetChars());
founderrors = true;
r->mDObjects[i] = RUNTIME_CLASS(AActor)->CreateNew(); // make sure we got at least a valid pointer for the duration of the loading process.
r->mDObjects[i]->Destroy(); // but we do not want to keep this around, so destroy it right away.
@ -1041,7 +1043,7 @@ void FSerializer::ReadObjects(bool hubtravel)
catch (CRecoverableError &err)
{
// In case something in here throws an error, let's continue and deal with it later.
Printf(TEXTCOLOR_RED "'%s'\n while restoring %s", err.GetMessage(), obj ? obj->GetClass()->TypeName.GetChars() : "invalid object");
Printf(TEXTCOLOR_RED "'%s'\n while restoring %s\n", err.GetMessage(), obj ? obj->GetClass()->TypeName.GetChars() : "invalid object");
mErrors++;
}
}
@ -1055,7 +1057,7 @@ void FSerializer::ReadObjects(bool hubtravel)
assert(!founderrors);
if (founderrors)
{
Printf(TEXTCOLOR_RED "Failed to restore all objects in savegame");
Printf(TEXTCOLOR_RED "Failed to restore all objects in savegame\n");
mErrors++;
}
}
@ -1064,7 +1066,7 @@ void FSerializer::ReadObjects(bool hubtravel)
// nuke all objects we created here.
for (auto obj : r->mDObjects)
{
obj->Destroy();
if (!(obj->ObjectFlags & OF_EuthanizeMe)) obj->Destroy();
}
r->mDObjects.Clear();
@ -1182,7 +1184,7 @@ FSerializer &Serialize(FSerializer &arc, const char *key, bool &value, bool *def
}
else
{
Printf(TEXTCOLOR_RED "boolean type expected for '%s'", key);
Printf(TEXTCOLOR_RED "boolean type expected for '%s'\n", key);
arc.mErrors++;
}
}
@ -1218,7 +1220,7 @@ FSerializer &Serialize(FSerializer &arc, const char *key, int64_t &value, int64_
}
else
{
Printf(TEXTCOLOR_RED "integer type expected for '%s'", key);
Printf(TEXTCOLOR_RED "integer type expected for '%s'\n", key);
arc.mErrors++;
}
}
@ -1254,7 +1256,7 @@ FSerializer &Serialize(FSerializer &arc, const char *key, uint64_t &value, uint6
}
else
{
Printf(TEXTCOLOR_RED "integer type expected for '%s'", key);
Printf(TEXTCOLOR_RED "integer type expected for '%s'\n", key);
arc.mErrors++;
}
}
@ -1291,7 +1293,7 @@ FSerializer &Serialize(FSerializer &arc, const char *key, int32_t &value, int32_
}
else
{
Printf(TEXTCOLOR_RED "integer type expected for '%s'", key);
Printf(TEXTCOLOR_RED "integer type expected for '%s'\n", key);
arc.mErrors++;
}
}
@ -1327,7 +1329,7 @@ FSerializer &Serialize(FSerializer &arc, const char *key, uint32_t &value, uint3
}
else
{
Printf(TEXTCOLOR_RED "integer type expected for '%s'", key);
Printf(TEXTCOLOR_RED "integer type expected for '%s'\n", key);
arc.mErrors++;
}
}
@ -1405,7 +1407,7 @@ FSerializer &Serialize(FSerializer &arc, const char *key, double &value, double
}
else
{
Printf(TEXTCOLOR_RED "float type expected for '%s'", key);
Printf(TEXTCOLOR_RED "float type expected for '%s'\n", key);
arc.mErrors++;
}
}
@ -1548,7 +1550,7 @@ FSerializer &Serialize(FSerializer &arc, const char *key, FTextureID &value, FTe
}
else
{
Printf(TEXTCOLOR_RED "object does not represent a texture for '%s'", key);
Printf(TEXTCOLOR_RED "object does not represent a texture for '%s'\n", key);
value.SetNull();
arc.mErrors++;
}
@ -1564,7 +1566,7 @@ FSerializer &Serialize(FSerializer &arc, const char *key, FTextureID &value, FTe
else
{
assert(false && "not a texture");
Printf(TEXTCOLOR_RED "object does not represent a texture for '%s'", key);
Printf(TEXTCOLOR_RED "object does not represent a texture for '%s'\n", key);
value.SetNull();
arc.mErrors++;
}
@ -1649,7 +1651,7 @@ FSerializer &Serialize(FSerializer &arc, const char *key, DObject *&value, DObje
else
{
assert(false && "invalid object reference");
Printf(TEXTCOLOR_RED "Invalid object reference for '%s'", key);
Printf(TEXTCOLOR_RED "Invalid object reference for '%s'\n", key);
value = nullptr;
arc.mErrors++;
if (retcode) *retcode = false;
@ -1698,7 +1700,7 @@ FSerializer &Serialize(FSerializer &arc, const char *key, FName &value, FName *d
}
else
{
Printf(TEXTCOLOR_RED "String expected for '%s'", key);
Printf(TEXTCOLOR_RED "String expected for '%s'\n", key);
arc.mErrors++;
value = NAME_None;
}
@ -1746,7 +1748,7 @@ template<> FSerializer &Serialize(FSerializer &arc, const char *key, FDynamicCol
}
}
assert(false && "not a colormap");
Printf(TEXTCOLOR_RED "object does not represent a colormap for '%s'", key);
Printf(TEXTCOLOR_RED "object does not represent a colormap for '%s'\n", key);
cm = &NormalLight;
}
}
@ -1787,7 +1789,7 @@ FSerializer &Serialize(FSerializer &arc, const char *key, FSoundID &sid, FSoundI
}
else
{
Printf(TEXTCOLOR_RED "string type expected for '%s'", key);
Printf(TEXTCOLOR_RED "string type expected for '%s'\n", key);
sid = 0;
arc.mErrors++;
}
@ -1836,7 +1838,7 @@ template<> FSerializer &Serialize(FSerializer &arc, const char *key, PClassActor
}
else
{
Printf(TEXTCOLOR_RED "string type expected for '%s'", key);
Printf(TEXTCOLOR_RED "string type expected for '%s'\n", key);
clst = nullptr;
arc.mErrors++;
}
@ -1884,7 +1886,7 @@ template<> FSerializer &Serialize(FSerializer &arc, const char *key, PClass *&cl
}
else
{
Printf(TEXTCOLOR_RED "string type expected for '%s'", key);
Printf(TEXTCOLOR_RED "string type expected for '%s'\n", key);
clst = nullptr;
arc.mErrors++;
}
@ -1960,20 +1962,20 @@ FSerializer &Serialize(FSerializer &arc, const char *key, FState *&state, FState
{
// this can actually happen by changing the DECORATE so treat it as a warning, not an error.
state = nullptr;
Printf(TEXTCOLOR_ORANGE "Invalid state '%s+%d' for '%s'", cls.GetString(), ndx.GetInt(), key);
Printf(TEXTCOLOR_ORANGE "Invalid state '%s+%d' for '%s'\n", cls.GetString(), ndx.GetInt(), key);
}
}
else
{
assert(false && "not a state");
Printf(TEXTCOLOR_RED "data does not represent a state for '%s'", key);
Printf(TEXTCOLOR_RED "data does not represent a state for '%s'\n", key);
arc.mErrors++;
}
}
else if (!retcode)
{
assert(false && "not an array");
Printf(TEXTCOLOR_RED "array type expected for '%s'", key);
Printf(TEXTCOLOR_RED "array type expected for '%s'\n", key);
arc.mErrors++;
}
}
@ -2028,7 +2030,7 @@ template<> FSerializer &Serialize(FSerializer &arc, const char *key, FStrifeDial
}
else
{
Printf(TEXTCOLOR_RED "integer expected for '%s'", key);
Printf(TEXTCOLOR_RED "integer expected for '%s'\n", key);
arc.mErrors++;
node = nullptr;
}
@ -2077,7 +2079,7 @@ template<> FSerializer &Serialize(FSerializer &arc, const char *key, FString *&p
}
else
{
Printf(TEXTCOLOR_RED "string expected for '%s'", key);
Printf(TEXTCOLOR_RED "string expected for '%s'\n", key);
pstr = nullptr;
arc.mErrors++;
}
@ -2119,7 +2121,7 @@ FSerializer &Serialize(FSerializer &arc, const char *key, FString &pstr, FString
}
else
{
Printf(TEXTCOLOR_RED "string expected for '%s'", key);
Printf(TEXTCOLOR_RED "string expected for '%s'\n", key);
pstr = "";
arc.mErrors++;
}
@ -2168,7 +2170,7 @@ template<> FSerializer &Serialize(FSerializer &arc, const char *key, char *&pstr
}
else
{
Printf(TEXTCOLOR_RED "string expected for '%s'", key);
Printf(TEXTCOLOR_RED "string expected for '%s'\n", key);
pstr = nullptr;
arc.mErrors++;
}

View file

@ -64,6 +64,7 @@ public:
~FSerializer()
{
mErrors = 0; // The destructor may not throw an exception so silence the error checker.
Close();
}
bool OpenWriter(bool pretty = true);