[Scummvm-git-logs] scummvm master -> 256f809bc7e195f48ce27bb96ef34d2aa1b0b9be
djsrv
dservilla at gmail.com
Thu Jun 18 18:28:42 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:
1a62ddac61 DIRECTOR: LINGO: Remove c_property
256f809bc7 DIRECTOR: LINGO: Implement script/xtra method call
Commit: 1a62ddac61db456fa445f52015106dc3436c1000
https://github.com/scummvm/scummvm/commit/1a62ddac61db456fa445f52015106dc3436c1000
Author: djsrv (dservilla at gmail.com)
Date: 2020-06-18T14:28:00-04:00
Commit Message:
DIRECTOR: LINGO: Remove c_property
Changed paths:
engines/director/lingo/lingo-code.cpp
engines/director/lingo/lingo-code.h
diff --git a/engines/director/lingo/lingo-code.cpp b/engines/director/lingo/lingo-code.cpp
index ac2449c7d3..e87bcd84db 100644
--- a/engines/director/lingo/lingo-code.cpp
+++ b/engines/director/lingo/lingo-code.cpp
@@ -113,7 +113,6 @@ static struct FuncDescr {
{ LC::c_printtop, "c_printtop", "" },
{ LC::c_procret, "c_procret", "" },
{ LC::c_proparraypush, "c_proparraypush", "i" },
- { LC::c_property, "c_property", "s" },
{ LC::c_setImmediate, "c_setImmediate", "i" },
{ LC::c_starts, "c_starts", "" },
{ LC::c_stringpush, "c_stringpush", "s" },
@@ -1465,12 +1464,6 @@ void LC::c_procret() {
}
}
-void LC::c_property() {
- Common::String name(g_lingo->readString());
-
- warning("STUB: c_property()");
-}
-
void LC::c_open() {
Datum d2 = g_lingo->pop();
Datum d1 = g_lingo->pop();
diff --git a/engines/director/lingo/lingo-code.h b/engines/director/lingo/lingo-code.h
index c46c6793b9..8c4606e835 100644
--- a/engines/director/lingo/lingo-code.h
+++ b/engines/director/lingo/lingo-code.h
@@ -126,7 +126,6 @@ namespace LC {
void c_gotoloop();
void c_gotonext();
void c_gotoprevious();
- void c_property();
void c_play();
Commit: 256f809bc7e195f48ce27bb96ef34d2aa1b0b9be
https://github.com/scummvm/scummvm/commit/256f809bc7e195f48ce27bb96ef34d2aa1b0b9be
Author: djsrv (dservilla at gmail.com)
Date: 2020-06-18T14:28:00-04:00
Commit Message:
DIRECTOR: LINGO: Implement script/xtra method call
Changed paths:
engines/director/lingo/lingo-code.cpp
engines/director/lingo/lingo-object.cpp
engines/director/lingo/lingo.h
diff --git a/engines/director/lingo/lingo-code.cpp b/engines/director/lingo/lingo-code.cpp
index e87bcd84db..5b1ed00298 100644
--- a/engines/director/lingo/lingo-code.cpp
+++ b/engines/director/lingo/lingo-code.cpp
@@ -200,6 +200,9 @@ Datum Lingo::peek(uint offset) {
assert (_stack.size() > offset);
Datum ret = _stack[_stack.size() - 1 - offset];
+ if (ret.lazy) {
+ ret = ret.eval();
+ }
return ret;
}
@@ -1294,15 +1297,34 @@ void LC::call(const Common::String &name, int nargs) {
if (debugChannelSet(3, kDebugLingoExec))
g_lingo->printSTUBWithArglist(name.c_str(), nargs, "call:");
- Symbol funcSym = g_lingo->getHandler(name);
+ Symbol funcSym;
+ // Script/Xtra method call
+ if (nargs > 0) {
+ Datum target = g_lingo->peek(nargs - 1);
+ if (target.type == OBJECT && (target.u.obj->type & (kScriptObj | kXtraObj))) {
+ debugC(3, kDebugLingoExec, "Dereferencing object reference: %s to <%s>", name.c_str(), target.asString(true).c_str());
+ g_lingo->_stack.remove_at(g_lingo->_stack.size() - nargs); // Take object out of stack
+ nargs -= 1;
+ if (name.equalsIgnoreCase("birth") || name.equalsIgnoreCase("new")) {
+ target = Datum(target.u.obj->clone());
+ }
+ funcSym = target.u.obj->getMethod(name);
+ call(funcSym, nargs, target);
+ return;
+ }
+ }
+
+ // Normal handler call
+ funcSym = g_lingo->getHandler(name);
+
+ // Factory/XObject method call
if (funcSym.type == VOID) {
- Datum eventName(name);
- eventName.type = VAR;
- Datum d = g_lingo->varFetch(eventName);
- if (d.type == OBJECT && (d.u.obj->type & (kFactoryObj | kXObj))) {
- debugC(3, kDebugLingoExec, "Dereferencing object reference: %s to <%s>", name.c_str(), d.asString(true).c_str());
- Datum target = d;
+ Datum objName(name);
+ objName.type = VAR;
+ Datum target = g_lingo->varFetch(objName);
+ if (target.type == OBJECT && (target.u.obj->type & (kFactoryObj | kXObj))) {
+ debugC(3, kDebugLingoExec, "Dereferencing object reference: %s to <%s>", name.c_str(), target.asString(true).c_str());
Datum methodName = g_lingo->_stack.remove_at(g_lingo->_stack.size() - nargs); // Take method name out of stack
nargs -= 1;
if (methodName.u.s->equalsIgnoreCase("mNew")) {
@@ -1313,6 +1335,7 @@ void LC::call(const Common::String &name, int nargs) {
return;
}
}
+
call(funcSym, nargs);
}
diff --git a/engines/director/lingo/lingo-object.cpp b/engines/director/lingo/lingo-object.cpp
index ed14229710..cb489f966c 100644
--- a/engines/director/lingo/lingo-object.cpp
+++ b/engines/director/lingo/lingo-object.cpp
@@ -36,13 +36,14 @@ static struct MethodProto {
int type;
int version;
} predefinedMethods[] = {
+ { "birth", LM::m_new, -1, 0, kScriptObj | kXtraObj, 4 }, // D4
{ "describe", LM::m_describe, 0, 0, kXObj, 2 }, // D2
{ "dispose", LM::m_dispose, 0, 0, kFactoryObj | kXObj, 2 }, // D2
{ "get", LM::m_get, 1, 1, kFactoryObj, 2 }, // D2
{ "instanceRespondsTo", LM::m_instanceRespondsTo, 1, 1, kXObj, 3 }, // D3
{ "messageList", LM::m_messageList, 0, 0, kXObj, 3 }, // D3
{ "name", LM::m_name, 0, 0, kXObj, 3 }, // D3
- { "new", LM::m_new, -1, 0, kFactoryObj | kXObj, 2 }, // D2
+ { "new", LM::m_new, -1, 0, kAllObj, 2 }, // D2
{ "perform", LM::m_perform, -1, 0, kFactoryObj | kXObj, 3 }, // D3
{ "put", LM::m_put, 2, 2, kFactoryObj, 2 }, // D2
{ "respondsTo", LM::m_respondsTo, 1, 1, kXObj, 2 }, // D2
diff --git a/engines/director/lingo/lingo.h b/engines/director/lingo/lingo.h
index 3c67e0db71..2d4e46172f 100644
--- a/engines/director/lingo/lingo.h
+++ b/engines/director/lingo/lingo.h
@@ -233,7 +233,8 @@ enum ObjectType {
kFactoryObj = 1 << 0,
kXObj = 1 << 1,
kScriptObj = 1 << 2,
- kXtraObj = 1 << 3
+ kXtraObj = 1 << 3,
+ kAllObj = kFactoryObj | kXObj | kScriptObj | kXtraObj
};
struct Object {
More information about the Scummvm-git-logs
mailing list