summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBen Longbons <b.r.longbons@gmail.com>2014-03-25 21:46:21 -0700
committerBen Longbons <b.r.longbons@gmail.com>2014-03-25 21:46:21 -0700
commit769e8ac9c17779a15492d7fcfc1931c014670c2d (patch)
tree8be5d50a8b0545bdb62770809e65ee523dc0c2d6
parent8d50ad7f65c46d83b44c18249566a16c6d290496 (diff)
downloadtmwa-769e8ac9c17779a15492d7fcfc1931c014670c2d.tar.gz
tmwa-769e8ac9c17779a15492d7fcfc1931c014670c2d.tar.bz2
tmwa-769e8ac9c17779a15492d7fcfc1931c014670c2d.tar.xz
tmwa-769e8ac9c17779a15492d7fcfc1931c014670c2d.zip
Add deprecation warnings for script syntax changes
-rw-r--r--src/map/itemdb.cpp4
-rw-r--r--src/map/magic-v2.cpp2
-rw-r--r--src/map/npc.cpp4
-rw-r--r--src/map/script.cpp43
-rw-r--r--src/map/script.hpp7
5 files changed, 47 insertions, 13 deletions
diff --git a/src/map/itemdb.cpp b/src/map/itemdb.cpp
index b1a1a30..52a14aa 100644
--- a/src/map/itemdb.cpp
+++ b/src/map/itemdb.cpp
@@ -227,12 +227,12 @@ bool itemdb_readdb(ZString filename)
if (!tail_part)
continue;
- id->use_script = parse_script(tail_part, lines);
+ id->use_script = parse_script(tail_part, lines, true);
tail_part = tail_part.xislice_t(std::find(tail_part.begin() + 1, tail_part.end(), '{'));
if (!tail_part)
continue;
- id->equip_script = parse_script(tail_part, lines);
+ id->equip_script = parse_script(tail_part, lines, true);
}
PRINTF("read %s done (count=%d)\n", filename, ln);
}
diff --git a/src/map/magic-v2.cpp b/src/map/magic-v2.cpp
index 9fb5001..1fad61d 100644
--- a/src/map/magic-v2.cpp
+++ b/src/map/magic-v2.cpp
@@ -762,7 +762,7 @@ namespace magic_v2
if (s._list[1]._type != sexpr::STRING)
return fail(s._list[1], "not string");
ZString body = s._list[1]._str;
- std::unique_ptr<const ScriptBuffer> script = parse_script(body, s._list[1]._span.begin.line);
+ std::unique_ptr<const ScriptBuffer> script = parse_script(body, s._list[1]._span.begin.line, true);
if (!script)
return fail(s._list[1], "script does not compile");
out = new_effect(EFFECT::SCRIPT);
diff --git a/src/map/npc.cpp b/src/map/npc.cpp
index 42ec4fa..dd75691 100644
--- a/src/map/npc.cpp
+++ b/src/map/npc.cpp
@@ -1228,7 +1228,7 @@ int npc_parse_script(XString w1, XString w2, NpcName w3, ZString w4,
srcbuf += line;
srcbuf += '\n';
}
- script = parse_script(AString(srcbuf), startline);
+ script = parse_script(AString(srcbuf), startline, false);
if (script == NULL)
// script parse error?
return 1;
@@ -1419,7 +1419,7 @@ int npc_parse_function(XString, XString, XString w3, ZString,
srcbuf += line;
srcbuf += '\n';
}
- std::unique_ptr<const ScriptBuffer> script = parse_script(AString(srcbuf), startline);
+ std::unique_ptr<const ScriptBuffer> script = parse_script(AString(srcbuf), startline, false);
if (script == NULL)
{
// script parse error?
diff --git a/src/map/script.cpp b/src/map/script.cpp
index 75f6809..cbb6d96 100644
--- a/src/map/script.cpp
+++ b/src/map/script.cpp
@@ -7,6 +7,8 @@
#include <cstring>
#include <ctime>
+#include <set>
+
#include "../compat/fun.hpp"
#include "../strings/mstring.hpp"
@@ -489,6 +491,7 @@ ZString::iterator ScriptBuffer::parse_subexpr(ZString::iterator p, int limit)
ZString::iterator tmpp = skip_space(p + 1);
if (*tmpp == ';' || *tmpp == ',')
{
+ --script_errors; disp_error_message("deprecated: implicit 'next statement' label", p);
add_scriptl(&LABEL_NEXTLINE_);
p++;
return p;
@@ -611,7 +614,7 @@ ZString::iterator ScriptBuffer::parse_expr(ZString::iterator p)
* 行の解析
*------------------------------------------
*/
-ZString::iterator ScriptBuffer::parse_line(ZString::iterator p)
+ZString::iterator ScriptBuffer::parse_line(ZString::iterator p, bool *can_step)
{
int i = 0;
ZString::iterator plist[128];
@@ -634,6 +637,20 @@ ZString::iterator ScriptBuffer::parse_line(ZString::iterator p)
// exit(0);
}
+ {
+ static
+ std::set<ZString> terminators =
+ {
+ "goto",
+ "return",
+ "close",
+ "menu",
+ "end",
+ "mapexit",
+ };
+ *can_step = terminators.count(cmd->strs) == 0;
+ }
+
add_scriptc(ByteCode::ARG);
while (*p && *p != ';' && i < 128)
{
@@ -726,10 +743,10 @@ bool read_constdb(ZString filename)
return rv;
}
-std::unique_ptr<const ScriptBuffer> parse_script(ZString src, int line)
+std::unique_ptr<const ScriptBuffer> parse_script(ZString src, int line, bool implicit_end)
{
auto script_buf = make_unique<ScriptBuffer>();
- script_buf->parse_script(src, line);
+ script_buf->parse_script(src, line, implicit_end);
return std::move(script_buf);
}
@@ -737,7 +754,7 @@ std::unique_ptr<const ScriptBuffer> parse_script(ZString src, int line)
* スクリプトの解析
*------------------------------------------
*/
-void ScriptBuffer::parse_script(ZString src, int line)
+void ScriptBuffer::parse_script(ZString src, int line, bool implicit_end)
{
static int first = 1;
@@ -767,6 +784,8 @@ void ScriptBuffer::parse_script(ZString src, int line)
startptr = src;
startline = line;
+ bool can_step = true;
+
ZString::iterator p = src.begin();
p = skip_space(p);
if (*p != '{')
@@ -779,6 +798,12 @@ void ScriptBuffer::parse_script(ZString src, int line)
p = skip_space(p);
if (*skip_space(skip_word(p)) == ':')
{
+ if (can_step)
+ {
+ --script_errors; disp_error_message("deprecated: implicit fallthrough", p);
+ }
+ can_step = true;
+
ZString::iterator tmpp = skip_word(p);
XString str(&*p, &*tmpp, nullptr);
str_data_t *ld = add_strp(str);
@@ -797,8 +822,12 @@ void ScriptBuffer::parse_script(ZString src, int line)
continue;
}
+ if (!can_step)
+ {
+ --script_errors; disp_error_message("deprecated: unreachable statement", p);
+ }
// 他は全部一緒くた
- p = parse_line(p);
+ p = parse_line(p, &can_step);
p = skip_space(p);
add_scriptc(ByteCode::EOL);
@@ -808,6 +837,10 @@ void ScriptBuffer::parse_script(ZString src, int line)
LABEL_NEXTLINE_.label_ = -1;
}
+ if (can_step && !implicit_end)
+ {
+ --script_errors; disp_error_message("deprecated: implicit end", p);
+ }
add_scriptc(ByteCode::NOP);
// resolve the unknown labels
diff --git a/src/map/script.hpp b/src/map/script.hpp
index 6cf40b0..8c072b3 100644
--- a/src/map/script.hpp
+++ b/src/map/script.hpp
@@ -35,8 +35,8 @@ public:
ZSit parse_simpleexpr(ZSit p);
ZSit parse_subexpr(ZSit p, int limit);
ZSit parse_expr(ZSit p);
- ZSit parse_line(ZSit p);
- void parse_script(ZString src, int line);
+ ZSit parse_line(ZSit p, bool *canstep);
+ void parse_script(ZString src, int line, bool implicit_end);
// consumption methods used only by script.cpp
ByteCode operator[](size_t i) const { return script_buf[i]; }
@@ -136,7 +136,8 @@ public:
int defsp, new_defsp;
};
-std::unique_ptr<const ScriptBuffer> parse_script(ZString, int);
+std::unique_ptr<const ScriptBuffer> parse_script(ZString, int, bool implicit_end);
+
struct argrec_t
{
ZString name;