Jelajahi Sumber

Make regex compilable with RTTI disabled

Pedro J. Estébanez 8 tahun lalu
induk
melakukan
f935d7ab0e
1 mengubah file dengan 9 tambahan dan 4 penghapusan
  1. 9 4
      modules/regex/regex.cpp

+ 9 - 4
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));