Merge branch 'master' of https://github.com/rheit/zdoom into zscript

# Conflicts:
#	src/scripting/codegeneration/codegen.cpp
This commit is contained in:
Christoph Oelckers 2016-10-18 00:55:56 +02:00
commit 646f9b21c7
12 changed files with 65 additions and 60 deletions

View file

@ -497,7 +497,7 @@ DFsSection *FParser::looping_section()
if(!best || (current->start_index > best->start_index)) if(!best || (current->start_index > best->start_index))
best = current; // save it best = current; // save it
} }
current = current->next; current = current->next;
} }
} }

View file

@ -331,6 +331,10 @@ void FRandom::StaticReadRNGState(FSerializer &arc)
FRandom *rng; FRandom *rng;
arc("rngseed", rngseed); arc("rngseed", rngseed);
// Call StaticClearRandom in order to ensure that SFMT is initialized
FRandom::StaticClearRandom ();
if (arc.BeginArray("rngs")) if (arc.BeginArray("rngs"))
{ {
int count = arc.ArraySize(); int count = arc.ArraySize();

View file

@ -1617,7 +1617,7 @@ void FBehavior::StaticSerializeModuleStates (FSerializer &arc)
{ {
if (arc.isReading()) if (arc.isReading())
{ {
int modnum = arc.ArraySize(); auto modnum = arc.ArraySize();
if (modnum != StaticModules.Size()) if (modnum != StaticModules.Size())
{ {
I_Error("Level was saved with a different number of ACS modules. (Have %d, save has %d)", StaticModules.Size(), modnum); I_Error("Level was saved with a different number of ACS modules. (Have %d, save has %d)", StaticModules.Size(), modnum);
@ -2934,7 +2934,7 @@ void DACSThinker::Serialize(FSerializer &arc)
if (arc.BeginArray("runningscripts")) if (arc.BeginArray("runningscripts"))
{ {
auto cnt = arc.ArraySize(); auto cnt = arc.ArraySize();
for (int i = 0; i < cnt; i++) for (unsigned i = 0; i < cnt; i++)
{ {
SavingRunningscript srs; SavingRunningscript srs;
arc(nullptr, srs); arc(nullptr, srs);

View file

@ -184,7 +184,7 @@ void DCeiling::Tick ()
case DCeiling::ceilLowerAndCrush: case DCeiling::ceilLowerAndCrush:
if (m_CrushMode == ECrushMode::crushSlowdown) if (m_CrushMode == ECrushMode::crushSlowdown)
m_Speed = 1. / 8; m_Speed = 1. / 8;
break; break;
default: default:
break; break;

View file

@ -888,10 +888,10 @@ void G_SerializeLevel(FSerializer &arc, bool hubload)
// deep down in the deserializer or just a crash if the few insufficient safeguards were not triggered. // deep down in the deserializer or just a crash if the few insufficient safeguards were not triggered.
BYTE chk[16] = { 0 }; BYTE chk[16] = { 0 };
arc.Array("checksum", chk, 16); arc.Array("checksum", chk, 16);
if (arc.GetSize("linedefs") != numlines || if (arc.GetSize("linedefs") != (unsigned)numlines ||
arc.GetSize("sidedefs") != numsides || arc.GetSize("sidedefs") != (unsigned)numsides ||
arc.GetSize("sectors") != numsectors || arc.GetSize("sectors") != (unsigned)numsectors ||
arc.GetSize("polyobjs") != po_NumPolyobjs || arc.GetSize("polyobjs") != (unsigned)po_NumPolyobjs ||
memcmp(chk, level.md5, 16)) memcmp(chk, level.md5, 16))
{ {
I_Error("Savegame is from a different level"); I_Error("Savegame is from a different level");

View file

@ -392,7 +392,8 @@ int FZipLump::FillCache()
int FZipLump::GetFileOffset() int FZipLump::GetFileOffset()
{ {
if (Method != METHOD_STORED) return -1; if (Method != METHOD_STORED) return -1;
if (Flags & LUMPFZIP_NEEDFILESTART) SetLumpAddress(); return Position; if (Flags & LUMPFZIP_NEEDFILESTART) SetLumpAddress();
return Position;
} }
//========================================================================== //==========================================================================

View file

@ -1556,7 +1556,7 @@ ExpEmit FxSizeAlign::Emit(VMFunctionBuilder *build)
//========================================================================== //==========================================================================
FxPreIncrDecr::FxPreIncrDecr(FxExpression *base, int token) FxPreIncrDecr::FxPreIncrDecr(FxExpression *base, int token)
: FxExpression(base->ScriptPosition), Base(base), Token(token) : FxExpression(base->ScriptPosition), Token(token), Base(base)
{ {
AddressRequested = false; AddressRequested = false;
AddressWritable = false; AddressWritable = false;
@ -1643,7 +1643,7 @@ ExpEmit FxPreIncrDecr::Emit(VMFunctionBuilder *build)
//========================================================================== //==========================================================================
FxPostIncrDecr::FxPostIncrDecr(FxExpression *base, int token) FxPostIncrDecr::FxPostIncrDecr(FxExpression *base, int token)
: FxExpression(base->ScriptPosition), Base(base), Token(token) : FxExpression(base->ScriptPosition), Token(token), Base(base)
{ {
} }
@ -1890,14 +1890,14 @@ bool FxBinary::ResolveLR(FCompileContext& ctx, bool castnumeric)
} }
else if (left->IsNumeric() && right->IsNumeric()) else if (left->IsNumeric() && right->IsNumeric())
{ {
if (left->ValueType->GetRegType() == REGT_INT && right->ValueType->GetRegType() == REGT_INT) if (left->ValueType->GetRegType() == REGT_INT && right->ValueType->GetRegType() == REGT_INT)
{ {
ValueType = TypeSInt32; ValueType = TypeSInt32;
} }
else else
{ {
ValueType = TypeFloat64; ValueType = TypeFloat64;
} }
} }
else if (left->ValueType->GetRegType() == REGT_POINTER && left->ValueType == right->ValueType) else if (left->ValueType->GetRegType() == REGT_POINTER && left->ValueType == right->ValueType)
{ {
@ -3915,9 +3915,9 @@ FxExpression *FxIdentifier::Resolve(FCompileContext& ctx)
} }
} }
} }
ScriptPosition.Message(MSG_DEBUGLOG, "Resolving name '%s' as member variable, index %d\n", Identifier.GetChars(), vsym->Offset); ScriptPosition.Message(MSG_DEBUGLOG, "Resolving name '%s' as member variable, index %d\n", Identifier.GetChars(), vsym->Offset);
newex = new FxClassMember((new FxSelf(ScriptPosition))->Resolve(ctx), vsym, ScriptPosition); newex = new FxClassMember((new FxSelf(ScriptPosition))->Resolve(ctx), vsym, ScriptPosition);
} }
} }
else else
{ {
@ -4816,28 +4816,28 @@ ExpEmit FxVMFunctionCall::Emit(VMFunctionBuilder *build)
// If both functions are non-action or both are action, there is no need for special treatment. // If both functions are non-action or both are action, there is no need for special treatment.
if (!OwnerIsSelf || (!!(Function->Variants[0].Flags & VARF_Action) == build->IsActionFunc)) if (!OwnerIsSelf || (!!(Function->Variants[0].Flags & VARF_Action) == build->IsActionFunc))
{ {
// Emit code to pass implied parameters // Emit code to pass implied parameters
if (Function->Variants[0].Flags & VARF_Method) if (Function->Variants[0].Flags & VARF_Method)
{ {
build->Emit(OP_PARAM, 0, REGT_POINTER, 0); build->Emit(OP_PARAM, 0, REGT_POINTER, 0);
count += 1; count += 1;
} }
if (Function->Variants[0].Flags & VARF_Action) if (Function->Variants[0].Flags & VARF_Action)
{
static_assert(NAP == 3, "This code needs to be updated if NAP changes");
if (build->IsActionFunc)
{ {
static_assert(NAP == 3, "This code needs to be updated if NAP changes"); build->Emit(OP_PARAM, 0, REGT_POINTER, 1);
if (build->IsActionFunc) build->Emit(OP_PARAM, 0, REGT_POINTER, 2);
{
build->Emit(OP_PARAM, 0, REGT_POINTER, 1);
build->Emit(OP_PARAM, 0, REGT_POINTER, 2);
}
else
{
int null = build->GetConstantAddress(nullptr, ATAG_GENERIC);
build->Emit(OP_PARAM, 0, REGT_POINTER | REGT_KONST, null);
build->Emit(OP_PARAM, 0, REGT_POINTER | REGT_KONST, null);
}
count += 2;
} }
else
{
int null = build->GetConstantAddress(nullptr, ATAG_GENERIC);
build->Emit(OP_PARAM, 0, REGT_POINTER | REGT_KONST, null);
build->Emit(OP_PARAM, 0, REGT_POINTER | REGT_KONST, null);
}
count += 2;
}
} }
else else
{ {
@ -5869,18 +5869,18 @@ static bool VerifyJumpTarget(AActor *stateowner, FStateParamInfo *stateinfo, int
if (stateinfo->mCallingState != nullptr) if (stateinfo->mCallingState != nullptr)
{ {
while (cls != RUNTIME_CLASS(AActor)) while (cls != RUNTIME_CLASS(AActor))
{
// both calling and target state need to belong to the same class.
if (cls->OwnsState(stateinfo->mCallingState))
{ {
// both calling and target state need to belong to the same class. return cls->OwnsState(stateinfo->mCallingState + index);
if (cls->OwnsState(stateinfo->mCallingState))
{
return cls->OwnsState(stateinfo->mCallingState + index);
}
// We can safely assume the ParentClass is of type PClassActor
// since we stop when we see the Actor base class.
cls = static_cast<PClassActor *>(cls->ParentClass);
} }
// We can safely assume the ParentClass is of type PClassActor
// since we stop when we see the Actor base class.
cls = static_cast<PClassActor *>(cls->ParentClass);
}
} }
return false; return false;
} }

View file

@ -382,7 +382,7 @@ void FSerializer::Close()
// //
//========================================================================== //==========================================================================
int FSerializer::ArraySize() unsigned FSerializer::ArraySize()
{ {
if (r != nullptr && r->mObjects.Last().mObject->IsArray()) if (r != nullptr && r->mObjects.Last().mObject->IsArray())
{ {
@ -710,7 +710,7 @@ FSerializer &FSerializer::Sprite(const char *key, int32_t &spritenum, int32_t *d
{ {
if (val->IsString()) if (val->IsString())
{ {
int name = *reinterpret_cast<const int*>(val->GetString()); uint32_t name = *reinterpret_cast<const uint32_t*>(val->GetString());
for (auto hint = NumStdSprites; hint-- != 0; ) for (auto hint = NumStdSprites; hint-- != 0; )
{ {
if (sprites[hint].dwName == name) if (sprites[hint].dwName == name)

View file

@ -60,7 +60,7 @@ public:
FWriter *w = nullptr; FWriter *w = nullptr;
FReader *r = nullptr; FReader *r = nullptr;
int ArraySize(); unsigned ArraySize();
void WriteKey(const char *key); void WriteKey(const char *key);
void WriteObjects(); void WriteObjects();

View file

@ -145,8 +145,8 @@ HMISong::HMISong (FileReader &reader, EMidiDevice type, const char *args)
MusHeader = new BYTE[len]; MusHeader = new BYTE[len];
SongLen = len; SongLen = len;
NumTracks = 0; NumTracks = 0;
if (reader.Read(MusHeader, len) != len) if (reader.Read(MusHeader, len) != len)
return; return;
// Do some validation of the MIDI file // Do some validation of the MIDI file
if (memcmp(MusHeader, HMI_SONG_MAGIC, sizeof(HMI_SONG_MAGIC)) == 0) if (memcmp(MusHeader, HMI_SONG_MAGIC, sizeof(HMI_SONG_MAGIC)) == 0)

View file

@ -114,10 +114,10 @@ MIDISong2::MIDISong2 (FileReader &reader, EMidiDevice type, const char *args)
return; return;
} }
#endif #endif
SongLen = reader.GetLength(); SongLen = reader.GetLength();
MusHeader = new BYTE[SongLen]; MusHeader = new BYTE[SongLen];
if (reader.Read(MusHeader, SongLen) != SongLen) if (reader.Read(MusHeader, SongLen) != SongLen)
return; return;
// Do some validation of the MIDI file // Do some validation of the MIDI file
if (MusHeader[4] != 0 || MusHeader[5] != 0 || MusHeader[6] != 0 || MusHeader[7] != 6) if (MusHeader[4] != 0 || MusHeader[5] != 0 || MusHeader[6] != 0 || MusHeader[7] != 6)

View file

@ -117,10 +117,10 @@ XMISong::XMISong (FileReader &reader, EMidiDevice type, const char *args)
return; return;
} }
#endif #endif
SongLen = reader.GetLength(); SongLen = reader.GetLength();
MusHeader = new BYTE[SongLen]; MusHeader = new BYTE[SongLen];
if (reader.Read(MusHeader, SongLen) != SongLen) if (reader.Read(MusHeader, SongLen) != SongLen)
return; return;
// Find all the songs in this file. // Find all the songs in this file.
NumSongs = FindXMIDforms(MusHeader, SongLen, NULL); NumSongs = FindXMIDforms(MusHeader, SongLen, NULL);