[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