[Scummvm-git-logs] scummvm master -> 531b93b2a24f5addeab1f561416aaf152bc2b585

djsrv dservilla at gmail.com
Mon Jun 22 19:52:30 UTC 2020


This automated email contains information about 2 new commits which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .

Summary:
624c8616d2 DIRECTOR: LINGO: Clean up script creation
531b93b2a2 DIRECTOR: LINGO: Destroy anonymous context on pop


Commit: 624c8616d2958ad576f6ab065db6b8ba3de88f6e
    https://github.com/scummvm/scummvm/commit/624c8616d2958ad576f6ab065db6b8ba3de88f6e
Author: djsrv (dservilla at gmail.com)
Date: 2020-06-22T15:51:29-04:00

Commit Message:
DIRECTOR: LINGO: Clean up script creation

Changed paths:
    engines/director/lingo/lingo-builtins.cpp
    engines/director/lingo/lingo-bytecode.cpp
    engines/director/lingo/lingo.cpp
    engines/director/lingo/lingo.h


diff --git a/engines/director/lingo/lingo-builtins.cpp b/engines/director/lingo/lingo-builtins.cpp
index cc641a10b7..fac5d015d5 100644
--- a/engines/director/lingo/lingo-builtins.cpp
+++ b/engines/director/lingo/lingo-builtins.cpp
@@ -518,7 +518,7 @@ void LB::b_value(int nargs) {
 	}
 	Common::String code = "scummvm_returnNumber " + expr;
 	// Compile the code to an anonymous function and call it
-	ScriptContext *sc = g_lingo->addCode(code.c_str(), kArchNone, kNoneScript, 0);
+	ScriptContext *sc = g_lingo->compileAnonymous(code.c_str());
 	Symbol sym = sc->_eventHandlers[kEventNone];
 	LC::call(sym, 0);
 	delete sc;
diff --git a/engines/director/lingo/lingo-bytecode.cpp b/engines/director/lingo/lingo-bytecode.cpp
index 5603361486..bbeac422cb 100644
--- a/engines/director/lingo/lingo-bytecode.cpp
+++ b/engines/director/lingo/lingo-bytecode.cpp
@@ -763,7 +763,7 @@ void LC::cb_zeropush() {
 	g_lingo->push(d);
 }
 
-void Lingo::addCodeV4(Common::SeekableSubReadStreamEndian &stream, int archiveIndex, ScriptType type, uint16 id, Common::String &scriptName, Common::String &archName) {
+void Lingo::addCodeV4(Common::SeekableSubReadStreamEndian &stream, int archiveIndex, ScriptType type, uint16 id, const Common::String &scriptName, Common::String &archName) {
 	debugC(1, kDebugCompile, "Add V4 bytecode for type %s with id %d", scriptType2str(type), id);
 
 	if (getScriptContext(archiveIndex, type, id)) {
diff --git a/engines/director/lingo/lingo.cpp b/engines/director/lingo/lingo.cpp
index b05f755341..883d5ae0b0 100644
--- a/engines/director/lingo/lingo.cpp
+++ b/engines/director/lingo/lingo.cpp
@@ -258,7 +258,12 @@ const char *Lingo::findNextDefinition(const char *s) {
 	return NULL;
 }
 
-ScriptContext *Lingo::addCode(const char *code, int archiveIndex, ScriptType type, uint16 id, const char *scriptName) {
+void Lingo::addCode(const char *code, int archiveIndex, ScriptType type, uint16 id, const char *scriptName) {
+	if (_archiveIndex < 0) {
+		warning("Lingo::addCode(): Invalid archiveIndex");
+		return;
+	}
+
 	debugC(1, kDebugCompile, "Add code for type %s(%d) with id %d\n"
 			"***********\n%s\n\n***********", scriptType2str(type), type, id, code);
 
@@ -274,12 +279,22 @@ ScriptContext *Lingo::addCode(const char *code, int archiveIndex, ScriptType typ
 		contextName = Common::String(scriptName);
 	else
 		contextName = Common::String::format("%d", id);
+	
+	ScriptContext *sc = compileLingo(code, archiveIndex, type, id, contextName);
+	_archives[_assemblyArchive].scriptContexts[type][id] = sc;
+}
+
+ScriptContext *Lingo::compileAnonymous(const char *code) {
+	debugC(1, kDebugCompile, "Compiling anonymous lingo\n"
+			"***********\n%s\n\n***********", code);
+	
+	return compileLingo(code, kArchNone, kNoneScript, 0, "[anonymous]");
+}
 
+ScriptContext *Lingo::compileLingo(const char *code, int archiveIndex, ScriptType type, uint16 id, const Common::String &scriptName) {
 	_assemblyArchive = archiveIndex;
-	ScriptContext *sc = _assemblyContext = new ScriptContext(type, contextName);
+	ScriptContext *sc = _assemblyContext = new ScriptContext(type, scriptName);
 	_currentAssembly = new ScriptData;
-	if (archiveIndex >= 0)
-		_archives[_assemblyArchive].scriptContexts[type][id] = _assemblyContext;
 
 	_methodVars = new VarTypeHash;
 	_linenumber = _colnumber = 1;
diff --git a/engines/director/lingo/lingo.h b/engines/director/lingo/lingo.h
index 328440df38..eb91a1e102 100644
--- a/engines/director/lingo/lingo.h
+++ b/engines/director/lingo/lingo.h
@@ -330,8 +330,9 @@ public:
 
 	void restartLingo(bool keepSharedCast);
 
-	ScriptContext *addCode(const char *code, int archiveIndex, ScriptType type, uint16 id, const char *scriptName = nullptr);
-	void addCodeV4(Common::SeekableSubReadStreamEndian &stream, int archiveIndex, ScriptType type, uint16 id, Common::String &scriptName, Common::String &archName);
+	void addCode(const char *code, int archiveIndex, ScriptType type, uint16 id, const char *scriptName = nullptr);
+	ScriptContext *compileAnonymous(const char *code);
+	void addCodeV4(Common::SeekableSubReadStreamEndian &stream, int archiveIndex, ScriptType type, uint16 id, const Common::String &scriptName, Common::String &archName);
 	void addNamesV4(Common::SeekableSubReadStreamEndian &stream, int archiveIndex);
 	void executeHandler(const Common::String &name);
 	void executeScript(ScriptType type, uint16 id);
@@ -358,6 +359,7 @@ public:
 
 	// lingo.cpp
 private:
+	ScriptContext *compileLingo(const char *code, int archiveIndex, ScriptType type, uint16 id, const Common::String &scriptName);
 	const char *findNextDefinition(const char *s);
 
 	// lingo-events.cpp


Commit: 531b93b2a24f5addeab1f561416aaf152bc2b585
    https://github.com/scummvm/scummvm/commit/531b93b2a24f5addeab1f561416aaf152bc2b585
Author: djsrv (dservilla at gmail.com)
Date: 2020-06-22T15:51:29-04:00

Commit Message:
DIRECTOR: LINGO: Destroy anonymous context on pop

Changed paths:
    engines/director/lingo/lingo-builtins.cpp
    engines/director/lingo/lingo-code.cpp


diff --git a/engines/director/lingo/lingo-builtins.cpp b/engines/director/lingo/lingo-builtins.cpp
index fac5d015d5..87b896078e 100644
--- a/engines/director/lingo/lingo-builtins.cpp
+++ b/engines/director/lingo/lingo-builtins.cpp
@@ -521,7 +521,6 @@ void LB::b_value(int nargs) {
 	ScriptContext *sc = g_lingo->compileAnonymous(code.c_str());
 	Symbol sym = sc->_eventHandlers[kEventNone];
 	LC::call(sym, 0);
-	delete sc;
 }
 
 ///////////////////
diff --git a/engines/director/lingo/lingo-code.cpp b/engines/director/lingo/lingo-code.cpp
index e1d6755e6c..712521d2d0 100644
--- a/engines/director/lingo/lingo-code.cpp
+++ b/engines/director/lingo/lingo-code.cpp
@@ -240,6 +240,11 @@ void Lingo::popContext() {
 	CFrame *fp = g_lingo->_callstack.back();
 	g_lingo->_callstack.pop_back();
 
+	// Destroy anonymous context
+	if (g_lingo->_archiveIndex < 0) {
+		delete g_lingo->_currentScriptContext;
+	}
+
 	g_lingo->_currentScript = fp->retscript;
 	g_lingo->_currentScriptContext = fp->retctx;
 	g_lingo->_archiveIndex = fp->retarchive;
@@ -654,10 +659,8 @@ Datum LC::divData(Datum &d1, Datum &d2) {
 	}
 
 	if ((d2.type == INT && d2.u.i == 0) ||
-			(d2.type == FLOAT && d2.u.f == 0.0)) {
-		warning("LC::divData(): division by zero");
-		d2 = Datum(1);
-	}
+			(d2.type == FLOAT && d2.u.f == 0.0))
+		error("division by zero");
 
 	int alignedType = g_lingo->getAlignedType(d1, d2);
 
@@ -686,10 +689,8 @@ Datum LC::modData(Datum &d1, Datum &d2) {
 
 	int i1 = d1.asInt();
 	int i2 = d2.asInt();
-	if (i2 == 0) {
-		warning("LC::modData(): division by zero");
-		i2 = 1;
-	}
+	if (i2 == 0)
+		error("division by zero");
 
 	Datum res(i1 % i2);
 	return res;




More information about the Scummvm-git-logs mailing list