[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