[Scummvm-git-logs] scummvm master -> ccf0e5b1964656228b5476188d312e3b757d0b4f
sev-
noreply at scummvm.org
Wed May 29 20:51:44 UTC 2024
This automated email contains information about 1 new commit which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .
Summary:
ccf0e5b196 DIRECTOR: LINGO: Save AST when compiling Lingo and store start/end of each node
Commit: ccf0e5b1964656228b5476188d312e3b757d0b4f
https://github.com/scummvm/scummvm/commit/ccf0e5b1964656228b5476188d312e3b757d0b4f
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2024-05-29T22:51:30+02:00
Commit Message:
DIRECTOR: LINGO: Save AST when compiling Lingo and store start/end of each node
Changed paths:
engines/director/lingo/lingo-ast.h
engines/director/lingo/lingo-codegen.cpp
engines/director/lingo/lingo-object.cpp
engines/director/lingo/lingo-object.h
diff --git a/engines/director/lingo/lingo-ast.h b/engines/director/lingo/lingo-ast.h
index b5bbf1044a5..d640cbc3fe6 100644
--- a/engines/director/lingo/lingo-ast.h
+++ b/engines/director/lingo/lingo-ast.h
@@ -222,10 +222,15 @@ struct Node {
bool isExpression;
bool isStatement;
bool isLoop;
+ uint32 startOffset;
+ uint32 endOffset;
- Node(NodeType t) : type(t), isExpression(false), isStatement(false), isLoop(false) {}
+ Node(NodeType t) : type(t), isExpression(false), isStatement(false), isLoop(false), startOffset(0), endOffset(0) {}
virtual ~Node() {}
virtual bool accept(NodeVisitor *visitor) = 0;
+
+ void storeStart();
+ void storeEnd();
};
/* ExprNode */
@@ -268,7 +273,10 @@ struct ScriptNode : Node {
deleteList(children);
}
virtual bool accept(NodeVisitor *visitor) {
- return visitor->visitScriptNode(this);
+ storeStart();
+ bool res = visitor->visitScriptNode(this);
+ storeEnd();
+ return res;
}
};
@@ -285,7 +293,10 @@ struct FactoryNode : Node {
deleteList(methods);
}
virtual bool accept(NodeVisitor *visitor) {
- return visitor->visitFactoryNode(this);
+ storeStart();
+ bool res = visitor->visitFactoryNode(this);
+ storeEnd();
+ return res;
}
};
@@ -304,7 +315,10 @@ struct HandlerNode : Node {
deleteList(stmts);
}
virtual bool accept(NodeVisitor *visitor) {
- return visitor->visitHandlerNode(this);
+ storeStart();
+ bool res = visitor->visitHandlerNode(this);
+ storeEnd();
+ return res;
}
};
@@ -322,7 +336,10 @@ struct CmdNode : StmtNode {
deleteList(args);
}
virtual bool accept(NodeVisitor *visitor) {
- return visitor->visitCmdNode(this);
+ storeStart();
+ bool res = visitor->visitCmdNode(this);
+ storeEnd();
+ return res;
}
};
@@ -339,7 +356,10 @@ struct PutIntoNode : StmtNode {
delete var;
}
virtual bool accept(NodeVisitor *visitor) {
- return visitor->visitPutIntoNode(this);
+ storeStart();
+ bool res = visitor->visitPutIntoNode(this);
+ storeEnd();
+ return res;
}
};
@@ -356,7 +376,10 @@ struct PutAfterNode : StmtNode {
delete var;
}
virtual bool accept(NodeVisitor *visitor) {
- return visitor->visitPutAfterNode(this);
+ storeStart();
+ bool res = visitor->visitPutAfterNode(this);
+ storeEnd();
+ return res;
}
};
@@ -373,7 +396,10 @@ struct PutBeforeNode : StmtNode {
delete var;
}
virtual bool accept(NodeVisitor *visitor) {
- return visitor->visitPutBeforeNode(this);
+ storeStart();
+ bool res = visitor->visitPutBeforeNode(this);
+ storeEnd();
+ return res;
}
};
@@ -390,7 +416,10 @@ struct SetNode : StmtNode {
delete val;
}
virtual bool accept(NodeVisitor *visitor) {
- return visitor->visitSetNode(this);
+ storeStart();
+ bool res = visitor->visitSetNode(this);
+ storeEnd();
+ return res;
}
};
@@ -404,7 +433,10 @@ struct GlobalNode : StmtNode {
deleteList(names);
}
virtual bool accept(NodeVisitor *visitor) {
- return visitor->visitGlobalNode(this);
+ storeStart();
+ bool res = visitor->visitGlobalNode(this);
+ storeEnd();
+ return res;
}
};
@@ -418,7 +450,10 @@ struct PropertyNode : StmtNode {
deleteList(names);
}
virtual bool accept(NodeVisitor *visitor) {
- return visitor->visitPropertyNode(this);
+ storeStart();
+ bool res = visitor->visitPropertyNode(this);
+ storeEnd();
+ return res;
}
};
@@ -432,7 +467,10 @@ struct InstanceNode : StmtNode {
deleteList(names);
}
virtual bool accept(NodeVisitor *visitor) {
- return visitor->visitInstanceNode(this);
+ storeStart();
+ bool res = visitor->visitInstanceNode(this);
+ storeEnd();
+ return res;
}
};
@@ -449,7 +487,10 @@ struct IfStmtNode : StmtNode {
deleteList(stmts);
}
virtual bool accept(NodeVisitor *visitor) {
- return visitor->visitIfStmtNode(this);
+ storeStart();
+ bool res = visitor->visitIfStmtNode(this);
+ storeEnd();
+ return res;
}
};
@@ -468,7 +509,10 @@ struct IfElseStmtNode : StmtNode {
deleteList(stmts2);
}
virtual bool accept(NodeVisitor *visitor) {
- return visitor->visitIfElseStmtNode(this);
+ storeStart();
+ bool res = visitor->visitIfElseStmtNode(this);
+ storeEnd();
+ return res;
}
};
@@ -485,7 +529,10 @@ struct RepeatWhileNode : LoopNode {
deleteList(stmts);
}
virtual bool accept(NodeVisitor *visitor) {
- return visitor->visitRepeatWhileNode(this);
+ storeStart();
+ bool res = visitor->visitRepeatWhileNode(this);
+ storeEnd();
+ return res;
}
};
@@ -507,7 +554,10 @@ struct RepeatWithToNode : LoopNode {
deleteList(stmts);
}
virtual bool accept(NodeVisitor *visitor) {
- return visitor->visitRepeatWithToNode(this);
+ storeStart();
+ bool res = visitor->visitRepeatWithToNode(this);
+ storeEnd();
+ return res;
}
};
@@ -526,7 +576,10 @@ struct RepeatWithInNode : LoopNode {
deleteList(stmts);
}
virtual bool accept(NodeVisitor *visitor) {
- return visitor->visitRepeatWithInNode(this);
+ storeStart();
+ bool res = visitor->visitRepeatWithInNode(this);
+ storeEnd();
+ return res;
}
};
@@ -536,7 +589,10 @@ struct NextRepeatNode : StmtNode {
NextRepeatNode() : StmtNode(kNextRepeatNode) {}
virtual ~NextRepeatNode() {}
virtual bool accept(NodeVisitor *visitor) {
- return visitor->visitNextRepeatNode(this);
+ storeStart();
+ bool res = visitor->visitNextRepeatNode(this);
+ storeEnd();
+ return res;
}
};
@@ -546,7 +602,10 @@ struct ExitRepeatNode : StmtNode {
ExitRepeatNode() : StmtNode(kExitRepeatNode) {}
virtual ~ExitRepeatNode() {}
virtual bool accept(NodeVisitor *visitor) {
- return visitor->visitExitRepeatNode(this);
+ storeStart();
+ bool res = visitor->visitExitRepeatNode(this);
+ storeEnd();
+ return res;
}
};
@@ -556,7 +615,10 @@ struct ExitNode : StmtNode {
ExitNode() : StmtNode(kExitNode) {}
virtual ~ExitNode() {}
virtual bool accept(NodeVisitor *visitor) {
- return visitor->visitExitNode(this);
+ storeStart();
+ bool res = visitor->visitExitNode(this);
+ storeEnd();
+ return res;
}
};
@@ -570,7 +632,10 @@ struct ReturnNode : StmtNode {
delete expr;
}
virtual bool accept(NodeVisitor *visitor) {
- return visitor->visitReturnNode(this);
+ storeStart();
+ bool res = visitor->visitReturnNode(this);
+ storeEnd();
+ return res;
}
};
@@ -588,7 +653,10 @@ struct TellNode : StmtNode {
deleteList(stmts);
}
virtual bool accept(NodeVisitor *visitor) {
- return visitor->visitTellNode(this);
+ storeStart();
+ bool res = visitor->visitTellNode(this);
+ storeEnd();
+ return res;
}
};
@@ -605,7 +673,10 @@ struct WhenNode : StmtNode {
delete code;
}
virtual bool accept(NodeVisitor *visitor) {
- return visitor->visitWhenNode(this);
+ storeStart();
+ bool res = visitor->visitWhenNode(this);
+ storeEnd();
+ return res;
}
};
@@ -619,7 +690,10 @@ struct DeleteNode : StmtNode {
delete chunk;
}
virtual bool accept(NodeVisitor *visitor) {
- return visitor->visitDeleteNode(this);
+ storeStart();
+ bool res = visitor->visitDeleteNode(this);
+ storeEnd();
+ return res;
}
};
@@ -633,7 +707,10 @@ struct HiliteNode : StmtNode {
delete chunk;
}
virtual bool accept(NodeVisitor *visitor) {
- return visitor->visitHiliteNode(this);
+ storeStart();
+ bool res = visitor->visitHiliteNode(this);
+ storeEnd();
+ return res;
}
};
@@ -647,7 +724,10 @@ struct AssertErrorNode : StmtNode {
delete stmt;
}
virtual bool accept(NodeVisitor *visitor) {
- return visitor->visitAssertErrorNode(this);
+ storeStart();
+ bool res = visitor->visitAssertErrorNode(this);
+ storeEnd();
+ return res;
}
};
@@ -659,7 +739,10 @@ struct IntNode : ExprNode {
IntNode(int valIn) : ExprNode(kIntNode), val(valIn) {}
virtual ~IntNode() {}
virtual bool accept(NodeVisitor *visitor) {
- return visitor->visitIntNode(this);
+ storeStart();
+ bool res = visitor->visitIntNode(this);
+ storeEnd();
+ return res;
}
};
@@ -671,7 +754,10 @@ struct FloatNode : ExprNode {
FloatNode(double valIn) : ExprNode(kFloatNode), val(valIn) {}
virtual ~FloatNode() {}
virtual bool accept(NodeVisitor *visitor) {
- return visitor->visitFloatNode(this);
+ storeStart();
+ bool res = visitor->visitFloatNode(this);
+ storeEnd();
+ return res;
}
};
@@ -685,7 +771,10 @@ struct SymbolNode : ExprNode {
delete val;
}
virtual bool accept(NodeVisitor *visitor) {
- return visitor->visitSymbolNode(this);
+ storeStart();
+ bool res = visitor->visitSymbolNode(this);
+ storeEnd();
+ return res;
}
};
@@ -699,7 +788,10 @@ struct StringNode : ExprNode {
delete val;
}
virtual bool accept(NodeVisitor *visitor) {
- return visitor->visitStringNode(this);
+ storeStart();
+ bool res = visitor->visitStringNode(this);
+ storeEnd();
+ return res;
}
};
@@ -713,7 +805,10 @@ struct ListNode : ExprNode {
deleteList(items);
}
virtual bool accept(NodeVisitor *visitor) {
- return visitor->visitListNode(this);
+ storeStart();
+ bool res = visitor->visitListNode(this);
+ storeEnd();
+ return res;
}
};
@@ -727,7 +822,10 @@ struct PropListNode : ExprNode {
deleteList(items);
}
virtual bool accept(NodeVisitor *visitor) {
- return visitor->visitPropListNode(this);
+ storeStart();
+ bool res = visitor->visitPropListNode(this);
+ storeEnd();
+ return res;
}
};
@@ -744,7 +842,10 @@ struct PropPairNode : ExprNode {
delete val;
}
virtual bool accept(NodeVisitor *visitor) {
- return visitor->visitPropPairNode(this);
+ storeStart();
+ bool res = visitor->visitPropPairNode(this);
+ storeEnd();
+ return res;
}
};
@@ -761,7 +862,10 @@ struct FuncNode : ExprNode {
deleteList(args);
}
virtual bool accept(NodeVisitor *visitor) {
- return visitor->visitFuncNode(this);
+ storeStart();
+ bool res = visitor->visitFuncNode(this);
+ storeEnd();
+ return res;
}
};
@@ -775,7 +879,10 @@ struct VarNode : ExprNode {
delete name;
}
virtual bool accept(NodeVisitor *visitor) {
- return visitor->visitVarNode(this);
+ storeStart();
+ bool res = visitor->visitVarNode(this);
+ storeEnd();
+ return res;
}
};
@@ -789,7 +896,10 @@ struct ParensNode : ExprNode {
delete expr;
}
virtual bool accept(NodeVisitor *visitor) {
- return visitor->visitParensNode(this);
+ storeStart();
+ bool res = visitor->visitParensNode(this);
+ storeEnd();
+ return res;
}
};
@@ -804,7 +914,10 @@ struct UnaryOpNode : ExprNode {
delete arg;
}
virtual bool accept(NodeVisitor *visitor) {
- return visitor->visitUnaryOpNode(this);
+ storeStart();
+ bool res = visitor->visitUnaryOpNode(this);
+ storeEnd();
+ return res;
}
};
@@ -821,7 +934,10 @@ struct BinaryOpNode : ExprNode {
delete b;
}
virtual bool accept(NodeVisitor *visitor) {
- return visitor->visitBinaryOpNode(this);
+ storeStart();
+ bool res = visitor->visitBinaryOpNode(this);
+ storeEnd();
+ return res;
}
};
@@ -835,7 +951,10 @@ struct FrameNode : ExprNode {
delete arg;
}
virtual bool accept(NodeVisitor *visitor) {
- return visitor->visitFrameNode(this);
+ storeStart();
+ bool res = visitor->visitFrameNode(this);
+ storeEnd();
+ return res;
}
};
@@ -849,7 +968,10 @@ struct MovieNode : ExprNode {
delete arg;
}
virtual bool accept(NodeVisitor *visitor) {
- return visitor->visitMovieNode(this);
+ storeStart();
+ bool res = visitor->visitMovieNode(this);
+ storeEnd();
+ return res;
}
};
@@ -866,7 +988,10 @@ struct IntersectsNode : ExprNode {
delete sprite2;
}
virtual bool accept(NodeVisitor *visitor) {
- return visitor->visitIntersectsNode(this);
+ storeStart();
+ bool res = visitor->visitIntersectsNode(this);
+ storeEnd();
+ return res;
}
};
@@ -883,7 +1008,10 @@ struct WithinNode : ExprNode {
delete sprite2;
}
virtual bool accept(NodeVisitor *visitor) {
- return visitor->visitWithinNode(this);
+ storeStart();
+ bool res = visitor->visitWithinNode(this);
+ storeEnd();
+ return res;
}
};
@@ -897,7 +1025,10 @@ struct TheNode : ExprNode {
delete prop;
}
virtual bool accept(NodeVisitor *visitor) {
- return visitor->visitTheNode(this);
+ storeStart();
+ bool res = visitor->visitTheNode(this);
+ storeEnd();
+ return res;
}
};
@@ -914,7 +1045,10 @@ struct TheOfNode : ExprNode {
delete obj;
}
virtual bool accept(NodeVisitor *visitor) {
- return visitor->visitTheOfNode(this);
+ storeStart();
+ bool res = visitor->visitTheOfNode(this);
+ storeEnd();
+ return res;
}
};
@@ -930,7 +1064,10 @@ struct TheNumberOfNode : ExprNode {
delete arg;
}
virtual bool accept(NodeVisitor *visitor) {
- return visitor->visitTheNumberOfNode(this);
+ storeStart();
+ bool res = visitor->visitTheNumberOfNode(this);
+ storeEnd();
+ return res;
}
};
@@ -946,7 +1083,10 @@ struct TheLastNode : ExprNode {
delete arg;
}
virtual bool accept(NodeVisitor *visitor) {
- return visitor->visitTheLastNode(this);
+ storeStart();
+ bool res = visitor->visitTheLastNode(this);
+ storeEnd();
+ return res;
}
};
@@ -960,7 +1100,10 @@ struct TheDateTimeNode : ExprNode {
: ExprNode(kTheDateTimeNode), field(fieldIn), entity(entityIn) {}
virtual ~TheDateTimeNode() {}
virtual bool accept(NodeVisitor *visitor) {
- return visitor->visitTheDateTimeNode(this);
+ storeStart();
+ bool res = visitor->visitTheDateTimeNode(this);
+ storeEnd();
+ return res;
}
};
@@ -974,7 +1117,10 @@ struct MenuNode : ExprNode {
delete arg;
}
virtual bool accept(NodeVisitor *visitor) {
- return visitor->visitMenuNode(this);
+ storeStart();
+ bool res = visitor->visitMenuNode(this);
+ storeEnd();
+ return res;
}
};
@@ -991,7 +1137,10 @@ struct MenuItemNode : ExprNode {
delete arg2;
}
virtual bool accept(NodeVisitor *visitor) {
- return visitor->visitMenuItemNode(this);
+ storeStart();
+ bool res = visitor->visitMenuItemNode(this);
+ storeEnd();
+ return res;
}
};
@@ -1005,7 +1154,10 @@ struct SoundNode : ExprNode {
delete arg;
}
virtual bool accept(NodeVisitor *visitor) {
- return visitor->visitSoundNode(this);
+ storeStart();
+ bool res = visitor->visitSoundNode(this);
+ storeEnd();
+ return res;
}
};
@@ -1019,7 +1171,10 @@ struct SpriteNode : ExprNode {
delete arg;
}
virtual bool accept(NodeVisitor *visitor) {
- return visitor->visitSpriteNode(this);
+ storeStart();
+ bool res = visitor->visitSpriteNode(this);
+ storeEnd();
+ return res;
}
};
@@ -1039,7 +1194,10 @@ struct ChunkExprNode : ExprNode {
delete src;
}
virtual bool accept(NodeVisitor *visitor) {
- return visitor->visitChunkExprNode(this);
+ storeStart();
+ bool res = visitor->visitChunkExprNode(this);
+ storeEnd();
+ return res;
}
};
diff --git a/engines/director/lingo/lingo-codegen.cpp b/engines/director/lingo/lingo-codegen.cpp
index 9e826671a12..fb2c3f575d9 100644
--- a/engines/director/lingo/lingo-codegen.cpp
+++ b/engines/director/lingo/lingo-codegen.cpp
@@ -90,6 +90,14 @@ namespace Director {
return false; \
}
+void Node::storeStart() {
+ startOffset = g_lingo->_compiler->_currentAssembly->size() - 1;
+}
+
+void Node::storeEnd() {
+ endOffset = g_lingo->_compiler->_currentAssembly->size() - 1;
+}
+
LingoCompiler::LingoCompiler() {
_assemblyAST = nullptr;
_assemblyArchive = nullptr;
@@ -248,7 +256,12 @@ ScriptContext *LingoCompiler::compileLingo(const Common::U32String &code, LingoA
delete _methodVars;
_methodVars = nullptr;
_currentAssembly = nullptr;
- delete _assemblyAST;
+
+ if (debugChannelSet(-1, kDebugImGui)) {
+ _assemblyContext->_assemblyAST = _assemblyAST;
+ } else {
+ delete _assemblyAST;
+ }
_assemblyAST = nullptr;
_assemblyContext = nullptr;
_assemblyArchive = nullptr;
diff --git a/engines/director/lingo/lingo-object.cpp b/engines/director/lingo/lingo-object.cpp
index 490099b4634..53737a63a4c 100644
--- a/engines/director/lingo/lingo-object.cpp
+++ b/engines/director/lingo/lingo-object.cpp
@@ -26,6 +26,7 @@
#include "director/director.h"
#include "director/movie.h"
#include "director/window.h"
+#include "director/lingo/lingo-ast.h"
#include "director/lingo/lingo-code.h"
#include "director/lingo/lingo-the.h"
@@ -423,7 +424,9 @@ ScriptContext::ScriptContext(const ScriptContext &sc) : Object<ScriptContext>(sc
_id = sc._id;
}
-ScriptContext::~ScriptContext() {}
+ScriptContext::~ScriptContext() {
+ delete _assemblyAST;
+}
Common::String ScriptContext::asString() {
return Common::String::format("script: %d \"%s\" %d %p", _id, _name.c_str(), _inheritanceLevel, (void *)this);
diff --git a/engines/director/lingo/lingo-object.h b/engines/director/lingo/lingo-object.h
index f0c7547b0d3..47bfb69dffa 100644
--- a/engines/director/lingo/lingo-object.h
+++ b/engines/director/lingo/lingo-object.h
@@ -216,6 +216,7 @@ public:
Common::Array<Datum> _constants;
Common::HashMap<uint32, Datum> _objArray;
MethodHash _methodNames;
+ Node *_assemblyAST = nullptr; // Optionally contains AST when we compile Lingo
private:
DatumHash _properties;
More information about the Scummvm-git-logs
mailing list