Merge parameter extraction between methods and function pointers

This commit is contained in:
Tamas Vajk
2021-01-11 11:36:24 +01:00
parent f986c15200
commit f99bf5755c
2 changed files with 13 additions and 11 deletions

View File

@@ -99,16 +99,9 @@ namespace Semmle.Extraction.CIL.Entities
yield return Tuples.cil_function_pointer_calling_conventions(this, signature.Header.CallingConvention);
var i = 0;
foreach (var p in signature.ParameterTypes)
foreach (var p in Method.GetParameterExtractionProducts(signature.ParameterTypes, this, this, Cx, 0))
{
var t = p;
if (t is ModifiedType mtparam)
{
t = mtparam.Unmodified;
yield return Tuples.cil_custom_modifiers(this, mtparam.Modifier, mtparam.IsRequired);
}
yield return Cx.Populate(new Parameter(Cx, this, i++, t));
yield return p;
}
}
}

View File

@@ -86,15 +86,24 @@ namespace Semmle.Extraction.CIL.Entities
yield return Cx.Populate(new Parameter(Cx, this, i++, DeclaringType));
}
foreach (var p in GetParameterExtractionProducts(parameterTypes, this, this, Cx, i))
{
yield return p;
}
}
internal static IEnumerable<IExtractionProduct> GetParameterExtractionProducts(IEnumerable<Type> parameterTypes, IParameterizable parameterizable, ICustomModifierReceiver receiver, Context cx, int firstChildIndex)
{
var i = firstChildIndex;
foreach (var p in parameterTypes)
{
var t = p;
if (t is ModifiedType mt)
{
t = mt.Unmodified;
yield return Tuples.cil_custom_modifiers(this, mt.Modifier, mt.IsRequired);
yield return Tuples.cil_custom_modifiers(receiver, mt.Modifier, mt.IsRequired);
}
yield return Cx.Populate(new Parameter(Cx, this, i++, t));
yield return cx.Populate(new Parameter(cx, parameterizable, i++, t));
}
}