summaryrefslogtreecommitdiff
path: root/modules
diff options
context:
space:
mode:
authorPedro J. Estébanez <pedrojrulez@gmail.com>2016-11-01 19:16:46 +0100
committerPedro J. Estébanez <pedrojrulez@gmail.com>2016-11-01 19:16:46 +0100
commitf935d7ab0ecd4757690cc29e449fec9572bbb435 (patch)
treeb01503065626c8ecfaa1f8e443eb4c0601a8c16e /modules
parent7e3aa4bd5e500d35401f5f2b15f1da65af12b26d (diff)
Make regex compilable with RTTI disabled
Diffstat (limited to 'modules')
-rw-r--r--modules/regex/regex.cpp13
1 files changed, 9 insertions, 4 deletions
diff --git a/modules/regex/regex.cpp b/modules/regex/regex.cpp
index a0f4b4934c..0197da46fb 100644
--- a/modules/regex/regex.cpp
+++ b/modules/regex/regex.cpp
@@ -97,6 +97,9 @@ struct RegExNode {
memdelete(next);
}
+ // For avoiding RTTI
+ virtual bool is_look_behind() { return false; }
+
virtual int test(RegExSearch& s, int pos) const {
return next ? next->test(s, pos) : -1;
@@ -750,6 +753,8 @@ struct RegExNodeLookBehind : public RegExNodeGroup {
reset_pos = true;
}
+ virtual bool is_look_behind() { return true; }
+
virtual int test(RegExSearch& s, int pos) const {
if (pos < length)
@@ -1089,7 +1094,7 @@ Error RegEx::compile(const String& p_pattern) {
REGEX_COMPILE_FAIL("backreference not found");
for (int i = 0; i < stack.size(); ++i)
- if (dynamic_cast<RegExNodeLookBehind*>(stack[i]))
+ if (stack[i]->is_look_behind())
REGEX_COMPILE_FAIL("backreferences inside lookbehind not supported");
for (int i = 0; i < group_names.size(); ++i) {
@@ -1112,7 +1117,7 @@ Error RegEx::compile(const String& p_pattern) {
c = d;
for (int i = 0; i < stack.size(); ++i)
- if (dynamic_cast<RegExNodeLookBehind*>(stack[i]))
+ if (stack[i]->is_look_behind())
REGEX_COMPILE_FAIL("backreferences inside lookbehind not supported");
int ref = -1;
@@ -1238,7 +1243,7 @@ Error RegEx::compile(const String& p_pattern) {
break;
case '|':
for (int i = 0; i < stack.size(); ++i)
- if (dynamic_cast<RegExNodeLookBehind*>(stack[i]))
+ if (stack[i]->is_look_behind())
REGEX_COMPILE_FAIL("alternations inside lookbehind not supported");
stack[0]->add_childset();
break;
@@ -1312,7 +1317,7 @@ Error RegEx::compile(const String& p_pattern) {
if (min_val != max_val)
for (int i = 0; i < stack.size(); ++i)
- if (dynamic_cast<RegExNodeLookBehind*>(stack[i]))
+ if (stack[i]->is_look_behind())
REGEX_COMPILE_FAIL("variable length quantifiers inside lookbehind not supported");
RegExNodeQuantifier* quant = memnew(RegExNodeQuantifier(min_val, max_val));