< Summary - FSharp.Interop.Dlr

Information
Class: FSharp.Interop.Dlr.TranslateMembers
Assembly: FSharp.Interop.Dlr
File(s): /home/runner/work/FSharp.Interop.Dlr/FSharp.Interop.Dlr/FSharp.Interop.Dlr/TranslateMembers.fs
Line coverage
98%
Covered lines: 360
Uncovered lines: 4
Coverable lines: 364
Total lines: 564
Line coverage: 98.9%
Branch coverage
82%
Covered branches: 468
Total branches: 566
Branch coverage: 82.6%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
targetArg(...)100%44100%
valueArg(...)100%44100%
argList(...)75%171686.66%
bind(...)100%11100%
indexList(...)100%22100%
finish(...)100%22100%
byRefCall(...)100%3232100%
shapeError@72(...)100%11100%
Invoke(...)100%11100%
agrees@74(...)100%11100%
Invoke(...)100%11100%
at@121(...)100%11100%
Invoke(...)100%11100%
newTuple@130(...)100%22100%
Invoke(...)100%22100%
withTuple(...)100%11100%
isWide(...)100%11100%
delegateTypeOver(...)100%44100%
lambdaOver(...)100%22100%
packArguments(...)100%66100%
keyedSiteTyped(...)100%1414100%
template@183(...)100%11100%
Invoke(...)100%11100%
lift@203(...)83.33%6683.33%
Invoke(...)83.33%6683.33%
keyedSiteRaw(...)100%11100%
keyedSiteCore(...)100%22100%
keySpec(...)58.33%1212100%
keyedSite(...)100%11100%
namedOfCallKeyed(...)100%44100%
Invoke(...)83.33%1212100%
value@315(...)100%11100%
Invoke(...)100%11100%
namedOfCall(...)100%11100%
|DelegateRead|_|(...)100%11100%
computedName(...)100%11100%
compoundAssign(...)100%22100%
tryOperation(...)100%1010100%
Invoke(...)37.5%88100%
Invoke(...)100%11100%
Invoke(...)50%22100%

File(s)

/home/runner/work/FSharp.Interop.Dlr/FSharp.Interop.Dlr/FSharp.Interop.Dlr/TranslateMembers.fs

#LineLine coverage
 1namespace FSharp.Interop.Dlr
 2
 3open System
 4open System.Linq.Expressions
 5open FSharp.Quotations
 6open FSharp.Quotations.Patterns
 7open FSharp.Quotations.DerivedPatterns
 8open FSharp.Quotations.ExprShape
 9open FSharp.Reflection
 10open Microsoft.FSharp.Linq.RuntimeHelpers
 11open System.Runtime.CompilerServices
 12
 13module internal TranslateMembers =
 14    open TranslatePatterns
 15    open SiteHoisting
 16    open TranslateBlock
 17
 18    /// The marker operations: a literal name is a baked site; a computed name or runtime type
 19    /// arguments bind per key through a SiteCache.
 20    module Members =
 21
 22        let private targetArg (rewriteIn: Rewrite) bound (target: Expr) =
 968423            match target with
 11624            | StaticTarget t -> Binders.staticTarget t
 25            | _ ->
 956826                let t = rewriteIn bound target
 2870427                Binders.dynamicArg (if t.Type = typeof<obj> then t else Expr.Coerce(t, typeof<obj>))
 28
 29        let private valueArg (rewriteIn: Rewrite) bound (value: Expr) =
 510830            match value with
 325331            | Value _ -> Binders.constant (Binders.typedArg value)
 32            // A unit-valued expression (a void call, `ignore x`) as a value: run, then `()`.
 185933            | _ when value.Type = typeof<unit> -> Binders.typedArg (Expr.Sequential(rewriteIn bound value, Expr.Value(()
 185134            | _ -> Binders.typedArg (rewriteIn bound value)
 35
 36        let private argList (rewriteIn: Rewrite) bound (argExprs: Expr list) =
 320037            let bindings = ResizeArray()
 320038            let args =
 928839                [ for a in argExprs do
 438340                    match a with
 441                    | TypeArgs _ -> unsupported "Dlr.typeArgs anywhere but as the first argument of a member call (a val
 042                    | NamedOf _ | ArgsOf _ -> unsupported "Dlr.namedOf / Dlr.argsOf here (they go in the arguments of a 
 043                    | OutMarker _ | RefMarker _ -> unsupported "Dlr.out / Dlr.outAs / Dlr.ref here: they go directly in 
 320044                    | NamedRecord(lets, fields) ->
 6645                        bindings.AddRange lets
 9946                        let inner = bindings |> Seq.fold (fun (b: Set<Var>) (v, _) -> b.Add v) bound
 38247                        for (name, v) in fields -> Binders.named name (valueArg rewriteIn inner v)
 320048                    // Argument positions are generic-typed, so a `Coerce(_, obj)` here is the user's
 320049                    // `x :> obj` and means what `box x` means: an obj argument, runtime dispatch.
 604050                    | v -> yield valueArg rewriteIn bound v ]
 317851            List.ofSeq bindings, args
 52
 53        let private bind (rewriteIn: Rewrite) bound (bindings: (Var * Expr) list) (call: Expr) =
 794754            List.foldBack (fun (v, value) body -> Expr.Let(v, rewriteIn bound value, body)) bindings call
 55
 89456        let private indexList (rewriteIn: Rewrite) bound (indexes: Expr list) = [ for i in indexes -> valueArg rewriteIn
 57
 58        let private finish (block: Block) discard (resultType: Type) (call: Expr) =
 340659            if discard then call else block.Convert resultType call
 60
 61        /// A call with `Dlr.out` / `Dlr.ref` arguments (#131). The outs come back as F# returns a
 62        /// method's out parameters: the result is a tuple of the return value then each out in
 63        /// order, or — when the result has no slot for the return value, which is then discarded —
 64        /// the outs alone (the bare value for one); each out's type is its element of the result
 65        /// type. A ref's value is read from its `let mutable` at the call, after every other argument
 66        /// (the callers bind those in order: `sequenced`), and the method's write is assigned back.
 67        /// Through `Binders.ByRefSite`, whose holder `makeCall` returns and is unpacked here.
 68        let private byRefCall (rewriteIn: Rewrite) bound (argExprs: Expr list) (resultType: Type) (convertReturn: Type -
 69            // Each out's stated type (`Dlr.outAs<'T>`), or None to take it from the result's shape.
 468370            let stated = argExprs |> List.choose (function OutMarker t -> Some t | _ -> None)
 129871            let outCount = stated.Length
 72            let shapeError () =
 2073                raise (DlrTranslationException(sprintf "dlr { } does not support a call with %d Dlr.out argument(s) whos
 407274            let agrees (outTypes: Type list) = List.forall2 (fun s t -> match s with Some s -> s = t | None -> true) sta
 75            // The shapes in order, the first that agrees with the stated types: the return value then
 76            // the outs; the outs alone (two or more); the one out's bare value — for a tuple-typed
 77            // result only when Dlr.outAs states that type, so a plain Dlr.out keeps a mismatched
 78            // tuple a shape error (the analyzer's too). A reference or a struct tuple: `let struct
 79            // (ok, v) = …` allocates no tuple.
 80            let returnType, outTypes =
 147281                if outCount = 0 then (if resultType = typeof<unit> then None else Some resultType), []
 124482                elif resultType = typeof<unit> then shapeError ()
 83                else
 123284                    let elements = if FSharpType.IsTuple resultType then List.ofArray (FSharpType.GetTupleElements resul
 241485                    if elements.Length = outCount + 1 && agrees elements.Tail then Some elements.Head, elements.Tail
 8486                    elif outCount >= 2 && elements.Length = outCount && agrees elements then None, elements
 11087                    elif outCount = 1 && (elements.IsEmpty || stated = [ Some resultType ]) && agrees [ resultType ] the
 888                    else shapeError ()
 127889            let pendingOuts = System.Collections.Generic.Queue<Type>(outTypes)
 90            // Per byref argument, in order: an out's type, or a ref's place (its type and how to
 91            // write it back).
 127892            let byRefs = ResizeArray<Choice<Type, Type * (Expr -> Expr)>>()
 127893            let namedBindings = ResizeArray<Var * Expr>()
 127894            let args =
 524695                [ for a in argExprs do
 404396                    match a with
 127897                    | OutMarker _ ->
 139698                        let t = pendingOuts.Dequeue()
 139699                        byRefs.Add(Choice1Of2 t)
 1396100                        yield Binders.byRefArg true t (Expr.Value(null, typeof<obj>)) null
 62101                    | RefMarker(Var v) when v.IsMutable ->
 124102                        byRefs.Add(Choice2Of2(v.Type, fun value -> Expr.VarSet(v, value)))
 62103                        yield Binders.byRefArg false v.Type (rewriteIn bound (Expr.Var v)) (box v)
 1278104                    // A `let mutable` a closure captures is a ref cell by the time it is quoted.
 645105                    | RefMarker(PropertyGet(Some(Var cell as cellExpr), p, [])) when cell.Type.IsGenericType && cell.Typ
 645106                        byRefs.Add(Choice2Of2(p.PropertyType, fun value -> Expr.PropertySet(cellExpr, p, value)))
 643107                        yield Binders.byRefArg false p.PropertyType (rewriteIn bound (Expr.PropertyGet(cellExpr, p))) (b
 643108                    | RefMarker other -> unsupported "Dlr.ref of anything but a let mutable (its value goes in, and the 
 1278109                    // Named arguments, as `argList` takes them: the record's field temporaries
 1278110                    // wrap the call, in source order.
 1278111                    | NamedRecord(lets, fields) ->
 651112                        namedBindings.AddRange lets
 661113                        let inner = namedBindings |> Seq.fold (fun (b: Set<Var>) (v, _) -> b.Add v) bound
 703114                        for (name, v) in fields -> Binders.named name (valueArg rewriteIn inner v)
 643115                    | NamedOf _ | ArgsOf _ -> unsupported "Dlr.namedOf / Dlr.argsOf in a call with Dlr.out, Dlr.outAs or
 641116                    | TypeArgs _ -> unsupported "Dlr.typeArgs anywhere but as the first argument of a member call" a
 1880117                    | v -> yield valueArg rewriteIn bound v ]
 1270118            let call = makeCall returnType.IsNone args
 119            // The holder (Binders.byRefHolderType): the result as obj, then each byref's value, typed.
 1270120            let results = Var("byRefResults", call.Type)
 6730121            let at (i: int) = Binders.byRefHolderPath call.Type i |> List.fold (fun (e: Expr) f -> Expr.FieldGet(e, f)) 
 1270122            let bound' = Set.add results bound
 1270123            let writeBacks =
 3998124                [ for i, b in Seq.indexed byRefs do
 2185125                    match b with
 66126                    | Choice2Of2(_, write) -> yield rewriteIn bound' (write (at (i + 1)))
 1964127                    | Choice1Of2 _ -> () ]
 8878128            let outValues = [ for i, b in Seq.indexed byRefs do match b with Choice1Of2 _ -> yield at (i + 1) | Choice2O
 129            // The result tuple, of the result type's kind: a struct one is the ValueTuple constructor.
 2376130            let newTuple (values: Expr list) = if resultType.IsValueType then Tuples.newQuotation resultType values else
 131            let value =
 1270132                match returnType, outValues with
 32133                | None, [] -> Expr.Value(())
 22134                | Some t, [] -> convertReturn t (at 0)
 1172135                | Some t, outs -> newTuple (convertReturn t (at 0) :: outs)
 28136                | None, [ single ] -> single
 16137                | None, outs -> newTuple outs
 1336138            let body = List.foldBack (fun w rest -> Expr.Sequential(w, rest)) writeBacks value
 1270139            List.foldBack (fun (v, value) body -> Expr.Let(v, rewriteIn bound value, body)) (List.ofSeq namedBindings) (
 140
 141        /// The tuple bindings of `splitArgs`, added to the bound set for the argument rewrites.
 142        let private withTuple (bound: Set<Var>) (tupleBindings: (Var * Expr) list) =
 2933143            tupleBindings |> List.fold (fun (b: Set<Var>) (v, _) -> b.Add v) bound
 144
 145        /// The name and the type arguments of a keyed site, each either static (a constant in the
 146        /// key) or an expression evaluated per call in the scope the site is emitted in.
 147        type KeySpec = Choice<string, Expr> * Choice<Type list, Expr>
 148
 149        /// A delegate over `parameters` returning obj, compiled once per site: a `Func<…>` while
 150        /// its arity allows; past that the delegate type would be emitted at run time, which a
 151        /// quotation must not name (see `Binders.WideSite`), so it is a `Func<obj[], obj>` over the
 152        /// parameters packed (`packArguments` at the call) and unpacked to their types inside.
 7928153        let private isWide (parameters: Var list) = not (DelegateMembers.funcFits parameters.Length)
 154        let private delegateTypeOver (parameters: Var list) =
 3972155            if isWide parameters then typeof<Func<obj[], obj>>
 29136156            else Expression.GetDelegateType(Array.ofList ([ for v in parameters -> v.Type ] @ [ typeof<obj> ]))
 157        let private lambdaOver (parameters: Var list) (body: Expr) =
 5038158            if not (isWide parameters) then Expr.NewDelegate(delegateTypeOver parameters, parameters, body)
 159            else
 16160                let packed = Var("packed", typeof<obj[]>)
 16161                let atArg = typeof<NamedOfCache>.GetMethod("At")
 16162                let unpacked =
 16163                    List.foldBack (fun (i, v: Var) (inner: Expr) ->
 272164                        let element = Expr.Call(atArg, [ Expr.Var packed; Expr.Value i ])
 816165                        Expr.Let(v, (if v.Type = typeof<obj> then element else Expr.Coerce(element, v.Type)), inner))
 16166                        (List.indexed parameters) body
 16167                Expr.NewDelegate(typeof<Func<obj[], obj>>, [ packed ], unpacked)
 168        let private packArguments (parameters: Var list) (arguments: Expr list) =
 2874169            if not (isWide parameters) then arguments
 592170            else [ Expr.NewArray(typeof<obj>, [ for a in arguments -> if a.Type = typeof<obj> then a else Expr.Coerce(a,
 171
 172        /// An operation whose binder inputs — the member name, the type arguments, or both — are
 173        /// only known at run time: the operation's delegate is compiled once here with its call
 174        /// sites as parameters (lifted from a template built for a placeholder key), and a
 175        /// SiteCache constant creates the sites per distinct `(name, types)` key; the emitted
 176        /// code is `let sites = cache.Get((name, types)) in delegate.Invoke(sites.[0], …, target, args…)`.
 177        /// Argument names in `Dlr.named` stay static. This is the core over prepared arguments;
 178        /// the name and type expressions must be valid where the result is placed.
 179        let private keyedSiteTyped (key: KeySpec) (targetInfo: Binders.Arg) (argInfos: Binders.Arg list) (site: string -
 1257180            let targetVar = Var("target", targetInfo.Type)
 181            // A byref argument (`Dlr.out` / `Dlr.ref`) is passed as its value: a quotation variable cannot be a byref.
 3028182            let argVars = argInfos |> List.mapi (fun i a -> Var(sprintf "a%d" i, (if a.Type.IsByRef then a.Expr.Type els
 183            let template (name: string, types: Type list) =
 5451184                let args = List.map2 (fun (info: Binders.Arg) (v: Var) -> { info with Expr = Expr.Var v }) argInfos argV
 4557185                site name types { targetInfo with Expr = Expr.Var targetVar } args
 186            // The operation's shape does not depend on the key, only its sites do: build it once
 187            // for a placeholder, lift every site constant into a parameter, and compile that one
 188            // delegate now. Per key, the cache creates the sites and hands them back in the
 189            // same order.
 190            let placeholderName, nameE =
 1257191                match fst key with
 40192                | Choice1Of2 name -> name, Expr.Value name
 1217193                | Choice2Of2 e -> "name", e
 194            let placeholderTypes, typesE =
 1257195                match snd key with
 1213196                | Choice1Of2 ts -> ts, Expr.Value(ts, typeof<Type list>)
 44197                | Choice2Of2 e -> [], e
 1257198            let placeholder = template (placeholderName, placeholderTypes)
 1257199            let sites = SiteCache<string * Type list>.Sites placeholder
 200            // A wide site's type names an emitted delegate type: keep it out of the quotation (see
 201            // `Binders.WideSite`) by typing the parameter as the base `CallSite`.
 7108202            let siteVars = sites |> List.mapi (fun i s -> s, Var(sprintf "site%d" i, (let t = s.GetType() in if t.GetGen
 203            let rec lift (e: Expr) =
 7089204                match e with
 2674205                | Value(v, _) when (v :? CallSite) ->
 7796206                    match siteVars |> List.tryFind (fun (s, _) -> obj.ReferenceEquals(s, v)) with
 2542207                    | Some(_, var) -> Expr.Var var
 0208                    | None -> e
 4547209                | _ -> Quotation.rebuild lift e
 1257210            let body = lift placeholder
 211            // A discarded result is a void site: the delegate still returns obj, so hand back null.
 212            let boxed =
 2466213                if body.Type = typeof<obj> then body
 144214                elif body.Type = typeof<unit> || body.Type = typeof<Void> then Expr.Sequential(body, Expr.Value(null, ty
 40215                else Expr.Coerce(body, typeof<obj>)
 6381216            let parameters = [ for _, v in siteVars -> v ] @ targetVar :: argVars
 1257217            let cache = SiteCache<string * Type list>(template)
 1257218            let cacheType = typeof<SiteCache<string * Type list>>
 1257219            let sitesVar = Var("sites", typeof<CallSite[]>)
 1257220            let at = cacheType.GetMethod("At")
 3193221            let siteArgs = siteVars |> List.mapi (fun i (_, v) -> Expr.Coerce(Expr.Call(at, [ Expr.Var sitesVar; Expr.Va
 4151222            let arguments = siteArgs @ targetInfo.Expr :: [ for a in argInfos -> a.Expr ]
 1257223            let siteDelegate = delegateTypeOver parameters
 224            // Through the hoister like every compiled tree: a wide site's placeholder in the template
 225            // is rewritten there (its site arrives as a parameter, which the rewrite converts).
 1257226            let linq = LeafExpressionConverter.QuotationToExpression (lambdaOver parameters boxed) :?> LambdaExpression
 1257227            let compiled = (SiteHoister().Visit linq :?> LambdaExpression).Compile()
 1257228            let invocation = Expr.Call(Expr.Value(compiled, siteDelegate), siteDelegate.GetMethod("Invoke"), packArgumen
 1257229            Expr.Let(sitesVar, Expr.Call(Expr.Value(cache, cacheType), cacheType.GetMethod("Get"), [ Expr.NewTuple [ nam
 1257230            placeholder.Type
 231
 232        /// The keyed call, boxed to `obj` whatever the operation's own type.
 24233        let private keyedSiteRaw key targetInfo argInfos site : Expr = fst (keyedSiteTyped key targetInfo argInfos site)
 234
 235        /// `keyedSiteRaw`'s call converted to `resultType`: cast back where the operation already is
 236        /// of that type (a member read as a function or delegate type), converted otherwise (a
 237        /// call's result, which may be a delegate typed as a function or back, #207).
 238        let private keyedSiteCore (block: Block) (key: KeySpec) (targetInfo: Binders.Arg) (argInfos: Binders.Arg list) (
 1233239            let call, operationType = keyedSiteTyped key targetInfo argInfos site
 2466240            if operationType = resultType then Expr.Coerce(call, resultType) else block.Convert resultType call
 241
 242        /// The key of a computed name / run-time type arguments, its expressions rewritten in
 243        /// the block's scope.
 244        let private keySpec (rewriteIn: Rewrite) bound (nameExpr: Expr) (typeArgs: TypeArgsSpec) : KeySpec =
 3735245            (match nameExpr with Literal name -> Choice1Of2(string name) | e -> Choice2Of2(rewriteIn bound e)),
 3735246            (match typeArgs with StaticTypes ts -> Choice1Of2 ts | RuntimeTypes e -> Choice2Of2(rewriteIn bound e))
 247
 248        /// `keyedSiteCore` over argument expressions, in the block's scope.
 249        let private keyedSite (block: Block) (rewriteIn: Rewrite) bound (nameExpr: Expr) (typeArgs: TypeArgsSpec) (targe
 1195250            let bindings, argInfos = argList rewriteIn bound argExprs
 1195251            keyedSiteCore block (keySpec rewriteIn bound nameExpr typeArgs) (targetArg rewriteIn bound target) argInfos 
 1195252            |> bind rewriteIn bound bindings
 253
 254        /// An invocation whose arguments include `Dlr.namedOf pairs`: the operation is compiled
 255        /// per distinct name list — the names decide the site's arity, so the whole delegate is
 256        /// per key — through a bounded `NamedOfCache` constant, taking the target, the fixed
 257        /// arguments and the named values (`obj`, dispatched on runtime type). `operation` builds
 258        /// the site expression for a target and its full argument list. `None` when there is no
 259        /// `namedOf` in `argExprs`. With a computed member name / run-time type arguments
 260        /// (`key`), their expressions are evaluated in the block's scope and passed into the
 261        /// per-name-list delegate as parameters, where `operation` gets them for a `keyedSiteCore`.
 262        let private namedOfCallKeyed (block: Block) (rewriteIn: Rewrite) bound (target: Expr) (argExprs: Expr list) (res
 1451263            let namedOfs = argExprs |> List.choose (function NamedOf pairs -> Some pairs | _ -> None)
 1451264            let argsOfs = argExprs |> List.choose (function ArgsOf values -> Some values | _ -> None)
 1213265            if namedOfs.IsEmpty && argsOfs.IsEmpty then None
 266            else
 98267                if namedOfs.Length > 1 then unsupported "more than one Dlr.namedOf in one call (concatenate the lists)" 
 100268                if argsOfs.Length > 1 then unsupported "more than one Dlr.argsOf in one call (concatenate the lists)" ar
 269                // Named arguments are the call's trailing ones (the binder's CallInfo names the
 270                // last arguments), so nothing positional may follow Dlr.namedOf.
 474271                (match argExprs |> List.tryFindIndex (function NamedOf _ -> true | _ -> false) with
 146272                 | Some i when argExprs |> List.skip (i + 1) |> List.exists (function NamedRecord _ -> false | _ -> true
 2273                    unsupported "a positional argument after Dlr.namedOf (named arguments come last)" argExprs.[i]
 94274                 | _ -> ())
 188275                let pairsExpr = match namedOfs with [ p ] -> p | _ -> Expr.Value(([]: (string * obj) list), typeof<(stri
 188276                let positionalExpr = match argsOfs with [ p ] -> p | _ -> Expr.Value(([]: obj list), typeof<obj list>)
 277                /// The argument list's layout: fixed arguments by index, the positional splat, the
 278                /// named splat — so the compiled call keeps the source order.
 279                let layout =
 94280                    let mutable next = 0
 188281                    argExprs |> List.choose (fun a ->
 184282                        match a with
 46283                        | NamedOf _ -> Some(Choice3Of3 ())
 55284                        | ArgsOf _ -> Some(Choice2Of3 ())
 343285                        | _ -> (let i = next in next <- next + 1; Some(Choice1Of3 i)))
 372286                let fixedExprs = argExprs |> List.filter (fun a -> not (isSplat a))
 94287                let bindings, fixedInfos = argList rewriteIn bound fixedExprs
 94288                let targetInfo = targetArg rewriteIn bound target
 94289                let targetVar = Var("target", targetInfo.Type)
 271290                let fixedVars = fixedInfos |> List.mapi (fun i a -> Var(sprintf "a%d" i, a.Type))
 94291                let valuesVar = Var("values", typeof<obj[]>)
 94292                let at = typeof<NamedOfCache>.GetMethod("At")
 293                // A computed name / run-time type list are evaluated out here and passed in as
 294                // parameters: the delegate does not see the block's scope.
 295                let keyVars, keyExprs, innerKey =
 94296                    match key with
 81297                    | None -> [], [], None
 298                    | Some(name, types) ->
 50299                        let nameVar, nameE = (match name with Choice1Of2 n -> None, Choice1Of2 n | Choice2Of2 e -> (let 
 41300                        let typesVar, typesE = (match types with Choice1Of2 ts -> None, Choice1Of2 ts | Choice2Of2 e -> 
 26301                        let vars = [ nameVar; typesVar ] |> List.choose id
 13302                        List.map fst vars, List.map snd vars, Some((nameE, typesE): KeySpec)
 303                // One delegate type for every key at this site: the names change the sites inside,
 304                // not the parameters, so the call is a typed Invoke, not DynamicInvoke.
 94305                let parameters = targetVar :: fixedVars @ keyVars @ [ valuesVar ]
 94306                let siteDelegate = delegateTypeOver parameters
 307                let compile (names: string list) : Delegate =
 721308                    let fixed' = List.map2 (fun (info: Binders.Arg) (v: Var) -> { info with Expr = Expr.Var v }) fixedIn
 309                    // `fixedInfos` are grouped per source argument (a Dlr.named record is several):
 310                    // walk the fixed expressions again to know how many each contributed.
 311                    let fixedGroups =
 1442312                        let counted = fixedExprs |> List.map (fun a -> match a with NamedRecord(_, fields) -> fields.Len
 635313                        let mutable offset = 0
 2335314                        [ for n in counted -> (let g = List.take n (List.skip offset fixed') in offset <- offset + n; g)
 2124315                    let value i = Binders.dynamicArg (Expr.Call(at, [ Expr.Var valuesVar; Expr.Value i ]))
 2939316                    let positionalCount = names |> List.takeWhile (fun n -> n.Length = 0) |> List.length
 2671317                    let positional = [ for i in 0 .. positionalCount - 1 -> value i ]
 2500318                    let named = names |> List.skip positionalCount |> List.mapi (fun j name -> Binders.named name (value
 319                    let args =
 1270320                        layout |> List.collect (function
 86321                            | Choice1Of3 i -> fixedGroups.[i]
 67322                            | Choice2Of3 () -> positional
 1212323                            | Choice3Of3 () -> named)
 635324                    let body = operation (defaultArg innerKey (Choice1Of2 "", Choice1Of2 [])) { targetInfo with Expr = E
 325                    let boxed =
 1266326                        if body.Type = typeof<obj> then body
 12327                        elif body.Type = typeof<unit> || body.Type = typeof<Void> then Expr.Sequential(body, Expr.Value(
 4328                        else Expr.Coerce(body, typeof<obj>)
 635329                    let linq = LeafExpressionConverter.QuotationToExpression (lambdaOver parameters boxed) :?> LambdaExp
 635330                    (SiteHoister().Visit linq :?> LambdaExpression).Compile()
 94331                let cache = NamedOfCache(compile)
 94332                let cacheType = typeof<NamedOfCache>
 94333                let pairsVar = Var("pairs", typeof<(string * obj) list>)
 94334                let positionalVar = Var("positional", typeof<obj list>)
 94335                let delegateVar = Var("d", siteDelegate)
 94336                let values = Expr.Call(cacheType.GetMethod("Values"), [ Expr.Var positionalVar; Expr.Var pairsVar ])
 94337                let call =
 94338                    Expr.Let(positionalVar, rewriteIn bound positionalExpr,
 94339                      Expr.Let(pairsVar, rewriteIn bound pairsExpr,
 94340                        Expr.Let(delegateVar, Expr.Coerce(Expr.Call(Expr.Value(cache, cacheType), cacheType.GetMethod("G
 365341                            Expr.Call(Expr.Var delegateVar, siteDelegate.GetMethod("Invoke"), packArguments parameters (
 282342                (if discard then Expr.Sequential(call, Expr.Value(())) else block.Convert resultType call)
 94343                |> bind rewriteIn bound bindings
 94344                |> Some
 345
 346        /// An invocation whose arguments include `Dlr.namedOf pairs`, with a literal member name.
 347        let private namedOfCall (block: Block) (rewriteIn: Rewrite) bound (target: Expr) (argExprs: Expr list) (resultTy
 1636348            namedOfCallKeyed block rewriteIn bound target argExprs resultType discard None (fun _ t args -> operation t 
 349
 350        /// An expression typed as a delegate type a member can be read as (#201), with the function
 351        /// type its invoker takes past fourteen parameters (`Binders.delegateRead`).
 2855352        let private (|DelegateRead|_|) (e: Expr) = Binders.delegateRead e.Type
 353
 354        /// `(?) x name` with a computed name (no type arguments): see keyedSite.
 355        let private computedName block rewriteIn bound (nameExpr: Expr) (target: Expr) (argExprs: Expr list) (resultType
 5368356            keyedSite block rewriteIn bound nameExpr (StaticTypes []) target argExprs resultType (fun name _ targetArg a
 357
 358        /// `Dlr.addAssign`/`subtractAssign`: bind the target and value once, then both branches
 359        /// of the IsEvent decision refer to them. A computed name goes through the SiteCache
 360        /// like any other member operation.
 361        let private compoundAssign (block: Block) (rewriteIn: Rewrite) bound (subtract: bool) (nameExpr: Expr) (target: 
 94362            match nameExpr with
 363            | Literal name ->
 45364                let targetInfo = targetArg rewriteIn bound target
 45365                let v = rewriteIn bound value
 45366                let tv = Var("target", targetInfo.Type)
 45367                let vv = Var("value", v.Type)
 368                // A literal value keeps C#'s constant conversions (a byte member += 1) even though
 369                // it is read through a variable here.
 370                let valueArg =
 45371                    let a = Binders.typedArg (Expr.Var vv)
 45372                    match value with
 14373                    | Value _ -> Binders.constant a
 31374                    | _ -> a
 45375                let body = Binders.compoundAssign block.Context (string name) subtract { targetInfo with Expr = Expr.Var
 43376                Expr.Let(tv, targetInfo.Expr, Expr.Let(vv, v, body))
 377            | _ ->
 4378                computedName block rewriteIn bound nameExpr target [ value ] typeof<unit> (fun name targetArg args ->
 4379                    // The name-cache template already makes target and value delegate parameters.
 16380                    Expr.Sequential(Binders.compoundAssign block.Context name subtract targetArg (List.head args), Expr.
 381
 382        /// The expression, if it is a marker operation.
 383        let tryOperation (block: Block) (rewriteIn: Rewrite) (bound: Set<Var>) (e: Expr) : Expr option =
 140947384            let context = block.Context
 140947385            let convert = block.Convert
 140947386            let rewrite = rewriteIn bound
 70045387            let targetArg = targetArg rewriteIn
 70045388            let valueArg = valueArg rewriteIn
 70045389            let argList = argList rewriteIn
 70045390            let bind = bind rewriteIn
 70045391            let indexList = indexList rewriteIn
 70045392            let finish = finish block
 70045393            let computedName = computedName block rewriteIn bound
 140947394            match e with
 4596395            | MemberOp(InvokeMember(target, nameExpr, argExpr)) when (snd (splitArgs argExpr)) |> List.exists isByRefMar
 609396                let tupleBindings, argExprs = splitArgs argExpr
 609397                if not tupleBindings.IsEmpty then unsupported "Dlr.out / Dlr.outAs / Dlr.ref in a tuple held in a variab
 398                let typeArgs, argExprs =
 609399                    match argExprs with
 6400                    | TypeArgs spec :: rest -> spec, rest
 603401                    | args -> StaticTypes [], args
 402                // C#'s order, always: the target, a computed name / type list, then the arguments,
 403                // each impure one bound in turn (a Dlr.named record's temporaries at its place).
 3654404                let keys = [ (match nameExpr with Literal _ -> None | k -> Some k); (match typeArgs with RuntimeTypes k 
 609405                let bindings, vars, target', keys', argExprs' = sequenced (Some target) keys [] argExprs
 609406                let bound' = Set.union bound vars
 1827407                let nameExpr', keys' = (match nameExpr with Literal _ -> nameExpr, keys' | _ -> List.head keys', List.ta
 1827408                let typeArgs' = (match typeArgs with RuntimeTypes _ -> RuntimeTypes(List.head keys') | t -> t)
 609409                let targetInfo = targetArg bound' target'.Value
 410                let makeCall =
 609411                    match nameExpr', typeArgs' with
 583412                    | Literal name, StaticTypes ts -> fun discard args -> Binders.invokeMemberByRef context (string name
 413                    // A computed name or run-time type arguments: a site per key, as for any member
 414                    // call; the holder comes back as it is, for byRefCall to unpack.
 415                    | _ ->
 12416                        let key = keySpec rewriteIn bound' nameExpr' typeArgs'
 417                        fun discard args ->
 12418                            let holder = Binders.byRefHolderOf (targetInfo :: args)
 36419                            Expr.Coerce(keyedSiteRaw key targetInfo args (fun name ts t a -> Binders.invokeMemberByRef c
 1799420                byRefCall rewriteIn bound' argExprs' e.Type convert makeCall |> bind bound bindings |> Some
 421            | MemberOp(InvokeMember(target, nameExpr, argExpr)) ->
 924422                let tupleBindings, argExprs = splitArgs argExpr
 423                let typeArgs, argExprs =
 924424                    match argExprs with
 38425                    | TypeArgs spec :: rest -> spec, rest
 886426                    | args -> StaticTypes [], args
 427                // A computed name / type list is evaluated by the keyed site ahead of the call,
 428                // so it too is sequenced when impure.
 5544429                let keys = [ (match nameExpr with Literal _ -> None | k -> Some k); (match typeArgs with RuntimeTypes k 
 2571430                let ordered = hoists tupleBindings argExprs || keys |> List.exists (fun k -> not (isPure k))
 431                let bindings, bound', target, nameExpr, typeArgs, argExprs =
 920432                    if ordered then
 126433                        let bindings, vars, target', keys', argExprs' = sequenced (Some target) keys tupleBindings argEx
 378434                        let nameExpr', keys' = (match nameExpr with Literal _ -> nameExpr, keys' | _ -> List.head keys',
 378435                        let typeArgs' = (match typeArgs with RuntimeTypes _ -> RuntimeTypes(List.head keys') | t -> t)
 126436                        bindings, Set.union bound vars, target'.Value, nameExpr', typeArgs', argExprs'
 794437                    else tupleBindings, withTuple bound tupleBindings, target, nameExpr, typeArgs, argExprs
 920438                let discard = e.Type = typeof<unit>
 1840439                let hasNamedOf = argExprs |> List.exists isSplat
 1840440                match nameExpr, typeArgs with
 868441                | Literal name, StaticTypes ts when hasNamedOf ->
 677442                    (namedOfCall block rewriteIn bound' target argExprs e.Type discard (fun t args -> Binders.invokeMemb
 443                | Literal name, StaticTypes ts ->
 795444                    let argBindings, args = argList bound' argExprs
 2373445                    Binders.invokeMemberOrApply context (string name) ts discard (targetArg bound' target) args |> finis
 52446                | _ when hasNamedOf ->
 13447                    (namedOfCallKeyed block rewriteIn bound' target argExprs e.Type discard (Some(keySpec rewriteIn boun
 74448                        keyedSiteCore block key t args typeof<obj> (fun name ts targetArg args -> Binders.invokeMemberOr
 449                | _ ->
 39450                    keyedSite block rewriteIn bound' nameExpr typeArgs target argExprs e.Type (fun name ts targetArg arg
 126451                        Binders.invokeMemberOrApply context name ts discard targetArg args)
 912452                |> bind bound bindings
 912453                |> Some
 2977454            | MemberOp(GetMember(target, nameExpr)) when FSharpType.IsFunction e.Type ->
 455                // Read as an F# function: a curried invoker of the member (method, delegate or F#
 456                // function), so `let f: int -> int -> int = dlr { return x?Add }` then `f 1 2`.
 244457                match nameExpr with
 118458                | Literal name -> Binders.functionMember context (string name) e.Type (targetArg bound target)
 12459                | _ -> computedName nameExpr target [] e.Type (fun name targetArg _ -> Binders.functionMember context na
 120460                |> Some
 461            | MemberOp(GetMember(target, nameExpr)) & DelegateRead functionType ->
 462                // Read as a delegate type (#201): the member's value, or an invoker of it when it
 463                // is a method, so `Api.Fold(dlr { return x?Add })` passes `Add` as the `Func`.
 156464                match nameExpr with
 74465                | Literal name -> Binders.delegateMember context (string name) e.Type functionType (targetArg bound targ
 12466                | _ -> computedName nameExpr target [] e.Type (fun name targetArg _ -> Binders.delegateMember context na
 78467                |> Some
 468            | MemberOp(GetMember(target, nameExpr)) ->
 5554469                match nameExpr with
 4454470                | Literal name -> Binders.getMember context (string name) (targetArg bound target) |> convert e.Type
 2651471                | _ -> computedName nameExpr target [] e.Type (fun name targetArg _ -> Binders.getMember context name ta
 2775472                |> Some
 65567473            | Op opAddAssign [ nameExpr; Unboxed value; Unboxed target ] -> Some(compoundAssign block rewriteIn bound fa
 65518474            | Op opSubtractAssign [ nameExpr; Unboxed value; Unboxed target ] -> Some(compoundAssign block rewriteIn bou
 475            | MemberOp(SetMember(target, nameExpr, value)) ->
 160476                match nameExpr with
 154477                | Literal name -> Binders.setMember context (string name) (targetArg bound target) (valueArg bound value
 478                | _ ->
 2479                    computedName nameExpr target [ value ] typeof<unit> (fun name targetArg args ->
 6480                        Binders.setMember context name targetArg (List.head args))
 78481                |> Some
 186482            | New(_, argExprs) when argExprs |> List.exists (function OutMarker _ -> true | _ -> false) ->
 2483                unsupported "Dlr.out / Dlr.outAs in Dlr.new': its result is the constructed T, with no room for an out v
 104484            | New(t, argExprs) when argExprs |> List.exists isByRefMarker ->
 485                // The site's result is `T` itself (see below): the return value unboxes to it.
 8486                let convertReturn (rt: Type) (e: Expr) = if rt = t then Expr.Call(unboxTo.MakeGenericMethod t, [ e ]) el
 4487                let bindings, vars, _, _, argExprs' = sequenced None [] [] argExprs
 8488                byRefCall rewriteIn (Set.union bound vars) argExprs' e.Type convertReturn (fun _ args -> Binders.invokeC
 8489                |> bind bound bindings |> Some
 490            | New(t, argExprs) ->
 491                // The site is typed `T` itself (the binder types a constructor's result as `T`,
 492                // which an obj-typed site rejects for a struct), so no Convert. One argument of a
 493                // tuple type is several, as for a member call: F# picks the one-argument overload
 494                // for `Dlr.new'<T> args` and coerces the tuple.
 495                let tupleBindings, argExprs =
 48496                    match argExprs with
 30497                    | [ single ] -> splitArgs single
 18498                    | many -> [], many
 499                let bindings, bound', argExprs =
 48500                    if hoists tupleBindings argExprs then
 10501                        let bindings, vars, _, _, argExprs' = sequenced None [] tupleBindings argExprs
 10502                        bindings, Set.union bound vars, argExprs'
 38503                    else tupleBindings, withTuple bound tupleBindings, argExprs
 52504                match namedOfCall block rewriteIn bound' (Expr.Value(null, typeof<obj>)) argExprs e.Type false (fun _ ar
 12505                | Some call -> call |> bind bound bindings |> Some
 506                | None ->
 44507                    let argBindings, args = argList bound' argExprs
 176508                    Binders.invokeConstructor context t args |> bind bound' argBindings |> bind bound bindings |> Some
 509            // The value's `?`: applied, a call; read at a function type, the target as that function.
 334510            | Application(EtaReduced(Op opCall [ Unboxed target ]), argExpr)
 65556511            | Op opApply [ argExpr; Unboxed target ] when (snd (splitArgs argExpr)) |> List.exists isByRefMarker ->
 34512                let tupleBindings, argExprs = splitArgs argExpr
 34513                if not tupleBindings.IsEmpty then unsupported "Dlr.out / Dlr.outAs / Dlr.ref in a tuple held in a variab
 34514                let bindings, vars, target', _, argExprs' = sequenced (Some target) [] [] argExprs
 34515                let bound' = Set.union bound vars
 34516                let targetInfo = targetArg bound' target'.Value
 68517                byRefCall rewriteIn bound' argExprs' e.Type convert (fun discard args -> Binders.invokeByRef context dis
 68518                |> bind bound bindings |> Some
 306519            | Application(EtaReduced(Op opCall [ Unboxed target ]), argExpr)
 65304520            | Op opApply [ argExpr; Unboxed target ] ->
 81521                let discard = e.Type = typeof<unit>
 81522                let tupleBindings, argExprs = splitArgs argExpr
 523                let bindings, bound', target, argExprs =
 81524                    if hoists tupleBindings argExprs then
 10525                        let bindings, vars, target', _, argExprs' = sequenced (Some target) [] tupleBindings argExprs
 10526                        bindings, Set.union bound vars, target'.Value, argExprs'
 71527                    else tupleBindings, withTuple bound tupleBindings, target, argExprs
 89528                match namedOfCall block rewriteIn bound' target argExprs e.Type discard (fun t args -> Binders.invokeOrA
 24529                | Some call -> call |> bind bound bindings |> Some
 530                | None ->
 73531                    let argBindings, args = argList bound' argExprs
 357532                    Binders.invokeOrApply context discard (targetArg bound' target) args |> finish discard e.Type |> bin
 65265533            | Op opCall [ Unboxed target ] when FSharpType.IsFunction e.Type ->
 48534                Binders.functionTarget context e.Type (targetArg bound target) |> Some
 65215535            | Op opCall [ _ ] ->
 2536                unsupported "Dlr.call read at a non-function type (a value read as a type is Dlr.implicit; to invoke, ap
 65213537            | Op opItem [ indexes; Unboxed target ] ->
 45538                let tupleBindings, indexExprs = splitArgs indexes
 45539                let bound' = withTuple bound tupleBindings
 168540                Binders.getIndex context (targetArg bound target) (indexList bound' indexExprs) |> convert e.Type |> bin
 65168541            | Op opSetItem [ indexes; value; Unboxed target ] ->
 32542                let tupleBindings, indexExprs = splitArgs indexes
 32543                let bound' = withTuple bound tupleBindings
 128544                Binders.setIndex context (targetArg bound target) (indexList bound' indexExprs) (valueArg bound' value) 
 545            | BinaryOp(op, Unboxed left, Unboxed right) ->
 357546                Binders.binaryOperation context op (valueArg bound left) (valueArg bound right) |> convert e.Type |> Som
 547            | UnaryOp(op, Unboxed operand) ->
 30548                Binders.unaryOperation context op (valueArg bound operand) |> convert e.Type |> Some
 65007549            | Op opCast [ Unboxed value ] ->
 13550                let v = rewrite value
 52551                Binders.convertExplicit context e.Type (if v.Type = typeof<obj> then v else Expr.Coerce(v, typeof<obj>))
 64994552            | Op opImplicit [ Unboxed value ] ->
 52553                let v = rewrite value
 208554                convert e.Type (if v.Type = typeof<obj> then v else Expr.Coerce(v, typeof<obj>)) |> Some
 555            // The marker anywhere but as a target would run its getter at run time and throw the
 556            // outside-a-block error from inside one; say what is wrong instead. Likewise an
 557            // argument marker anywhere but in a call's argument list (those were consumed above).
 4558            | StaticTarget _ -> unsupported "Dlr.Static<T>.Overloads anywhere but as the target of a call" e
 64942559            | Op opNamed _ -> unsupported "Dlr.named anywhere but as an argument of a call (a member call, Dlr.invoke, D
 64936560            | Op opNamedOf _ -> unsupported "Dlr.namedOf anywhere but as an argument of a call (a member call, Dlr.invok
 64932561            | Op opArgsOf _ -> unsupported "Dlr.argsOf anywhere but as an argument of a call (a member call, Dlr.invoke,
 2562            | OutMarker _ | RefMarker _ -> unsupported "Dlr.out / Dlr.outAs / Dlr.ref anywhere but directly in the argum
 0563            | TypeArgs _ -> unsupported "Dlr.typeArgs anywhere but as the first argument of a member call" e
 64930564            | _ -> None

Methods/Properties

targetArg(Microsoft.FSharp.Core.FSharpFunc`2<Microsoft.FSharp.Collections.FSharpSet`1<Microsoft.FSharp.Quotations.FSharpVar>,Microsoft.FSharp.Core.FSharpFunc`2<Microsoft.FSharp.Quotations.FSharpExpr,Microsoft.FSharp.Quotations.FSharpExpr>>,Microsoft.FSharp.Collections.FSharpSet`1<Microsoft.FSharp.Quotations.FSharpVar>,Microsoft.FSharp.Quotations.FSharpExpr)
valueArg(Microsoft.FSharp.Core.FSharpFunc`2<Microsoft.FSharp.Collections.FSharpSet`1<Microsoft.FSharp.Quotations.FSharpVar>,Microsoft.FSharp.Core.FSharpFunc`2<Microsoft.FSharp.Quotations.FSharpExpr,Microsoft.FSharp.Quotations.FSharpExpr>>,Microsoft.FSharp.Collections.FSharpSet`1<Microsoft.FSharp.Quotations.FSharpVar>,Microsoft.FSharp.Quotations.FSharpExpr)
argList(Microsoft.FSharp.Core.FSharpFunc`2<Microsoft.FSharp.Collections.FSharpSet`1<Microsoft.FSharp.Quotations.FSharpVar>,Microsoft.FSharp.Core.FSharpFunc`2<Microsoft.FSharp.Quotations.FSharpExpr,Microsoft.FSharp.Quotations.FSharpExpr>>,Microsoft.FSharp.Collections.FSharpSet`1<Microsoft.FSharp.Quotations.FSharpVar>,Microsoft.FSharp.Collections.FSharpList`1<Microsoft.FSharp.Quotations.FSharpExpr>)
bind(Microsoft.FSharp.Core.FSharpFunc`2<Microsoft.FSharp.Collections.FSharpSet`1<Microsoft.FSharp.Quotations.FSharpVar>,Microsoft.FSharp.Core.FSharpFunc`2<Microsoft.FSharp.Quotations.FSharpExpr,Microsoft.FSharp.Quotations.FSharpExpr>>,Microsoft.FSharp.Collections.FSharpSet`1<Microsoft.FSharp.Quotations.FSharpVar>,Microsoft.FSharp.Collections.FSharpList`1<System.Tuple`2<Microsoft.FSharp.Quotations.FSharpVar,Microsoft.FSharp.Quotations.FSharpExpr>>,Microsoft.FSharp.Quotations.FSharpExpr)
indexList(Microsoft.FSharp.Core.FSharpFunc`2<Microsoft.FSharp.Collections.FSharpSet`1<Microsoft.FSharp.Quotations.FSharpVar>,Microsoft.FSharp.Core.FSharpFunc`2<Microsoft.FSharp.Quotations.FSharpExpr,Microsoft.FSharp.Quotations.FSharpExpr>>,Microsoft.FSharp.Collections.FSharpSet`1<Microsoft.FSharp.Quotations.FSharpVar>,Microsoft.FSharp.Collections.FSharpList`1<Microsoft.FSharp.Quotations.FSharpExpr>)
finish(FSharp.Interop.Dlr.TranslateBlock/Block,System.Boolean,System.Type,Microsoft.FSharp.Quotations.FSharpExpr)
byRefCall(Microsoft.FSharp.Core.FSharpFunc`2<Microsoft.FSharp.Collections.FSharpSet`1<Microsoft.FSharp.Quotations.FSharpVar>,Microsoft.FSharp.Core.FSharpFunc`2<Microsoft.FSharp.Quotations.FSharpExpr,Microsoft.FSharp.Quotations.FSharpExpr>>,Microsoft.FSharp.Collections.FSharpSet`1<Microsoft.FSharp.Quotations.FSharpVar>,Microsoft.FSharp.Collections.FSharpList`1<Microsoft.FSharp.Quotations.FSharpExpr>,System.Type,Microsoft.FSharp.Core.FSharpFunc`2<System.Type,Microsoft.FSharp.Core.FSharpFunc`2<Microsoft.FSharp.Quotations.FSharpExpr,Microsoft.FSharp.Quotations.FSharpExpr>>,Microsoft.FSharp.Core.FSharpFunc`2<System.Boolean,Microsoft.FSharp.Core.FSharpFunc`2<Microsoft.FSharp.Collections.FSharpList`1<FSharp.Interop.Dlr.Binders/Arg>,Microsoft.FSharp.Quotations.FSharpExpr>>)
shapeError@72(System.Type,System.Int32,Microsoft.FSharp.Core.Unit)
Invoke(Microsoft.FSharp.Core.Unit)
agrees@74(Microsoft.FSharp.Collections.FSharpList`1<Microsoft.FSharp.Core.FSharpOption`1<System.Type>>,Microsoft.FSharp.Collections.FSharpList`1<System.Type>)
Invoke(Microsoft.FSharp.Collections.FSharpList`1<System.Type>)
at@121(Microsoft.FSharp.Quotations.FSharpExpr,Microsoft.FSharp.Quotations.FSharpVar,System.Int32)
Invoke(System.Int32)
newTuple@130(System.Type,Microsoft.FSharp.Collections.FSharpList`1<Microsoft.FSharp.Quotations.FSharpExpr>)
Invoke(Microsoft.FSharp.Collections.FSharpList`1<Microsoft.FSharp.Quotations.FSharpExpr>)
withTuple(Microsoft.FSharp.Collections.FSharpSet`1<Microsoft.FSharp.Quotations.FSharpVar>,Microsoft.FSharp.Collections.FSharpList`1<System.Tuple`2<Microsoft.FSharp.Quotations.FSharpVar,Microsoft.FSharp.Quotations.FSharpExpr>>)
isWide(Microsoft.FSharp.Collections.FSharpList`1<Microsoft.FSharp.Quotations.FSharpVar>)
delegateTypeOver(Microsoft.FSharp.Collections.FSharpList`1<Microsoft.FSharp.Quotations.FSharpVar>)
lambdaOver(Microsoft.FSharp.Collections.FSharpList`1<Microsoft.FSharp.Quotations.FSharpVar>,Microsoft.FSharp.Quotations.FSharpExpr)
packArguments(Microsoft.FSharp.Collections.FSharpList`1<Microsoft.FSharp.Quotations.FSharpVar>,Microsoft.FSharp.Collections.FSharpList`1<Microsoft.FSharp.Quotations.FSharpExpr>)
keyedSiteTyped(Microsoft.FSharp.Core.FSharpChoice`2<System.String,Microsoft.FSharp.Quotations.FSharpExpr>,Microsoft.FSharp.Core.FSharpChoice`2<Microsoft.FSharp.Collections.FSharpList`1<System.Type>,Microsoft.FSharp.Quotations.FSharpExpr>,FSharp.Interop.Dlr.Binders/Arg,Microsoft.FSharp.Collections.FSharpList`1<FSharp.Interop.Dlr.Binders/Arg>,Microsoft.FSharp.Core.FSharpFunc`2<System.String,Microsoft.FSharp.Core.FSharpFunc`2<Microsoft.FSharp.Collections.FSharpList`1<System.Type>,Microsoft.FSharp.Core.FSharpFunc`2<FSharp.Interop.Dlr.Binders/Arg,Microsoft.FSharp.Core.FSharpFunc`2<Microsoft.FSharp.Collections.FSharpList`1<FSharp.Interop.Dlr.Binders/Arg>,Microsoft.FSharp.Quotations.FSharpExpr>>>>)
template@183(FSharp.Interop.Dlr.Binders/Arg,Microsoft.FSharp.Collections.FSharpList`1<FSharp.Interop.Dlr.Binders/Arg>,Microsoft.FSharp.Core.FSharpFunc`2<System.String,Microsoft.FSharp.Core.FSharpFunc`2<Microsoft.FSharp.Collections.FSharpList`1<System.Type>,Microsoft.FSharp.Core.FSharpFunc`2<FSharp.Interop.Dlr.Binders/Arg,Microsoft.FSharp.Core.FSharpFunc`2<Microsoft.FSharp.Collections.FSharpList`1<FSharp.Interop.Dlr.Binders/Arg>,Microsoft.FSharp.Quotations.FSharpExpr>>>>,Microsoft.FSharp.Quotations.FSharpVar,Microsoft.FSharp.Collections.FSharpList`1<Microsoft.FSharp.Quotations.FSharpVar>,System.Tuple`2<System.String,Microsoft.FSharp.Collections.FSharpList`1<System.Type>>)
Invoke(System.Tuple`2<System.String,Microsoft.FSharp.Collections.FSharpList`1<System.Type>>)
lift@203(Microsoft.FSharp.Collections.FSharpList`1<System.Tuple`2<System.Runtime.CompilerServices.CallSite,Microsoft.FSharp.Quotations.FSharpVar>>,Microsoft.FSharp.Quotations.FSharpExpr)
Invoke(Microsoft.FSharp.Quotations.FSharpExpr)
keyedSiteRaw(Microsoft.FSharp.Core.FSharpChoice`2<System.String,Microsoft.FSharp.Quotations.FSharpExpr>,Microsoft.FSharp.Core.FSharpChoice`2<Microsoft.FSharp.Collections.FSharpList`1<System.Type>,Microsoft.FSharp.Quotations.FSharpExpr>,FSharp.Interop.Dlr.Binders/Arg,Microsoft.FSharp.Collections.FSharpList`1<FSharp.Interop.Dlr.Binders/Arg>,Microsoft.FSharp.Core.FSharpFunc`2<System.String,Microsoft.FSharp.Core.FSharpFunc`2<Microsoft.FSharp.Collections.FSharpList`1<System.Type>,Microsoft.FSharp.Core.FSharpFunc`2<FSharp.Interop.Dlr.Binders/Arg,Microsoft.FSharp.Core.FSharpFunc`2<Microsoft.FSharp.Collections.FSharpList`1<FSharp.Interop.Dlr.Binders/Arg>,Microsoft.FSharp.Quotations.FSharpExpr>>>>)
keyedSiteCore(FSharp.Interop.Dlr.TranslateBlock/Block,Microsoft.FSharp.Core.FSharpChoice`2<System.String,Microsoft.FSharp.Quotations.FSharpExpr>,Microsoft.FSharp.Core.FSharpChoice`2<Microsoft.FSharp.Collections.FSharpList`1<System.Type>,Microsoft.FSharp.Quotations.FSharpExpr>,FSharp.Interop.Dlr.Binders/Arg,Microsoft.FSharp.Collections.FSharpList`1<FSharp.Interop.Dlr.Binders/Arg>,System.Type,Microsoft.FSharp.Core.FSharpFunc`2<System.String,Microsoft.FSharp.Core.FSharpFunc`2<Microsoft.FSharp.Collections.FSharpList`1<System.Type>,Microsoft.FSharp.Core.FSharpFunc`2<FSharp.Interop.Dlr.Binders/Arg,Microsoft.FSharp.Core.FSharpFunc`2<Microsoft.FSharp.Collections.FSharpList`1<FSharp.Interop.Dlr.Binders/Arg>,Microsoft.FSharp.Quotations.FSharpExpr>>>>)
keySpec(Microsoft.FSharp.Core.FSharpFunc`2<Microsoft.FSharp.Collections.FSharpSet`1<Microsoft.FSharp.Quotations.FSharpVar>,Microsoft.FSharp.Core.FSharpFunc`2<Microsoft.FSharp.Quotations.FSharpExpr,Microsoft.FSharp.Quotations.FSharpExpr>>,Microsoft.FSharp.Collections.FSharpSet`1<Microsoft.FSharp.Quotations.FSharpVar>,Microsoft.FSharp.Quotations.FSharpExpr,FSharp.Interop.Dlr.TranslatePatterns/TypeArgsSpec)
keyedSite(FSharp.Interop.Dlr.TranslateBlock/Block,Microsoft.FSharp.Core.FSharpFunc`2<Microsoft.FSharp.Collections.FSharpSet`1<Microsoft.FSharp.Quotations.FSharpVar>,Microsoft.FSharp.Core.FSharpFunc`2<Microsoft.FSharp.Quotations.FSharpExpr,Microsoft.FSharp.Quotations.FSharpExpr>>,Microsoft.FSharp.Collections.FSharpSet`1<Microsoft.FSharp.Quotations.FSharpVar>,Microsoft.FSharp.Quotations.FSharpExpr,FSharp.Interop.Dlr.TranslatePatterns/TypeArgsSpec,Microsoft.FSharp.Quotations.FSharpExpr,Microsoft.FSharp.Collections.FSharpList`1<Microsoft.FSharp.Quotations.FSharpExpr>,System.Type,Microsoft.FSharp.Core.FSharpFunc`2<System.String,Microsoft.FSharp.Core.FSharpFunc`2<Microsoft.FSharp.Collections.FSharpList`1<System.Type>,Microsoft.FSharp.Core.FSharpFunc`2<FSharp.Interop.Dlr.Binders/Arg,Microsoft.FSharp.Core.FSharpFunc`2<Microsoft.FSharp.Collections.FSharpList`1<FSharp.Interop.Dlr.Binders/Arg>,Microsoft.FSharp.Quotations.FSharpExpr>>>>)
namedOfCallKeyed(FSharp.Interop.Dlr.TranslateBlock/Block,Microsoft.FSharp.Core.FSharpFunc`2<Microsoft.FSharp.Collections.FSharpSet`1<Microsoft.FSharp.Quotations.FSharpVar>,Microsoft.FSharp.Core.FSharpFunc`2<Microsoft.FSharp.Quotations.FSharpExpr,Microsoft.FSharp.Quotations.FSharpExpr>>,Microsoft.FSharp.Collections.FSharpSet`1<Microsoft.FSharp.Quotations.FSharpVar>,Microsoft.FSharp.Quotations.FSharpExpr,Microsoft.FSharp.Collections.FSharpList`1<Microsoft.FSharp.Quotations.FSharpExpr>,System.Type,System.Boolean,Microsoft.FSharp.Core.FSharpOption`1<System.Tuple`2<Microsoft.FSharp.Core.FSharpChoice`2<System.String,Microsoft.FSharp.Quotations.FSharpExpr>,Microsoft.FSharp.Core.FSharpChoice`2<Microsoft.FSharp.Collections.FSharpList`1<System.Type>,Microsoft.FSharp.Quotations.FSharpExpr>>>,Microsoft.FSharp.Core.FSharpFunc`2<System.Tuple`2<Microsoft.FSharp.Core.FSharpChoice`2<System.String,Microsoft.FSharp.Quotations.FSharpExpr>,Microsoft.FSharp.Core.FSharpChoice`2<Microsoft.FSharp.Collections.FSharpList`1<System.Type>,Microsoft.FSharp.Quotations.FSharpExpr>>,Microsoft.FSharp.Core.FSharpFunc`2<FSharp.Interop.Dlr.Binders/Arg,Microsoft.FSharp.Core.FSharpFunc`2<Microsoft.FSharp.Collections.FSharpList`1<FSharp.Interop.Dlr.Binders/Arg>,Microsoft.FSharp.Quotations.FSharpExpr>>>)
Invoke(Microsoft.FSharp.Collections.FSharpList`1<System.String>)
value@315(Microsoft.FSharp.Quotations.FSharpVar,System.Reflection.MethodInfo,a)
Invoke(a)
namedOfCall(FSharp.Interop.Dlr.TranslateBlock/Block,Microsoft.FSharp.Core.FSharpFunc`2<Microsoft.FSharp.Collections.FSharpSet`1<Microsoft.FSharp.Quotations.FSharpVar>,Microsoft.FSharp.Core.FSharpFunc`2<Microsoft.FSharp.Quotations.FSharpExpr,Microsoft.FSharp.Quotations.FSharpExpr>>,Microsoft.FSharp.Collections.FSharpSet`1<Microsoft.FSharp.Quotations.FSharpVar>,Microsoft.FSharp.Quotations.FSharpExpr,Microsoft.FSharp.Collections.FSharpList`1<Microsoft.FSharp.Quotations.FSharpExpr>,System.Type,System.Boolean,Microsoft.FSharp.Core.FSharpFunc`2<FSharp.Interop.Dlr.Binders/Arg,Microsoft.FSharp.Core.FSharpFunc`2<Microsoft.FSharp.Collections.FSharpList`1<FSharp.Interop.Dlr.Binders/Arg>,Microsoft.FSharp.Quotations.FSharpExpr>>)
|DelegateRead|_|(Microsoft.FSharp.Quotations.FSharpExpr)
computedName(FSharp.Interop.Dlr.TranslateBlock/Block,Microsoft.FSharp.Core.FSharpFunc`2<Microsoft.FSharp.Collections.FSharpSet`1<Microsoft.FSharp.Quotations.FSharpVar>,Microsoft.FSharp.Core.FSharpFunc`2<Microsoft.FSharp.Quotations.FSharpExpr,Microsoft.FSharp.Quotations.FSharpExpr>>,Microsoft.FSharp.Collections.FSharpSet`1<Microsoft.FSharp.Quotations.FSharpVar>,Microsoft.FSharp.Quotations.FSharpExpr,Microsoft.FSharp.Quotations.FSharpExpr,Microsoft.FSharp.Collections.FSharpList`1<Microsoft.FSharp.Quotations.FSharpExpr>,System.Type,Microsoft.FSharp.Core.FSharpFunc`2<System.String,Microsoft.FSharp.Core.FSharpFunc`2<FSharp.Interop.Dlr.Binders/Arg,Microsoft.FSharp.Core.FSharpFunc`2<Microsoft.FSharp.Collections.FSharpList`1<FSharp.Interop.Dlr.Binders/Arg>,Microsoft.FSharp.Quotations.FSharpExpr>>>)
compoundAssign(FSharp.Interop.Dlr.TranslateBlock/Block,Microsoft.FSharp.Core.FSharpFunc`2<Microsoft.FSharp.Collections.FSharpSet`1<Microsoft.FSharp.Quotations.FSharpVar>,Microsoft.FSharp.Core.FSharpFunc`2<Microsoft.FSharp.Quotations.FSharpExpr,Microsoft.FSharp.Quotations.FSharpExpr>>,Microsoft.FSharp.Collections.FSharpSet`1<Microsoft.FSharp.Quotations.FSharpVar>,System.Boolean,Microsoft.FSharp.Quotations.FSharpExpr,Microsoft.FSharp.Quotations.FSharpExpr,Microsoft.FSharp.Quotations.FSharpExpr)
tryOperation(FSharp.Interop.Dlr.TranslateBlock/Block,Microsoft.FSharp.Core.FSharpFunc`2<Microsoft.FSharp.Collections.FSharpSet`1<Microsoft.FSharp.Quotations.FSharpVar>,Microsoft.FSharp.Core.FSharpFunc`2<Microsoft.FSharp.Quotations.FSharpExpr,Microsoft.FSharp.Quotations.FSharpExpr>>,Microsoft.FSharp.Collections.FSharpSet`1<Microsoft.FSharp.Quotations.FSharpVar>,Microsoft.FSharp.Quotations.FSharpExpr)
Invoke(System.Boolean,Microsoft.FSharp.Collections.FSharpList`1<FSharp.Interop.Dlr.Binders/Arg>)
Invoke(System.Boolean,Microsoft.FSharp.Collections.FSharpList`1<FSharp.Interop.Dlr.Binders/Arg>)
Invoke(System.Type,Microsoft.FSharp.Quotations.FSharpExpr)