Browse Source

LiteralSearchStrategy: implement support for field constants.

pull/1030/head
Siegfried Pammer 7 years ago
parent
commit
58c2746e60
  1. 2
      ICSharpCode.Decompiler/Disassembler/ReflectionDisassembler.cs
  2. 19
      ILSpy/Search/LiteralSearchStrategy.cs

2
ICSharpCode.Decompiler/Disassembler/ReflectionDisassembler.cs

@ -989,12 +989,12 @@ namespace ICSharpCode.Decompiler.Disassembler
void WriteConstant(MetadataReader metadata, Constant constant) void WriteConstant(MetadataReader metadata, Constant constant)
{ {
var blob = metadata.GetBlobReader(constant.Value);
switch (constant.TypeCode) { switch (constant.TypeCode) {
case ConstantTypeCode.NullReference: case ConstantTypeCode.NullReference:
output.Write("nullref"); output.Write("nullref");
break; break;
default: default:
var blob = metadata.GetBlobReader(constant.Value);
var value = blob.ReadConstant(constant.TypeCode); var value = blob.ReadConstant(constant.TypeCode);
if (value is string) { if (value is string) {
DisassemblerHelpers.WriteOperand(output, value); DisassemblerHelpers.WriteOperand(output, value);

19
ILSpy/Search/LiteralSearchStrategy.cs

@ -65,16 +65,21 @@ namespace ICSharpCode.ILSpy.Search
foreach (var handle in metadata.FieldDefinitions) { foreach (var handle in metadata.FieldDefinitions) {
var fd = metadata.GetFieldDefinition(handle); var fd = metadata.GetFieldDefinition(handle);
if (!fd.HasFlag(System.Reflection.FieldAttributes.HasFieldRVA) || !fd.HasFlag(System.Reflection.FieldAttributes.Literal)) if (!fd.HasFlag(System.Reflection.FieldAttributes.Literal))
continue; continue;
// TODO var constantHandle = fd.GetDefaultValue();
//fd.GetInitialValue(module.Reader, typeSystem); if (constantHandle.IsNil)
//IField field = ((MetadataModule)typeSystem.MainModule).GetDefinition(handle); continue;
//addResult(ResultFromEntity(field)); var constant = metadata.GetConstant(constantHandle);
var blob = metadata.GetBlobReader(constant.Value);
if (!IsLiteralMatch(metadata, blob.ReadConstant(constant.TypeCode)))
continue;
IField field = ((MetadataModule)typeSystem.MainModule).GetDefinition(handle);
addResult(ResultFromEntity(field));
} }
} }
bool IsLiteralMatch(PEFile module, object val) bool IsLiteralMatch(MetadataReader metadata, object val)
{ {
if (val == null) if (val == null)
return false; return false;
@ -91,7 +96,7 @@ namespace ICSharpCode.ILSpy.Search
return searchTermLiteralValue.Equals(val); return searchTermLiteralValue.Equals(val);
default: default:
// substring search with searchTerm // substring search with searchTerm
return IsMatch(module.Metadata, MetadataTokens.StringHandle(0), val.ToString()); return IsMatch(metadata, MetadataTokens.StringHandle(0), val.ToString());
} }
} }

Loading…
Cancel
Save