Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
dotNET Platform
runtime
提交
ad3847ca
R
runtime
项目概览
dotNET Platform
/
runtime
11 个月 前同步成功
通知
1
Star
1
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
R
runtime
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
未验证
提交
ad3847ca
编写于
2月 26, 2022
作者:
S
Stephen Toub
提交者:
GitHub
2月 26, 2022
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Change regex source generator to emit returns rather than jumps to NoMatch (#65599)
上级
26b91db7
变更
2
展开全部
隐藏空白更改
内联
并排
Showing
2 changed file
with
119 addition
and
93 deletion
+119
-93
src/libraries/System.Text.RegularExpressions/gen/RegexGenerator.Emitter.cs
...tem.Text.RegularExpressions/gen/RegexGenerator.Emitter.cs
+108
-87
src/libraries/System.Text.RegularExpressions/src/System/Text/RegularExpressions/RegexCompiler.cs
...sions/src/System/Text/RegularExpressions/RegexCompiler.cs
+11
-6
未找到文件。
src/libraries/System.Text.RegularExpressions/gen/RegexGenerator.Emitter.cs
浏览文件 @
ad3847ca
此差异已折叠。
点击以展开。
src/libraries/System.Text.RegularExpressions/src/System/Text/RegularExpressions/RegexCompiler.cs
浏览文件 @
ad3847ca
...
...
@@ -1096,7 +1096,6 @@ protected void EmitTryMatchAtCurrentPosition()
LocalBuilder
pos
=
DeclareInt32
();
LocalBuilder
slice
=
DeclareReadOnlySpanChar
();
LocalBuilder
end
=
DeclareInt32
();
Label
stopSuccessLabel
=
DefineLabel
();
Label
doneLabel
=
DefineLabel
();
Label
originalDoneLabel
=
doneLabel
;
if
(
_hasTimeout
)
...
...
@@ -1105,7 +1104,7 @@ protected void EmitTryMatchAtCurrentPosition()
}
// CultureInfo culture = CultureInfo.CurrentCulture; // only if the whole expression or any subportion is ignoring case, and we're not using invariant
InitializeCultureFor
Go
IfNecessary
();
InitializeCultureFor
TryMatchAtCurrentPosition
IfNecessary
();
// ReadOnlySpan<char> inputSpan = input;
// int end = base.runtextend;
...
...
@@ -1143,11 +1142,10 @@ protected void EmitTryMatchAtCurrentPosition()
// Emit the code for all nodes in the tree.
EmitNode
(
node
);
// Success:
// pos += sliceStaticPos;
// base.runtextpos = pos;
// Capture(0, originalpos, pos);
MarkLabel
(
stopSuccessLabel
)
;
// return true
;
Ldthis
();
Ldloc
(
pos
);
if
(
sliceStaticPos
>
0
)
...
...
@@ -1163,10 +1161,17 @@ protected void EmitTryMatchAtCurrentPosition()
Ldloc
(
originalPos
);
Ldloc
(
pos
);
Call
(
s_captureMethod
);
// return true;
Ldc
(
1
);
Ret
();
// NOTE: The following is a difference from the source generator. The source generator emits:
// UncaptureUntil(0);
// return false;
// at every location where the all-up match is known to fail. In contrast, the compiler currently
// emits this uncapture/return code in one place and jumps to it upon match failure. The difference
// stems primarily from the return-at-each-location pattern resulting in cleaner / easier to read
// source code, which is not an issue for RegexCompiler emitting IL instead of C#.
// If the graph contained captures, undo any remaining to handle failed matches.
if
(
expressionHasCaptures
)
{
...
...
@@ -4011,7 +4016,7 @@ protected void EmitScan(DynamicMethod tryFindNextStartingPositionMethod, Dynamic
Ret
();
}
private
void
InitializeCultureFor
Go
IfNecessary
()
private
void
InitializeCultureFor
TryMatchAtCurrentPosition
IfNecessary
()
{
_textInfo
=
null
;
if
((
_options
&
RegexOptions
.
CultureInvariant
)
==
0
)
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录