Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches

◆ GenerateFindFirstChar()

void System.Text.RegularExpressions.RegexCompiler.GenerateFindFirstChar ( )
inlineprotectedinherited

Definition at line 1034 of file RegexCompiler.cs.

1035 {
1040 if (_code.RightToLeft)
1041 {
1043 }
1045 _textInfoLocal = null;
1046 if (!_options.HasFlag(RegexOptions.CultureInvariant))
1047 {
1048 bool flag = _options.HasFlag(RegexOptions.IgnoreCase) || (_boyerMoorePrefix?.CaseInsensitive ?? false);
1049 if (!flag && _leadingCharClasses != null)
1050 {
1051 for (int i = 0; i < _leadingCharClasses.Length; i++)
1052 {
1053 if (_leadingCharClasses[i].CaseInsensitive)
1054 {
1055 flag = true;
1056 break;
1057 }
1058 }
1059 }
1060 if (flag)
1061 {
1064 }
1065 }
1068 if (_code.RightToLeft)
1069 {
1071 }
1073 Label l = DefineLabel();
1074 Label l2 = DefineLabel();
1075 if (!_code.RightToLeft)
1076 {
1079 if (minRequiredLength > 0)
1080 {
1082 Sub();
1083 }
1084 Ble(l2);
1085 MarkLabel(l);
1086 Ldthis();
1088 }
1089 else
1090 {
1092 if (minRequiredLength > 0)
1093 {
1095 Sub();
1096 }
1098 Bge(l2);
1099 MarkLabel(l);
1100 Ldthis();
1102 }
1104 Ldc(0);
1105 Ret();
1106 MarkLabel(l2);
1107 if (((uint)_leadingAnchor & 0x37u) != 0)
1108 {
1109 switch (_leadingAnchor)
1110 {
1111 case 1:
1112 {
1113 Label l5 = DefineLabel();
1115 if (!_code.RightToLeft)
1116 {
1118 Ble(l5);
1119 Br(l);
1120 }
1121 else
1122 {
1124 Ble(l5);
1125 Ldthis();
1128 }
1129 MarkLabel(l5);
1130 Ldc(1);
1131 Ret();
1132 return;
1133 }
1134 case 4:
1135 {
1136 Label l4 = DefineLabel();
1139 if (!_code.RightToLeft)
1140 {
1141 Ble(l4);
1142 }
1143 else
1144 {
1145 Bge(l4);
1146 }
1147 Br(l);
1148 MarkLabel(l4);
1149 Ldc(1);
1150 Ret();
1151 return;
1152 }
1153 case 16:
1154 {
1155 Label l7 = DefineLabel();
1156 if (!_code.RightToLeft)
1157 {
1160 Ldc(1);
1161 Sub();
1162 Bge(l7);
1163 Ldthis();
1165 Ldc(1);
1166 Sub();
1168 MarkLabel(l7);
1169 }
1170 else
1171 {
1172 Label l8 = DefineLabel();
1175 Ldc(1);
1176 Sub();
1177 Blt(l7);
1180 Beq(l8);
1184 Ldc(10);
1185 Beq(l8);
1186 MarkLabel(l7);
1187 BrFar(l);
1188 MarkLabel(l8);
1189 }
1190 Ldc(1);
1191 Ret();
1192 return;
1193 }
1194 case 32:
1195 if (minRequiredLength == 0)
1196 {
1197 Label l6 = DefineLabel();
1200 if (!_code.RightToLeft)
1201 {
1202 Bge(l6);
1203 Ldthis();
1206 }
1207 else
1208 {
1209 Bge(l6);
1210 Br(l);
1211 }
1212 MarkLabel(l6);
1213 Ldc(1);
1214 Ret();
1215 return;
1216 }
1217 break;
1218 case 2:
1219 if (!_code.RightToLeft)
1220 {
1221 Label l3 = DefineLabel();
1224 Ble(l3);
1227 Ldc(1);
1228 Sub();
1230 Ldc(10);
1231 Beq(l3);
1233 Ldc(10);
1236 using (RentedLocalBuilder rentedLocalBuilder = RentInt32Local())
1237 {
1240 Ldc(-1);
1241 Beq(l);
1243 Ldc(1);
1244 Add();
1246 Bgt(l);
1248 Ldc(1);
1249 Add();
1251 }
1252 MarkLabel(l3);
1253 }
1254 break;
1255 }
1256 }
1258 {
1260 int num;
1261 int index;
1262 if (!_code.RightToLeft)
1263 {
1265 num = -1;
1266 index = _boyerMoorePrefix.Pattern.Length - 1;
1267 }
1268 else
1269 {
1271 num = _boyerMoorePrefix.Pattern.Length;
1272 index = 0;
1273 }
1277 if (!_code.RightToLeft)
1278 {
1279 Ldc(_boyerMoorePrefix.Pattern.Length - 1);
1280 Add();
1281 }
1282 else
1283 {
1285 Sub();
1286 }
1288 Label l9 = DefineLabel();
1289 Br(l9);
1290 Label l10 = DefineLabel();
1291 MarkLabel(l10);
1293 Label l11 = DefineLabel();
1294 MarkLabel(l11);
1296 Add();
1298 MarkLabel(l9);
1300 Ldloc(lt);
1301 if (!_code.RightToLeft)
1302 {
1303 BgeFar(l);
1304 }
1305 else
1306 {
1307 BltFar(l);
1308 }
1309 Rightchar();
1311 {
1312 CallToLower();
1313 }
1314 Label l12 = DefineLabel();
1315 using (RentedLocalBuilder rentedLocalBuilder2 = RentInt32Local())
1316 {
1319 Ldc(i2);
1320 BeqFar(l12);
1323 Sub();
1327 BgtUn(l10);
1328 int num2 = _boyerMoorePrefix.HighASCII - _boyerMoorePrefix.LowASCII + 1;
1329 if (num2 > 1)
1330 {
1331 string str = string.Create(num2, (this, num), delegate(Span<char> span, (RegexCompiler thisRef, int beforefirst) state)
1332 {
1333 for (int k = 0; k < span.Length; k++)
1334 {
1335 int num8 = state.thisRef._boyerMoorePrefix.NegativeASCII[k + state.thisRef._boyerMoorePrefix.LowASCII];
1336 if (num8 == state.beforefirst)
1337 {
1338 num8 = state.thisRef._boyerMoorePrefix.Pattern.Length;
1339 }
1340 else if (state.thisRef._code.RightToLeft)
1341 {
1342 num8 = -num8;
1343 }
1344 span[k] = (char)num8;
1345 }
1346 });
1347 Ldstr(str);
1350 if (_code.RightToLeft)
1351 {
1352 Neg();
1353 }
1354 }
1355 else
1356 {
1358 if (num3 == num)
1359 {
1360 num3 = (_code.RightToLeft ? (-_boyerMoorePrefix.Pattern.Length) : _boyerMoorePrefix.Pattern.Length);
1361 }
1362 Ldc(num3);
1363 }
1364 BrFar(l11);
1365 }
1366 MarkLabel(l12);
1368 using RentedLocalBuilder rentedLocalBuilder3 = RentInt32Local();
1370 int num4 = int.MaxValue;
1371 Label l13 = default(Label);
1372 for (int num5 = _boyerMoorePrefix.Pattern.Length - 2; num5 >= 0; num5--)
1373 {
1374 int num6 = (_code.RightToLeft ? (_boyerMoorePrefix.Pattern.Length - 1 - num5) : num5);
1377 Ldc(1);
1383 {
1384 CallToLower();
1385 }
1388 {
1389 BneFar(l13);
1390 }
1391 else
1392 {
1393 Label l14 = DefineLabel();
1394 Beq(l14);
1395 l13 = DefineLabel();
1397 MarkLabel(l13);
1398 Ldc(num4);
1399 BrFar(l11);
1400 MarkLabel(l14);
1401 }
1402 }
1403 Ldthis();
1405 if (_code.RightToLeft)
1406 {
1407 Ldc(1);
1408 Add();
1409 }
1411 Ldc(1);
1412 Ret();
1413 return;
1414 }
1415 if (_leadingCharClasses == null)
1416 {
1417 Ldc(1);
1418 Ret();
1419 return;
1420 }
1421 if (_code.RightToLeft)
1422 {
1423 using (RentedLocalBuilder rentedLocalBuilder4 = RentInt32Local())
1424 {
1425 Label l15 = DefineLabel();
1426 Label l16 = DefineLabel();
1427 Label l17 = DefineLabel();
1428 Label l18 = DefineLabel();
1429 Label l19 = DefineLabel();
1433 Sub();
1435 if (minRequiredLength == 0)
1436 {
1438 Ldc(0);
1439 BleFar(l18);
1440 }
1441 MarkLabel(l15);
1443 Ldc(1);
1444 Sub();
1446 Leftcharnext();
1447 if (!RegexCharClass.IsSingleton(_leadingCharClasses[0].CharClass))
1448 {
1450 Brtrue(l16);
1451 }
1452 else
1453 {
1454 Ldc(RegexCharClass.SingletonChar(_leadingCharClasses[0].CharClass));
1455 Beq(l16);
1456 }
1457 MarkLabel(l19);
1459 Ldc(0);
1460 if (!RegexCharClass.IsSingleton(_leadingCharClasses[0].CharClass))
1461 {
1462 BgtFar(l15);
1463 }
1464 else
1465 {
1466 Bgt(l15);
1467 }
1468 Ldc(0);
1469 Br(l17);
1470 MarkLabel(l16);
1472 Ldc(1);
1475 Ldc(1);
1476 MarkLabel(l17);
1478 Ret();
1479 MarkLabel(l18);
1480 Ldc(0);
1481 Ret();
1482 return;
1483 }
1484 }
1486 {
1488 if (_leadingCharClasses.Length > 1)
1489 {
1490 Ldc(_leadingCharClasses.Length - 1);
1491 Sub();
1492 }
1494 BleFar(l);
1495 }
1496 using RentedLocalBuilder rentedLocalBuilder6 = RentInt32Local();
1497 using RentedLocalBuilder rentedLocalBuilder5 = RentReadOnlySpanCharLocal();
1502 Sub();
1505 Span<char> chars = stackalloc char[3];
1506 int num7 = 0;
1507 int j = 0;
1508 bool flag2 = !_leadingCharClasses[0].CaseInsensitive && (num7 = RegexCharClass.GetSetChars(_leadingCharClasses[0].CharClass, chars)) > 0 && !RegexCharClass.IsNegated(_leadingCharClasses[0].CharClass);
1509 bool flag3 = !flag2 || _leadingCharClasses.Length > 1;
1510 Label l20 = default(Label);
1511 Label l21 = default(Label);
1512 Label l22 = default(Label);
1513 if (flag3)
1514 {
1515 l20 = DefineLabel();
1516 l21 = DefineLabel();
1517 l22 = DefineLabel();
1518 Ldc(0);
1520 BrFar(l20);
1521 MarkLabel(l22);
1522 }
1523 if (flag2)
1524 {
1525 j = 1;
1526 if (flag3)
1527 {
1531 }
1532 else
1533 {
1535 }
1536 switch (num7)
1537 {
1538 case 1:
1539 Ldc(chars[0]);
1541 break;
1542 case 2:
1543 Ldc(chars[0]);
1544 Ldc(chars[1]);
1546 break;
1547 default:
1548 Ldc(chars[0]);
1549 Ldc(chars[1]);
1550 Ldc(chars[2]);
1552 break;
1553 }
1554 if (flag3)
1555 {
1556 using RentedLocalBuilder rentedLocalBuilder7 = RentInt32Local();
1560 Add();
1563 Ldc(0);
1564 BltFar(l);
1565 }
1566 else
1567 {
1570 Ldc(0);
1571 BltFar(l);
1572 }
1573 if (_leadingCharClasses.Length > 1)
1574 {
1577 Ldc(_leadingCharClasses.Length - 1);
1578 Sub();
1580 BleFar(l);
1581 }
1582 }
1583 for (; j < _leadingCharClasses.Length; j++)
1584 {
1587 if (j > 0)
1588 {
1589 Ldc(j);
1590 Add();
1591 }
1593 LdindU2();
1595 BrfalseFar(l21);
1596 }
1597 Ldthis();
1600 Add();
1602 Ldc(1);
1603 Ret();
1604 if (flag3)
1605 {
1606 MarkLabel(l21);
1608 Ldc(1);
1609 Add();
1611 MarkLabel(l20);
1615 if (_leadingCharClasses.Length > 1)
1616 {
1617 Ldc(_leadingCharClasses.Length - 1);
1618 Sub();
1619 }
1620 BltFar(l22);
1621 BrFar(l);
1622 }
1623 }
static readonly FieldInfo s_runtextstartField
void EmitMatchCharacterClass(string charClass, bool caseInsensitive)
static readonly MethodInfo s_stringAsSpanIntIntMethod
static readonly MethodInfo s_spanIndexOfAnyCharChar
static readonly FieldInfo s_runtextendField
static readonly MethodInfo s_spanSliceIntMethod
string bool CaseInsensitive[] _leadingCharClasses
static readonly MethodInfo s_stringGetCharsMethod
void Mvlocfld(LocalBuilder lt, FieldInfo ft)
static readonly MethodInfo s_spanGetItemMethod
static bool ParticipatesInCaseConversion(int comparison)
static readonly MethodInfo s_spanIndexOfAnyCharCharChar
static readonly FieldInfo s_runtextbegField
static readonly MethodInfo s_stringIndexOfCharInt
static readonly MethodInfo s_spanGetLengthMethod
static readonly FieldInfo s_runtextposField
void Mvfldloc(FieldInfo ft, LocalBuilder lt)

References System.Text.RegularExpressions.RegexCompiler._boyerMoorePrefix, System.Text.RegularExpressions.RegexCompiler._code, System.Text.RegularExpressions.RegexCompiler._int32LocalsPool, System.Text.RegularExpressions.RegexCompiler._leadingAnchor, System.Text.RegularExpressions.RegexCompiler._leadingCharClasses, System.Text.RegularExpressions.RegexCompiler._options, System.Text.RegularExpressions.RegexCompiler._readOnlySpanCharLocalsPool, System.Text.RegularExpressions.RegexCompiler._runtextbegLocal, System.Text.RegularExpressions.RegexCompiler._runtextendLocal, System.Text.RegularExpressions.RegexCompiler._runtextLocal, System.Text.RegularExpressions.RegexCompiler._runtextposLocal, System.Text.RegularExpressions.RegexCompiler._textInfoLocal, System.Text.RegularExpressions.RegexCompiler.Add(), System.Reflection.Emit.Beq, System.Text.RegularExpressions.RegexCompiler.BeqFar(), System.Reflection.Emit.Bge, System.Text.RegularExpressions.RegexCompiler.BgeFar(), System.Reflection.Emit.Bgt, System.Text.RegularExpressions.RegexCompiler.BgtFar(), System.Text.RegularExpressions.RegexCompiler.BgtUn(), System.Reflection.Emit.Ble, System.Text.RegularExpressions.RegexCompiler.BleFar(), System.Reflection.Emit.Blt, System.Text.RegularExpressions.RegexCompiler.BltFar(), System.Text.RegularExpressions.RegexCompiler.BneFar(), System.Reflection.Emit.Br, System.Text.RegularExpressions.RegexCompiler.BrfalseFar(), System.Text.RegularExpressions.RegexCompiler.BrFar(), System.Reflection.Emit.Brtrue, System.Reflection.Emit.Call, System.Text.RegularExpressions.RegexCompiler.CallToLower(), System.Text.RegularExpressions.RegexBoyerMoore.CaseInsensitive, System.Text.RegularExpressions.RegexCompiler.CharClass, System.chars, System.Collections.Generic.Stack< T >.Clear(), System.Text.RegularExpressions.RegexCompiler.DeclareInt32(), System.Text.RegularExpressions.RegexCompiler.DeclareString(), System.Text.RegularExpressions.RegexCompiler.DeclareTextInfo(), System.Text.RegularExpressions.RegexCompiler.DefineLabel(), System.Text.RegularExpressions.RegexCompiler.EmitMatchCharacterClass(), System.Text.RegularExpressions.RegexCharClass.GetSetChars(), System.Text.RegularExpressions.RegexBoyerMoore.HighASCII, System.Text.RegularExpressions.i, System.index, System.Text.RegularExpressions.RegexCompiler.InitLocalCultureInfo(), System.Text.RegularExpressions.RegexCharClass.IsNegated(), System.Text.RegularExpressions.RegexCharClass.IsSingleton(), System.Text.RegularExpressions.RegexCompiler.Ldc(), System.Text.RegularExpressions.RegexCompiler.LdindU2(), System.Reflection.Emit.Ldloc, System.Reflection.Emit.Ldloca, System.Reflection.Emit.Ldstr, System.Text.RegularExpressions.RegexCompiler.Ldthis(), System.Text.RegularExpressions.RegexCompiler.Ldthisfld(), System.Text.RegularExpressions.RegexCompiler.Leftcharnext(), System.Text.RegularExpressions.RegexBoyerMoore.LowASCII, System.Text.RegularExpressions.RegexCompiler.MarkLabel(), System.Text.RegularExpressions.RegexTree.MinRequiredLength, System.Text.RegularExpressions.RegexCompiler.Mvfldloc(), System.Text.RegularExpressions.RegexCompiler.Mvlocfld(), System.Text.RegularExpressions.RegexCompiler.Neg(), System.Text.RegularExpressions.RegexBoyerMoore.NegativeASCII, System.Text.RegularExpressions.RegexBoyerMoore.NegativeUnicode, System.Text.RegularExpressions.RegexCompiler.ParticipatesInCaseConversion(), System.Text.RegularExpressions.RegexBoyerMoore.Pattern, System.Text.RegularExpressions.RegexBoyerMoore.Positive, System.Text.RegularExpressions.RegexCompiler.RentInt32Local(), System.Text.RegularExpressions.RegexCompiler.RentReadOnlySpanCharLocal(), System.Text.RegularExpressions.RegexCompiler.Ret(), System.Text.RegularExpressions.RegexCompiler.Rightchar(), System.Text.RegularExpressions.RegexCode.RightToLeft, System.Text.RegularExpressions.RegexCompiler.s_runtextbegField, System.Text.RegularExpressions.RegexCompiler.s_runtextendField, System.Text.RegularExpressions.RegexCompiler.s_runtextField, System.Text.RegularExpressions.RegexCompiler.s_runtextposField, System.Text.RegularExpressions.RegexCompiler.s_runtextstartField, System.Text.RegularExpressions.RegexCompiler.s_spanGetItemMethod, System.Text.RegularExpressions.RegexCompiler.s_spanGetLengthMethod, System.Text.RegularExpressions.RegexCompiler.s_spanIndexOf, System.Text.RegularExpressions.RegexCompiler.s_spanIndexOfAnyCharChar, System.Text.RegularExpressions.RegexCompiler.s_spanIndexOfAnyCharCharChar, System.Text.RegularExpressions.RegexCompiler.s_spanSliceIntMethod, System.Text.RegularExpressions.RegexCompiler.s_stringAsSpanIntIntMethod, System.Text.RegularExpressions.RegexCompiler.s_stringGetCharsMethod, System.Text.RegularExpressions.RegexCompiler.s_stringIndexOfCharInt, System.Text.RegularExpressions.RegexCharClass.SingletonChar(), System.state, System.Reflection.Emit.Stfld, System.Reflection.Emit.Stloc, System.Text.RegularExpressions.str, System.Text.RegularExpressions.RegexCompiler.Sub(), and System.Text.RegularExpressions.RegexCode.Tree.

Referenced by System.Text.RegularExpressions.RegexLWCGCompiler.FactoryInstanceFromCode().