- Renamed FxSequence to FxCompoundStatement.

- fixed: The state parser was unable to accept empty anonymous functions, which should be treated as if there is none at all.
This commit is contained in:
Christoph Oelckers 2016-10-19 16:15:02 +02:00
parent 458c68775f
commit 8a6230d64a
5 changed files with 17 additions and 13 deletions

View file

@ -5016,11 +5016,11 @@ ExpEmit FxFlopFunctionCall::Emit(VMFunctionBuilder *build)
//========================================================================== //==========================================================================
// //
// FxSequence :: Resolve // FxCompoundStatement :: Resolve
// //
//========================================================================== //==========================================================================
FxExpression *FxSequence::Resolve(FCompileContext &ctx) FxExpression *FxCompoundStatement::Resolve(FCompileContext &ctx)
{ {
CHECKRESOLVED(); CHECKRESOLVED();
for (unsigned i = 0; i < Expressions.Size(); ++i) for (unsigned i = 0; i < Expressions.Size(); ++i)
@ -5036,11 +5036,11 @@ FxExpression *FxSequence::Resolve(FCompileContext &ctx)
//========================================================================== //==========================================================================
// //
// FxSequence :: Emit // FxCompoundStatement :: Emit
// //
//========================================================================== //==========================================================================
ExpEmit FxSequence::Emit(VMFunctionBuilder *build) ExpEmit FxCompoundStatement::Emit(VMFunctionBuilder *build)
{ {
for (unsigned i = 0; i < Expressions.Size(); ++i) for (unsigned i = 0; i < Expressions.Size(); ++i)
{ {
@ -5053,11 +5053,11 @@ ExpEmit FxSequence::Emit(VMFunctionBuilder *build)
//========================================================================== //==========================================================================
// //
// FxSequence :: GetDirectFunction // FxCompoundStatement :: GetDirectFunction
// //
//========================================================================== //==========================================================================
VMFunction *FxSequence::GetDirectFunction() VMFunction *FxCompoundStatement::GetDirectFunction()
{ {
if (Expressions.Size() == 1) if (Expressions.Size() == 1)
{ {

View file

@ -1079,16 +1079,16 @@ public:
//========================================================================== //==========================================================================
// //
// FxSequence // FxCompoundStatement
// //
//========================================================================== //==========================================================================
class FxSequence : public FxExpression class FxCompoundStatement : public FxExpression
{ {
TDeletingArray<FxExpression *> Expressions; TDeletingArray<FxExpression *> Expressions;
public: public:
FxSequence(const FScriptPosition &pos) : FxExpression(pos) {} FxCompoundStatement(const FScriptPosition &pos) : FxExpression(pos) {}
FxExpression *Resolve(FCompileContext&); FxExpression *Resolve(FCompileContext&);
ExpEmit Emit(VMFunctionBuilder *build); ExpEmit Emit(VMFunctionBuilder *build);
void Add(FxExpression *expr) { if (expr != NULL) Expressions.Push(expr); } void Add(FxExpression *expr) { if (expr != NULL) Expressions.Push(expr); }

View file

@ -314,7 +314,7 @@ do_stop:
ScriptCode = ParseActions(sc, state, statestring, bag, hasfinalret); ScriptCode = ParseActions(sc, state, statestring, bag, hasfinalret);
if (!hasfinalret && ScriptCode != nullptr) if (!hasfinalret && ScriptCode != nullptr)
{ {
static_cast<FxSequence *>(ScriptCode)->Add(new FxReturnStatement(nullptr, sc)); static_cast<FxCompoundStatement *>(ScriptCode)->Add(new FxReturnStatement(nullptr, sc));
} }
goto endofstate; goto endofstate;
} }
@ -474,7 +474,7 @@ FxExpression *ParseActions(FScanner &sc, FState state, FString statestring, Bagg
const FScriptPosition pos(sc); const FScriptPosition pos(sc);
FxSequence *seq = NULL; FxCompoundStatement *seq = NULL;
bool lastwasret = false; bool lastwasret = false;
sc.MustGetString(); sc.MustGetString();
@ -536,7 +536,7 @@ FxExpression *ParseActions(FScanner &sc, FState state, FString statestring, Bagg
{ {
if (seq == NULL) if (seq == NULL)
{ {
seq = new FxSequence(pos); seq = new FxCompoundStatement(pos);
} }
seq->Add(add); seq->Add(add);
} }

View file

@ -528,6 +528,10 @@ state_action(X) ::= LBRACE(T) statement_list(A) scanner_mode RBRACE.
stmt->Content = A; stmt->Content = A;
X = stmt; X = stmt;
} }
state_action(X) ::= LBRACE scanner_mode RBRACE.
{
X = NULL;
}
state_action(X) ::= LBRACE error scanner_mode RBRACE. { X = NULL; } state_action(X) ::= LBRACE error scanner_mode RBRACE. { X = NULL; }
state_action(X) ::= state_call(A) scanner_mode SEMICOLON. { X = A; /*X-overwrites-A*/ } state_action(X) ::= state_call(A) scanner_mode SEMICOLON. { X = A; /*X-overwrites-A*/ }

View file

@ -2087,7 +2087,7 @@ FxExpression *ZCCCompiler::SetupActionFunction(PClassActor *cls, ZCC_TreeNode *a
tcall->Code = ParseActions(sc, state, statestring, bag, hasfinalret); tcall->Code = ParseActions(sc, state, statestring, bag, hasfinalret);
if (!hasfinalret && tcall->Code != nullptr) if (!hasfinalret && tcall->Code != nullptr)
{ {
static_cast<FxSequence *>(tcall->Code)->Add(new FxReturnStatement(nullptr, sc)); static_cast<FxCompoundStatement *>(tcall->Code)->Add(new FxReturnStatement(nullptr, sc));
} }
*/ */