Make regex compilable with RTTI disabled

This commit is contained in:
Pedro J. Estébanez 2016-11-01 19:16:46 +01:00
parent 7e3aa4bd5e
commit f935d7ab0e
1 changed files with 9 additions and 4 deletions

View File

@ -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));