Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
dotNET Platform
runtime
提交
7bc07c24
R
runtime
项目概览
dotNET Platform
/
runtime
大约 1 年 前同步成功
通知
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,发现更多精彩内容 >>
未验证
提交
7bc07c24
编写于
8月 09, 2022
作者:
B
Buyaa Namnan
提交者:
GitHub
8月 10, 2022
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Revert "Generic attributes handling in CustomAttributeDecoder" (#73671)
This reverts commit
b947dd6e
.
上级
7b63201c
变更
2
展开全部
隐藏空白更改
内联
并排
Showing
2 changed file
with
18 addition
and
501 deletion
+18
-501
src/libraries/System.Reflection.Metadata/src/System/Reflection/Metadata/Ecma335/CustomAttributeDecoder.cs
...tem/Reflection/Metadata/Ecma335/CustomAttributeDecoder.cs
+5
-150
src/libraries/System.Reflection.Metadata/tests/Metadata/Decoding/CustomAttributeDecoderTests.cs
...ta/tests/Metadata/Decoding/CustomAttributeDecoderTests.cs
+13
-351
未找到文件。
src/libraries/System.Reflection.Metadata/src/System/Reflection/Metadata/Ecma335/CustomAttributeDecoder.cs
浏览文件 @
7bc07c24
...
...
@@ -22,7 +22,6 @@ public CustomAttributeDecoder(ICustomAttributeTypeProvider<TType> provider, Meta
public
CustomAttributeValue
<
TType
>
DecodeValue
(
EntityHandle
constructor
,
BlobHandle
value
)
{
BlobHandle
signature
;
BlobHandle
attributeOwningTypeSpec
=
default
;
switch
(
constructor
.
Kind
)
{
case
HandleKind
.
MethodDefinition
:
...
...
@@ -33,13 +32,6 @@ public CustomAttributeValue<TType> DecodeValue(EntityHandle constructor, BlobHan
case
HandleKind
.
MemberReference
:
MemberReference
reference
=
_reader
.
GetMemberReference
((
MemberReferenceHandle
)
constructor
);
signature
=
reference
.
Signature
;
// If this is a generic attribute, we'll need its instantiation to decode the signatures
if
(
reference
.
Parent
.
Kind
==
HandleKind
.
TypeSpecification
)
{
TypeSpecification
genericOwner
=
_reader
.
GetTypeSpecification
((
TypeSpecificationHandle
)
reference
.
Parent
);
attributeOwningTypeSpec
=
genericOwner
.
Signature
;
}
break
;
default
:
...
...
@@ -68,38 +60,12 @@ public CustomAttributeValue<TType> DecodeValue(EntityHandle constructor, BlobHan
throw
new
BadImageFormatException
();
}
BlobReader
genericContextReader
=
default
;
if
(!
attributeOwningTypeSpec
.
IsNil
)
{
// If this is a generic attribute, grab the instantiation arguments so that we can
// interpret the constructor signature, should it refer to the generic context.
genericContextReader
=
_reader
.
GetBlobReader
(
attributeOwningTypeSpec
);
if
(
genericContextReader
.
ReadSignatureTypeCode
()
==
SignatureTypeCode
.
GenericTypeInstance
)
{
int
kind
=
genericContextReader
.
ReadCompressedInteger
();
if
(
kind
!=
(
int
)
SignatureTypeKind
.
Class
&&
kind
!=
(
int
)
SignatureTypeKind
.
ValueType
)
{
throw
new
BadImageFormatException
();
}
genericContextReader
.
ReadTypeHandle
();
// At this point, the reader points to the "GenArgCount Type Type*" part of the signature.
}
else
{
// Some other invalid TypeSpec. Don't accidentally allow resolving generic parameters
// from the constructor signature into a broken blob.
genericContextReader
=
default
;
}
}
ImmutableArray
<
CustomAttributeTypedArgument
<
TType
>>
fixedArguments
=
DecodeFixedArguments
(
ref
signatureReader
,
ref
valueReader
,
parameterCount
,
genericContextReader
);
ImmutableArray
<
CustomAttributeTypedArgument
<
TType
>>
fixedArguments
=
DecodeFixedArguments
(
ref
signatureReader
,
ref
valueReader
,
parameterCount
);
ImmutableArray
<
CustomAttributeNamedArgument
<
TType
>>
namedArguments
=
DecodeNamedArguments
(
ref
valueReader
);
return
new
CustomAttributeValue
<
TType
>(
fixedArguments
,
namedArguments
);
}
private
ImmutableArray
<
CustomAttributeTypedArgument
<
TType
>>
DecodeFixedArguments
(
ref
BlobReader
signatureReader
,
ref
BlobReader
valueReader
,
int
count
,
BlobReader
genericContextReader
)
private
ImmutableArray
<
CustomAttributeTypedArgument
<
TType
>>
DecodeFixedArguments
(
ref
BlobReader
signatureReader
,
ref
BlobReader
valueReader
,
int
count
)
{
if
(
count
==
0
)
{
...
...
@@ -110,7 +76,7 @@ private ImmutableArray<CustomAttributeTypedArgument<TType>> DecodeFixedArguments
for
(
int
i
=
0
;
i
<
count
;
i
++)
{
ArgumentTypeInfo
info
=
DecodeFixedArgumentType
(
ref
signatureReader
,
genericContextReader
);
ArgumentTypeInfo
info
=
DecodeFixedArgumentType
(
ref
signatureReader
);
arguments
.
Add
(
DecodeArgument
(
ref
valueReader
,
info
));
}
...
...
@@ -158,7 +124,7 @@ private struct ArgumentTypeInfo
// better perf-wise, but even more important is that we can't actually reason about
// a method signature with opaque TType values without adding some unnecessary chatter
// with the provider.
private
ArgumentTypeInfo
DecodeFixedArgumentType
(
ref
BlobReader
signatureReader
,
BlobReader
genericContextReader
,
bool
isElementType
=
false
)
private
ArgumentTypeInfo
DecodeFixedArgumentType
(
ref
BlobReader
signatureReader
,
bool
isElementType
=
false
)
{
SignatureTypeCode
signatureTypeCode
=
signatureReader
.
ReadSignatureTypeCode
();
...
...
@@ -204,33 +170,12 @@ private ArgumentTypeInfo DecodeFixedArgumentType(ref BlobReader signatureReader,
throw
new
BadImageFormatException
();
}
var
elementInfo
=
DecodeFixedArgumentType
(
ref
signatureReader
,
genericContextReader
,
isElementType
:
true
);
var
elementInfo
=
DecodeFixedArgumentType
(
ref
signatureReader
,
isElementType
:
true
);
info
.
ElementType
=
elementInfo
.
Type
;
info
.
ElementTypeCode
=
elementInfo
.
TypeCode
;
info
.
Type
=
_provider
.
GetSZArrayType
(
info
.
ElementType
);
break
;
case
SignatureTypeCode
.
GenericTypeParameter
:
if
(
genericContextReader
.
Length
==
0
)
{
throw
new
BadImageFormatException
();
}
int
parameterIndex
=
signatureReader
.
ReadCompressedInteger
();
int
numGenericParameters
=
genericContextReader
.
ReadCompressedInteger
();
if
(
parameterIndex
>=
numGenericParameters
)
{
throw
new
BadImageFormatException
();
}
while
(
parameterIndex
>
0
)
{
SkipType
(
ref
genericContextReader
);
parameterIndex
--;
}
return
DecodeFixedArgumentType
(
ref
genericContextReader
,
default
,
isElementType
);
default
:
throw
new
BadImageFormatException
();
}
...
...
@@ -418,95 +363,5 @@ handle.Kind switch
HandleKind
.
TypeReference
=>
_provider
.
GetTypeFromReference
(
_reader
,
(
TypeReferenceHandle
)
handle
,
0
),
_
=>
throw
new
BadImageFormatException
(
SR
.
NotTypeDefOrRefHandle
),
};
private
static
void
SkipType
(
ref
BlobReader
blobReader
)
{
int
typeCode
=
blobReader
.
ReadCompressedInteger
();
switch
(
typeCode
)
{
case
(
int
)
SignatureTypeCode
.
Boolean
:
case
(
int
)
SignatureTypeCode
.
Char
:
case
(
int
)
SignatureTypeCode
.
SByte
:
case
(
int
)
SignatureTypeCode
.
Byte
:
case
(
int
)
SignatureTypeCode
.
Int16
:
case
(
int
)
SignatureTypeCode
.
UInt16
:
case
(
int
)
SignatureTypeCode
.
Int32
:
case
(
int
)
SignatureTypeCode
.
UInt32
:
case
(
int
)
SignatureTypeCode
.
Int64
:
case
(
int
)
SignatureTypeCode
.
UInt64
:
case
(
int
)
SignatureTypeCode
.
Single
:
case
(
int
)
SignatureTypeCode
.
Double
:
case
(
int
)
SignatureTypeCode
.
IntPtr
:
case
(
int
)
SignatureTypeCode
.
UIntPtr
:
case
(
int
)
SignatureTypeCode
.
Object
:
case
(
int
)
SignatureTypeCode
.
String
:
case
(
int
)
SignatureTypeCode
.
Void
:
case
(
int
)
SignatureTypeCode
.
TypedReference
:
return
;
case
(
int
)
SignatureTypeCode
.
Pointer
:
case
(
int
)
SignatureTypeCode
.
ByReference
:
case
(
int
)
SignatureTypeCode
.
Pinned
:
case
(
int
)
SignatureTypeCode
.
SZArray
:
SkipType
(
ref
blobReader
);
return
;
case
(
int
)
SignatureTypeCode
.
FunctionPointer
:
SignatureHeader
header
=
blobReader
.
ReadSignatureHeader
();
if
(
header
.
IsGeneric
)
{
blobReader
.
ReadCompressedInteger
();
// arity
}
int
paramCount
=
blobReader
.
ReadCompressedInteger
();
SkipType
(
ref
blobReader
);
for
(
int
i
=
0
;
i
<
paramCount
;
i
++)
SkipType
(
ref
blobReader
);
return
;
case
(
int
)
SignatureTypeCode
.
Array
:
SkipType
(
ref
blobReader
);
blobReader
.
ReadCompressedInteger
();
// rank
int
boundsCount
=
blobReader
.
ReadCompressedInteger
();
for
(
int
i
=
0
;
i
<
boundsCount
;
i
++)
{
blobReader
.
ReadCompressedInteger
();
}
int
lowerBoundsCount
=
blobReader
.
ReadCompressedInteger
();
for
(
int
i
=
0
;
i
<
lowerBoundsCount
;
i
++)
{
blobReader
.
ReadCompressedSignedInteger
();
}
return
;
case
(
int
)
SignatureTypeCode
.
RequiredModifier
:
case
(
int
)
SignatureTypeCode
.
OptionalModifier
:
blobReader
.
ReadTypeHandle
();
SkipType
(
ref
blobReader
);
return
;
case
(
int
)
SignatureTypeCode
.
GenericTypeInstance
:
SkipType
(
ref
blobReader
);
int
count
=
blobReader
.
ReadCompressedInteger
();
for
(
int
i
=
0
;
i
<
count
;
i
++)
{
SkipType
(
ref
blobReader
);
}
return
;
case
(
int
)
SignatureTypeCode
.
GenericTypeParameter
:
blobReader
.
ReadCompressedInteger
();
return
;
case
(
int
)
SignatureTypeKind
.
Class
:
case
(
int
)
SignatureTypeKind
.
ValueType
:
SkipType
(
ref
blobReader
);
break
;
default
:
throw
new
BadImageFormatException
();
}
}
}
}
src/libraries/System.Reflection.Metadata/tests/Metadata/Decoding/CustomAttributeDecoderTests.cs
浏览文件 @
7bc07c24
此差异已折叠。
点击以展开。
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录