[Scummvm-git-logs] scummvm master -> dffdfba6ade300f13c658e533ba3a203d4cca01e
sev-
noreply at scummvm.org
Thu Jul 20 14:22:16 UTC 2023
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:
dffdfba6ad DIRECOTR: LINGO: Prescan object method names before compiling
Commit: dffdfba6ade300f13c658e533ba3a203d4cca01e
https://github.com/scummvm/scummvm/commit/dffdfba6ade300f13c658e533ba3a203d4cca01e
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2023-07-20T16:21:01+02:00
Commit Message:
DIRECOTR: LINGO: Prescan object method names before compiling
Changed paths:
engines/director/lingo/lingo-codegen.cpp
engines/director/lingo/lingo-codegen.h
engines/director/lingo/lingo-object.h
engines/director/lingo/lingo-preprocessor.cpp
engines/director/lingo/lingo.h
diff --git a/engines/director/lingo/lingo-codegen.cpp b/engines/director/lingo/lingo-codegen.cpp
index 941eeeb337e..c0563f8d0a0 100644
--- a/engines/director/lingo/lingo-codegen.cpp
+++ b/engines/director/lingo/lingo-codegen.cpp
@@ -129,7 +129,12 @@ ScriptContext *LingoCompiler::compileLingo(const Common::U32String &code, LingoA
_hadError = false;
// Preprocess the code for ease of the parser
- Common::String codeNorm = codePreprocessor(code, archive, type, id, preprocFlags).encode(Common::kUtf8);
+ Common::U32String codePrep = codePreprocessor(code, archive, type, id, preprocFlags);
+
+ // Search the methods
+ mainContext->_methodNames = prescanMethods(codePrep);
+
+ Common::String codeNorm = codePrep.encode(Common::kUtf8);
const char *utf8Code = codeNorm.c_str();
// Parse the Lingo and build an AST
diff --git a/engines/director/lingo/lingo-codegen.h b/engines/director/lingo/lingo-codegen.h
index d70192a4f6b..11079b90c02 100644
--- a/engines/director/lingo/lingo-codegen.h
+++ b/engines/director/lingo/lingo-codegen.h
@@ -130,6 +130,7 @@ private:
public:
// lingo-preprocessor.cpp
Common::U32String codePreprocessor(const Common::U32String &code, LingoArchive *archive, ScriptType type, CastMemberID id, uint32 flags);
+ MethodHash prescanMethods(const Common::U32String &code);
// lingo-patcher.cpp
Common::U32String patchLingoCode(const Common::U32String &line, LingoArchive *archive, ScriptType type, CastMemberID id, int linenumber);
diff --git a/engines/director/lingo/lingo-object.h b/engines/director/lingo/lingo-object.h
index 50d2f723a6e..1924813be1e 100644
--- a/engines/director/lingo/lingo-object.h
+++ b/engines/director/lingo/lingo-object.h
@@ -208,6 +208,7 @@ public:
Common::Array<Datum> _constants;
DatumHash _properties;
Common::HashMap<uint32, Datum> _objArray;
+ MethodHash _methodNames;
private:
bool _onlyInLctxContexts = false;
diff --git a/engines/director/lingo/lingo-preprocessor.cpp b/engines/director/lingo/lingo-preprocessor.cpp
index 7e9e48aa946..9e420197036 100644
--- a/engines/director/lingo/lingo-preprocessor.cpp
+++ b/engines/director/lingo/lingo-preprocessor.cpp
@@ -252,4 +252,34 @@ Common::U32String LingoCompiler::codePreprocessor(const Common::U32String &code,
return res;
}
+MethodHash LingoCompiler::prescanMethods(const Common::U32String &code) {
+ const Common::u32char_type_t *s = code.c_str();
+ Common::U32String line, tok;
+ MethodHash res;
+
+ const Common::U32String macro("macro"), on("on"), method("method");
+
+ while (*s) {
+ line.clear();
+
+ // Get next line
+ while (*s && *s != '\n')
+ line += tolower(*s++);
+
+ const Common::u32char_type_t *contLine;
+ tok = nexttok(line.c_str(), &contLine);
+
+ if ((tok.equals(macro) || tok.equals(on) || tok.equals(method)) && *contLine != 0) {
+ Common::U32String methodname = nexttok(contLine);
+
+ res[methodname] = true;
+ }
+
+ if (*s)
+ s++; // Newline symbol
+ }
+
+ return res;
+}
+
} // End of namespace Director
diff --git a/engines/director/lingo/lingo.h b/engines/director/lingo/lingo.h
index 9f78c94023c..ce15eae66c1 100644
--- a/engines/director/lingo/lingo.h
+++ b/engines/director/lingo/lingo.h
@@ -75,6 +75,8 @@ struct FuncDesc {
typedef Common::HashMap<void *, FuncDesc *> FuncHash;
+typedef Common::HashMap<Common::String, bool, Common::IgnoreCase_Hash, Common::IgnoreCase_EqualTo> MethodHash;
+
struct BuiltinProto {
const char *name;
void (*func)(int);
More information about the Scummvm-git-logs
mailing list