Ответ 1
@kvb верен, что кажется, что компилятор F#
, похоже, лишает MethodImpl
.
ComputeMethodImplAttribs
в IlxGen.fs вызывается для вычисления атрибутов метода.
and ComputeMethodImplAttribs cenv (_v:Val) attrs =
let implflags =
match TryFindFSharpAttribute cenv.g cenv.g.attrib_MethodImplAttribute attrs with
| Some (Attrib(_,_,[ AttribInt32Arg flags ],_,_,_,_)) -> flags
| _ -> 0x0
let hasPreserveSigAttr =
match TryFindFSharpAttributeOpt cenv.g cenv.g.attrib_PreserveSigAttribute attrs with
| Some _ -> true
| _ -> false
// strip the MethodImpl pseudo-custom attribute
// The following method implementation flags are used here
// 0x80 - hasPreserveSigImplFlag
// 0x20 - synchronize
// (See ECMA 335, Partition II, section 23.1.11 - Flags for methods [MethodImplAttributes])
let attrs = attrs
|> List.filter (IsMatchingFSharpAttribute cenv.g cenv.g.attrib_MethodImplAttribute >> not)
|> List.filter (IsMatchingFSharpAttributeOpt cenv.g cenv.g.attrib_PreserveSigAttribute >> not)
let hasPreserveSigImplFlag = ((implflags &&& 0x80) <> 0x0) || hasPreserveSigAttr
let hasSynchronizedImplFlag = (implflags &&& 0x20) <> 0x0
let hasNoInliningImplFlag = (implflags &&& 0x08) <> 0x0
hasPreserveSigImplFlag, hasSynchronizedImplFlag, hasNoInliningImplFlag, attrs
Глядя ближе на строку: 4990:
let attrs = attrs
|> List.filter (IsMatchingFSharpAttribute cenv.g cenv.g.attrib_MethodImplAttribute >> not)
|> List.filter (IsMatchingFSharpAttributeOpt cenv.g cenv.g.attrib_PreserveSigAttribute >> not)
Первый filter
отфильтровывает MethodImplAttribute
.
Теперь я немного искал логическое обоснование, но этот код восходит к latkin
initial commit. Я думаю, что, вероятно, неправильно отделять MethodImpl
особенно для AggressiveInlining
, который, я считаю, влияет на JIT: ing, поэтому он должен быть в сборке.
Я бы рекомендовал зарегистрировать issue. Возможно, вы можете получить объяснение, по крайней мере.