diff --git a/docs/debug-emit.md b/docs/debug-emit.md index 2593cfafe0..deca2e9652 100644 --- a/docs/debug-emit.md +++ b/docs/debug-emit.md @@ -504,7 +504,3 @@ Some design-time services are un-implemented by F#: * Unimplemented: [Proximity expressions](https://github.com/dotnet/fsharp/issues/4271) (for Autos window) These are major holes in the F# experience and should be implemented. - -### Missing debug emit for F# Interactive - -For F# Interactive [we do not currently emit debug information for script code](https://github.com/dotnet/fsharp/issues/5457). This is because of a missing piece of functionality in the Reflection.Emit APIs, and means we have to change our approach to emitting code fragments in F# Interactive to no longer use dynamic assemblies. diff --git a/docs/fsi-emit.md b/docs/fsi-emit.md new file mode 100644 index 0000000000..2a16e183b9 --- /dev/null +++ b/docs/fsi-emit.md @@ -0,0 +1,84 @@ +--- +title: F# Interactive Emit +category: Compiler Internals +categoryindex: 200 +index: 375 +--- +# F# Interactive Code Generation + +F# Interactive (`dotnet fsi`) accepts incremental code fragments. This capability is also used by [hosted execution capability of the FSharp.Compiler.Service API](fcs/interactive.fsx) which is used to build the F# kernel for .NET Interactive notebooks. + +Historically F# Interactive code was emitted into a single dynamic assembly using Reflection.Emit and ilreflect.fs (meaning one assembly that is continually growing). However, .NET Core Reflection.Emit does not support the emit of debug symbols for dynamic assemblies, so in Feb 2022 we switched to emitting multiple non-dynamic assemblies (meaning assemblies dynamically created in-memory using ilwrite.fs, and loaded, but not growing). + +The assemblies are named: + +`FSI-ASSEMBLY1` +`FSI-ASSEMBLY2` + +etc. + +## Compat switch + +There is a switch `fsi --multiemit` that turns on the use of multi-assembly generation (when it is off, we use Reflection Emit for single-dynamic-assembly generation). This is on by default for .NET Core, and off by default for .NET Framework for compat reasons. + +## Are multiple assemblies too costly? + +There is general assumption in this that on modern dev machines (where users execute multiple interactions) then generating 50, 100 or 1,000 or 10,000 dynamic assemblies by repeated manual execution of code is not a problem: the extra overheads of multiple assemblies compared to one dynamic assembly is of no real significance in developer REPL scenarios given the vast amount of memory available on modern 64-bit machines. + +Quick check: adding 10,000 `let x = 1;;` interactions to .NET Core `dotnet fsi` adds about 300MB to the FSI.EXE process, meaning 30K/interaction. A budget of 1GB for interactive fragments (reasonable on a 64-bit machine), and an expected maximum of 10000 fragments before restart (that's a lot!), then each fragment can take up to 100K. This is well below the cost of a new assembly. + +Additionally, these costs are not substantially reduced if `--multiemit` is disabled, so they've always been the approximate costs of F# Interactive fragment generation. + +## Internals and accessibility across fragments + +Generating into multiple assemblies raises issues for some things that are assembly bound such as "internals" accessibility. In a first iteration of this we had a failing case here: + +```fsharp +> artifacts\bin\fsi\Debug\net50\fsi.exe --optimize- +... +// Fragment 1 +> let internal f() = 1;; +val internal f: unit -> int + +// Fragment 2 - according to existing rules it is allowed to access internal things of the first +f();; +System.MethodAccessException: Attempt by method '.$FSI_0003.main@()' to access method 'FSI_0002.f()' failed. + at .$FSI_0003.main@() +``` + +This is because we are now generating into multiple assemblies. Another bug was this: + +```fsharp +> artifacts\bin\fsi\Debug\net50\fsi.exe --optimize+ +... +// Fragment 1 - not `x` becomes an internal field of the class +> type C() = +> let mutable x = 1 +> member _.M() = x +> ;; +... +// Fragment 2 - inlining 'M()' gave an access to the internal field `x` +> C().M();; +...... +``` + +According to the current F# scripting programming model (the one checked in the editor), the "internal" thing should be accessible in subsequent fragments. Should this be changed? No: + +* It's very hard to adjust the implementation of the editor scripting model to consider fragments delimited by `;;` to be different assemblies, whether in the editor or in F# Interactive. +* And would we even want to? It's common enough for people to debug code scattered with "internal" declarations. +* In scripts, the `;;` aren't actually accurate markers for what will or won't be sent to F# Interactive, which get added implicitly. + + For example, consider the script + + ```fsharp + let internal f() = 1;; + f();; + ``` + + In the editor should this be given an error or not? That is, should the `;;` be seen as accurate indicators of separate script fragments? (Answer: yes if we know the script will be piped-to-input, no if the script is used as a single file entry - when the `;;` are ignored) + +* Further, this would be a breaking change, e.g. it could arise in an automated compat situation if people are piping into standard input and the input contains `;;` markers. + +Because of this we emit IVTs for the next 30 `FSI-ASSEMBLYnnn` assemblies on each assembly fragment, giving a warning when an internal thing is accessed across assembly boundaries within that 30 (reporting it as a deprecated feature), and give an error if internal access happens after that. + +From a compat perspective this seems reasonable, and the compat flag is available to return the whole system to generate-one-assembly behavior. diff --git a/src/fsharp/AttributeChecking.fs b/src/fsharp/AttributeChecking.fs index 3e860b5661..998b258285 100644 --- a/src/fsharp/AttributeChecking.fs +++ b/src/fsharp/AttributeChecking.fs @@ -125,7 +125,7 @@ type AttribInfo = /// Check custom attributes. This is particularly messy because custom attributes come in in three different /// formats. let AttribInfosOfIL g amap scoref m (attribs: ILAttributes) = - attribs.AsList |> List.map (fun a -> ILAttribInfo (g, amap, scoref, a, m)) + attribs.AsList() |> List.map (fun a -> ILAttribInfo (g, amap, scoref, a, m)) let AttribInfosOfFS g attribs = attribs |> List.map (fun a -> FSAttribInfo (g, a)) @@ -443,7 +443,7 @@ let MethInfoIsUnseen g (m: range) (ty: TType) minfo = // We are only interested in filtering out the method on System.Object, so it is sufficient // just to look at the attributes on IL methods. if tcref.IsILTycon then - tcref.ILTyconRawMetadata.CustomAttrs.AsArray + tcref.ILTyconRawMetadata.CustomAttrs.AsArray() |> Array.exists (fun attr -> attr.Method.DeclaringType.TypeSpec.Name = typeof.FullName) else false @@ -452,9 +452,7 @@ let MethInfoIsUnseen g (m: range) (ty: TType) minfo = false #endif - //let isUnseenByBeingTupleMethod () = isAnyTupleTy g ty - - isUnseenByObsoleteAttrib () || isUnseenByHidingAttribute () //|| isUnseenByBeingTupleMethod () + isUnseenByObsoleteAttrib () || isUnseenByHidingAttribute () /// Indicate if a property has 'Obsolete' or 'CompilerMessageAttribute'. /// Used to suppress the item in intellisense. diff --git a/src/fsharp/CompilerConfig.fs b/src/fsharp/CompilerConfig.fs index f04d303ca9..bb4137d8aa 100644 --- a/src/fsharp/CompilerConfig.fs +++ b/src/fsharp/CompilerConfig.fs @@ -447,27 +447,27 @@ type TcConfigBuilder = mutable showTimes: bool mutable showLoadedAssemblies: bool mutable continueAfterParseFailure: bool + #if !NO_EXTENSIONTYPING /// show messages about extension type resolution? mutable showExtensionTypeMessages: bool #endif - /// pause between passes? + /// Pause between passes? mutable pause: bool - /// whenever possible, emit callvirt instead of call + + /// Whenever possible, emit callvirt instead of call mutable alwaysCallVirt: bool - /// if true, strip away data that would not be of use to end users, but is useful to us for debugging - // REVIEW: "stripDebugData"? + /// If true, strip away data that would not be of use to end users, but is useful to us for debugging mutable noDebugAttributes: bool - /// if true, indicates all type checking and code generation is in the context of fsi.exe + /// If true, indicates all type checking and code generation is in the context of fsi.exe isInteractive: bool - isInvalidationSupported: bool - /// used to log sqm data + isInvalidationSupported: bool - /// if true - every expression in quotations will be augmented with full debug info (filename, location in file) + /// If true - every expression in quotations will be augmented with full debug info (filename, location in file) mutable emitDebugInfoInQuotations: bool mutable exename: string option @@ -477,9 +477,14 @@ type TcConfigBuilder = /// When false FSI will lock referenced assemblies requiring process restart, false = disable Shadow Copy false (*default*) mutable shadowCopyReferences: bool + mutable useSdkRefs: bool + mutable fxResolver: FxResolver option + // Is F# Interactive using multi-assembly emit? + mutable fsiMultiAssemblyEmit: bool + /// specify the error range for FxResolver rangeForErrors: range @@ -660,6 +665,7 @@ type TcConfigBuilder = shadowCopyReferences = false useSdkRefs = true fxResolver = None + fsiMultiAssemblyEmit = true internalTestSpanStackReferring = false noConditionalErasure = false pathMap = PathMap.empty @@ -921,6 +927,7 @@ type TcConfig private (data: TcConfigBuilder, validate: bool) = #endif None, data.legacyReferenceResolver.Impl.HighestInstalledNetFrameworkVersion() + member _.fsiMultiAssemblyEmit = data.fsiMultiAssemblyEmit member x.FxResolver = data.FxResolver member x.primaryAssembly = data.primaryAssembly member x.noFeedback = data.noFeedback diff --git a/src/fsharp/CompilerConfig.fsi b/src/fsharp/CompilerConfig.fsi index b353f42e06..b1d60f1921 100644 --- a/src/fsharp/CompilerConfig.fsi +++ b/src/fsharp/CompilerConfig.fsi @@ -272,6 +272,7 @@ type TcConfigBuilder = mutable shadowCopyReferences: bool mutable useSdkRefs: bool mutable fxResolver: FxResolver option + mutable fsiMultiAssemblyEmit: bool rangeForErrors: range sdkDirOverride: string option @@ -458,6 +459,9 @@ type TcConfig = member isInteractive: bool member isInvalidationSupported: bool + /// Indicates if F# Interactive is using single-assembly emit via Reflection.Emit, where internals are available. + member fsiMultiAssemblyEmit: bool + member xmlDocInfoLoader: IXmlDocumentationInfoLoader option member FxResolver: FxResolver diff --git a/src/fsharp/CompilerImports.fs b/src/fsharp/CompilerImports.fs index 0f10e4a6fd..5b9a6d8c97 100644 --- a/src/fsharp/CompilerImports.fs +++ b/src/fsharp/CompilerImports.fs @@ -650,7 +650,7 @@ let MakeScopeRefForILModule (ilModule: ILModuleDef) = | None -> ILScopeRef.Module (mkRefToILModule ilModule) let GetCustomAttributesOfILModule (ilModule: ILModuleDef) = - (match ilModule.Manifest with Some m -> m.CustomAttrs | None -> ilModule.CustomAttrs).AsList + (match ilModule.Manifest with Some m -> m.CustomAttrs | None -> ilModule.CustomAttrs).AsList() let GetAutoOpenAttributes ilModule = ilModule |> GetCustomAttributesOfILModule |> List.choose TryFindAutoOpenAttr @@ -669,7 +669,7 @@ type RawFSharpAssemblyDataBackedByFileOnDisk (ilModule: ILModuleDef, ilAssemblyR member _.TryGetILModuleDef() = Some ilModule member _.GetRawFSharpSignatureData(m, ilShortAssemName, filename) = - let resources = ilModule.Resources.AsList + let resources = ilModule.Resources.AsList() let sigDataReaders = [ for iresource in resources do if IsSignatureDataResource iresource then @@ -688,7 +688,7 @@ type RawFSharpAssemblyDataBackedByFileOnDisk (ilModule: ILModuleDef, ilAssemblyR member _.GetRawFSharpOptimizationData(m, ilShortAssemName, filename) = let optDataReaders = - ilModule.Resources.AsList + ilModule.Resources.AsList() |> List.choose (fun r -> if IsOptimizationDataResource r then Some(GetOptimizationDataResourceName r, (fun () -> r.GetBytes())) else None) // Look for optimization data in a file @@ -733,14 +733,14 @@ type RawFSharpAssemblyData (ilModule: ILModuleDef, ilAssemblyRefs) = member _.TryGetILModuleDef() = Some ilModule member _.GetRawFSharpSignatureData(_, _, _) = - let resources = ilModule.Resources.AsList + let resources = ilModule.Resources.AsList() [ for iresource in resources do if IsSignatureDataResource iresource then let ccuName = GetSignatureDataResourceName iresource yield (ccuName, fun () -> iresource.GetBytes()) ] member _.GetRawFSharpOptimizationData(_, _, _) = - ilModule.Resources.AsList + ilModule.Resources.AsList() |> List.choose (fun r -> if IsOptimizationDataResource r then Some(GetOptimizationDataResourceName r, (fun () -> r.GetBytes())) else None) member _.GetRawTypeForwarders() = @@ -1499,7 +1499,7 @@ and [] TcImports(tcConfigP: TcConfigProvider, initialResolutions: TcAsse let phase2 () = #if !NO_EXTENSIONTYPING - ccuinfo.TypeProviders <- tcImports.ImportTypeProviderExtensions (ctok, tcConfig, filename, ilScopeRef, ilModule.ManifestOfAssembly.CustomAttrs.AsList, ccu.Contents, invalidateCcu, m) + ccuinfo.TypeProviders <- tcImports.ImportTypeProviderExtensions (ctok, tcConfig, filename, ilScopeRef, ilModule.ManifestOfAssembly.CustomAttrs.AsList(), ccu.Contents, invalidateCcu, m) #endif [ResolvedImportedAssembly ccuinfo] phase2 @@ -1593,7 +1593,7 @@ and [] TcImports(tcConfigP: TcConfigProvider, initialResolutions: TcAsse match ilModule.TryGetILModuleDef() with | None -> () // no type providers can be used without a real IL Module present | Some ilModule -> - let tps = tcImports.ImportTypeProviderExtensions (ctok, tcConfig, filename, ilScopeRef, ilModule.ManifestOfAssembly.CustomAttrs.AsList, ccu.Contents, invalidateCcu, m) + let tps = tcImports.ImportTypeProviderExtensions (ctok, tcConfig, filename, ilScopeRef, ilModule.ManifestOfAssembly.CustomAttrs.AsList(), ccu.Contents, invalidateCcu, m) ccuinfo.TypeProviders <- tps #else () diff --git a/src/fsharp/IlxGen.fs b/src/fsharp/IlxGen.fs index 2e3aa5a90c..542618723a 100644 --- a/src/fsharp/IlxGen.fs +++ b/src/fsharp/IlxGen.fs @@ -1565,11 +1565,11 @@ type TypeDefBuilder(tdef: ILTypeDef, tdefDiscards) = let gnested = TypeDefsBuilder() member b.Close() = - tdef.With(methods = mkILMethods (tdef.Methods.AsList @ ResizeArray.toList gmethods), - fields = mkILFields (tdef.Fields.AsList @ ResizeArray.toList gfields), - properties = mkILProperties (tdef.Properties.AsList @ HashRangeSorted gproperties ), - events = mkILEvents (tdef.Events.AsList @ ResizeArray.toList gevents), - nestedTypes = mkILTypeDefs (tdef.NestedTypes.AsList @ gnested.Close())) + tdef.With(methods = mkILMethods (tdef.Methods.AsList() @ ResizeArray.toList gmethods), + fields = mkILFields (tdef.Fields.AsList() @ ResizeArray.toList gfields), + properties = mkILProperties (tdef.Properties.AsList() @ HashRangeSorted gproperties ), + events = mkILEvents (tdef.Events.AsList() @ ResizeArray.toList gevents), + nestedTypes = mkILTypeDefs (tdef.NestedTypes.AsList() @ gnested.Close())) member b.AddEventDef edef = gevents.Add edef @@ -1618,11 +1618,11 @@ and TypeDefsBuilder() = let tdef = b.Close() // Skip the type if it is empty if not eliminateIfEmpty - || not tdef.NestedTypes.AsList.IsEmpty - || not tdef.Fields.AsList.IsEmpty - || not tdef.Events.AsList.IsEmpty - || not tdef.Properties.AsList.IsEmpty - || not (Array.isEmpty tdef.Methods.AsArray) then + || not (tdef.NestedTypes.AsList()).IsEmpty + || not (tdef.Fields.AsList()).IsEmpty + || not (tdef.Events.AsList()).IsEmpty + || not (tdef.Properties.AsList()).IsEmpty + || not (Array.isEmpty (tdef.Methods.AsArray())) then yield tdef ] member b.FindTypeDefBuilder nm = @@ -1704,7 +1704,9 @@ type AssemblyBuilder(cenv: cenv, anonTypeTable: AnonTypeGenerationTable) as mgbu let ilFieldDefs = mkILFields [ for _, fldName, fldTy in flds -> - let fdef = mkILInstanceField (fldName, fldTy, None, ILMemberAccess.Private) + // The F# Interactive backend may split to multiple assemblies. + let access = (if cenv.opts.isInteractive then ILMemberAccess.Public else ILMemberAccess.Private) + let fdef = mkILInstanceField (fldName, fldTy, None, access) fdef.With(customAttrs = mkILCustomAttrs [ g.DebuggerBrowsableNeverAttribute ]) ] // Generate property definitions for the fields compiled as properties @@ -4536,7 +4538,7 @@ and GenFormalReturnType m cenv eenvFormal returnTy : ILReturn = | None -> ilRet | Some ty -> match GenReadOnlyAttributeIfNecessary cenv.g ty with - | Some attr -> ilRet.WithCustomAttrs (mkILCustomAttrs (ilRet.CustomAttrs.AsList @ [attr])) + | Some attr -> ilRet.WithCustomAttrs (mkILCustomAttrs (ilRet.CustomAttrs.AsList() @ [attr])) | None -> ilRet and instSlotParam inst (TSlotParam(nm, ty, inFlag, fl2, fl3, attrs)) = @@ -5042,7 +5044,7 @@ and GenStaticDelegateClosureTypeDefs cenv (tref: ILTypeRef, ilGenParams, attrs, // Apply the abstract attribute, turning the sealed class into abstract sealed (i.e. static class). // Remove the redundant constructor. tdefs |> List.map (fun td -> td.WithAbstract(true) - .With(methods= mkILMethodsFromArray (td.Methods.AsArray |> Array.filter (fun m -> not m.IsConstructor)))) + .With(methods= mkILMethodsFromArray (td.Methods.AsArray() |> Array.filter (fun m -> not m.IsConstructor)))) and GenGenericParams cenv eenv tps = tps |> DropErasedTypars |> List.map (GenGenericParam cenv eenv) @@ -8591,9 +8593,7 @@ open System /// The lookup* functions are the conversions available from ilreflect. type ExecutionContext = - { LookupFieldRef: ILFieldRef -> FieldInfo - LookupMethodRef: ILMethodRef -> MethodInfo - LookupTypeRef: ILTypeRef -> Type + { LookupTypeRef: ILTypeRef -> Type LookupType: ILType -> Type } // A helper to generate a default value for any System.Type. I couldn't find a System.Reflection @@ -8615,7 +8615,7 @@ let LookupGeneratedValue (amap: ImportMap) (ctxt: ExecutionContext) eenv (v: Val try // Convert the v.Type into a System.Type according to ilxgen and ilreflect. let objTyp() = - let ilTy = GenType amap v.Range TypeReprEnv.Empty v.Type (* TypeReprEnv.Empty ok, not expecting typars *) + let ilTy = GenType amap v.Range TypeReprEnv.Empty v.Type ctxt.LookupType ilTy // Lookup the compiled v value (as an object). match StorageForVal amap.g v.Range v eenv with diff --git a/src/fsharp/IlxGen.fsi b/src/fsharp/IlxGen.fsi index 7fe28f1616..d4184d75c1 100644 --- a/src/fsharp/IlxGen.fsi +++ b/src/fsharp/IlxGen.fsi @@ -79,8 +79,6 @@ type public IlxGenResults = /// Used to support the compilation-inversion operations "ClearGeneratedValue" and "LookupGeneratedValue" type ExecutionContext = { - LookupFieldRef: ILFieldRef -> FieldInfo - LookupMethodRef: ILMethodRef -> MethodInfo LookupTypeRef: ILTypeRef -> Type LookupType: ILType -> Type } diff --git a/src/fsharp/InfoReader.fs b/src/fsharp/InfoReader.fs index 1abbb38820..255a447de6 100644 --- a/src/fsharp/InfoReader.fs +++ b/src/fsharp/InfoReader.fs @@ -66,7 +66,7 @@ let rec GetImmediateIntrinsicMethInfosOfTypeAux (optFilter, ad) g amap m origTy | ILTypeMetadata _ -> let tinfo = ILTypeInfo.FromType g origTy let mdefs = tinfo.RawMetadata.Methods - let mdefs = match optFilter with None -> mdefs.AsList | Some nm -> mdefs.FindByName nm + let mdefs = match optFilter with None -> mdefs.AsList() | Some nm -> mdefs.FindByName nm mdefs |> List.map (fun mdef -> MethInfo.CreateILMeth(amap, m, origTy, mdef)) | FSharpOrArrayOrByrefOrTupleOrExnTypeMetadata -> @@ -160,7 +160,7 @@ let rec GetImmediateIntrinsicPropInfosOfTypeAux (optFilter, ad) g amap m origTy | ILTypeMetadata _ -> let tinfo = ILTypeInfo.FromType g origTy let pdefs = tinfo.RawMetadata.Properties - let pdefs = match optFilter with None -> pdefs.AsList | Some nm -> pdefs.LookupByName nm + let pdefs = match optFilter with None -> pdefs.AsList() | Some nm -> pdefs.LookupByName nm pdefs |> List.map (fun pdef -> ILProp(ILPropInfo(tinfo, pdef))) | FSharpOrArrayOrByrefOrTupleOrExnTypeMetadata -> @@ -312,7 +312,7 @@ type InfoReader(g: TcGlobals, amap: Import.ImportMap) as this = | ILTypeMetadata _ -> let tinfo = ILTypeInfo.FromType g ty let fdefs = tinfo.RawMetadata.Fields - let fdefs = match optFilter with None -> fdefs.AsList | Some nm -> fdefs.LookupByName nm + let fdefs = match optFilter with None -> fdefs.AsList() | Some nm -> fdefs.LookupByName nm fdefs |> List.map (fun pd -> ILFieldInfo(tinfo, pd)) | FSharpOrArrayOrByrefOrTupleOrExnTypeMetadata -> [] @@ -337,7 +337,7 @@ type InfoReader(g: TcGlobals, amap: Import.ImportMap) as this = | ILTypeMetadata _ -> let tinfo = ILTypeInfo.FromType g ty let edefs = tinfo.RawMetadata.Events - let edefs = match optFilter with None -> edefs.AsList | Some nm -> edefs.LookupByName nm + let edefs = match optFilter with None -> edefs.AsList() | Some nm -> edefs.LookupByName nm [ for edef in edefs do let ileinfo = ILEventInfo(tinfo, edef) if IsILEventInfoAccessible g amap m ad ileinfo then @@ -421,7 +421,7 @@ type InfoReader(g: TcGlobals, amap: Import.ImportMap) as this = let GetImmediateIntrinsicOverrideMethodSetsOfType optFilter m (interfaceTys: TType list) ty acc = match tryAppTy g ty with | ValueSome (tcref, _) when tcref.IsILTycon && tcref.ILTyconRawMetadata.IsInterface -> - let mimpls = tcref.ILTyconRawMetadata.MethodImpls.AsList + let mimpls = tcref.ILTyconRawMetadata.MethodImpls.AsList() let mdefs = tcref.ILTyconRawMetadata.Methods // MethodImpls contains a list of methods that override. diff --git a/src/fsharp/NameResolution.fs b/src/fsharp/NameResolution.fs index d82b0655df..a01f525401 100644 --- a/src/fsharp/NameResolution.fs +++ b/src/fsharp/NameResolution.fs @@ -703,7 +703,7 @@ let AddValRefsToItems (bulkAddMode: BulkAdd) (eUnqualifiedItems: UnqualifiedItem match bulkAddMode with | BulkAdd.Yes -> - eUnqualifiedItems.AddAndMarkAsCollapsible(vrefs |> Array.map (fun vref -> KeyValuePair(vref.LogicalName, Item.Value vref))) + eUnqualifiedItems.AddMany(vrefs |> Array.map (fun vref -> KeyValuePair(vref.LogicalName, Item.Value vref))) | BulkAdd.No -> assert (vrefs.Length = 1) let vref = vrefs.[0] @@ -783,7 +783,7 @@ let AddTyconsByDemangledNameAndArity (bulkAddMode: BulkAdd) (tcrefs: TyconRef[]) |> Array.map (fun tcref -> Construct.KeyTyconByDecodedName tcref.LogicalName tcref) match bulkAddMode with - | BulkAdd.Yes -> tab.AddAndMarkAsCollapsible entries + | BulkAdd.Yes -> tab.AddMany entries | BulkAdd.No -> (tab, entries) ||> Array.fold (fun tab (KeyValue(k, v)) -> tab.Add(k, v)) /// Add type definitions to the sub-table of the environment indexed by access name @@ -794,7 +794,7 @@ let AddTyconByAccessNames bulkAddMode (tcrefs: TyconRef[]) (tab: LayeredMultiMap |> Array.collect (fun tcref -> Construct.KeyTyconByAccessNames tcref.LogicalName tcref) match bulkAddMode with - | BulkAdd.Yes -> tab.AddAndMarkAsCollapsible entries + | BulkAdd.Yes -> tab.AddMany entries | BulkAdd.No -> (tab, entries) ||> Array.fold (fun tab (KeyValue(k, v)) -> tab.Add (k, v)) /// Add a record field to the corresponding sub-table of the name resolution environment @@ -814,7 +814,7 @@ let AddUnionCases2 bulkAddMode (eUnqualifiedItems: UnqualifiedItems) (ucrefs: Un ucrefs |> Array.ofList |> Array.map (fun ucref -> let item = Item.UnionCase(GeneralizeUnionCaseRef ucref, false) KeyValuePair(ucref.CaseName, item)) - eUnqualifiedItems.AddAndMarkAsCollapsible items + eUnqualifiedItems.AddMany items | BulkAdd.No -> (eUnqualifiedItems, ucrefs) ||> List.fold (fun acc ucref -> @@ -1137,7 +1137,7 @@ let rec AddStaticContentOfTypeToNameEnv (g:TcGlobals) (amap: Import.ImportMap) a |> ChoosePropInfosForNameEnv g ty |] - let nenv = { nenv with eUnqualifiedItems = nenv.eUnqualifiedItems.AddAndMarkAsCollapsible items } + let nenv = { nenv with eUnqualifiedItems = nenv.eUnqualifiedItems.AddMany items } let methodGroupItems = // Methods @@ -1158,7 +1158,7 @@ let rec AddStaticContentOfTypeToNameEnv (g:TcGlobals) (amap: Import.ImportMap) a pair) |> Array.ofList - { nenv with eUnqualifiedItems = nenv.eUnqualifiedItems.AddAndMarkAsCollapsible methodGroupItems } + { nenv with eUnqualifiedItems = nenv.eUnqualifiedItems.AddMany methodGroupItems } and private AddNestedTypesOfTypeToNameEnv infoReader (amap: Import.ImportMap) ad m nenv ty = let tinst, tcrefs = GetNestedTyconRefsOfType infoReader amap (ad, None, TypeNameResolutionStaticArgsInfo.Indefinite, true, m) ty @@ -1270,7 +1270,7 @@ and private AddPartsOfTyconRefToNameEnv bulkAddMode ownDefinition (g: TcGlobals) isClassTy g ty || isStructTy g ty) if mayHaveConstruction then - tab.LinearTryModifyThenLaterFlatten (tcref.DisplayName, (fun prev -> + tab.AddOrModify (tcref.DisplayName, (fun prev -> match prev with | Some (Item.UnqualifiedType tcrefs) -> Item.UnqualifiedType (tcref :: tcrefs) | _ -> Item.UnqualifiedType [tcref])) @@ -1319,7 +1319,7 @@ let AddExceptionDeclsToNameEnv bulkAddMode nenv (ecref: TyconRef) = eUnqualifiedItems = match bulkAddMode with | BulkAdd.Yes -> - nenv.eUnqualifiedItems.AddAndMarkAsCollapsible [| KeyValuePair(ecref.LogicalName, item) |] + nenv.eUnqualifiedItems.AddMany [| KeyValuePair(ecref.LogicalName, item) |] | BulkAdd.No -> nenv.eUnqualifiedItems.Add (ecref.LogicalName, item) diff --git a/src/fsharp/OptimizeInputs.fs b/src/fsharp/OptimizeInputs.fs index 3cccaeef04..150d7fb448 100644 --- a/src/fsharp/OptimizeInputs.fs +++ b/src/fsharp/OptimizeInputs.fs @@ -77,7 +77,7 @@ let ApplyAllOptimizations (tcConfig:TcConfig, tcGlobals, tcVal, outfile, importM let (optEnvFirstLoop, implFile, implFileOptData, hidden), optimizeDuringCodeGen = Optimizer.OptimizeImplFile (optSettings, ccu, tcGlobals, tcVal, importMap, - optEnvFirstLoop, isIncrementalFragment, + optEnvFirstLoop, isIncrementalFragment, tcConfig.fsiMultiAssemblyEmit, tcConfig.emitTailcalls, hidden, implFile) let implFile = AutoBox.TransformImplFile tcGlobals importMap implFile @@ -96,7 +96,7 @@ let ApplyAllOptimizations (tcConfig:TcConfig, tcGlobals, tcVal, outfile, importM let (optEnvExtraLoop, implFile, _, _), _ = Optimizer.OptimizeImplFile (optSettings, ccu, tcGlobals, tcVal, importMap, - optEnvExtraLoop, isIncrementalFragment, + optEnvExtraLoop, isIncrementalFragment, tcConfig.fsiMultiAssemblyEmit, tcConfig.emitTailcalls, hidden, implFile) //PrintWholeAssemblyImplementation tcConfig outfile (sprintf "extra-loop-%d" n) implFile @@ -127,7 +127,7 @@ let ApplyAllOptimizations (tcConfig:TcConfig, tcGlobals, tcVal, outfile, importM let (optEnvFinalSimplify, implFile, _, _), _ = Optimizer.OptimizeImplFile (optSettings, ccu, tcGlobals, tcVal, importMap, optEnvFinalSimplify, - isIncrementalFragment, tcConfig.emitTailcalls, hidden, implFile) + isIncrementalFragment, tcConfig.fsiMultiAssemblyEmit, tcConfig.emitTailcalls, hidden, implFile) //PrintWholeAssemblyImplementation tcConfig outfile "post-rec-opt" implFile implFile, optEnvFinalSimplify diff --git a/src/fsharp/OptimizeInputs.fsi b/src/fsharp/OptimizeInputs.fsi index 2c64a648ff..5a41c3f9bd 100644 --- a/src/fsharp/OptimizeInputs.fsi +++ b/src/fsharp/OptimizeInputs.fsi @@ -19,7 +19,17 @@ val GetInitialOptimizationEnv : TcImports * TcGlobals -> IncrementalOptimization val AddExternalCcuToOptimizationEnv : TcGlobals -> IncrementalOptimizationEnv -> ImportedAssembly -> IncrementalOptimizationEnv -val ApplyAllOptimizations : TcConfig * TcGlobals * ConstraintSolver.TcValF * string * ImportMap * bool * IncrementalOptimizationEnv * CcuThunk * TypedImplFile list -> TypedAssemblyAfterOptimization * LazyModuleInfo * IncrementalOptimizationEnv +val ApplyAllOptimizations: + TcConfig * + TcGlobals * + ConstraintSolver.TcValF * + string * + ImportMap * + isIncrementalFragment: bool * + IncrementalOptimizationEnv * + CcuThunk * + TypedImplFile list + -> TypedAssemblyAfterOptimization * LazyModuleInfo * IncrementalOptimizationEnv val CreateIlxAssemblyGenerator : TcConfig * TcImports * TcGlobals * ConstraintSolver.TcValF * CcuThunk -> IlxAssemblyGenerator diff --git a/src/fsharp/Optimizer.fs b/src/fsharp/Optimizer.fs index 1679aefb66..0129e84108 100644 --- a/src/fsharp/Optimizer.fs +++ b/src/fsharp/Optimizer.fs @@ -3952,7 +3952,8 @@ and OptimizeModuleDef cenv (env, bindInfosColl) input = let (defs, info), (env, bindInfosColl) = OptimizeModuleDefs cenv (env, bindInfosColl) defs (TMDefs defs, info), (env, bindInfosColl) -and OptimizeModuleBindings cenv (env, bindInfosColl) xs = List.mapFold (OptimizeModuleBinding cenv) (env, bindInfosColl) xs +and OptimizeModuleBindings cenv (env, bindInfosColl) xs = + List.mapFold (OptimizeModuleBinding cenv) (env, bindInfosColl) xs and OptimizeModuleBinding cenv (env, bindInfosColl) x = match x with @@ -3971,30 +3972,48 @@ and OptimizeModuleDefs cenv (env, bindInfosColl) defs = let defs, minfos = List.unzip defs (defs, UnionOptimizationInfos minfos), (env, bindInfosColl) -and OptimizeImplFileInternal cenv env isIncrementalFragment hidden implFile = +and OptimizeImplFileInternal cenv env isIncrementalFragment fsiMultiAssemblyEmit hidden implFile = let (TImplFile (qname, pragmas, mexpr, hasExplicitEntryPoint, isScript, anonRecdTypes, namedDebugPointsForInlinedCode)) = implFile - let env, mexprR, minfo = + let env, mexprR, minfo, hidden = match mexpr with - // FSI: FSI compiles everything as if you're typing incrementally into one module - // This means the fragment is not truly a constrained module as later fragments will be typechecked - // against the internals of the module rather than the externals. Furthermore it would be wrong to apply - // optimizations that did lots of reorganizing stuff to the internals of a module should we ever implement that. + // FSI compiles interactive fragments as if you're typing incrementally into one module. + // + // This means the fragment is not constrained by its signature and later fragments will be typechecked + // against the implementation of the module rather than the externals. + // | ModuleOrNamespaceExprWithSig(mty, def, m) when isIncrementalFragment -> - let (def, minfo), (env, _bindInfosColl) = OptimizeModuleDef cenv (env, []) def - env, ModuleOrNamespaceExprWithSig(mty, def, m), minfo - | _ -> - let mexprR, minfo = OptimizeModuleExpr cenv env mexpr + // This optimizes and builds minfo ignoring the signature + let (defR, minfo), (_env, _bindInfosColl) = OptimizeModuleDef cenv (env, []) def + let hidden = ComputeImplementationHidingInfoAtAssemblyBoundary defR hidden + let minfo = + // In F# interactive multi-assembly mode, no internals are accessible across interactive fragments. + // In F# interactive single-assembly mode, internals are accessible across interactive fragments. + if fsiMultiAssemblyEmit then + AbstractLazyModulInfoByHiding true hidden minfo + else + AbstractLazyModulInfoByHiding false hidden minfo let env = BindValsInModuleOrNamespace cenv minfo env - let env = { env with localExternalVals=env.localExternalVals.MarkAsCollapsible() } // take the chance to flatten to a dictionary - env, mexprR, minfo + env, ModuleOrNamespaceExprWithSig(mty, defR, m), minfo, hidden + | _ -> + // This optimizes and builds minfo w.r.t. the signature + let mexprR, minfo = OptimizeModuleExpr cenv env mexpr + let hidden = ComputeSignatureHidingInfoAtAssemblyBoundary mexpr.Type hidden + let minfoExternal = AbstractLazyModulInfoByHiding true hidden minfo + let env = + // In F# interactive multi-assembly mode, internals are not accessible in the 'env' used intra-assembly + // In regular fsc compilation, internals are accessible in the 'env' used intra-assembly + if cenv.g.isInteractive && fsiMultiAssemblyEmit then + BindValsInModuleOrNamespace cenv minfoExternal env + else + BindValsInModuleOrNamespace cenv minfo env + env, mexprR, minfoExternal, hidden - let hidden = ComputeHidingInfoAtAssemblyBoundary mexpr.Type hidden + let implFileR = TImplFile (qname, pragmas, mexprR, hasExplicitEntryPoint, isScript, anonRecdTypes, namedDebugPointsForInlinedCode) - let minfo = AbstractLazyModulInfoByHiding true hidden minfo - env, TImplFile (qname, pragmas, mexprR, hasExplicitEntryPoint, isScript, anonRecdTypes, namedDebugPointsForInlinedCode), minfo, hidden + env, implFileR, minfo, hidden /// Entry point -let OptimizeImplFile (settings, ccu, tcGlobals, tcVal, importMap, optEnv, isIncrementalFragment, emitTailcalls, hidden, mimpls) = +let OptimizeImplFile (settings, ccu, tcGlobals, tcVal, importMap, optEnv, isIncrementalFragment, fsiMultiAssemblyEmit, emitTailcalls, hidden, mimpls) = let cenv = { settings=settings scope=ccu @@ -4008,7 +4027,7 @@ let OptimizeImplFile (settings, ccu, tcGlobals, tcVal, importMap, optEnv, isIncr stackGuard = StackGuard(OptimizerStackGuardDepth) } - let env, _, _, _ as results = OptimizeImplFileInternal cenv optEnv isIncrementalFragment hidden mimpls + let env, _, _, _ as results = OptimizeImplFileInternal cenv optEnv isIncrementalFragment fsiMultiAssemblyEmit hidden mimpls let optimizeDuringCodeGen disableMethodSplitting expr = let env = { env with disableMethodSplitting = env.disableMethodSplitting || disableMethodSplitting } diff --git a/src/fsharp/Optimizer.fsi b/src/fsharp/Optimizer.fsi index 2f58475338..11af2e4333 100644 --- a/src/fsharp/Optimizer.fsi +++ b/src/fsharp/Optimizer.fsi @@ -74,6 +74,7 @@ val internal OptimizeImplFile: Import.ImportMap * IncrementalOptimizationEnv * isIncrementalFragment: bool * + fsiMultiAssemblyEmit: bool * emitTailcalls: bool * SignatureHidingInfo * TypedImplFile diff --git a/src/fsharp/PatternMatchCompilation.fs b/src/fsharp/PatternMatchCompilation.fs index 3e809b83e9..643f025285 100644 --- a/src/fsharp/PatternMatchCompilation.fs +++ b/src/fsharp/PatternMatchCompilation.fs @@ -270,7 +270,7 @@ let RefuteDiscrimSet g m path discrims = let enumValues = if tcref.IsILEnumTycon then let (TILObjectReprData(_, _, tdef)) = tcref.ILTyconInfo - tdef.Fields.AsList + tdef.Fields.AsList() |> Seq.choose (fun ilField -> if ilField.IsStatic then ilField.LiteralValue |> Option.map (fun ilValue -> diff --git a/src/fsharp/StaticLinking.fs b/src/fsharp/StaticLinking.fs index c2a1e9c25c..2d0a40e0c0 100644 --- a/src/fsharp/StaticLinking.fs +++ b/src/fsharp/StaticLinking.fs @@ -126,13 +126,13 @@ let StaticLinkILModules (tcConfig:TcConfig, ilGlobals, tcImports, ilxMainModule, [ for _, depILModule in dependentILModules do match depILModule.Manifest with | Some m -> - for ca in m.CustomAttrs.AsArray do + for ca in m.CustomAttrs.AsArray() do if ca.Method.MethodRef.DeclaringTypeRef.FullName = typeof.FullName then yield ca | _ -> () ] let savedResources = - let allResources = [ for ccu, m in dependentILModules do for r in m.Resources.AsList do yield (ccu, r) ] + let allResources = [ for ccu, m in dependentILModules do for r in m.Resources.AsList() do yield (ccu, r) ] // Don't save interface, optimization or resource definitions for provider-generated assemblies. // These are "fake". let isProvided (ccu: CcuThunk option) = @@ -172,22 +172,22 @@ let StaticLinkILModules (tcConfig:TcConfig, ilGlobals, tcImports, ilxMainModule, let topTypeDefs, normalTypeDefs = moduls - |> List.map (fun m -> m.TypeDefs.AsList |> List.partition (fun td -> isTypeNameForGlobalFunctions td.Name)) + |> List.map (fun m -> m.TypeDefs.AsList() |> List.partition (fun td -> isTypeNameForGlobalFunctions td.Name)) |> List.unzip let topTypeDef = let topTypeDefs = List.concat topTypeDefs mkILTypeDefForGlobalFunctions ilGlobals - (mkILMethods (topTypeDefs |> List.collect (fun td -> td.Methods.AsList)), - mkILFields (topTypeDefs |> List.collect (fun td -> td.Fields.AsList))) + (mkILMethods (topTypeDefs |> List.collect (fun td -> td.Methods.AsList())), + mkILFields (topTypeDefs |> List.collect (fun td -> td.Fields.AsList()))) let ilxMainModule = let main = { ilxMainModule with - Manifest = (let m = ilxMainModule.ManifestOfAssembly in Some {m with CustomAttrsStored = storeILCustomAttrs (mkILCustomAttrs (m.CustomAttrs.AsList @ savedManifestAttrs)) }) - CustomAttrsStored = storeILCustomAttrs (mkILCustomAttrs [ for m in moduls do yield! m.CustomAttrs.AsArray ]) + Manifest = (let m = ilxMainModule.ManifestOfAssembly in Some {m with CustomAttrsStored = storeILCustomAttrs (mkILCustomAttrs (m.CustomAttrs.AsList() @ savedManifestAttrs)) }) + CustomAttrsStored = storeILCustomAttrs (mkILCustomAttrs [ for m in moduls do yield! m.CustomAttrs.AsArray() ]) TypeDefs = mkILTypeDefs (topTypeDef :: List.concat normalTypeDefs) - Resources = mkILResources (savedResources @ ilxMainModule.Resources.AsList) + Resources = mkILResources (savedResources @ ilxMainModule.Resources.AsList()) NativeResources = savedNativeResources } Morphs.morphILTypeRefsInILModuleMemoized typeForwarding.TypeForwardILTypeRef main @@ -219,7 +219,7 @@ let FindDependentILModulesForStaticLinking (ctok, tcConfig: TcConfig, tcImports: let assumedIndependentSet = set [ "mscorlib"; "System"; "System.Core"; "System.Xml"; "Microsoft.Build.Framework"; "Microsoft.Build.Utilities"; "netstandard" ] begin - let mutable remaining = (computeILRefs ilGlobals ilxMainModule).AssemblyReferences + let mutable remaining = (computeILRefs ilGlobals ilxMainModule).AssemblyReferences |> Array.toList while not (isNil remaining) do let ilAssemRef = List.head remaining remaining <- List.tail remaining @@ -265,8 +265,11 @@ let FindDependentILModulesForStaticLinking (ctok, tcConfig: TcConfig, tcImports: warning(Error(FSComp.SR.fscIgnoringMixedWhenLinking ilAssemRef.Name, rangeStartup)) emptyILRefs else - { AssemblyReferences = dllInfo.ILAssemblyRefs - ModuleReferences = [] } + { AssemblyReferences = dllInfo.ILAssemblyRefs |> List.toArray + ModuleReferences = [| |] + TypeReferences = [| |] + MethodReferences = [| |] + FieldReferences = [||] } depModuleTable.[ilAssemRef.Name] <- { refs=refs @@ -277,7 +280,7 @@ let FindDependentILModulesForStaticLinking (ctok, tcConfig: TcConfig, tcImports: visited = false } // Push the new work items - remaining <- refs.AssemblyReferences @ remaining + remaining <- Array.toList refs.AssemblyReferences @ remaining | None -> warning(Error(FSComp.SR.fscAssumeStaticLinkContainsNoDependencies(ilAssemRef.Name), rangeStartup)) @@ -458,7 +461,7 @@ let StaticLink (ctok, tcConfig: TcConfig, tcImports: TcImports, ilGlobals: ILGlo match enc with | [] -> addILTypeDef td tdefs | h :: t -> - let tdefs = tdefs.AsList + let tdefs = tdefs.AsList() let ltdefs, htd, rtdefs = match tdefs |> trySplitFind (fun td -> td.Name = h) with | ltdefs, None, rtdefs -> diff --git a/src/fsharp/TcGlobals.fs b/src/fsharp/TcGlobals.fs index ddb5904ca1..ff27a2165c 100755 --- a/src/fsharp/TcGlobals.fs +++ b/src/fsharp/TcGlobals.fs @@ -113,6 +113,8 @@ type override x.ToString() = x.TyconRef.ToString() +[] +let tname_InternalsVisibleToAttribute = "System.Runtime.CompilerServices.InternalsVisibleToAttribute" [] let tname_DebuggerNonUserCodeAttribute = "System.Diagnostics.DebuggerNonUserCodeAttribute" [] @@ -777,6 +779,7 @@ type public TcGlobals(compilingFslib: bool, ilg:ILGlobals, fslibCcu: CcuThunk, d let tref_DebuggableAttribute = findSysILTypeRef tname_DebuggableAttribute let tref_CompilerGeneratedAttribute = findSysILTypeRef tname_CompilerGeneratedAttribute + let tref_InternalsVisibleToAttribute = findSysILTypeRef tname_InternalsVisibleToAttribute let mutable generatedAttribsCache = [] let mutable debuggerBrowsableNeverAttributeCache = None @@ -796,7 +799,7 @@ type public TcGlobals(compilingFslib: bool, ilg:ILGlobals, fslibCcu: CcuThunk, d generatedAttribsCache <- res res | res -> res - mkILCustomAttrs (attrs.AsList @ attribs) + mkILCustomAttrs (attrs.AsList() @ attribs) let addMethodGeneratedAttrs (mdef:ILMethodDef) = mdef.With(customAttrs = addGeneratedAttrs mdef.CustomAttrs) @@ -818,7 +821,7 @@ type public TcGlobals(compilingFslib: bool, ilg:ILGlobals, fslibCcu: CcuThunk, d res | Some res -> res - let addNeverAttrs (attrs: ILAttributes) = mkILCustomAttrs (attrs.AsList @ [mkDebuggerBrowsableNeverAttribute()]) + let addNeverAttrs (attrs: ILAttributes) = mkILCustomAttrs (attrs.AsList() @ [mkDebuggerBrowsableNeverAttribute()]) let addPropertyNeverAttrs (pdef:ILPropertyDef) = pdef.With(customAttrs = addNeverAttrs pdef.CustomAttrs) let addFieldNeverAttrs (fdef:ILFieldDef) = fdef.With(customAttrs = addNeverAttrs fdef.CustomAttrs) let mkDebuggerTypeProxyAttribute (ty : ILType) = mkILCustomAttribute (findSysILTypeRef tname_DebuggerTypeProxyAttribute, [ilg.typ_Type], [ILAttribElem.TypeRef (Some ty.TypeRef)], []) @@ -1259,7 +1262,7 @@ type public TcGlobals(compilingFslib: bool, ilg:ILGlobals, fslibCcu: CcuThunk, d member val attrib_ReflectedDefinitionAttribute = mk_MFCore_attrib "ReflectedDefinitionAttribute" member val attrib_CompiledNameAttribute = mk_MFCore_attrib "CompiledNameAttribute" member val attrib_AutoOpenAttribute = mk_MFCore_attrib "AutoOpenAttribute" - member val attrib_InternalsVisibleToAttribute = findSysAttrib "System.Runtime.CompilerServices.InternalsVisibleToAttribute" + member val attrib_InternalsVisibleToAttribute = findSysAttrib tname_InternalsVisibleToAttribute member val attrib_CompilationRepresentationAttribute = mk_MFCore_attrib "CompilationRepresentationAttribute" member val attrib_CompilationArgumentCountsAttribute = mk_MFCore_attrib "CompilationArgumentCountsAttribute" member val attrib_CompilationMappingAttribute = mk_MFCore_attrib "CompilationMappingAttribute" @@ -1618,6 +1621,9 @@ type public TcGlobals(compilingFslib: bool, ilg:ILGlobals, fslibCcu: CcuThunk, d member _.CompilerGeneratedAttribute = mkCompilerGeneratedAttribute () + member _.MakeInternalsVisibleToAttribute(simpleAssemName) = + mkILCustomAttribute (tref_InternalsVisibleToAttribute, [ilg.typ_String], [ILAttribElem.String (Some simpleAssemName)], []) + /// Find an FSharp.Core LaguagePrimitives dynamic function that corresponds to a trait witness, e.g. /// AdditionDynamic for op_Addition. Also work out the type instantiation of the dynamic function. member _.MakeBuiltInWitnessInfo (t: TraitConstraintInfo) = diff --git a/src/fsharp/TypedTree.fs b/src/fsharp/TypedTree.fs index 4482b1af6f..184b123cfa 100644 --- a/src/fsharp/TypedTree.fs +++ b/src/fsharp/TypedTree.fs @@ -1949,13 +1949,13 @@ type ModuleOrNamespaceType(kind: ModuleOrNamespaceKind, vals: QueueList, en /// types "List`1", the entry (List, 1) will be present. member mtyp.TypesByDemangledNameAndArity = cacheOptByref &tyconsByDemangledNameAndArityCache (fun () -> - LayeredMap.Empty.AddAndMarkAsCollapsible( mtyp.TypeAndExceptionDefinitions |> List.map (fun (tc: Tycon) -> Construct.KeyTyconByDecodedName tc.LogicalName tc) |> List.toArray)) + LayeredMap.Empty.AddMany( mtyp.TypeAndExceptionDefinitions |> List.map (fun (tc: Tycon) -> Construct.KeyTyconByDecodedName tc.LogicalName tc) |> List.toArray)) /// Get a table of types defined within this module, namespace or type. The /// table is indexed by both name and, for generic types, also by mangled name. member mtyp.TypesByAccessNames = cacheOptByref &tyconsByAccessNamesCache (fun () -> - LayeredMultiMap.Empty.AddAndMarkAsCollapsible (mtyp.TypeAndExceptionDefinitions |> List.toArray |> Array.collect (fun (tc: Tycon) -> Construct.KeyTyconByAccessNames tc.LogicalName tc))) + LayeredMultiMap.Empty.AddMany (mtyp.TypeAndExceptionDefinitions |> List.toArray |> Array.collect (fun (tc: Tycon) -> Construct.KeyTyconByAccessNames tc.LogicalName tc))) // REVIEW: we can remove this lookup and use AllEntitiesByMangledName instead? member mtyp.TypesByMangledName = @@ -5316,7 +5316,7 @@ type CcuThunk = name: CcuReference } - /// Dereference the asssembly reference + /// Dereference the assembly reference member ccu.Deref = if isNull (ccu.target :> obj) then raise(UnresolvedReferenceNoRange ccu.name) @@ -5336,7 +5336,7 @@ type CcuThunk = with get() = ccu.Deref.UsesFSharp20PlusQuotations and set v = ccu.Deref.UsesFSharp20PlusQuotations <- v - /// The short name of the asssembly being referenced + /// The short name of the assembly being referenced member ccu.AssemblyName = ccu.name /// Holds the data indicating how this assembly/module is referenced from the code being compiled. diff --git a/src/fsharp/TypedTreeOps.fs b/src/fsharp/TypedTreeOps.fs index e90d97f91b..49dc04c11b 100644 --- a/src/fsharp/TypedTreeOps.fs +++ b/src/fsharp/TypedTreeOps.fs @@ -3082,10 +3082,10 @@ let isILAttrib (tref: ILTypeRef) (attr: ILAttribute) = // on imported types. However this is fairly rare and can also be solved by caching the // results of attribute lookups in the TAST let HasILAttribute tref (attrs: ILAttributes) = - attrs.AsArray |> Array.exists (isILAttrib tref) + attrs.AsArray() |> Array.exists (isILAttrib tref) let TryDecodeILAttribute tref (attrs: ILAttributes) = - attrs.AsArray |> Array.tryPick (fun x -> if isILAttrib tref x then Some(decodeILAttribData x) else None) + attrs.AsArray() |> Array.tryPick (fun x -> if isILAttrib tref x then Some(decodeILAttribData x) else None) // F# view of attributes (these get converted to AbsIL attributes in ilxgen) let IsMatchingFSharpAttribute g (AttribInfo(_, tcref)) (Attrib(tcref2, _, _, _, _, _, _)) = tyconRefEq g tcref tcref2 @@ -3210,7 +3210,7 @@ let TyconRefHasAttributeByName (m: range) attrFullName (tcref: TyconRef) = a.GetAttributeConstructorArgs(provAttribs.TypeProvider.PUntaintNoFailure id, attrFullName)), m).IsSome #endif | ILTypeMetadata (TILObjectReprData(_, _, tdef)) -> - tdef.CustomAttrs.AsArray + tdef.CustomAttrs.AsArray() |> Array.exists (fun attr -> isILAttribByName ([], attrFullName) attr) | FSharpOrArrayOrByrefOrTupleOrExnTypeMetadata -> tcref.Attribs @@ -4476,9 +4476,36 @@ let rec accModuleOrNamespaceHidingInfoAtAssemblyBoundary mty acc = let acc = QueueList.foldBack accValHidingInfoAtAssemblyBoundary mty.AllValsAndMembers acc acc -let ComputeHidingInfoAtAssemblyBoundary mty acc = +let ComputeSignatureHidingInfoAtAssemblyBoundary mty acc = accModuleOrNamespaceHidingInfoAtAssemblyBoundary mty acc +let rec accImplHidingInfoAtAssemblyBoundary mdef acc = + match mdef with + | TMDefRec(_isRec, _opens, tycons, mbinds, _m) -> + let acc = List.foldBack accTyconHidingInfoAtAssemblyBoundary tycons acc + let acc = + (mbinds, acc) ||> List.foldBack (fun mbind acc -> + match mbind with + | ModuleOrNamespaceBinding.Binding bind -> + accValHidingInfoAtAssemblyBoundary bind.Var acc + | ModuleOrNamespaceBinding.Module(_mspec, def) -> + accImplHidingInfoAtAssemblyBoundary def acc) + acc + + | TMAbstract mexpr -> + accModuleOrNamespaceHidingInfoAtAssemblyBoundary mexpr.Type acc + + | TMDefOpens _openDecls -> acc + + | TMDefLet(bind, _m) -> accValHidingInfoAtAssemblyBoundary bind.Var acc + + | TMDefDo _ -> acc + + | TMDefs defs -> List.foldBack accImplHidingInfoAtAssemblyBoundary defs acc + +let ComputeImplementationHidingInfoAtAssemblyBoundary mty acc = + accImplHidingInfoAtAssemblyBoundary mty acc + //-------------------------------------------------------------------------- // Compute instances of the above for mexpr -> mty //-------------------------------------------------------------------------- diff --git a/src/fsharp/TypedTreeOps.fsi b/src/fsharp/TypedTreeOps.fsi index 0c7e432a96..a05dfaf923 100755 --- a/src/fsharp/TypedTreeOps.fsi +++ b/src/fsharp/TypedTreeOps.fsi @@ -1212,7 +1212,10 @@ val ComputeRemappingFromImplementationToSignature: TcGlobals -> ModuleOrNamespac val ComputeRemappingFromInferredSignatureToExplicitSignature: TcGlobals -> ModuleOrNamespaceType -> ModuleOrNamespaceType -> SignatureRepackageInfo * SignatureHidingInfo /// Compute the hiding information that corresponds to the hiding applied at an assembly boundary -val ComputeHidingInfoAtAssemblyBoundary: ModuleOrNamespaceType -> SignatureHidingInfo -> SignatureHidingInfo +val ComputeSignatureHidingInfoAtAssemblyBoundary: ModuleOrNamespaceType -> SignatureHidingInfo -> SignatureHidingInfo + +/// Compute the hiding information that corresponds to the hiding applied at an assembly boundary +val ComputeImplementationHidingInfoAtAssemblyBoundary: ModuleOrNamespaceExpr -> SignatureHidingInfo -> SignatureHidingInfo val mkRepackageRemapping: SignatureRepackageInfo -> Remap diff --git a/src/fsharp/absil/il.fs b/src/fsharp/absil/il.fs index 2401f90c04..2937a274cf 100644 --- a/src/fsharp/absil/il.fs +++ b/src/fsharp/absil/il.fs @@ -14,6 +14,7 @@ open System.Collections open System.Collections.Generic open System.Collections.Concurrent open System.Collections.ObjectModel +open System.Linq open System.Reflection open System.Text open System.Threading @@ -577,7 +578,7 @@ type ILTypeRef = { trefScope: ILScopeRef trefEnclosing: string list trefName: string - hashCode : int + hashCode: int mutable asBoxedType: ILType } static member ComputeHash(scope, enclosing, name) = @@ -791,9 +792,9 @@ and [] ArgTypes: ILTypes ReturnType: ILType } -and ILGenericArgs = list +and ILGenericArgs = ILType list -and ILTypes = list +and ILTypes = ILType list let mkILCallSig (cc, args, ret) = { ArgTypes=args; CallingConv=cc; ReturnType=ret} @@ -1011,9 +1012,9 @@ type ILAttribute = [] type ILAttributes(array : ILAttribute[]) = - member x.AsArray = array + member x.AsArray() = array - member x.AsList = x.AsArray |> Array.toList + member x.AsList() = array |> Array.toList [] type ILAttributesStored = @@ -1031,13 +1032,19 @@ type ILAttributesStored = let emptyILCustomAttrs = ILAttributes [| |] -let mkILCustomAttrsFromArray (attrs: ILAttribute[]) = if attrs.Length = 0 then emptyILCustomAttrs else ILAttributes attrs +let mkILCustomAttrsFromArray (attrs: ILAttribute[]) = + if attrs.Length = 0 then emptyILCustomAttrs else ILAttributes attrs -let mkILCustomAttrs l = match l with [] -> emptyILCustomAttrs | _ -> mkILCustomAttrsFromArray (List.toArray l) +let mkILCustomAttrs l = + match l with + | [] -> emptyILCustomAttrs + | _ -> mkILCustomAttrsFromArray (List.toArray l) -let emptyILCustomAttrsStored = ILAttributesStored.Given emptyILCustomAttrs +let emptyILCustomAttrsStored = + ILAttributesStored.Given emptyILCustomAttrs -let storeILCustomAttrs (attrs: ILAttributes) = if attrs.AsArray.Length = 0 then emptyILCustomAttrsStored else ILAttributesStored.Given attrs +let storeILCustomAttrs (attrs: ILAttributes) = + if attrs.AsArray().Length = 0 then emptyILCustomAttrsStored else ILAttributesStored.Given attrs let mkILCustomAttrsReader f = ILAttributesStored.Reader f @@ -1457,8 +1464,8 @@ type ILSecurityDecl = [] type ILSecurityDecls (array : ILSecurityDecl[]) = - member x.AsArray = array - member x.AsList = x.AsArray |> Array.toList + member x.AsArray() = array + member x.AsList() = x.AsArray() |> Array.toList [] type ILSecurityDeclsStored = @@ -1480,7 +1487,10 @@ let emptyILSecurityDeclsStored = ILSecurityDeclsStored.Given emptyILSecurityDecl let mkILSecurityDecls l = match l with [] -> emptyILSecurityDecls | _ -> ILSecurityDecls (Array.ofList l) -let storeILSecurityDecls (x: ILSecurityDecls) = if x.AsArray.Length = 0 then emptyILSecurityDeclsStored else ILSecurityDeclsStored.Given x +let storeILSecurityDecls (x: ILSecurityDecls) = + if x.AsArray().Length = 0 then + emptyILSecurityDeclsStored + else ILSecurityDeclsStored.Given x let mkILSecurityDeclsReader f = ILSecurityDeclsStored.Reader f @@ -1807,9 +1817,9 @@ type ILMethodDefs(f : unit -> ILMethodDef[]) = interface IEnumerable with member x.GetEnumerator() = (array.Value :> IEnumerable).GetEnumerator() - member x.AsArray = array.Value + member x.AsArray() = array.Value - member x.AsList = array.Value|> Array.toList + member x.AsList() = array.Value|> Array.toList member x.FindByName nm = match dict.Value.TryGetValue nm with @@ -1864,7 +1874,7 @@ type ILEventDef(eventType: ILType option, name: string, attributes: EventAttribu type ILEventDefs = | ILEvents of LazyOrderedMultiMap - member x.AsList = let (ILEvents t) = x in t.Entries() + member x.AsList() = let (ILEvents t) = x in t.Entries() member x.LookupByName s = let (ILEvents t) = x in t.[s] @@ -1913,7 +1923,9 @@ type ILPropertyDef(name: string, attributes: PropertyAttributes, setMethod: ILMe [] type ILPropertyDefs = | ILProperties of LazyOrderedMultiMap - member x.AsList = let (ILProperties t) = x in t.Entries() + + member x.AsList() = let (ILProperties t) = x in t.Entries() + member x.LookupByName s = let (ILProperties t) = x in t.[s] let convertFieldAccess (ilMemberAccess: ILMemberAccess) = @@ -1971,7 +1983,7 @@ type ILFieldDef(name: string, fieldType: ILType, attributes: FieldAttributes, da type ILFieldDefs = | ILFields of LazyOrderedMultiMap - member x.AsList = let (ILFields t) = x in t.Entries() + member x.AsList() = let (ILFields t) = x in t.Entries() member x.LookupByName s = let (ILFields t) = x in t.[s] @@ -1983,7 +1995,7 @@ type ILMethodImplDef = type ILMethodImplDefs = | ILMethodImpls of Lazy - member x.AsList = let (ILMethodImpls ltab) = x in Map.foldBack (fun _x y r -> y@r) (ltab.Force()) [] + member x.AsList() = let (ILMethodImpls ltab) = x in Map.foldBack (fun _x y r -> y@r) (ltab.Force()) [] and MethodImplsMap = Map @@ -2189,9 +2201,9 @@ and [] ILTypeDefs(f : unit -> ILPreTypeDef[]) = t.[key] <- pre ReadOnlyDictionary t) - member x.AsArray = [| for pre in array.Value -> pre.GetTypeDef() |] + member x.AsArray() = [| for pre in array.Value -> pre.GetTypeDef() |] - member x.AsList = [ for pre in array.Value -> pre.GetTypeDef() ] + member x.AsList() = [ for pre in array.Value -> pre.GetTypeDef() ] interface IEnumerable with member x.GetEnumerator() = ((x :> IEnumerable).GetEnumerator() :> IEnumerator) @@ -2200,7 +2212,7 @@ and [] ILTypeDefs(f : unit -> ILPreTypeDef[]) = member x.GetEnumerator() = (seq { for pre in array.Value -> pre.GetTypeDef() }).GetEnumerator() - member x.AsArrayOfPreTypeDefs = array.Value + member x.AsArrayOfPreTypeDefs() = array.Value member x.FindByName nm = let ns, n = splitILTypeName nm @@ -2253,7 +2265,7 @@ type ILNestedExportedType = and ILNestedExportedTypes = | ILNestedExportedTypes of Lazy> - member x.AsList = let (ILNestedExportedTypes ltab) = x in Map.foldBack (fun _x y r -> y :: r) (ltab.Force()) [] + member x.AsList() = let (ILNestedExportedTypes ltab) = x in Map.foldBack (fun _x y r -> y :: r) (ltab.Force()) [] and [] ILExportedTypeOrForwarder = @@ -2273,7 +2285,7 @@ and [] and ILExportedTypesAndForwarders = | ILExportedTypesAndForwarders of Lazy> - member x.AsList = let (ILExportedTypesAndForwarders ltab) = x in Map.foldBack (fun _x y r -> y :: r) (ltab.Force()) [] + member x.AsList() = let (ILExportedTypesAndForwarders ltab) = x in Map.foldBack (fun _x y r -> y :: r) (ltab.Force()) [] member x.TryFindByName nm = match x with @@ -2309,7 +2321,7 @@ type ILResource = type ILResources = | ILResources of ILResource list - member x.AsList = let (ILResources ltab) = x in ltab + member x.AsList() = let (ILResources ltab) = x in ltab // -------------------------------------------------------------------- // One module in the "current" assembly @@ -2580,7 +2592,7 @@ let mkILPreTypeDefRead (ns, n, idx, f) = ILPreTypeDefImpl (ns, n, idx, f) :> ILPreTypeDef -let addILTypeDef td (tdefs: ILTypeDefs) = ILTypeDefs (fun () -> [| yield mkILPreTypeDef td; yield! tdefs.AsArrayOfPreTypeDefs |]) +let addILTypeDef td (tdefs: ILTypeDefs) = ILTypeDefs (fun () -> [| yield mkILPreTypeDef td; yield! tdefs.AsArrayOfPreTypeDefs() |]) let mkILTypeDefsFromArray (l: ILTypeDef[]) = ILTypeDefs (fun () -> Array.map mkILPreTypeDef l) let mkILTypeDefs l = mkILTypeDefsFromArray (Array.ofList l) let mkILTypeDefsComputed f = ILTypeDefs f @@ -2596,7 +2608,7 @@ let mkILMethodsComputed f = ILMethodDefs f let emptyILMethods = mkILMethodsFromArray [| |] let filterILMethodDefs f (mdefs: ILMethodDefs) = - ILMethodDefs (fun () -> mdefs.AsArray |> Array.filter f) + ILMethodDefs (fun () -> mdefs.AsArray() |> Array.filter f) // -------------------------------------------------------------------- // Operations and defaults for modules, assemblies etc. @@ -3370,7 +3382,7 @@ let mkILTypeDefForGlobalFunctions ilg (methods, fields) = mkILSimpleClass ilg (typeNameForGlobalFunctions, ILTypeDefAccess.Public, methods, fields, emptyILTypeDefs, emptyILProperties, emptyILEvents, emptyILCustomAttrs, ILTypeInit.BeforeField) let destTypeDefsWithGlobalFunctionsFirst ilg (tdefs: ILTypeDefs) = - let l = tdefs.AsList + let l = tdefs.AsList() let top, nontop = l |> List.partition (fun td -> td.Name = typeNameForGlobalFunctions) let top2 = if isNil top then [ mkILTypeDefForGlobalFunctions ilg (emptyILMethods, emptyILFields) ] else top top2@nontop @@ -3465,7 +3477,7 @@ type ILEnumInfo = let getTyOfILEnumInfo info = info.enumType let computeILEnumInfo (mdName, mdFields: ILFieldDefs) = - match (List.partition (fun (fd: ILFieldDef) -> fd.IsStatic) mdFields.AsList) with + match (List.partition (fun (fd: ILFieldDef) -> fd.IsStatic) (mdFields.AsList())) with | staticFields, [vfd] -> { enumType = vfd.FieldType enumValues = staticFields |> List.map (fun fd -> (fd.Name, match fd.LiteralValue with Some i -> i | None -> failwith ("info_of_enum_tdef: badly formed enum "+mdName+": static field does not have an default value"))) } @@ -4156,17 +4168,26 @@ let decodeILAttribData (ca: ILAttribute) = // -------------------------------------------------------------------- type ILReferences = - { AssemblyReferences: ILAssemblyRef list - ModuleReferences: ILModuleRef list } + { AssemblyReferences: ILAssemblyRef[] + ModuleReferences: ILModuleRef[] + TypeReferences: ILTypeRef[] + MethodReferences: ILMethodRef[] + FieldReferences: ILFieldRef[] } type ILReferencesAccumulator = { ilg: ILGlobals refsA: HashSet - refsM: HashSet } + refsM: HashSet + refsTs: HashSet + refsMs: HashSet + refsFs: HashSet } let emptyILRefs = - { AssemblyReferences=[] - ModuleReferences = [] } + { AssemblyReferences = [||] + ModuleReferences = [||] + TypeReferences = [||] + MethodReferences = [||] + FieldReferences = [||] } (* Now find references. *) let refs_of_assemblyRef (s: ILReferencesAccumulator) x = s.refsA.Add x |> ignore @@ -4207,8 +4228,12 @@ and refs_of_mref s (x: ILMethodRef) = refs_of_dloc s x.DeclaringTypeRef refs_of_tys s x.mrefArgs refs_of_typ s x.mrefReturn + s.refsMs.Add x |> ignore -and refs_of_fref s x = refs_of_tref s x.DeclaringTypeRef; refs_of_typ s x.Type +and refs_of_fref s x = + refs_of_tref s x.DeclaringTypeRef + refs_of_typ s x.Type + s.refsFs.Add x |> ignore and refs_of_ospec s (OverridesSpec (mref, ty)) = refs_of_mref s mref; refs_of_typ s ty @@ -4229,9 +4254,11 @@ and refs_of_token s x = | ILToken.ILMethod mr -> refs_of_mspec s mr | ILToken.ILField fr -> refs_of_fspec s fr -and refs_of_custom_attr s (cattr: ILAttribute) = refs_of_mspec s cattr.Method +and refs_of_custom_attr s (cattr: ILAttribute) = + refs_of_mspec s cattr.Method -and refs_of_custom_attrs s (cas : ILAttributes) = Array.iter (refs_of_custom_attr s) cas.AsArray +and refs_of_custom_attrs s (cas : ILAttributes) = + Array.iter (refs_of_custom_attr s) (cas.AsArray()) and refs_of_varargs s tyso = Option.iter (refs_of_tys s) tyso @@ -4307,7 +4334,8 @@ and refs_of_event_def s (ed: ILEventDef) = List.iter (refs_of_mref s) ed.OtherMethods refs_of_custom_attrs s ed.CustomAttrs -and refs_of_events s (x: ILEventDefs) = List.iter (refs_of_event_def s) x.AsList +and refs_of_events s (x: ILEventDefs) = + List.iter (refs_of_event_def s) (x.AsList()) and refs_of_property_def s (pd: ILPropertyDef) = Option.iter (refs_of_mref s) pd.SetMethod @@ -4316,15 +4344,18 @@ and refs_of_property_def s (pd: ILPropertyDef) = refs_of_tys s pd.Args refs_of_custom_attrs s pd.CustomAttrs -and refs_of_properties s (x: ILPropertyDefs) = List.iter (refs_of_property_def s) x.AsList +and refs_of_properties s (x: ILPropertyDefs) = + List.iter (refs_of_property_def s) (x.AsList()) and refs_of_fdef s (fd: ILFieldDef) = refs_of_typ s fd.FieldType refs_of_custom_attrs s fd.CustomAttrs -and refs_of_fields s fields = List.iter (refs_of_fdef s) fields +and refs_of_fields s fields = + List.iter (refs_of_fdef s) fields -and refs_of_method_impls s mimpls = List.iter (refs_of_method_impl s) mimpls +and refs_of_method_impls s mimpls = + List.iter (refs_of_method_impl s) mimpls and refs_of_method_impl s m = refs_of_ospec s m.Overrides @@ -4338,8 +4369,8 @@ and refs_of_tdef s (td : ILTypeDef) = refs_of_tys s td.Implements Option.iter (refs_of_typ s) td.Extends refs_of_mdefs s td.Methods - refs_of_fields s td.Fields.AsList - refs_of_method_impls s td.MethodImpls.AsList + refs_of_fields s (td.Fields.AsList()) + refs_of_method_impls s (td.MethodImpls.AsList()) refs_of_events s td.Events refs_of_tdef_kind s td refs_of_custom_attrs s td.CustomAttrs @@ -4352,7 +4383,8 @@ and refs_of_types s (types: ILTypeDefs) = Seq.iter (refs_of_tdef s) types and refs_of_exported_type s (c: ILExportedTypeOrForwarder) = refs_of_custom_attrs s c.CustomAttrs -and refs_of_exported_types s (tab: ILExportedTypesAndForwarders) = List.iter (refs_of_exported_type s) tab.AsList +and refs_of_exported_types s (tab: ILExportedTypesAndForwarders) = + List.iter (refs_of_exported_type s) (tab.AsList()) and refs_of_resource_where s x = match x with @@ -4364,7 +4396,8 @@ and refs_of_resource s x = refs_of_resource_where s x.Location refs_of_custom_attrs s x.CustomAttrs -and refs_of_resources s (tab: ILResources) = List.iter (refs_of_resource s) tab.AsList +and refs_of_resources s (tab: ILResources) = + List.iter (refs_of_resource s) (tab.AsList()) and refs_of_modul s m = refs_of_types s m.TypeDefs @@ -4379,11 +4412,17 @@ let computeILRefs ilg modul = let s = { ilg = ilg refsA = HashSet<_>(HashIdentity.Structural) - refsM = HashSet<_>(HashIdentity.Structural) } + refsM = HashSet<_>(HashIdentity.Structural) + refsTs = HashSet<_>(HashIdentity.Structural) + refsMs = HashSet<_>(HashIdentity.Structural) + refsFs = HashSet<_>(HashIdentity.Structural) } refs_of_modul s modul - { AssemblyReferences = Seq.fold (fun acc x -> x :: acc) [] s.refsA - ModuleReferences = Seq.fold (fun acc x -> x :: acc) [] s.refsM } + { AssemblyReferences = s.refsA.ToArray() + ModuleReferences = s.refsM.ToArray() + TypeReferences = s.refsTs.ToArray() + MethodReferences = s.refsMs.ToArray() + FieldReferences = s.refsFs.ToArray() } let unscopeILTypeRef (x: ILTypeRef) = ILTypeRef.Create (ILScopeRef.Local, x.Enclosing, x.Name) diff --git a/src/fsharp/absil/il.fsi b/src/fsharp/absil/il.fsi index d87dd163a2..5c2f093f17 100644 --- a/src/fsharp/absil/il.fsi +++ b/src/fsharp/absil/il.fsi @@ -844,9 +844,9 @@ type ILAttribute = [] type ILAttributes = - member AsArray: ILAttribute [] + member AsArray: unit -> ILAttribute [] - member AsList: ILAttribute list + member AsList: unit -> ILAttribute list /// Represents the efficiency-oriented storage of ILAttributes in another item. [] @@ -911,7 +911,7 @@ type internal ILSecurityDecl = /// below to construct/destruct these. [] type internal ILSecurityDecls = - member AsList: ILSecurityDecl list + member AsList: unit -> ILSecurityDecl list /// Represents the efficiency-oriented storage of ILSecurityDecls in another item. [] @@ -1101,8 +1101,8 @@ type ILMethodDef = [] type ILMethodDefs = interface IEnumerable - member AsArray: ILMethodDef[] - member AsList: ILMethodDef list + member AsArray: unit -> ILMethodDef[] + member AsList: unit -> ILMethodDef list member FindByName: string -> ILMethodDef list member TryFindInstanceByNameAndCallingSignature: string * ILCallingSignature -> ILMethodDef option @@ -1154,7 +1154,8 @@ type ILFieldDef = /// a form to allow efficient looking up fields by name. [] type ILFieldDefs = - member internal AsList: ILFieldDef list + member internal AsList: unit -> ILFieldDef list + member internal LookupByName: string -> ILFieldDef list /// Event definitions. @@ -1192,7 +1193,8 @@ type ILEventDef = /// Table of those events in a type definition. [] type ILEventDefs = - member internal AsList: ILEventDef list + member internal AsList: unit -> ILEventDef list + member internal LookupByName: string -> ILEventDef list /// Property definitions @@ -1232,7 +1234,9 @@ type ILPropertyDef = [] [] type ILPropertyDefs = - member internal AsList: ILPropertyDef list + + member internal AsList: unit -> ILPropertyDef list + member internal LookupByName: string -> ILPropertyDef list /// Method Impls @@ -1242,7 +1246,7 @@ type ILMethodImplDef = [] type ILMethodImplDefs = - member internal AsList: ILMethodImplDef list + member internal AsList: unit -> ILMethodImplDef list /// Type Layout information. [] @@ -1289,12 +1293,12 @@ type ILTypeDefKind = type ILTypeDefs = interface IEnumerable - member internal AsArray: ILTypeDef[] + member internal AsArray: unit -> ILTypeDef[] - member internal AsList: ILTypeDef list + member internal AsList: unit -> ILTypeDef list /// Get some information about the type defs, but do not force the read of the type defs themselves. - member internal AsArrayOfPreTypeDefs: ILPreTypeDef[] + member internal AsArrayOfPreTypeDefs: unit -> ILPreTypeDef[] /// Calls to FindByName will result in any laziness in the overall /// set of ILTypeDefs being read in in addition @@ -1395,7 +1399,7 @@ val internal mkILTypeDefReader: (int32 -> ILTypeDef) -> ILTypeDefStored [] type ILNestedExportedTypes = - member internal AsList: ILNestedExportedType list + member internal AsList: unit -> ILNestedExportedType list /// "Classes Elsewhere" - classes in auxiliary modules. /// @@ -1453,7 +1457,7 @@ type ILExportedTypeOrForwarder = [] [] type ILExportedTypesAndForwarders = - member internal AsList: ILExportedTypeOrForwarder list + member internal AsList: unit -> ILExportedTypeOrForwarder list member internal TryFindByName: string -> ILExportedTypeOrForwarder option [] @@ -1493,7 +1497,7 @@ type internal ILResource = [] [] type ILResources = - member internal AsList: ILResource list + member internal AsList: unit -> ILResource list [] type ILAssemblyLongevity = @@ -2011,23 +2015,27 @@ val NoMetadataIdx: int32 // become ILScopeRef.Assembly m // -------------------------------------------------------------------- -/// Rescoping. The first argument tells the function how to reference the original scope from +/// Rescoping. The first argument indicates how to reference the original scope from /// the new scope. val internal rescopeILScopeRef: ILScopeRef -> ILScopeRef -> ILScopeRef -/// Rescoping. The first argument tells the function how to reference the original scope from +/// Rescoping. The first argument indicates how to reference the original scope from +/// the new scope. +val internal rescopeILTypeRef: ILScopeRef -> ILTypeRef -> ILTypeRef + +/// Rescoping. The first argument indicates how to reference the original scope from /// the new scope. val internal rescopeILTypeSpec: ILScopeRef -> ILTypeSpec -> ILTypeSpec -/// Rescoping. The first argument tells the function how to reference the original scope from +/// Rescoping. The first argument indicates how to reference the original scope from /// the new scope. val internal rescopeILType: ILScopeRef -> ILType -> ILType -/// Rescoping. The first argument tells the function how to reference the original scope from +/// Rescoping. The first argument indicates how to reference the original scope from /// the new scope. val internal rescopeILMethodRef: ILScopeRef -> ILMethodRef -> ILMethodRef -/// Rescoping. The first argument tells the function how to reference the original scope from +/// Rescoping. The first argument indicates how to reference the original scope from /// the new scope. val internal rescopeILFieldRef: ILScopeRef -> ILFieldRef -> ILFieldRef @@ -2100,11 +2108,15 @@ type internal ILPropertyRef = member Name: string interface System.IComparable -type internal ILReferences = - { AssemblyReferences: ILAssemblyRef list - ModuleReferences: ILModuleRef list } +type ILReferences = + { AssemblyReferences: ILAssemblyRef[] + ModuleReferences: ILModuleRef[] + TypeReferences: ILTypeRef[] + MethodReferences: ILMethodRef[] + FieldReferences: ILFieldRef[] } /// Find the full set of assemblies referenced by a module. val internal computeILRefs: ILGlobals -> ILModuleDef -> ILReferences + val internal emptyILRefs: ILReferences diff --git a/src/fsharp/absil/illib.fs b/src/fsharp/absil/illib.fs index dcc7d133ff..97e93e8659 100644 --- a/src/fsharp/absil/illib.fs +++ b/src/fsharp/absil/illib.fs @@ -1134,11 +1134,9 @@ module MapAutoOpens = member x.Values = [ for KeyValue(_, v) in x -> v ] #endif - member x.AddAndMarkAsCollapsible (kvs: _[]) = (x, kvs) ||> Array.fold (fun x (KeyValue(k, v)) -> x.Add(k, v)) + member x.AddMany (kvs: _[]) = (x, kvs) ||> Array.fold (fun x (KeyValue(k, v)) -> x.Add(k, v)) - member x.LinearTryModifyThenLaterFlatten (key, f: 'Value option -> 'Value) = x.Add (key, f (x.TryFind key)) - - member x.MarkAsCollapsible () = x + member x.AddOrModify (key, f: 'Value option -> 'Value) = x.Add (key, f (x.TryFind key)) /// Immutable map collection, with explicit flattening to a backing dictionary [] @@ -1148,11 +1146,8 @@ type LayeredMultiMap<'Key, 'Value when 'Key : equality and 'Key : comparison>(co member _.Item with get k = match contents.TryGetValue k with true, l -> l | _ -> [] - member x.AddAndMarkAsCollapsible (kvs: _[]) = - let x = (x, kvs) ||> Array.fold (fun x (KeyValue(k, v)) -> x.Add(k, v)) - x.MarkAsCollapsible() - - member _.MarkAsCollapsible() = LayeredMultiMap(contents.MarkAsCollapsible()) + member x.AddMany (kvs: _[]) = + (x, kvs) ||> Array.fold (fun x (KeyValue(k, v)) -> x.Add(k, v)) member _.TryFind k = contents.TryFind k diff --git a/src/fsharp/absil/illib.fsi b/src/fsharp/absil/illib.fsi index da8bc23da1..f6300d3f57 100644 --- a/src/fsharp/absil/illib.fsi +++ b/src/fsharp/absil/illib.fsi @@ -601,12 +601,9 @@ module internal MapAutoOpens = member Values: 'Value list #endif - member AddAndMarkAsCollapsible: kvs:KeyValuePair<'Key,'Value> [] -> Map<'Key,'Value> when 'Key: comparison + member AddMany: kvs:KeyValuePair<'Key,'Value> [] -> Map<'Key,'Value> when 'Key: comparison - member LinearTryModifyThenLaterFlatten: key:'Key * f:('Value option -> 'Value) -> Map<'Key,'Value> when 'Key: comparison - - type internal Map<'Key,'Value when 'Key: comparison> with - member MarkAsCollapsible: unit -> Map<'Key,'Value> when 'Key: comparison + member AddOrModify: key:'Key * f:('Value option -> 'Value) -> Map<'Key,'Value> when 'Key: comparison /// Immutable map collection, with explicit flattening to a backing dictionary [] @@ -616,9 +613,7 @@ type internal LayeredMultiMap<'Key,'Value when 'Key: comparison> = member Add: k:'Key * v:'Value -> LayeredMultiMap<'Key,'Value> - member AddAndMarkAsCollapsible: kvs:KeyValuePair<'Key,'Value> [] -> LayeredMultiMap<'Key,'Value> - - member MarkAsCollapsible: unit -> LayeredMultiMap<'Key,'Value> + member AddMany: kvs:KeyValuePair<'Key,'Value> [] -> LayeredMultiMap<'Key,'Value> member TryFind: k:'Key -> 'Value list option diff --git a/src/fsharp/absil/ilmorph.fs b/src/fsharp/absil/ilmorph.fs index 558bae4360..b457a14e30 100644 --- a/src/fsharp/absil/ilmorph.fs +++ b/src/fsharp/absil/ilmorph.fs @@ -49,23 +49,23 @@ let code_instr2instr_ty2ty (finstr,fty) (c:ILCode) = // Standard morphisms - mapping types etc. // -------------------------------------------------------------------- -let rec ty_tref2tref f x = +let rec morphILTypeRefsInILType f x = match x with - | ILType.Ptr t -> ILType.Ptr (ty_tref2tref f t) + | ILType.Ptr t -> ILType.Ptr (morphILTypeRefsInILType f t) | ILType.FunctionPointer x -> ILType.FunctionPointer { x with - ArgTypes=List.map (ty_tref2tref f) x.ArgTypes - ReturnType=ty_tref2tref f x.ReturnType} - | ILType.Byref t -> ILType.Byref (ty_tref2tref f t) + ArgTypes=List.map (morphILTypeRefsInILType f) x.ArgTypes + ReturnType=morphILTypeRefsInILType f x.ReturnType} + | ILType.Byref t -> ILType.Byref (morphILTypeRefsInILType f t) | ILType.Boxed cr -> mkILBoxedType (tspec_tref2tref f cr) | ILType.Value ir -> ILType.Value (tspec_tref2tref f ir) - | ILType.Array (s,ty) -> ILType.Array (s,ty_tref2tref f ty) + | ILType.Array (s,ty) -> ILType.Array (s,morphILTypeRefsInILType f ty) | ILType.TypeVar v -> ILType.TypeVar v - | ILType.Modified (req,tref,ty) -> ILType.Modified (req, f tref, ty_tref2tref f ty) + | ILType.Modified (req,tref,ty) -> ILType.Modified (req, f tref, morphILTypeRefsInILType f ty) | ILType.Void -> ILType.Void and tspec_tref2tref f (x:ILTypeSpec) = - mkILTySpec(f x.TypeRef, List.map (ty_tref2tref f) x.GenericArgs) + mkILTySpec(f x.TypeRef, List.map (morphILTypeRefsInILType f) x.GenericArgs) let rec ty_scoref2scoref_tyvar2ty (_fscope,ftyvar as fs)x = match x with @@ -148,7 +148,7 @@ let cattr_ty2ty f (c: ILAttribute) = let cattrs_ty2ty f (cs: ILAttributes) = - mkILCustomAttrs (List.map (cattr_ty2ty f) cs.AsList) + mkILCustomAttrs (List.map (cattr_ty2ty f) (cs.AsList())) let fdef_ty2ty ftye (fd: ILFieldDef) = fd.With(fieldType=ftye fd.FieldType, @@ -156,6 +156,7 @@ let fdef_ty2ty ftye (fd: ILFieldDef) = let local_ty2ty f (l: ILLocal) = {l with Type = f l.Type} let varargs_ty2ty f (varargs: ILVarArgs) = Option.map (List.map f) varargs + (* REVIEW: convert varargs *) let morphILTypesInILInstr ((factualty,fformalty)) i = let factualty = factualty (Some i) @@ -197,13 +198,14 @@ let morphILTypesInILInstr ((factualty,fformalty)) i = | x -> x let return_ty2ty f (r:ILReturn) = {r with Type=f r.Type; CustomAttrsStored= storeILCustomAttrs (cattrs_ty2ty f r.CustomAttrs)} + let param_ty2ty f (p: ILParameter) = {p with Type=f p.Type; CustomAttrsStored= storeILCustomAttrs (cattrs_ty2ty f p.CustomAttrs)} -let morphILMethodDefs f (m:ILMethodDefs) = mkILMethods (List.map f m.AsList) -let fdefs_fdef2fdef f (m:ILFieldDefs) = mkILFields (List.map f m.AsList) +let morphILMethodDefs f (m:ILMethodDefs) = mkILMethods (List.map f (m.AsList())) -(* use this when the conversion produces just one tye... *) -let morphILTypeDefs f (m: ILTypeDefs) = mkILTypeDefsFromArray (Array.map f m.AsArray) +let fdefs_fdef2fdef f (m:ILFieldDefs) = mkILFields (List.map f (m.AsList())) + +let morphILTypeDefs f (m: ILTypeDefs) = mkILTypeDefsFromArray (Array.map f (m.AsArray())) let locals_ty2ty f ls = List.map (local_ty2ty f) ls @@ -254,10 +256,14 @@ let pdef_ty2ty f (p: ILPropertyDef) = args = List.map f p.Args, customAttrs = cattrs_ty2ty f p.CustomAttrs) -let pdefs_ty2ty f (pdefs: ILPropertyDefs) = mkILProperties (List.map (pdef_ty2ty f) pdefs.AsList) -let edefs_ty2ty f (edefs: ILEventDefs) = mkILEvents (List.map (edef_ty2ty f) edefs.AsList) +let pdefs_ty2ty f (pdefs: ILPropertyDefs) = + mkILProperties (pdefs.AsList() |> List.map (pdef_ty2ty f)) + +let edefs_ty2ty f (edefs: ILEventDefs) = + mkILEvents (edefs.AsList() |> List.map (edef_ty2ty f)) -let mimpls_ty2ty f (mimpls : ILMethodImplDefs) = mkILMethodImpls (List.map (mimpl_ty2ty f) mimpls.AsList) +let mimpls_ty2ty f (mimpls : ILMethodImplDefs) = + mkILMethodImpls (mimpls.AsList() |> List.map (mimpl_ty2ty f)) let rec tdef_ty2ty_ilmbody2ilmbody_mdefs2mdefs enc fs (td: ILTypeDef) = let ftye,fmdefs = fs @@ -311,7 +317,7 @@ let morphILTypeInILModule ftye y = morphILInstrsAndILTypesInILModule (finstr,ftye) y let morphILTypeRefsInILModuleMemoized f modul = - let fty = Tables.memoize (ty_tref2tref f) + let fty = Tables.memoize (morphILTypeRefsInILType f) morphILTypeInILModule (fun _ _ _ ty -> fty ty) modul let morphILScopeRefsInILModuleMemoized f modul = diff --git a/src/fsharp/absil/ilmorph.fsi b/src/fsharp/absil/ilmorph.fsi index 70cb7808f2..aacdc34a5d 100644 --- a/src/fsharp/absil/ilmorph.fsi +++ b/src/fsharp/absil/ilmorph.fsi @@ -13,6 +13,9 @@ open FSharp.Compiler.AbstractIL.IL /// Morph each scope reference inside a type signature. val morphILScopeRefsInILTypeRef: (ILScopeRef -> ILScopeRef) -> ILTypeRef -> ILTypeRef +/// Morph each ILTypeRef inside an ILType +val morphILTypeRefsInILType: (ILTypeRef -> ILTypeRef) -> ILType -> ILType + /// Morph all type references throughout an entire module. val morphILTypeRefsInILModuleMemoized: (ILTypeRef -> ILTypeRef) -> ILModuleDef -> ILModuleDef diff --git a/src/fsharp/absil/ilprint.fs b/src/fsharp/absil/ilprint.fs index 0a1a58c753..7dd61ab7d1 100644 --- a/src/fsharp/absil/ilprint.fs +++ b/src/fsharp/absil/ilprint.fs @@ -304,7 +304,8 @@ and goutput_permission _env os p = output_bytes os b output_string os ")" -and goutput_security_decls env os (ps: ILSecurityDecls) = output_seq " " (goutput_permission env) os ps.AsList +and goutput_security_decls env os (ps: ILSecurityDecls) = + output_seq " " (goutput_permission env) os (ps.AsList()) and goutput_gparam env os (gf: ILGenericParameterDef) = output_string os (tyvar_generator gf.Name) @@ -503,7 +504,7 @@ let goutput_custom_attr env os (attr: ILAttribute) = output_custom_attr_data os data let goutput_custom_attrs env os (attrs : ILAttributes) = - Array.iter (fun attr -> goutput_custom_attr env os attr; output_string os "\n" ) attrs.AsArray + Array.iter (fun attr -> goutput_custom_attr env os attr; output_string os "\n" ) (attrs.AsArray()) let goutput_fdef _tref env os (fd: ILFieldDef) = output_string os " .field " @@ -915,13 +916,13 @@ let splitTypeLayout = function | ILTypeDefLayout.Explicit info -> "explicit", (fun os () -> output_type_layout_info os info) let goutput_fdefs tref env os (fdefs: ILFieldDefs) = - List.iter (fun f -> (goutput_fdef tref env) os f; output_string os "\n" ) fdefs.AsList + List.iter (fun f -> (goutput_fdef tref env) os f; output_string os "\n" ) (fdefs.AsList()) let goutput_mdefs env os (mdefs: ILMethodDefs) = - Array.iter (fun f -> (goutput_mdef env) os f; output_string os "\n" ) mdefs.AsArray + Array.iter (fun f -> (goutput_mdef env) os f; output_string os "\n" ) (mdefs.AsArray()) let goutput_pdefs env os (pdefs: ILPropertyDefs) = - List.iter (fun f -> (goutput_pdef env) os f; output_string os "\n" ) pdefs.AsList + List.iter (fun f -> (goutput_pdef env) os f; output_string os "\n" ) (pdefs.AsList()) let rec goutput_tdef enc env contents os (cd: ILTypeDef) = let env = ppenv_enter_tdef cd.GenericParams env @@ -980,8 +981,9 @@ and goutput_lambdas env os lambdas = (goutput_lambdas env) os l | Lambdas_return typ -> output_string os "--> "; (goutput_typ env) os typ -and goutput_tdefs contents enc env os (td: ILTypeDefs) = - List.iter (goutput_tdef enc env contents os) td.AsList +and goutput_tdefs contents enc env os (tds: ILTypeDefs) = + for td in tds.AsList() do + goutput_tdef enc env contents os td let output_ver os (version: ILVersionInfo) = output_string os " .ver " @@ -1044,11 +1046,11 @@ let goutput_resource env os r = let goutput_manifest env os m = output_string os " .assembly " match m.AssemblyLongevity with - | ILAssemblyLongevity.Unspecified -> () - | ILAssemblyLongevity.Library -> output_string os "library " - | ILAssemblyLongevity.PlatformAppDomain -> output_string os "platformappdomain " - | ILAssemblyLongevity.PlatformProcess -> output_string os "platformprocess " - | ILAssemblyLongevity.PlatformSystem -> output_string os "platformmachine " + | ILAssemblyLongevity.Unspecified -> () + | ILAssemblyLongevity.Library -> output_string os "library " + | ILAssemblyLongevity.PlatformAppDomain -> output_string os "platformappdomain " + | ILAssemblyLongevity.PlatformProcess -> output_string os "platformprocess " + | ILAssemblyLongevity.PlatformSystem -> output_string os "platformmachine " output_sqstring os m.Name output_string os " { \n" output_string os ".hash algorithm "; output_i32 os m.AuxModuleHashAlgorithm; output_string os "\n" @@ -1059,47 +1061,28 @@ let goutput_manifest env os m = output_string os " } \n" -let output_module_fragment_aux _refs os (ilg: ILGlobals) modul = - try +let output_module_fragment_aux os (ilg: ILGlobals) modul = let env = mk_ppenv ilg let env = ppenv_enter_modul env goutput_tdefs false [] env os modul.TypeDefs goutput_tdefs true [] env os modul.TypeDefs - with e -> - output_string os "*** Error during printing : "; output_string os (e.ToString()); os.Flush() - reraise() - -let output_module_fragment os (ilg: ILGlobals) modul = - let refs = computeILRefs ilg modul - output_module_fragment_aux refs os ilg modul - refs - -let output_module_refs os refs = - List.iter (fun x -> output_assemblyRef os x; output_string os "\n") refs.AssemblyReferences - List.iter (fun x -> output_modref os x; output_string os "\n") refs.ModuleReferences let goutput_module_manifest env os modul = - output_string os " .module "; output_sqstring os modul.Name - goutput_custom_attrs env os modul.CustomAttrs - output_string os " .imagebase "; output_i32 os modul.ImageBase - output_string os " .file alignment "; output_i32 os modul.PhysicalAlignment - output_string os " .subsystem "; output_i32 os modul.SubSystemFlags - output_string os " .corflags "; output_i32 os ((if modul.IsILOnly then 0x0001 else 0) ||| (if modul.Is32Bit then 0x0002 else 0) ||| (if modul.Is32BitPreferred then 0x00020003 else 0)) - List.iter (fun r -> goutput_resource env os r) modul.Resources.AsList - output_string os "\n" - output_option (goutput_manifest env) os modul.Manifest + output_string os " .module "; output_sqstring os modul.Name + goutput_custom_attrs env os modul.CustomAttrs + output_string os " .imagebase "; output_i32 os modul.ImageBase + output_string os " .file alignment "; output_i32 os modul.PhysicalAlignment + output_string os " .subsystem "; output_i32 os modul.SubSystemFlags + output_string os " .corflags "; output_i32 os ((if modul.IsILOnly then 0x0001 else 0) ||| (if modul.Is32Bit then 0x0002 else 0) ||| (if modul.Is32BitPreferred then 0x00020003 else 0)) + List.iter (fun r -> goutput_resource env os r) (modul.Resources.AsList()) + output_string os "\n" + output_option (goutput_manifest env) os modul.Manifest let output_module os (ilg: ILGlobals) modul = - try - let refs = computeILRefs ilg modul let env = mk_ppenv ilg let env = ppenv_enter_modul env - output_module_refs os refs goutput_module_manifest env os modul - output_module_fragment_aux refs os ilg modul - with e -> - output_string os "*** Error during printing : "; output_string os (e.ToString()); os.Flush() - raise e + output_module_fragment_aux os ilg modul #endif diff --git a/src/fsharp/absil/ilreflect.fs b/src/fsharp/absil/ilreflect.fs index 2eff2b6d4e..3ee2037090 100644 --- a/src/fsharp/absil/ilreflect.fs +++ b/src/fsharp/absil/ilreflect.fs @@ -1,7 +1,7 @@ // Copyright (c) Microsoft Corporation. All Rights Reserved. See License.txt in the project root for license information. /// Write Abstract IL structures at runtime using Reflection.Emit -module internal FSharp.Compiler.AbstractIL.ILRuntimeWriter +module internal FSharp.Compiler.AbstractIL.ILDynamicAssemblyWriter open System open System.Reflection @@ -359,7 +359,7 @@ let convTypeRefAux (cenv: cenv) (tref: ILTypeRef) = /// The (local) emitter env (state). Some of these fields are effectively global accumulators /// and could be placed as hash tables in the global environment. [] -type emEnv = +type ILDynamicAssemblyEmitEnv = { emTypMap: Zmap emConsMap: Zmap emMethMap: Zmap @@ -1385,8 +1385,11 @@ let convCustomAttr cenv emEnv (cattr: ILAttribute) = let data = getCustomAttrData cattr (methInfo, data) -let emitCustomAttr cenv emEnv add cattr = add (convCustomAttr cenv emEnv cattr) -let emitCustomAttrs cenv emEnv add (cattrs: ILAttributes) = Array.iter (emitCustomAttr cenv emEnv add) cattrs.AsArray +let emitCustomAttr cenv emEnv add cattr = + add (convCustomAttr cenv emEnv cattr) + +let emitCustomAttrs cenv emEnv add (cattrs: ILAttributes) = + cattrs.AsArray() |> Array.iter (emitCustomAttr cenv emEnv add) //---------------------------------------------------------------------------- // buildGenParams @@ -1590,7 +1593,7 @@ let rec buildMethodPass3 cenv tref modB (typB: TypeBuilder) emEnv (mdef: ILMetho (getGenericArgumentsOfType (typB.AsType())) (getGenericArgumentsOfMethod methB)) - if not (Array.isEmpty mdef.Return.CustomAttrs.AsArray) then + if not (Array.isEmpty (mdef.Return.CustomAttrs.AsArray())) then let retB = methB.DefineParameterAndLog (0, ParameterAttributes.Retval, null) emitCustomAttrs cenv emEnv (wrapCustomAttr retB.SetCustomAttribute) mdef.Return.CustomAttrs @@ -1781,7 +1784,7 @@ let rec buildTypeDefPass1 cenv emEnv (modB: ModuleBuilder) rootTypeBuilder nesti // recurse on nested types let nesting = nesting @ [tdef] let buildNestedType emEnv tdef = buildTypeTypeDef cenv emEnv modB typB nesting tdef - let emEnv = List.fold buildNestedType emEnv tdef.NestedTypes.AsList + let emEnv = Array.fold buildNestedType emEnv (tdef.NestedTypes.AsArray()) emEnv and buildTypeTypeDef cenv emEnv modB (typB: TypeBuilder) nesting tdef = @@ -1803,7 +1806,7 @@ let rec buildTypeDefPass1b cenv nesting emEnv (tdef: ILTypeDef) = buildGenParamsPass1b cenv emEnv genArgs tdef.GenericParams let emEnv = envPopTyvars emEnv let nesting = nesting @ [tdef] - List.iter (buildTypeDefPass1b cenv nesting emEnv) tdef.NestedTypes.AsList + List.iter (buildTypeDefPass1b cenv nesting emEnv) (tdef.NestedTypes.AsList()) //---------------------------------------------------------------------------- // buildTypeDefPass2 @@ -1816,13 +1819,13 @@ let rec buildTypeDefPass2 cenv nesting emEnv (tdef: ILTypeDef) = // add interface impls tdef.Implements |> convTypes cenv emEnv |> List.iter (fun implT -> typB.AddInterfaceImplementationAndLog implT) // add methods, properties - let emEnv = Array.fold (buildMethodPass2 cenv tref typB) emEnv tdef.Methods.AsArray - let emEnv = List.fold (buildFieldPass2 cenv tref typB) emEnv tdef.Fields.AsList - let emEnv = List.fold (buildPropertyPass2 cenv tref typB) emEnv tdef.Properties.AsList + let emEnv = Array.fold (buildMethodPass2 cenv tref typB) emEnv (tdef.Methods.AsArray()) + let emEnv = List.fold (buildFieldPass2 cenv tref typB) emEnv (tdef.Fields.AsList()) + let emEnv = List.fold (buildPropertyPass2 cenv tref typB) emEnv (tdef.Properties.AsList()) let emEnv = envPopTyvars emEnv // nested types let nesting = nesting @ [tdef] - let emEnv = List.fold (buildTypeDefPass2 cenv nesting) emEnv tdef.NestedTypes.AsList + let emEnv = List.fold (buildTypeDefPass2 cenv nesting) emEnv (tdef.NestedTypes.AsList()) emEnv //---------------------------------------------------------------------------- @@ -1835,16 +1838,16 @@ let rec buildTypeDefPass3 cenv nesting modB emEnv (tdef: ILTypeDef) = let emEnv = envPushTyvars emEnv (getGenericArgumentsOfType (typB.AsType())) // add method bodies, properties, events tdef.Methods |> Seq.iter (buildMethodPass3 cenv tref modB typB emEnv) - tdef.Properties.AsList |> List.iter (buildPropertyPass3 cenv tref typB emEnv) - tdef.Events.AsList |> List.iter (buildEventPass3 cenv typB emEnv) - tdef.Fields.AsList |> List.iter (buildFieldPass3 cenv tref typB emEnv) - let emEnv = List.fold (buildMethodImplsPass3 cenv tref typB) emEnv tdef.MethodImpls.AsList + tdef.Properties.AsList() |> List.iter (buildPropertyPass3 cenv tref typB emEnv) + tdef.Events.AsList() |> List.iter (buildEventPass3 cenv typB emEnv) + tdef.Fields.AsList() |> List.iter (buildFieldPass3 cenv tref typB emEnv) + let emEnv = List.fold (buildMethodImplsPass3 cenv tref typB) emEnv (tdef.MethodImpls.AsList()) tdef.CustomAttrs |> emitCustomAttrs cenv emEnv typB.SetCustomAttributeAndLog // custom attributes let emEnv = envPopTyvars emEnv // nested types let nesting = nesting @ [tdef] - let emEnv = List.fold (buildTypeDefPass3 cenv nesting modB) emEnv tdef.NestedTypes.AsList + let emEnv = List.fold (buildTypeDefPass3 cenv nesting modB) emEnv (tdef.NestedTypes.AsList()) emEnv //---------------------------------------------------------------------------- @@ -1933,7 +1936,7 @@ let createTypeRef (visited: Dictionary<_, _>, created: Dictionary<_, _>) emEnv t traverseType CollectTypes.All cx if verbose2 then dprintf "buildTypeDefPass4: Doing method constraints of %s\n" tdef.Name - for md in tdef.Methods.AsArray do + for md in tdef.Methods.AsArray() do for gp in md.GenericParams do for cx in gp.Constraints do traverseType CollectTypes.All cx @@ -1947,7 +1950,7 @@ let createTypeRef (visited: Dictionary<_, _>, created: Dictionary<_, _>) emEnv t tdef.Implements |> List.iter (traverseType CollectTypes.All) if verbose2 then dprintf "buildTypeDefPass4: Do value types in fields of %s\n" tdef.Name - tdef.Fields.AsList |> List.iter (fun fd -> traverseType CollectTypes.ValueTypesOnly fd.FieldType) + tdef.Fields.AsList() |> List.iter (fun fd -> traverseType CollectTypes.ValueTypesOnly fd.FieldType) if verbose2 then dprintf "buildTypeDefPass4: Done with dependencies of %s\n" tdef.Name @@ -2025,7 +2028,7 @@ let buildModuleTypePass4 visited emEnv tdef = buildTypeDefPass4 visited [] emEnv //---------------------------------------------------------------------------- let buildModuleFragment cenv emEnv (asmB: AssemblyBuilder) (modB: ModuleBuilder) (m: ILModuleDef) = - let tdefs = m.TypeDefs.AsList + let tdefs = m.TypeDefs.AsList() let emEnv = (emEnv, tdefs) ||> List.fold (buildModuleTypePass1 cenv modB) tdefs |> List.iter (buildModuleTypePass1b cenv emEnv) @@ -2045,7 +2048,7 @@ let buildModuleFragment cenv emEnv (asmB: AssemblyBuilder) (modB: ModuleBuilder) #if FX_RESHAPED_REFEMIT ignore asmB #else - m.Resources.AsList |> List.iter (fun r -> + m.Resources.AsList() |> List.iter (fun r -> let attribs = (match r.Access with ILResourceAccess.Public -> ResourceAttributes.Public | ILResourceAccess.Private -> ResourceAttributes.Private) match r.Location with | ILResourceLocation.Local bytes -> @@ -2097,7 +2100,7 @@ let mkDynamicAssemblyAndModule (assemblyName, optimize, debugInfo: bool, collect let modB = asmB.DefineDynamicModuleAndLog (assemblyName, filename, debugInfo) asmB, modB -let emitModuleFragment (ilg, emitTailcalls, emEnv, asmB: AssemblyBuilder, modB: ModuleBuilder, modul: ILModuleDef, debugInfo: bool, resolveAssemblyRef, tryFindSysILTypeRef) = +let EmitDynamicAssemblyFragment (ilg, emitTailcalls, emEnv, asmB: AssemblyBuilder, modB: ModuleBuilder, modul: ILModuleDef, debugInfo: bool, resolveAssemblyRef, tryFindSysILTypeRef) = let cenv = { ilg = ilg ; emitTailcalls=emitTailcalls; generatePdb = debugInfo; resolveAssemblyRef=resolveAssemblyRef; tryFindSysILTypeRef=tryFindSysILTypeRef } let emEnv = buildModuleFragment cenv emEnv asmB modB modul @@ -2134,7 +2137,3 @@ let emitModuleFragment (ilg, emitTailcalls, emEnv, asmB: AssemblyBuilder, modB: let LookupTypeRef cenv emEnv tref = convCreatedTypeRef cenv emEnv tref let LookupType cenv emEnv ty = convCreatedType cenv emEnv ty -// Lookups of ILFieldRef and MethodRef may require a similar non-Builder-fixup post Type-creation. -let LookupFieldRef emEnv fref = Zmap.tryFind fref emEnv.emFieldMap |> Option.map (fun fieldBuilder -> fieldBuilder :> FieldInfo) -let LookupMethodRef emEnv mref = Zmap.tryFind mref emEnv.emMethMap |> Option.map (fun methodBuilder -> methodBuilder :> MethodInfo) - diff --git a/src/fsharp/absil/ilreflect.fsi b/src/fsharp/absil/ilreflect.fsi index 61d9102fc9..4913f85109 100644 --- a/src/fsharp/absil/ilreflect.fsi +++ b/src/fsharp/absil/ilreflect.fsi @@ -1,7 +1,7 @@ // Copyright (c) Microsoft Corporation. All Rights Reserved. See License.txt in the project root for license information. /// Write Abstract IL structures at runtime using Reflection.Emit -module internal FSharp.Compiler.AbstractIL.ILRuntimeWriter +module internal FSharp.Compiler.AbstractIL.ILDynamicAssemblyWriter open System.Reflection open System.Reflection.Emit @@ -17,26 +17,23 @@ type cenv = generatePdb: bool resolveAssemblyRef: ILAssemblyRef -> Choice option } -type emEnv +type ILDynamicAssemblyEmitEnv -val emEnv0: emEnv +val emEnv0: ILDynamicAssemblyEmitEnv -val emitModuleFragment: +val EmitDynamicAssemblyFragment: ilg: ILGlobals * emitTailcalls: bool * - emEnv: emEnv * + emEnv: ILDynamicAssemblyEmitEnv * asmB: AssemblyBuilder * modB: ModuleBuilder * modul: ILModuleDef * debugInfo: bool * resolveAssemblyRef: (ILAssemblyRef -> Choice option) * tryFindSysILTypeRef: (string -> ILTypeRef option) -> - emEnv * (unit -> exn option) list + ILDynamicAssemblyEmitEnv * (unit -> exn option) list -val LookupTypeRef: cenv: cenv -> emEnv: emEnv -> tref: ILTypeRef -> System.Type +val LookupTypeRef: cenv: cenv -> emEnv: ILDynamicAssemblyEmitEnv -> tref: ILTypeRef -> System.Type -val LookupType: cenv: cenv -> emEnv: emEnv -> ty: ILType -> System.Type +val LookupType: cenv: cenv -> emEnv: ILDynamicAssemblyEmitEnv -> ty: ILType -> System.Type -val LookupFieldRef: emEnv: emEnv -> fref: ILFieldRef -> FieldInfo option - -val LookupMethodRef: emEnv: emEnv -> mref: ILMethodRef -> MethodInfo option diff --git a/src/fsharp/absil/ilwrite.fs b/src/fsharp/absil/ilwrite.fs index 95435d6ab0..a5c58fd723 100644 --- a/src/fsharp/absil/ilwrite.fs +++ b/src/fsharp/absil/ilwrite.fs @@ -618,7 +618,7 @@ let peOptionalHeaderByteByCLRVersion v = if compareILVersions v (parseILVersion "2.0.0.0") >= 0 then 8 else 6 -// returned by writeBinaryAndReportMappings +// returned by writeBinary [] type ILTokenMappings = { TypeDefTokenMap: ILTypeDef list * ILTypeDef -> int32 @@ -665,7 +665,7 @@ let GetTypeNameAsElemPair cenv n = let rec GenTypeDefPass1 enc cenv (td: ILTypeDef) = ignore (cenv.typeDefs.AddUniqueEntry "type index" (fun (TdKey (_, n)) -> n) (TdKey (enc, td.Name))) - GenTypeDefsPass1 (enc@[td.Name]) cenv td.NestedTypes.AsList + GenTypeDefsPass1 (enc@[td.Name]) cenv (td.NestedTypes.AsList()) and GenTypeDefsPass1 enc cenv tds = List.iter (GenTypeDefPass1 enc cenv) tds @@ -1166,10 +1166,10 @@ and GenTypeDefPass2 pidx enc cenv (td: ILTypeDef) = (UnsharedRow [| SimpleIndex (TableNames.TypeDef, tidx) SimpleIndex (TableNames.TypeDef, pidx) |]) |> ignore - let props = td.Properties.AsList + let props = td.Properties.AsList() if not (isNil props) then AddUnsharedRow cenv TableNames.PropertyMap (GetTypeDefAsPropertyMapRow cenv tidx) |> ignore - let events = td.Events.AsList + let events = td.Events.AsList() if not (isNil events) then AddUnsharedRow cenv TableNames.EventMap (GetTypeDefAsEventMapRow cenv tidx) |> ignore @@ -1179,9 +1179,9 @@ and GenTypeDefPass2 pidx enc cenv (td: ILTypeDef) = td.Implements |> List.iter (GenImplementsPass2 cenv env tidx) props |> List.iter (GenPropertyDefPass2 cenv tidx) events |> List.iter (GenEventDefPass2 cenv tidx) - td.Fields.AsList |> List.iter (GenFieldDefPass2 cenv tidx) + td.Fields.AsList() |> List.iter (GenFieldDefPass2 cenv tidx) td.Methods |> Seq.iter (GenMethodDefPass2 cenv tidx) - td.NestedTypes.AsList |> GenTypeDefsPass2 tidx (enc@[td.Name]) cenv + td.NestedTypes.AsList() |> GenTypeDefsPass2 tidx (enc@[td.Name]) cenv with e -> failwith ("Error in pass2 for type "+td.Name+", error: "+e.Message) @@ -1386,7 +1386,7 @@ and GenCustomAttrPass3Or4 cenv hca attr = AddUnsharedRow cenv TableNames.CustomAttribute (GetCustomAttrRow cenv hca attr) |> ignore and GenCustomAttrsPass3Or4 cenv hca (attrs: ILAttributes) = - attrs.AsArray |> Array.iter (GenCustomAttrPass3Or4 cenv hca) + attrs.AsArray() |> Array.iter (GenCustomAttrPass3Or4 cenv hca) // -------------------------------------------------------------------- // ILSecurityDecl --> DeclSecurity rows @@ -1488,24 +1488,28 @@ type ExceptionClauseSpec = int * int * int * int * ExceptionClauseKind [] let CodeBufferCapacity = 200 +/// Buffer to write results of emitting code into. Also record: +/// - branch sources (where fixups will occur) +/// - possible branch destinations +/// - locations of embedded handles into the string table +/// - the exception table type CodeBuffer = + { + code: ByteBuffer - // -------------------------------------------------------------------- - // Buffer to write results of emitting code into. Also record: - // - branch sources (where fixups will occur) - // - possible branch destinations - // - locations of embedded handles into the string table - // - the exception table - // -------------------------------------------------------------------- - { code: ByteBuffer /// (instruction; optional short form); start of instr in code buffer; code loc for the end of the instruction the fixup resides in ; where is the destination of the fixup mutable reqdBrFixups: ((int * int option) * int * ILCodeLabel list) list + availBrFixups: Dictionary + /// code loc to fixup in code buffer mutable reqdStringFixupsInMethod: (int * int) list + /// data for exception handling clauses mutable seh: ExceptionClauseSpec list - seqpoints: ResizeArray } + + seqpoints: ResizeArray + } interface IDisposable with member this.Dispose() = @@ -1535,8 +1539,11 @@ type CodeBuffer = EndColumn=m.EndColumn } member codebuf.EmitByte x = codebuf.code.EmitIntAsByte x + member codebuf.EmitUInt16 x = codebuf.code.EmitUInt16 x + member codebuf.EmitInt32 x = codebuf.code.EmitInt32 x + member codebuf.EmitInt64 x = codebuf.code.EmitInt64 x member codebuf.EmitUncodedToken u = codebuf.EmitInt32 u @@ -1556,17 +1563,16 @@ type CodeBuffer = List.iter (fun _ -> codebuf.EmitInt32 0xdeadbbbb) tgs member codebuf.RecordReqdBrFixup i tg = codebuf.RecordReqdBrFixups i [tg] + member codebuf.RecordAvailBrFixup tg = codebuf.availBrFixups.[tg] <- codebuf.code.Position +/// Applying branch fixups. Use short versions of instructions +/// wherever possible. Sadly we can only determine if we can use a short +/// version after we've layed out the code for all other instructions. +/// This in turn means that using a short version may change +/// the various offsets into the code. module Codebuf = - // -------------------------------------------------------------------- - // Applying branch fixups. Use short versions of instructions - // wherever possible. Sadly we can only determine if we can use a short - // version after we've layed out the code for all other instructions. - // This in turn means that using a short version may change - // the various offsets into the code. - // -------------------------------------------------------------------- let binaryChop p (arr: 'T[]) = let rec go n m = @@ -1726,7 +1732,6 @@ module Codebuf = newCode, newReqdStringFixups, newExnClauses, newSeqPoints, newScopes - // -------------------------------------------------------------------- // Structured residue of emitting instructions: SEH exception handling // and scopes for local variables. @@ -1738,7 +1743,6 @@ module Codebuf = type SEHTree = | Node of ExceptionClauseSpec option * SEHTree list - // -------------------------------------------------------------------- // Table of encodings for instructions without arguments, also indexes // for all instructions. @@ -1800,9 +1804,6 @@ module Codebuf = let emitTailness (cenv: cenv) codebuf tl = if tl = Tailcall && cenv.emitTailcalls then emitInstrCode codebuf i_tail - //let emitAfterTailcall codebuf tl = - // if tl = Tailcall then emitInstrCode codebuf i_ret - let emitVolatility codebuf tl = if tl = Volatile then emitInstrCode codebuf i_volatile @@ -2481,7 +2482,7 @@ let GenReturnAsParamRow (returnv : ILReturn) = StringE 0 |] let GenReturnPass3 cenv (returnv: ILReturn) = - if Option.isSome returnv.Marshal || not (Array.isEmpty returnv.CustomAttrs.AsArray) then + if Option.isSome returnv.Marshal || not (Array.isEmpty (returnv.CustomAttrs.AsArray())) then let pidx = AddUnsharedRow cenv TableNames.Param (GenReturnAsParamRow returnv) GenCustomAttrsPass3Or4 cenv (hca_ParamDef, pidx) returnv.CustomAttrs match returnv.Marshal with @@ -2587,7 +2588,7 @@ let GenMethodDefPass3 cenv env (md: ILMethodDef) = GenReturnPass3 cenv md.Return md.Parameters |> List.iteri (fun n param -> GenParamPass3 cenv env (n+1) param) md.CustomAttrs |> GenCustomAttrsPass3Or4 cenv (hca_MethodDef, midx) - md.SecurityDecls.AsList |> GenSecurityDeclsPass3 cenv (hds_MethodDef, midx) + md.SecurityDecls.AsList() |> GenSecurityDeclsPass3 cenv (hds_MethodDef, midx) md.GenericParams |> List.iteri (fun n gp -> GenGenericParamPass3 cenv env n (tomd_MethodDef, midx) gp) match md.Body with | MethodBody.PInvoke attrLazy -> @@ -2741,11 +2742,11 @@ let rec GenTypeDefPass3 enc cenv (td: ILTypeDef) = try let env = envForTypeDef td let tidx = GetIdxForTypeDef cenv (TdKey(enc, td.Name)) - td.Properties.AsList |> List.iter (GenPropertyPass3 cenv env) - td.Events.AsList |> List.iter (GenEventPass3 cenv env) - td.Fields.AsList |> List.iter (GenFieldDefPass3 cenv env) + td.Properties.AsList() |> List.iter (GenPropertyPass3 cenv env) + td.Events.AsList() |> List.iter (GenEventPass3 cenv env) + td.Fields.AsList() |> List.iter (GenFieldDefPass3 cenv env) td.Methods |> Seq.iter (GenMethodDefPass3 cenv env) - td.MethodImpls.AsList |> List.iter (GenMethodImplPass3 cenv env td.GenericParams.Length tidx) + td.MethodImpls.AsList() |> List.iter (GenMethodImplPass3 cenv env td.GenericParams.Length tidx) // ClassLayout entry if needed match td.Layout with | ILTypeDefLayout.Auto -> () @@ -2757,10 +2758,10 @@ let rec GenTypeDefPass3 enc cenv (td: ILTypeDef) = ULong (defaultArg layout.Size 0x0) SimpleIndex (TableNames.TypeDef, tidx) |]) |> ignore - td.SecurityDecls.AsList |> GenSecurityDeclsPass3 cenv (hds_TypeDef, tidx) + td.SecurityDecls.AsList() |> GenSecurityDeclsPass3 cenv (hds_TypeDef, tidx) td.CustomAttrs |> GenCustomAttrsPass3Or4 cenv (hca_TypeDef, tidx) td.GenericParams |> List.iteri (fun n gp -> GenGenericParamPass3 cenv env n (tomd_TypeDef, tidx) gp) - td.NestedTypes.AsList |> GenTypeDefsPass3 (enc@[td.Name]) cenv + td.NestedTypes.AsList() |> GenTypeDefsPass3 (enc@[td.Name]) cenv with e -> failwith ("Error in pass3 for type "+td.Name+", error: "+e.Message) reraise() @@ -2778,7 +2779,7 @@ let rec GenTypeDefPass4 enc cenv (td: ILTypeDef) = let tidx = GetIdxForTypeDef cenv (TdKey(enc, td.Name)) td.Methods |> Seq.iter (GenMethodDefPass4 cenv env) List.iteri (fun n gp -> GenGenericParamPass4 cenv env n (tomd_TypeDef, tidx) gp) td.GenericParams - GenTypeDefsPass4 (enc@[td.Name]) cenv td.NestedTypes.AsList + GenTypeDefsPass4 (enc@[td.Name]) cenv (td.NestedTypes.AsList()) with e -> failwith ("Error in pass4 for type "+td.Name+", error: "+e.Message) reraise() @@ -2787,7 +2788,6 @@ let rec GenTypeDefPass4 enc cenv (td: ILTypeDef) = and GenTypeDefsPass4 enc cenv tds = List.iter (GenTypeDefPass4 enc cenv) tds - let timestamp = absilWriteGetTimeStamp () // -------------------------------------------------------------------- @@ -2808,7 +2808,7 @@ let rec GenNestedExportedTypePass3 cenv cidx (ce: ILNestedExportedType) = GenNestedExportedTypesPass3 cenv nidx ce.Nested and GenNestedExportedTypesPass3 cenv nidx (nce: ILNestedExportedTypes) = - nce.AsList |> List.iter (GenNestedExportedTypePass3 cenv nidx) + nce.AsList() |> List.iter (GenNestedExportedTypePass3 cenv nidx) and GenExportedTypePass3 cenv (ce: ILExportedTypeOrForwarder) = let nselem, nelem = GetTypeNameAsElemPair cenv ce.Name @@ -2826,7 +2826,7 @@ and GenExportedTypePass3 cenv (ce: ILExportedTypeOrForwarder) = GenNestedExportedTypesPass3 cenv cidx ce.Nested and GenExportedTypesPass3 cenv (ce: ILExportedTypesAndForwarders) = - List.iter (GenExportedTypePass3 cenv) ce.AsList + List.iter (GenExportedTypePass3 cenv) (ce.AsList()) // -------------------------------------------------------------------- // manifest --> generate Assembly row @@ -2858,7 +2858,7 @@ and GetManifestAsAssemblyRow cenv m = and GenManifestPass3 cenv m = let aidx = AddUnsharedRow cenv TableNames.Assembly (GetManifestAsAssemblyRow cenv m) - GenSecurityDeclsPass3 cenv (hds_Assembly, aidx) m.SecurityDecls.AsList + GenSecurityDeclsPass3 cenv (hds_Assembly, aidx) (m.SecurityDecls.AsList()) GenCustomAttrsPass3Or4 cenv (hca_Assembly, aidx) m.CustomAttrs GenExportedTypesPass3 cenv m.ExportedTypes // Record the entrypoint decl if needed. @@ -2911,7 +2911,7 @@ let SortTableRows tab (rows: GenericRow[]) = let GenModule (cenv : cenv) (modul: ILModuleDef) = let midx = AddUnsharedRow cenv TableNames.Module (GetModuleAsRow cenv modul) - List.iter (GenResourcePass3 cenv) modul.Resources.AsList + List.iter (GenResourcePass3 cenv) (modul.Resources.AsList()) let tds = destTypeDefsWithGlobalFunctionsFirst cenv.ilg modul.TypeDefs reportTime cenv.showTimes "Module Generation Preparation" GenTypeDefsPass1 [] cenv tds @@ -3542,53 +3542,128 @@ let writeDirectory os dict = let writeBytes (os: BinaryWriter) (chunk: byte[]) = os.Write(chunk, 0, chunk.Length) -let rec writeBinaryAndReportMappings (outfile, - ilg: ILGlobals, pdbfile: string option, signer: ILStrongNameSigner option, portablePDB, embeddedPDB, - embedAllSource, embedSourceList, sourceLink, checksumAlgorithm, emitTailcalls, deterministic, showTimes, dumpDebugInfo, pathMap) - modul normalizeAssemblyRefs = +let writePdb ( + dumpDebugInfo, + showTimes, + portablePDB, + embeddedPDB, + pdbfile, + outfile, + reopenOutput, + writePdbInMemory, + signer: ILStrongNameSigner option, + deterministic, + pathMap, + pdbData, + pdbInfoOpt, + debugDirectoryChunk, + debugDataChunk, + debugChecksumPdbChunk, + debugEmbeddedPdbChunk, + debugDeterministicPdbChunk, + textV2P) = - let stream = - try - // Ensure the output directory exists otherwise it will fail - let dir = FileSystem.GetDirectoryNameShim outfile - if not (FileSystem.DirectoryExistsShim dir) then FileSystem.DirectoryCreateShim dir |> ignore - FileSystem.OpenFileForWriteShim(outfile, FileMode.Create, FileAccess.Write, FileShare.Read) - with _ -> - failwith ("Could not open file for writing (binary mode): " + outfile) + if dumpDebugInfo then logDebugInfo outfile pdbData - let pdbData, pdbOpt, debugDirectoryChunk, debugDataChunk, debugChecksumPdbChunk, debugEmbeddedPdbChunk, debugDeterministicPdbChunk, textV2P, mappings = - try - let res = writeBinaryAndReportMappingsAux(stream, false, ilg, pdbfile, signer, portablePDB, embeddedPDB, embedAllSource, embedSourceList, sourceLink, - checksumAlgorithm, emitTailcalls, deterministic, showTimes, pathMap) modul normalizeAssemblyRefs + // Used to capture the pdb file bytes in the case we're generating in-memory + let mutable pdbBytes = None - try - FileSystemUtilities.setExecutablePermission outfile - with _ -> - () + // Now we've done the bulk of the binary, do the PDB file and fixup the binary. + match pdbfile with + | None -> () +#if ENABLE_MONO_SUPPORT + | Some fmdb when runningOnMono && not portablePDB -> + writeMdbInfo fmdb outfile pdbData +#endif + | Some pdbfile -> + let idd = + match pdbInfoOpt with + | Some (originalLength, contentId, stream: MemoryStream, algorithmName, checkSum) -> + if embeddedPDB then + getInfoForEmbeddedPortablePdb originalLength contentId stream pdbfile debugDataChunk debugEmbeddedPdbChunk debugDeterministicPdbChunk debugChecksumPdbChunk algorithmName checkSum deterministic + else + if writePdbInMemory then + let ms = new MemoryStream() + stream.WriteTo ms + ms.Close() + pdbBytes <- Some (ms.ToArray()) + else + try FileSystem.FileDeleteShim pdbfile with _ -> () + use fs = FileSystem.OpenFileForWriteShim(pdbfile, fileMode = FileMode.Create, fileAccess = FileAccess.ReadWrite) + stream.WriteTo fs + getInfoForPortablePdb contentId pdbfile pathMap debugDataChunk debugDeterministicPdbChunk debugChecksumPdbChunk algorithmName checkSum embeddedPDB deterministic + | None -> +#if FX_NO_PDB_WRITER + [| |] +#else + writePdbInfo showTimes outfile pdbfile pdbData debugDataChunk +#endif + reportTime showTimes "Generate PDB Info" - res - with - | _ -> - try FileSystem.FileDeleteShim outfile with | _ -> () + // Now we have the debug data we can go back and fill in the debug directory in the image + use fs2 = reopenOutput() + let os2 = new BinaryWriter(fs2) + try + // write the IMAGE_DEBUG_DIRECTORY + os2.BaseStream.Seek (int64 (textV2P debugDirectoryChunk.addr), SeekOrigin.Begin) |> ignore + for i in idd do + writeInt32 os2 i.iddCharacteristics // IMAGE_DEBUG_DIRECTORY.Characteristics + writeInt32 os2 i.iddTimestamp + writeInt32AsUInt16 os2 i.iddMajorVersion + writeInt32AsUInt16 os2 i.iddMinorVersion + writeInt32 os2 i.iddType + writeInt32 os2 i.iddData.Length // IMAGE_DEBUG_DIRECTORY.SizeOfData + writeInt32 os2 i.iddChunk.addr // IMAGE_DEBUG_DIRECTORY.AddressOfRawData + writeInt32 os2 (textV2P i.iddChunk.addr) // IMAGE_DEBUG_DIRECTORY.PointerToRawData + + // Write the Debug Data + for i in idd do + if i.iddChunk.size <> 0 then + // write the debug raw data as given us by the PDB writer + os2.BaseStream.Seek (int64 (textV2P i.iddChunk.addr), SeekOrigin.Begin) |> ignore + if i.iddChunk.size < i.iddData.Length then failwith "Debug data area is not big enough. Debug info may not be usable" + writeBytes os2 i.iddData + os2.Dispose() + with e -> + failwith ("Error while writing debug directory entry: "+e.Message) + (try os2.Dispose(); FileSystem.FileDeleteShim outfile with _ -> ()) reraise() - writePdb - (dumpDebugInfo, showTimes, portablePDB, embeddedPDB, pdbfile, outfile, signer, deterministic, pathMap) - (pdbData, pdbOpt, debugDirectoryChunk, debugDataChunk, debugChecksumPdbChunk, debugEmbeddedPdbChunk, debugDeterministicPdbChunk, textV2P, mappings) + reportTime showTimes "Finalize PDB" -and writeBinaryWithNoPdb (stream: Stream, - ilg: ILGlobals, signer: ILStrongNameSigner option, portablePDB, embeddedPDB, - embedAllSource, embedSourceList, sourceLink, checksumAlgorithm, emitTailcalls, deterministic, showTimes, pathMap) - modul normalizeAssemblyRefs = + // Sign the binary. No further changes to binary allowed past this point! + match signer with + | None -> () + | Some s -> + try + s.SignFile outfile + s.Close() + with e -> + failwith ("Warning: A call to SignFile failed ("+e.Message+")") + (try s.Close() with _ -> ()) + (try FileSystem.FileDeleteShim outfile with _ -> ()) + () - writeBinaryAndReportMappingsAux(stream, true, ilg, None, signer, portablePDB, embeddedPDB, embedAllSource, embedSourceList, sourceLink, - checksumAlgorithm, emitTailcalls, deterministic, showTimes, pathMap) modul normalizeAssemblyRefs - |> ignore + reportTime showTimes "Signing Image" + pdbBytes + +let writeBinaryAux ( + stream: Stream, + ilg: ILGlobals, + pdbfile: string option, + signer: ILStrongNameSigner option, + portablePDB, + embeddedPDB, + embedAllSource, + embedSourceList, + sourceLink, + checksumAlgorithm, + emitTailcalls, + deterministic, + showTimes, + pathMap, modul, + normalizeAssemblyRefs) = -and writeBinaryAndReportMappingsAux (stream: Stream, leaveStreamOpen: bool, - ilg: ILGlobals, pdbfile: string option, signer: ILStrongNameSigner option, portablePDB, embeddedPDB, - embedAllSource, embedSourceList, sourceLink, checksumAlgorithm, emitTailcalls, deterministic, showTimes, pathMap) - modul normalizeAssemblyRefs = // Store the public key from the signer into the manifest. This means it will be written // to the binary and also acts as an indicator to leave space for delay sign @@ -3619,18 +3694,16 @@ and writeBinaryAndReportMappingsAux (stream: Stream, leaveStreamOpen: bool, with e -> failwith ("A call to StrongNameGetPublicKey failed ("+e.Message+")") None - begin match modul.Manifest with + match modul.Manifest with | None -> () | Some m -> if m.PublicKey <> None && m.PublicKey <> pubkey then dprintn "Warning: The output assembly is being signed or delay-signed with a strong name that is different to the original." - end { modul with Manifest = match modul.Manifest with None -> None | Some m -> Some {m with PublicKey = pubkey} } - let os = new BinaryWriter(stream, System.Text.Encoding.UTF8, leaveOpen=leaveStreamOpen) + let pdbData, pdbInfoOpt, debugDirectoryChunk, debugDataChunk, debugChecksumPdbChunk, debugEmbeddedPdbChunk, debugDeterministicPdbChunk, textV2P, mappings = - let pdbData, pdbOpt, debugDirectoryChunk, debugDataChunk, debugChecksumPdbChunk, debugEmbeddedPdbChunk, debugDeterministicPdbChunk, textV2P, mappings = - try + let os = new BinaryWriter(stream, System.Text.Encoding.UTF8) let imageBaseReal = modul.ImageBase // FIXED CHOICE let alignVirt = modul.VirtualAlignment // FIXED CHOICE @@ -3640,7 +3713,6 @@ and writeBinaryAndReportMappingsAux (stream: Stream, leaveStreamOpen: bool, let numSections = 3 // .text, .sdata, .reloc - // HEADERS let next = 0x0 let headerSectionPhysLoc = 0x0 @@ -3732,16 +3804,18 @@ and writeBinaryAndReportMappingsAux (stream: Stream, leaveStreamOpen: bool, let entrypointCodeChunk, next = chunk 0x06 next let globalpointerCodeChunk, next = chunk (if isItanium then 0x8 else 0x0) next - let pdbOpt = - match portablePDB with - | true -> - let uncompressedLength, contentId, stream, algorithmName, checkSum as pdbStream = + let pdbInfoOpt = + match pdbfile, portablePDB with + | Some _, true -> + let pdbInfo = generatePortablePdb embedAllSource embedSourceList sourceLink checksumAlgorithm showTimes pdbData pathMap if embeddedPDB then - let uncompressedLength, contentId, stream = compressPortablePdbStream uncompressedLength contentId stream - Some (uncompressedLength, contentId, stream, algorithmName, checkSum) - else Some pdbStream + let (uncompressedLength, contentId, stream, algorithmName, checkSum) = pdbInfo + let compressedStream = compressPortablePdbStream stream + Some (uncompressedLength, contentId, compressedStream, algorithmName, checkSum) + else + Some pdbInfo | _ -> None @@ -3767,7 +3841,7 @@ and writeBinaryAndReportMappingsAux (stream: Stream, leaveStreamOpen: bool, + debugDataJustInCase))) next let debugChecksumPdbChunk, next = - chunk (align 0x4 (match pdbOpt with + chunk (align 0x4 (match pdbInfoOpt with | Some (_, _, _, algorithmName, checkSum) -> let alg = System.Text.Encoding.UTF8.GetBytes(algorithmName) let size = alg.Length + 1 + checkSum.Length @@ -3777,7 +3851,7 @@ and writeBinaryAndReportMappingsAux (stream: Stream, leaveStreamOpen: bool, let debugEmbeddedPdbChunk, next = if embeddedPDB then let streamLength = - match pdbOpt with + match pdbInfoOpt with | Some (_, _, stream, _, _) -> int stream.Length | None -> 0 chunk (align 0x4 (match embeddedPDB with @@ -3790,7 +3864,6 @@ and writeBinaryAndReportMappingsAux (stream: Stream, leaveStreamOpen: bool, if deterministic then emptychunk next else nochunk next - let textSectionSize = next - textSectionAddr let nextPhys = align alignPhys (textSectionPhysLoc + textSectionSize) let textSectionPhysSize = nextPhys - textSectionPhysLoc @@ -3812,10 +3885,8 @@ and writeBinaryAndReportMappingsAux (stream: Stream, leaveStreamOpen: bool, let linkedResource = stream.ReadBytes(start, len) unlinkResource linkedResourceBase linkedResource) - begin - try linkNativeResources unlinkedResources next - with e -> failwith ("Linking a native resource failed: "+e.Message+"") - end + try linkNativeResources unlinkedResources next + with e -> failwith ("Linking a native resource failed: "+e.Message+"") let nativeResourcesSize = nativeResources.Length @@ -3840,8 +3911,7 @@ and writeBinaryAndReportMappingsAux (stream: Stream, leaveStreamOpen: bool, // Now we know where the data section lies we can fix up the // references into the data section from the metadata tables. - begin - requiredDataFixups |> List.iter + requiredDataFixups |> List.iter (fun (metadataOffset32, (dataOffset, kind)) -> let metadataOffset = metadataOffset32 if metadataOffset < 0 || metadataOffset >= metadata.Length - 4 then failwith "data RVA fixup: fixup located outside metadata" @@ -3859,7 +3929,6 @@ and writeBinaryAndReportMappingsAux (stream: Stream, leaveStreamOpen: bool, + ", rawdataChunk.size = "+string rawdataChunk.size) res applyFixup32 metadata metadataOffset dataRva) - end // IMAGE TOTAL SIZE let imageEndSectionPhysLoc = nextPhys @@ -3950,9 +4019,9 @@ and writeBinaryAndReportMappingsAux (stream: Stream, leaveStreamOpen: bool, write (Some peOptionalHeaderChunk.addr) os "pe optional header" [| |] if modul.Is64Bit then - writeInt32AsUInt16 os 0x020B // Magic number is 0x020B for 64-bit + writeInt32AsUInt16 os 0x020B // Magic number is 0x020B for 64-bit else - writeInt32AsUInt16 os 0x010b // Always 0x10B (see Section 23.1). + writeInt32AsUInt16 os 0x010b // Always 0x10B (see Section 23.1). writeInt32AsUInt16 os peOptionalHeaderByte // ECMA spec says 6, some binaries, e.g. fscmanaged.exe say 7, Whidbey binaries say 8 writeInt32 os textSectionPhysSize // Size of the code (text) section, or the sum of all code sections if there are multiple sections. // 000000a0 @@ -3962,10 +4031,10 @@ and writeBinaryAndReportMappingsAux (stream: Stream, leaveStreamOpen: bool, writeInt32 os textSectionAddr // e.g. 0x0002000 // 000000b0 if modul.Is64Bit then - writeInt64 os (int64 imageBaseReal) // REVIEW: For 64-bit, we should use a 64-bit image base + writeInt64 os (int64 imageBaseReal) // REVIEW: For 64-bit, we should use a 64-bit image base else - writeInt32 os dataSectionAddr // e.g. 0x0000c000 - writeInt32 os imageBaseReal // Image Base Always 0x400000 (see Section 23.1). - QUERY : no it's not always 0x400000, e.g. 0x034f0000 + writeInt32 os dataSectionAddr // e.g. 0x0000c000 + writeInt32 os imageBaseReal // Image Base Always 0x400000 (see Section 23.1). - QUERY : no it's not always 0x400000, e.g. 0x034f0000 writeInt32 os alignVirt // Section Alignment Always 0x2000 (see Section 23.1). writeInt32 os alignPhys // File Alignment Either 0x200 or 0x1000. @@ -3974,10 +4043,9 @@ and writeBinaryAndReportMappingsAux (stream: Stream, leaveStreamOpen: bool, writeInt32AsUInt16 os 0x00 // OS Minor Always 0 (see Section 23.1). writeInt32AsUInt16 os 0x00 // User Major Always 0 (see Section 23.1). writeInt32AsUInt16 os 0x00 // User Minor Always 0 (see Section 23.1). - do - let major, minor = modul.SubsystemVersion - writeInt32AsUInt16 os major - writeInt32AsUInt16 os minor + let major, minor = modul.SubsystemVersion + writeInt32AsUInt16 os major + writeInt32AsUInt16 os minor writeInt32 os 0x00 // Reserved Always 0 (see Section 23.1). // 000000d0 writeInt32 os imageEndAddr // Image Size: Size, in bytes, of image, including all headers and padding @@ -4255,100 +4323,117 @@ and writeBinaryAndReportMappingsAux (stream: Stream, leaveStreamOpen: bool, b0 reloc2; b1 reloc2; |] writePadding os "end of .reloc" (imageEndSectionPhysLoc - relocSectionPhysLoc - relocSectionSize) - os.Dispose() - - pdbData, pdbOpt, debugDirectoryChunk, debugDataChunk, debugChecksumPdbChunk, debugEmbeddedPdbChunk, debugDeterministicPdbChunk, textV2P, mappings - - // Looks like a finally - with e -> - (try - os.Dispose() - with _ -> ()) - reraise() + pdbData, pdbInfoOpt, debugDirectoryChunk, debugDataChunk, debugChecksumPdbChunk, debugEmbeddedPdbChunk, debugDeterministicPdbChunk, textV2P, mappings reportTime showTimes "Writing Image" - pdbData, pdbOpt, debugDirectoryChunk, debugDataChunk, debugChecksumPdbChunk, debugEmbeddedPdbChunk, debugDeterministicPdbChunk, textV2P, mappings + pdbData, pdbInfoOpt, debugDirectoryChunk, debugDataChunk, debugChecksumPdbChunk, debugEmbeddedPdbChunk, debugDeterministicPdbChunk, textV2P, mappings + +let writeBinaryFiles (outfile, + ilg: ILGlobals, + pdbfile: string option, + signer: ILStrongNameSigner option, + portablePDB, + embeddedPDB, + embedAllSource, + embedSourceList, + sourceLink, + checksumAlgorithm, + emitTailcalls, + deterministic, + showTimes, + dumpDebugInfo, + pathMap, + modul, normalizeAssemblyRefs) = -and writePdb (dumpDebugInfo, showTimes, portablePDB, embeddedPDB, pdbfile, outfile, signer, deterministic, pathMap) (pdbData, pdbOpt, debugDirectoryChunk, debugDataChunk, debugChecksumPdbChunk, debugEmbeddedPdbChunk, debugDeterministicPdbChunk, textV2P, mappings) = - if dumpDebugInfo then logDebugInfo outfile pdbData + let stream = + try + // Ensure the output directory exists otherwise it will fail + let dir = FileSystem.GetDirectoryNameShim outfile + if not (FileSystem.DirectoryExistsShim dir) then FileSystem.DirectoryCreateShim dir |> ignore + FileSystem.OpenFileForWriteShim(outfile, FileMode.Create, FileAccess.Write, FileShare.Read) + with _ -> + failwith ("Could not open file for writing (binary mode): " + outfile) - // Now we've done the bulk of the binary, do the PDB file and fixup the binary. - begin match pdbfile with - | None -> () -#if ENABLE_MONO_SUPPORT - | Some fmdb when runningOnMono && not portablePDB -> - writeMdbInfo fmdb outfile pdbData -#endif - | Some fpdb -> + let pdbData, pdbInfoOpt, debugDirectoryChunk, debugDataChunk, debugChecksumPdbChunk, debugEmbeddedPdbChunk, debugDeterministicPdbChunk, textV2P, mappings = try - let idd = - match pdbOpt with - | Some (originalLength, contentId, stream, algorithmName, checkSum) -> - if embeddedPDB then - embedPortablePdbInfo originalLength contentId stream showTimes fpdb debugDataChunk debugEmbeddedPdbChunk debugDeterministicPdbChunk debugChecksumPdbChunk algorithmName checkSum embeddedPDB deterministic - else - writePortablePdbInfo contentId stream showTimes fpdb pathMap debugDataChunk debugDeterministicPdbChunk debugChecksumPdbChunk algorithmName checkSum embeddedPDB deterministic - | None -> -#if FX_NO_PDB_WRITER - Array.empty -#else - writePdbInfo showTimes outfile fpdb pdbData debugDataChunk -#endif - reportTime showTimes "Generate PDB Info" - - // Now we have the debug data we can go back and fill in the debug directory in the image - use fs2 = FileSystem.OpenFileForWriteShim(outfile, FileMode.Open, FileAccess.Write, FileShare.Read) - let os2 = new BinaryWriter(fs2) - try - // write the IMAGE_DEBUG_DIRECTORY - os2.BaseStream.Seek (int64 (textV2P debugDirectoryChunk.addr), SeekOrigin.Begin) |> ignore - for i in idd do - writeInt32 os2 i.iddCharacteristics // IMAGE_DEBUG_DIRECTORY.Characteristics - writeInt32 os2 i.iddTimestamp - writeInt32AsUInt16 os2 i.iddMajorVersion - writeInt32AsUInt16 os2 i.iddMinorVersion - writeInt32 os2 i.iddType - writeInt32 os2 i.iddData.Length // IMAGE_DEBUG_DIRECTORY.SizeOfData - writeInt32 os2 i.iddChunk.addr // IMAGE_DEBUG_DIRECTORY.AddressOfRawData - writeInt32 os2 (textV2P i.iddChunk.addr) // IMAGE_DEBUG_DIRECTORY.PointerToRawData - - // Write the Debug Data - for i in idd do - if i.iddChunk.size <> 0 then - // write the debug raw data as given us by the PDB writer - os2.BaseStream.Seek (int64 (textV2P i.iddChunk.addr), SeekOrigin.Begin) |> ignore - if i.iddChunk.size < i.iddData.Length then failwith "Debug data area is not big enough. Debug info may not be usable" - writeBytes os2 i.iddData - os2.Dispose() - with e -> - failwith ("Error while writing debug directory entry: "+e.Message) - (try os2.Dispose(); FileSystem.FileDeleteShim outfile with _ -> ()) - reraise() - with e -> + try + writeBinaryAux( + stream, ilg, pdbfile, signer, + portablePDB, embeddedPDB, embedAllSource, + embedSourceList, sourceLink, + checksumAlgorithm, emitTailcalls, deterministic, showTimes, pathMap, + modul, normalizeAssemblyRefs) + finally + stream.Close() + + with _ -> + try FileSystem.FileDeleteShim outfile with | _ -> () reraise() - end - reportTime showTimes "Finalize PDB" + try + FileSystemUtilities.setExecutablePermission outfile + with _ -> + () - // Sign the binary. No further changes to binary allowed past this point! - match signer with - | None -> () - | Some s -> - try - s.SignFile outfile - s.Close() - with e -> - failwith ("Warning: A call to SignFile failed ("+e.Message+")") - (try s.Close() with _ -> ()) - (try FileSystem.FileDeleteShim outfile with _ -> ()) - () + let reopenOutput () = + FileSystem.OpenFileForWriteShim(outfile, FileMode.Open, FileAccess.Write, FileShare.Read) + + writePdb (dumpDebugInfo, + showTimes, portablePDB, + embeddedPDB, pdbfile, outfile, + reopenOutput, false, signer, deterministic, pathMap, + pdbData, pdbInfoOpt, debugDirectoryChunk, + debugDataChunk, debugChecksumPdbChunk, debugEmbeddedPdbChunk, + debugDeterministicPdbChunk, textV2P) |> ignore - reportTime showTimes "Signing Image" - //Finished writing and signing the binary and debug info... mappings +let writeBinaryInMemory ( + outfile: string, + ilg: ILGlobals, + pdbfile: string option, + signer: ILStrongNameSigner option, + portablePDB, + embeddedPDB, + embedAllSource, + embedSourceList, + sourceLink, + checksumAlgorithm, + emitTailcalls, deterministic, + showTimes, + dumpDebugInfo, + pathMap, + modul, + normalizeAssemblyRefs) = + + let stream = new MemoryStream() + let pdbData, pdbInfoOpt, debugDirectoryChunk, debugDataChunk, debugChecksumPdbChunk, debugEmbeddedPdbChunk, debugDeterministicPdbChunk, textV2P, _mappings = + writeBinaryAux(stream, ilg, + pdbfile, signer, + portablePDB, embeddedPDB, embedAllSource, + embedSourceList, sourceLink, + checksumAlgorithm, emitTailcalls, + deterministic, showTimes, pathMap, modul, normalizeAssemblyRefs) + + let reopenOutput () = stream + + let pdbBytes = + writePdb (dumpDebugInfo, + showTimes, portablePDB, embeddedPDB, pdbfile, + outfile, reopenOutput, true, + signer, deterministic, pathMap, + pdbData, pdbInfoOpt, debugDirectoryChunk, debugDataChunk, + debugChecksumPdbChunk, debugEmbeddedPdbChunk, + debugDeterministicPdbChunk, textV2P) + + stream.Close() + + stream.ToArray(), pdbBytes + + type options = { ilg: ILGlobals + outfile: string pdbfile: string option portablePDB: bool embeddedPDB: bool @@ -4363,14 +4448,23 @@ type options = dumpDebugInfo: bool pathMap: PathMap } -let WriteILBinary (filename, options: options, inputModule, normalizeAssemblyRefs) = - writeBinaryAndReportMappings (filename, - options.ilg, options.pdbfile, options.signer, options.portablePDB, options.embeddedPDB, options.embedAllSource, - options.embedSourceList, options.sourceLink, options.checksumAlgorithm, options.emitTailcalls, options.deterministic, options.showTimes, options.dumpDebugInfo, options.pathMap) inputModule normalizeAssemblyRefs +let WriteILBinaryFile (options: options, inputModule, normalizeAssemblyRefs) = + writeBinaryFiles (options.outfile, + options.ilg, options.pdbfile, options.signer, + options.portablePDB, options.embeddedPDB,options.embedAllSource, + options.embedSourceList, options.sourceLink, options.checksumAlgorithm, + options.emitTailcalls, options.deterministic, options.showTimes, + options.dumpDebugInfo, options.pathMap, + inputModule, normalizeAssemblyRefs) |> ignore -let WriteILBinaryStreamWithNoPDB (stream, options: options, inputModule, normalizeAssemblyRefs) = - writeBinaryWithNoPdb (stream, - options.ilg, options.signer, options.portablePDB, options.embeddedPDB, options.embedAllSource, - options.embedSourceList, options.sourceLink, options.checksumAlgorithm, options.emitTailcalls, options.deterministic, options.showTimes, options.pathMap) inputModule normalizeAssemblyRefs - |> ignore +let WriteILBinaryInMemory (options: options, inputModule: ILModuleDef, normalizeAssemblyRefs) = + writeBinaryInMemory (options.outfile, + options.ilg, + options.pdbfile, + options.signer, + options.portablePDB, options.embeddedPDB, options.embedAllSource, + options.embedSourceList, options.sourceLink, options.checksumAlgorithm, + options.emitTailcalls, options.deterministic, + options.showTimes, options.dumpDebugInfo, options.pathMap, + inputModule, normalizeAssemblyRefs) diff --git a/src/fsharp/absil/ilwrite.fsi b/src/fsharp/absil/ilwrite.fsi index 152c9abc45..2c1cab018b 100644 --- a/src/fsharp/absil/ilwrite.fsi +++ b/src/fsharp/absil/ilwrite.fsi @@ -4,13 +4,13 @@ module internal FSharp.Compiler.AbstractIL.ILBinaryWriter open Internal.Utilities -open System.IO open FSharp.Compiler.AbstractIL.IL open FSharp.Compiler.AbstractIL.ILPdbWriter open FSharp.Compiler.AbstractIL.StrongNameSign type options = { ilg: ILGlobals + outfile: string pdbfile: string option portablePDB: bool embeddedPDB: bool @@ -18,15 +18,15 @@ type options = embedSourceList: string list sourceLink: string checksumAlgorithm: HashAlgorithm - signer : ILStrongNameSigner option + signer: ILStrongNameSigner option emitTailcalls: bool deterministic: bool - showTimes : bool - dumpDebugInfo : bool - pathMap : PathMap } + showTimes: bool + dumpDebugInfo: bool + pathMap: PathMap } -/// Write a binary to the file system. Extra configuration parameters can also be specified. -val WriteILBinary: filename: string * options: options * inputModule: ILModuleDef * (ILAssemblyRef -> ILAssemblyRef) -> unit +/// Write a binary to the file system. +val WriteILBinaryFile: options: options * inputModule: ILModuleDef * (ILAssemblyRef -> ILAssemblyRef) -> unit -/// Write a binary to the given stream. Extra configuration parameters can also be specified. -val WriteILBinaryStreamWithNoPDB: stream: Stream * options: options * inputModule: ILModuleDef * (ILAssemblyRef -> ILAssemblyRef) -> unit \ No newline at end of file +/// Write a binary to an array of bytes auitable for dynamic loading. +val WriteILBinaryInMemory: options: options * inputModule: ILModuleDef * (ILAssemblyRef -> ILAssemblyRef) -> byte[] * byte[] option \ No newline at end of file diff --git a/src/fsharp/absil/ilwritepdb.fs b/src/fsharp/absil/ilwritepdb.fs index a080cd2147..3acc2ada21 100644 --- a/src/fsharp/absil/ilwritepdb.fs +++ b/src/fsharp/absil/ilwritepdb.fs @@ -203,15 +203,15 @@ let pdbGetCvDebugInfo (mvid: byte[]) (timestamp: int32) (filepath: string) (cvCh } let pdbMagicNumber= 0x4244504dL -let pdbGetEmbeddedPdbDebugInfo (embeddedPdbChunk: BinaryChunk) (uncompressedLength: int64) (stream: MemoryStream) = +let pdbGetEmbeddedPdbDebugInfo (embeddedPdbChunk: BinaryChunk) (uncompressedLength: int64) (compressedStream: MemoryStream) = let iddPdbBuffer = - let buffer = Array.zeroCreate (sizeof + sizeof + int(stream.Length)) + let buffer = Array.zeroCreate (sizeof + sizeof + int(compressedStream.Length)) let offset, size = (0, sizeof) // Magic Number dword: 0x4244504dL Buffer.BlockCopy(i32AsBytes (int pdbMagicNumber), 0, buffer, offset, size) let offset, size = (offset + size, sizeof) // Uncompressed size Buffer.BlockCopy(i32AsBytes (int uncompressedLength), 0, buffer, offset, size) - let offset, size = (offset + size, int(stream.Length)) // Uncompressed size - Buffer.BlockCopy(stream.ToArray(), 0, buffer, offset, size) + let offset, size = (offset + size, int(compressedStream.Length)) // Uncompressed size + Buffer.BlockCopy(compressedStream.ToArray(), 0, buffer, offset, size) buffer { iddCharacteristics = 0 // Reserved iddMajorVersion = 0x0100 // VersionMajor should be 0x0100 @@ -253,15 +253,15 @@ let pdbGetDebugInfo (contentId: byte[]) (timestamp: int32) (filepath: string) (embeddedPdbChunk: BinaryChunk option) (deterministicPdbChunk: BinaryChunk) (checksumPdbChunk: BinaryChunk) (algorithmName:string) (checksum: byte []) - (uncompressedLength: int64) (stream: MemoryStream option) + (uncompressedLength: int64) (compressedStream: MemoryStream option) (embeddedPdb: bool) (deterministic: bool) = [| yield pdbGetCvDebugInfo contentId timestamp filepath cvChunk yield pdbChecksumDebugInfo timestamp checksumPdbChunk algorithmName checksum if embeddedPdb then - match stream, embeddedPdbChunk with + match compressedStream, embeddedPdbChunk with | None, _ | _, None -> () - | Some s, Some chunk -> - yield pdbGetEmbeddedPdbDebugInfo chunk uncompressedLength s + | Some compressedStream, Some chunk -> + yield pdbGetEmbeddedPdbDebugInfo chunk uncompressedLength compressedStream if deterministic then yield pdbGetPdbDebugDeterministicInfo deterministicPdbChunk |] @@ -369,6 +369,7 @@ type PortablePdbGenerator (embedAllSource: bool, embedSourceList: string list, s let docLength = docs.Length + if String.IsNullOrEmpty sourceLink then 1 else 0 metadata.SetCapacity(TableIndex.Document, docLength) for doc in docs do + // For F# Interactive, file name 'stdin' gets generated for interactive inputs let handle = match checkSum doc.File checksumAlgorithm with | Some (hashAlg, checkSum) -> @@ -728,23 +729,18 @@ let generatePortablePdb (embedAllSource: bool) (embedSourceList: string list) (s let generator = PortablePdbGenerator (embedAllSource, embedSourceList, sourceLink, checksumAlgorithm, showTimes, info, pathMap) generator.Emit() -let compressPortablePdbStream (uncompressedLength: int64) (contentId: BlobContentId) (stream: MemoryStream) = +let compressPortablePdbStream (stream: MemoryStream) = let compressedStream = new MemoryStream() use compressionStream = new DeflateStream(compressedStream, CompressionMode.Compress,true) stream.WriteTo compressionStream - (uncompressedLength, contentId, compressedStream) + compressedStream -let writePortablePdbInfo (contentId: BlobContentId) (stream: MemoryStream) showTimes fpdb pathMap cvChunk deterministicPdbChunk checksumPdbChunk algorithmName checksum embeddedPdb deterministic = - try FileSystem.FileDeleteShim fpdb with _ -> () - use fs = FileSystem.OpenFileForWriteShim(fpdb, fileMode = FileMode.Create, fileAccess = FileAccess.ReadWrite) - stream.WriteTo fs - reportTime showTimes "PDB: Closed" - pdbGetDebugInfo (contentId.Guid.ToByteArray()) (int32 contentId.Stamp) (PathMap.apply pathMap fpdb) cvChunk None deterministicPdbChunk checksumPdbChunk algorithmName checksum 0L None embeddedPdb deterministic +let getInfoForPortablePdb (contentId: BlobContentId) pdbfile pathMap cvChunk deterministicPdbChunk checksumPdbChunk algorithmName checksum embeddedPdb deterministic = + pdbGetDebugInfo (contentId.Guid.ToByteArray()) (int32 contentId.Stamp) (PathMap.apply pathMap pdbfile) cvChunk None deterministicPdbChunk checksumPdbChunk algorithmName checksum 0L None embeddedPdb deterministic -let embedPortablePdbInfo (uncompressedLength: int64) (contentId: BlobContentId) (stream: MemoryStream) showTimes fpdb cvChunk pdbChunk deterministicPdbChunk checksumPdbChunk algorithmName checksum embeddedPdb deterministic = - reportTime showTimes "PDB: Closed" - let fn = Path.GetFileName fpdb - pdbGetDebugInfo (contentId.Guid.ToByteArray()) (int32 contentId.Stamp) fn cvChunk (Some pdbChunk) deterministicPdbChunk checksumPdbChunk algorithmName checksum uncompressedLength (Some stream) embeddedPdb deterministic +let getInfoForEmbeddedPortablePdb (uncompressedLength: int64) (contentId: BlobContentId) (compressedStream: MemoryStream) pdbfile cvChunk pdbChunk deterministicPdbChunk checksumPdbChunk algorithmName checksum deterministic = + let fn = Path.GetFileName pdbfile + pdbGetDebugInfo (contentId.Guid.ToByteArray()) (int32 contentId.Stamp) fn cvChunk (Some pdbChunk) deterministicPdbChunk checksumPdbChunk algorithmName checksum uncompressedLength (Some compressedStream) true deterministic #if !FX_NO_PDB_WRITER @@ -754,15 +750,15 @@ open Microsoft.Win32 // PDB Writer. The function [WritePdbInfo] abstracts the // imperative calls to the Symbol Writer API. //--------------------------------------------------------------------- -let writePdbInfo showTimes f fpdb info cvChunk = +let writePdbInfo showTimes outfile pdbfile info cvChunk = - try FileSystem.FileDeleteShim fpdb with _ -> () + try FileSystem.FileDeleteShim pdbfile with _ -> () let pdbw = try - pdbInitialize f fpdb + pdbInitialize outfile pdbfile with _ -> - error(Error(FSComp.SR.ilwriteErrorCreatingPdb fpdb, rangeCmdArgs)) + error(Error(FSComp.SR.ilwriteErrorCreatingPdb pdbfile, rangeCmdArgs)) match info.EntryPoint with | None -> () @@ -845,7 +841,7 @@ let writePdbInfo showTimes f fpdb info cvChunk = let res = pdbWriteDebugInfo pdbw for pdbDoc in docs do pdbCloseDocument pdbDoc - pdbClose pdbw f fpdb + pdbClose pdbw outfile pdbfile reportTime showTimes "PDB: Closed" [| { iddCharacteristics = res.iddCharacteristics diff --git a/src/fsharp/absil/ilwritepdb.fsi b/src/fsharp/absil/ilwritepdb.fsi index a59d5a971a..77a41cdc71 100644 --- a/src/fsharp/absil/ilwritepdb.fsi +++ b/src/fsharp/absil/ilwritepdb.fsi @@ -120,14 +120,14 @@ type HashAlgorithm = val generatePortablePdb : embedAllSource: bool -> embedSourceList: string list -> sourceLink: string -> checksumAlgorithm: HashAlgorithm -> showTimes: bool -> info: PdbData -> pathMap:PathMap -> int64 * BlobContentId * MemoryStream * string * byte[] -val compressPortablePdbStream : uncompressedLength:int64 -> contentId:BlobContentId -> stream:MemoryStream -> int64 * BlobContentId * MemoryStream +val compressPortablePdbStream: stream:MemoryStream -> MemoryStream -val embedPortablePdbInfo: uncompressedLength: int64 -> contentId: BlobContentId -> stream: MemoryStream -> showTimes: bool -> fpdb: string -> cvChunk: BinaryChunk -> pdbChunk: BinaryChunk -> deterministicPdbChunk: BinaryChunk -> checksumPdbChunk: BinaryChunk -> algorithmName: string -> checksum: byte[] -> embeddedPdb: bool -> deterministic: bool -> idd[] +val getInfoForEmbeddedPortablePdb: uncompressedLength: int64 -> contentId: BlobContentId -> compressedStream: MemoryStream -> pdbfile: string -> cvChunk: BinaryChunk -> pdbChunk: BinaryChunk -> deterministicPdbChunk: BinaryChunk -> checksumPdbChunk: BinaryChunk -> algorithmName: string -> checksum: byte[] -> deterministic: bool -> idd[] -val writePortablePdbInfo: contentId: BlobContentId -> stream: MemoryStream -> showTimes: bool -> fpdb: string -> pathMap: PathMap -> cvChunk: BinaryChunk -> deterministicPdbChunk: BinaryChunk -> checksumPdbChunk: BinaryChunk -> algorithmName: string -> checksum: byte[] -> embeddedPdb: bool -> deterministic: bool -> idd[] +val getInfoForPortablePdb: contentId: BlobContentId -> pdbfile: string -> pathMap: PathMap -> cvChunk: BinaryChunk -> deterministicPdbChunk: BinaryChunk -> checksumPdbChunk: BinaryChunk -> algorithmName: string -> checksum: byte[] -> embeddedPdb: bool -> deterministic: bool -> idd[] #if !FX_NO_PDB_WRITER -val writePdbInfo : showTimes:bool -> f:string -> fpdb:string -> info:PdbData -> cvChunk:BinaryChunk -> idd[] +val writePdbInfo : showTimes:bool -> outfile:string -> pdbfile:string -> info:PdbData -> cvChunk:BinaryChunk -> idd[] #endif /// Check to see if a scope has a local with the same name as any of its children diff --git a/src/fsharp/fsc.fs b/src/fsharp/fsc.fs index 917299352b..b16c7a5548 100644 --- a/src/fsharp/fsc.fs +++ b/src/fsharp/fsc.fs @@ -799,7 +799,7 @@ let main3(Args (ctok, tcConfig, tcImports, frameworkTcImports: TcImports, tcGlob let optimizedImpls, optimizationData, _ = ApplyAllOptimizations - (tcConfig, tcGlobals, (LightweightTcValForUsingInBuildMethodCall tcGlobals), outfile, + (tcConfig, tcGlobals, LightweightTcValForUsingInBuildMethodCall tcGlobals, outfile, importMap, false, optEnv0, generatedCcu, typedImplFiles) AbortOnError(errorLogger, exiter) @@ -909,10 +909,10 @@ let main6 dynamicAssemblyCreator (Args (ctok, tcConfig, tcImports: TcImports, t | None -> try try - ILBinaryWriter.WriteILBinary - (outfile, - { ilg = tcGlobals.ilg - pdbfile=pdbfile + ILBinaryWriter.WriteILBinaryFile + ({ ilg = tcGlobals.ilg + outfile = outfile + pdbfile = pdbfile emitTailcalls = tcConfig.emitTailcalls deterministic = tcConfig.deterministic showTimes = tcConfig.showTimes diff --git a/src/fsharp/fsi/FSIstrings.txt b/src/fsharp/fsi/FSIstrings.txt index dbd7642476..91a4593f85 100644 --- a/src/fsharp/fsi/FSIstrings.txt +++ b/src/fsharp/fsi/FSIstrings.txt @@ -54,3 +54,6 @@ fsiProductNameCommunity,"F# Interactive for F# %s" shadowCopyReferences,"Prevents references from being locked by the F# Interactive process" fsiOperationCouldNotBeCompleted,"Operation could not be completed due to earlier error" fsiOperationFailed,"Operation failed. The error text has been printed in the error stream. To return the corresponding FSharpDiagnostic use the EvalInteractionNonThrowing, EvalScriptNonThrowing or EvalExpressionNonThrowing" +fsiMultiAssemblyEmitOption,"Emit multiple assemblies (on by default)" +fsiMultiAssemblyEmitOptionOffByDefault,"Emit multiple assemblies (off by default for .NET Framework)" +2303,fsiInternalAccess,"Accessing the internal type, method or field '%s' from a previous evaluation in F# Interactive is deprecated and may cause subsequent access errors. To enable the legacy generation of a single dynamic assembly that can access internals, use the '--multiemit-' option." \ No newline at end of file diff --git a/src/fsharp/fsi/fsi.fs b/src/fsharp/fsi/fsi.fs index 5922c1a6fb..52b0262bdf 100644 --- a/src/fsharp/fsi/fsi.fs +++ b/src/fsharp/fsi/fsi.fs @@ -30,7 +30,8 @@ open FSharp.Compiler.AbstractIL open FSharp.Compiler.AbstractIL.Diagnostics open FSharp.Compiler.AbstractIL.IL open FSharp.Compiler.AbstractIL.ILBinaryReader -open FSharp.Compiler.AbstractIL.ILRuntimeWriter +open FSharp.Compiler.AbstractIL.ILBinaryWriter +open FSharp.Compiler.AbstractIL.ILDynamicAssemblyWriter open FSharp.Compiler.AccessibilityLogic open FSharp.Compiler.CheckDeclarations open FSharp.Compiler.CheckExpressions @@ -73,13 +74,16 @@ open FSharp.Compiler.BuildGraph //---------------------------------------------------------------------------- type FsiValue(reflectionValue:obj, reflectionType:Type, fsharpType:FSharpType) = - member x.ReflectionValue = reflectionValue - member x.ReflectionType = reflectionType - member x.FSharpType = fsharpType + member _.ReflectionValue = reflectionValue + + member _.ReflectionType = reflectionType + + member _.FSharpType = fsharpType [] type FsiBoundValue(name: string, value: FsiValue) = member _.Name = name + member _.Value = value [] @@ -102,7 +106,6 @@ module internal Utilities = let ignoreAllErrors f = try f() with _ -> () - // TODO: this dotnet/core polyfill can be removed when it surfaces in Type let getMember (name: string) (memberType: MemberTypes) (attr: BindingFlags) (declaringType: Type) = let memberType = if memberType &&& MemberTypes.NestedType = MemberTypes.NestedType then @@ -198,10 +201,7 @@ module internal Utilities = let getOutputDir (tcConfigB: TcConfigBuilder) = tcConfigB.outputDir |> Option.defaultValue "" -//---------------------------------------------------------------------------- -// Timing support -//---------------------------------------------------------------------------- - +/// Timing support [] type internal FsiTimeReporter(outWriter: TextWriter) = let stopwatch = Stopwatch() @@ -222,6 +222,190 @@ type internal FsiTimeReporter(outWriter: TextWriter) = member tr.TimeOpIf flag f = if flag then tr.TimeOp f else f () +/// Manages the emit of one logical assembly into multiple assemblies. Gives warnings +/// on cross-fragment internal access. +type ILMultiInMemoryAssemblyEmitEnv( + ilg: ILGlobals, + resolveAssemblyRef: ILAssemblyRef -> Choice option, + dynamicCcuName: string + ) = + + let typeMap = Dictionary(HashIdentity.Structural) + let reverseTypeMap = Dictionary(HashIdentity.Structural) + let internalTypes = HashSet(HashIdentity.Structural) + let internalMethods = HashSet(HashIdentity.Structural) + let internalFields = HashSet(HashIdentity.Structural) + let dynamicCcuScopeRef = ILScopeRef.Assembly (IL.mkSimpleAssemblyRef dynamicCcuName) + + /// Convert an ILAssemblyRef to a dynamic System.Type given the dynamic emit context + let convAssemblyRef (aref: ILAssemblyRef) = + let asmName = AssemblyName() + asmName.Name <- aref.Name + match aref.PublicKey with + | None -> () + | Some (PublicKey bytes) -> asmName.SetPublicKey bytes + | Some (PublicKeyToken bytes) -> asmName.SetPublicKeyToken bytes + match aref.Version with + | None -> () + | Some version -> + asmName.Version <- Version (int32 version.Major, int32 version.Minor, int32 version.Build, int32 version.Revision) + asmName.CultureInfo <- System.Globalization.CultureInfo.InvariantCulture + asmName + + /// Convert an ILAssemblyRef to a dynamic System.Type given the dynamic emit context + let convResolveAssemblyRef (asmref: ILAssemblyRef) qualifiedName = + let assembly = + match resolveAssemblyRef asmref with + | Some (Choice1Of2 path) -> + // asmRef is a path but the runtime is smarter with assembly names so make one + let asmName = AssemblyName.GetAssemblyName(path) + asmName.CodeBase <- path + FileSystem.AssemblyLoader.AssemblyLoad asmName + | Some (Choice2Of2 assembly) -> + assembly + | None -> + let asmName = convAssemblyRef asmref + FileSystem.AssemblyLoader.AssemblyLoad asmName + let typT = assembly.GetType qualifiedName + match typT with + | null -> error(Error(FSComp.SR.itemNotFoundDuringDynamicCodeGen ("type", qualifiedName, asmref.QualifiedName), range0)) + | res -> res + + /// Convert an Abstract IL type reference to System.Type + let convTypeRefAux (tref: ILTypeRef) = + let qualifiedName = (String.concat "+" (tref.Enclosing @ [ tref.Name ])).Replace(",", @"\,") + match tref.Scope with + | ILScopeRef.Assembly asmref -> + convResolveAssemblyRef asmref qualifiedName + | ILScopeRef.Module _ + | ILScopeRef.Local _ -> + let typT = Type.GetType qualifiedName + match typT with + | null -> error(Error(FSComp.SR.itemNotFoundDuringDynamicCodeGen ("type", qualifiedName, ""), range0)) + | res -> res + | ILScopeRef.PrimaryAssembly -> + convResolveAssemblyRef ilg.primaryAssemblyRef qualifiedName + + /// Convert an ILTypeRef to a dynamic System.Type given the dynamic emit context + let convTypeRef (tref: ILTypeRef) = + if tref.Scope.IsLocalRef then + assert tref.Scope.IsLocalRef + let typ, _ = typeMap.[tref] + typ + else + convTypeRefAux tref + + /// Convert an ILTypeSpec to a dynamic System.Type given the dynamic emit context + let rec convTypeSpec (tspec: ILTypeSpec) = + let tref = tspec.TypeRef + let typT = convTypeRef tref + let tyargs = List.map convTypeAux tspec.GenericArgs + let res = + match isNil tyargs, typT.IsGenericType with + | _, true -> typT.MakeGenericType(List.toArray tyargs) + | true, false -> typT + | _, false -> null + match res with + | null -> error(Error(FSComp.SR.itemNotFoundDuringDynamicCodeGen ("type", tspec.TypeRef.QualifiedName, tspec.Scope.QualifiedName), range0)) + | _ -> res + + and convTypeAux ty = + match ty with + | ILType.Void -> Type.GetType("System.Void") + | ILType.Array (shape, eltType) -> + let baseT = convTypeAux eltType + if shape.Rank=1 then baseT.MakeArrayType() + else baseT.MakeArrayType shape.Rank + | ILType.Value tspec -> convTypeSpec tspec + | ILType.Boxed tspec -> convTypeSpec tspec + | ILType.Ptr eltType -> + let baseT = convTypeAux eltType + baseT.MakePointerType() + | ILType.Byref eltType -> + let baseT = convTypeAux eltType + baseT.MakeByRefType() + | ILType.TypeVar _tv -> failwith "open generic type" + | ILType.Modified (_, _, modifiedTy) -> + convTypeAux modifiedTy + | ILType.FunctionPointer _callsig -> failwith "convType: fptr" + + /// Map the given ILTypeRef to the appropriate assembly fragment + member _.MapTypeRef (tref: ILTypeRef) = + if tref.Scope.IsLocalRef && typeMap.ContainsKey(tref) then + typeMap.[tref] |> snd + else + tref + + /// Map an ILTypeRef built from reflection over loaded assembly fragments back to an ILTypeRef suitable + /// to use on the F# compiler logic. + member _.ReverseMapTypeRef (tref: ILTypeRef) = + if reverseTypeMap.ContainsKey(tref) then + reverseTypeMap.[tref] + else + tref + + /// Convert an ILTypeRef to a dynamic System.Type given the dynamic emit context + member _.LookupTypeRef (tref: ILTypeRef) = + convTypeRef tref + + /// Convert an ILType to a dynamic System.Type given the dynamic emit context + member _.LookupType (ty: ILType) = + convTypeAux ty + + /// Record the given ILTypeDef in the dynamic emit context + member emEnv.AddTypeDef (asm: Assembly) ilScopeRef enc (tdef: ILTypeDef) = + let ltref = mkRefForNestedILTypeDef ILScopeRef.Local (enc, tdef) + let tref = mkRefForNestedILTypeDef ilScopeRef (enc, tdef) + let key = tref.BasicQualifiedName + let typ = asm.GetType(key) + //printfn "Adding %s --> %s" key typ.FullName + let rtref = rescopeILTypeRef dynamicCcuScopeRef tref + typeMap.Add(ltref, (typ, tref)) + reverseTypeMap.Add(tref, rtref) + for ntdef in tdef.NestedTypes.AsArray() do + emEnv.AddTypeDef asm ilScopeRef (enc@[tdef]) ntdef + + // Record the internal things to give warnings for internal access across fragment boundaries + for fdef in tdef.Fields.AsList() do + match fdef.Access with + | ILMemberAccess.Public -> () + | _ -> + let lfref = mkRefForILField ILScopeRef.Local (enc, tdef) fdef + internalFields.Add(lfref) |> ignore + + for mdef in tdef.Methods.AsArray() do + match mdef.Access with + | ILMemberAccess.Public -> () + | _ -> + let lmref = mkRefForILMethod ILScopeRef.Local (enc, tdef) mdef + internalMethods.Add(lmref) |> ignore + + match tdef.Access with + | ILTypeDefAccess.Public + | ILTypeDefAccess.Nested ILMemberAccess.Public -> () + | _ -> + internalTypes.Add(ltref) |> ignore + + /// Record the given ILModuleDef (i.e. an assembly) in the dynamic emit context + member emEnv.AddModuleDef asm ilScopeRef (mdef: ILModuleDef) = + for tdef in mdef.TypeDefs.AsArray() do + emEnv.AddTypeDef asm ilScopeRef [] tdef + + /// Check if an ILTypeRef is a reference to an already-emitted internal type within the dynamic emit context + member _.IsLocalInternalType (tref: ILTypeRef) = + tref.Scope.IsLocalRef && internalTypes.Contains(tref) + + /// Check if an ILMethodRef is a reference to an already-emitted internal method within the dynamic emit context + member _.IsLocalInternalMethod (mref: ILMethodRef) = + mref.DeclaringTypeRef.Scope.IsLocalRef && internalMethods.Contains(mref) + + /// Check if an ILFieldRef is a reference to an already-emitted internal field within the dynamic emit context + member _.IsLocalInternalField (fref: ILFieldRef) = + fref.DeclaringTypeRef.Scope.IsLocalRef && internalFields.Contains(fref) + +type ILAssemblyEmitEnv = + | SingleRefEmitAssembly of ILDynamicAssemblyWriter.cenv * ILDynamicAssemblyEmitEnv + | MultipleInMemoryAssemblies of ILMultiInMemoryAssemblyEmitEnv type internal FsiValuePrinterMode = | PrintExpr @@ -229,35 +413,45 @@ type internal FsiValuePrinterMode = type EvaluationEventArgs(fsivalue : FsiValue option, symbolUse : FSharpSymbolUse, decl: FSharpImplementationFileDeclaration) = inherit EventArgs() - member x.Name = symbolUse.Symbol.DisplayName - member x.FsiValue = fsivalue - member x.SymbolUse = symbolUse - member x.Symbol = symbolUse.Symbol - member x.ImplementationDeclaration = decl + member _.Name = symbolUse.Symbol.DisplayName + member _.FsiValue = fsivalue + member _.SymbolUse = symbolUse + member _.Symbol = symbolUse.Symbol + member _.ImplementationDeclaration = decl /// User-configurable information that changes how F# Interactive operates, stored in the 'fsi' object /// and accessible via the programming model [] type FsiEvaluationSessionHostConfig () = let evaluationEvent = Event() + /// Called by the evaluation session to ask the host for parameters to format text for output abstract FormatProvider: IFormatProvider + /// Called by the evaluation session to ask the host for parameters to format text for output abstract FloatingPointFormat: string + /// Called by the evaluation session to ask the host for parameters to format text for output abstract AddedPrinters : Choice string), Type * (obj -> obj)> list + /// Called by the evaluation session to ask the host for parameters to format text for output abstract ShowDeclarationValues: bool + /// Called by the evaluation session to ask the host for parameters to format text for output abstract ShowIEnumerable: bool + /// Called by the evaluation session to ask the host for parameters to format text for output abstract ShowProperties : bool + /// Called by the evaluation session to ask the host for parameters to format text for output abstract PrintSize : int + /// Called by the evaluation session to ask the host for parameters to format text for output abstract PrintDepth : int + /// Called by the evaluation session to ask the host for parameters to format text for output abstract PrintWidth : int + /// Called by the evaluation session to ask the host for parameters to format text for output abstract PrintLength : int @@ -265,7 +459,6 @@ type FsiEvaluationSessionHostConfig () = /// stripping things like "/use:file.fsx", "-r:Foo.dll" etc. abstract ReportUserCommandLineArgs : string [] -> unit - /// The evaluation session calls this to ask the host for the special console reader. /// Returning 'Some' indicates a console is to be used, so some special rules apply. /// @@ -306,13 +499,14 @@ type FsiEvaluationSessionHostConfig () = abstract UseFsiAuxLib : bool /// Hook for listening for evaluation bindings - member x.OnEvaluation = evaluationEvent.Publish + member _.OnEvaluation = evaluationEvent.Publish + member internal x.TriggerEvaluation (value, symbolUse, decl) = evaluationEvent.Trigger (EvaluationEventArgs (value, symbolUse, decl) ) /// Used to print value signatures along with their values, according to the current /// set of pretty printers installed in the system, and default printing rules. -type internal FsiValuePrinter(fsi: FsiEvaluationSessionHostConfig, tcConfigB: TcConfigBuilder, g: TcGlobals, generateDebugInfo, resolveAssemblyRef, outWriter: TextWriter) = +type internal FsiValuePrinter(fsi: FsiEvaluationSessionHostConfig, outWriter: TextWriter) = /// This printer is used by F# Interactive if no other printers apply. let DefaultPrintingIntercept (ienv: IEnvironment) (obj:obj) = @@ -382,13 +576,15 @@ type internal FsiValuePrinter(fsi: FsiEvaluationSessionHostConfig, tcConfigB: Tc ShowProperties = fsi.ShowProperties; ShowIEnumerable = fsi.ShowIEnumerable; } - /// Get the evaluation context used when inverting the storage mapping of the ILRuntimeWriter. - member _.GetEvaluationContext emEnv = - let cenv = { ilg = g.ilg ; emitTailcalls= tcConfigB.emitTailcalls; generatePdb = generateDebugInfo; resolveAssemblyRef=resolveAssemblyRef; tryFindSysILTypeRef=g.TryFindSysILTypeRef } - { LookupFieldRef = LookupFieldRef emEnv >> Option.get - LookupMethodRef = LookupMethodRef emEnv >> Option.get - LookupTypeRef = LookupTypeRef cenv emEnv - LookupType = LookupType cenv emEnv } + /// Get the evaluation context used when inverting the storage mapping of the ILDynamicAssemblyWriter. + member _.GetEvaluationContext (emEnv: ILAssemblyEmitEnv) = + match emEnv with + | SingleRefEmitAssembly (cenv, emEnv) -> + { LookupTypeRef = LookupTypeRef cenv emEnv + LookupType = LookupType cenv emEnv } + | MultipleInMemoryAssemblies emEnv -> + { LookupTypeRef = emEnv.LookupTypeRef + LookupType = emEnv.LookupType } /// Generate a layout for an actual F# value, where we know the value has the given static type. member _.PrintValue (printMode, opts:FormatOptions, x:obj, ty:Type) = @@ -447,13 +643,10 @@ type internal FsiValuePrinter(fsi: FsiEvaluationSessionHostConfig, tcConfigB: Tc StringLimit = max 0 (opts.PrintWidth-4) // 4 allows for an indent of 2 and 2 quotes (rough) PrintSize = opts.PrintSize / declaredValueReductionFactor } // print less let res = - try ilxGenerator.LookupGeneratedValue (valuePrinter.GetEvaluationContext emEnv, v) + try + ilxGenerator.LookupGeneratedValue (valuePrinter.GetEvaluationContext emEnv, v) with e -> - assert false -#if DEBUG - //fprintfn fsiConsoleOutput.Out "lookGenerateVal: failed on v=%+A v.Name=%s" v v.LogicalName -#endif - None // lookup may fail + None match res with | None -> None | Some (obj,objTy) -> @@ -495,15 +688,15 @@ type internal FsiStdinSyphon(errorWriter: TextWriter) = let syphonText = StringBuilder() /// Clears the syphon text - member x.Reset () = + member _.Reset () = syphonText.Clear() |> ignore /// Adds a new line to the syphon text - member x.Add (str:string) = + member _.Add (str:string) = syphonText.Append str |> ignore /// Gets the indicated line in the syphon text - member x.GetLine filename i = + member _.GetLine filename i = if filename <> stdinMockFilename then "" else @@ -537,23 +730,21 @@ type internal FsiStdinSyphon(errorWriter: TextWriter) = errorWriter.WriteLine() errorWriter.Flush())) - - /// Encapsulates functions used to write to outWriter and errorWriter type internal FsiConsoleOutput(tcConfigB, outWriter:TextWriter, errorWriter:TextWriter) = let nullOut = new StreamWriter(Stream.Null) :> TextWriter let fprintfnn (os: TextWriter) fmt = Printf.kfprintf (fun _ -> os.WriteLine(); os.WriteLine()) os fmt /// uprintf to write usual responses to stdout (suppressed by --quiet), with various pre/post newlines - member out.uprintf fmt = fprintf (if tcConfigB.noFeedback then nullOut else outWriter) fmt - member out.uprintfn fmt = fprintfn (if tcConfigB.noFeedback then nullOut else outWriter) fmt - member out.uprintfnn fmt = fprintfnn (if tcConfigB.noFeedback then nullOut else outWriter) fmt + member _.uprintf fmt = fprintf (if tcConfigB.noFeedback then nullOut else outWriter) fmt + member _.uprintfn fmt = fprintfn (if tcConfigB.noFeedback then nullOut else outWriter) fmt + member _.uprintfnn fmt = fprintfnn (if tcConfigB.noFeedback then nullOut else outWriter) fmt member out.uprintnf fmt = out.uprintfn ""; out.uprintf fmt member out.uprintnfn fmt = out.uprintfn ""; out.uprintfn fmt member out.uprintnfnn fmt = out.uprintfn ""; out.uprintfnn fmt - member out.Out = outWriter - member out.Error = errorWriter + member _.Out = outWriter + member _.Error = errorWriter /// This ErrorLogger reports all warnings, but raises StopProcessing on first error or early exit @@ -561,10 +752,10 @@ type internal ErrorLoggerThatStopsOnFirstError(tcConfigB:TcConfigBuilder, fsiStd inherit ErrorLogger("ErrorLoggerThatStopsOnFirstError") let mutable errorCount = 0 - member x.SetError() = + member _.SetError() = errorCount <- 1 - member x.ResetErrorCount() = errorCount <- 0 + member _.ResetErrorCount() = errorCount <- 0 override x.DiagnosticSink(err, severity) = if ReportDiagnosticAsError tcConfigB.errorSeverityOptions (err, severity) then @@ -750,13 +941,17 @@ type internal FsiCommandLineOptions(fsi: FsiEvaluationSessionHostConfig, CompilerOption("full-help", tagNone, OptionHelp (displayHelpFsi tcConfigB), None, None); // "Short form of --help"); ]); PublicOptions(FSComp.SR.optsHelpBannerAdvanced(), - [CompilerOption("exec", "", OptionUnit (fun () -> interact <- false), None, Some (FSIstrings.SR.fsiExec())); - CompilerOption("gui", tagNone, OptionSwitch(fun flag -> gui <- (flag = OptionSwitch.On)),None,Some (FSIstrings.SR.fsiGui())); + [CompilerOption("exec", "", OptionUnit (fun () -> interact <- false), None, Some (FSIstrings.SR.fsiExec())) + CompilerOption("gui", tagNone, OptionSwitch(fun flag -> gui <- (flag = OptionSwitch.On)),None,Some (FSIstrings.SR.fsiGui())) CompilerOption("quiet", "", OptionUnit (fun () -> tcConfigB.noFeedback <- true), None,Some (FSIstrings.SR.fsiQuiet())); - (* Renamed --readline and --no-readline to --tabcompletion:+|- *) - CompilerOption("readline", tagNone, OptionSwitch(fun flag -> enableConsoleKeyProcessing <- (flag = OptionSwitch.On)), None, Some(FSIstrings.SR.fsiReadline())); - CompilerOption("quotations-debug", tagNone, OptionSwitch(fun switch -> tcConfigB.emitDebugInfoInQuotations <- switch = OptionSwitch.On),None, Some(FSIstrings.SR.fsiEmitDebugInfoInQuotations())); - CompilerOption("shadowcopyreferences", tagNone, OptionSwitch(fun flag -> tcConfigB.shadowCopyReferences <- flag = OptionSwitch.On), None, Some(FSIstrings.SR.shadowCopyReferences())); + CompilerOption("readline", tagNone, OptionSwitch(fun flag -> enableConsoleKeyProcessing <- (flag = OptionSwitch.On)), None, Some(FSIstrings.SR.fsiReadline())) + CompilerOption("quotations-debug", tagNone, OptionSwitch(fun switch -> tcConfigB.emitDebugInfoInQuotations <- switch = OptionSwitch.On),None, Some(FSIstrings.SR.fsiEmitDebugInfoInQuotations())) + CompilerOption("shadowcopyreferences", tagNone, OptionSwitch(fun flag -> tcConfigB.shadowCopyReferences <- flag = OptionSwitch.On), None, Some(FSIstrings.SR.shadowCopyReferences())) +#if NETSTANDARD + CompilerOption("multiemit", tagNone, OptionSwitch(fun flag -> tcConfigB.fsiMultiAssemblyEmit <- flag = OptionSwitch.On), None, Some(FSIstrings.SR.fsiMultiAssemblyEmitOption())) +#else + CompilerOption("multiemit", tagNone, OptionSwitch(fun flag -> tcConfigB.fsiMultiAssemblyEmit <- flag = OptionSwitch.On), None, Some(FSIstrings.SR.fsiMultiAssemblyEmitOptionOffByDefault())) +#endif ]); ] @@ -822,7 +1017,7 @@ type internal FsiCommandLineOptions(fsi: FsiEvaluationSessionHostConfig, for msg in dependencyProvider.GetRegisteredDependencyManagerHelpText(tcConfigB.compilerToolPaths, getOutputDir tcConfigB, reportError m) do fsiConsoleOutput.uprintfn "%s" msg - fsiConsoleOutput.uprintfn """ #quit;; // %s""" (FSIstrings.SR.fsiIntroTextHashquitInfo()) (* last thing you want to do, last thing in the list - stands out more *) + fsiConsoleOutput.uprintfn """ #quit;; // %s""" (FSIstrings.SR.fsiIntroTextHashquitInfo()) fsiConsoleOutput.uprintfn ""; fsiConsoleOutput.uprintfnn "%s" (FSIstrings.SR.fsiIntroTextHeader2commandLine()) fsiConsoleOutput.uprintfn "%s" (FSIstrings.SR.fsiIntroTextHeader3(helpLine)) @@ -858,7 +1053,7 @@ let internal SetCurrentUICultureForThread (lcid : int option) = match lcid with | Some n -> Thread.CurrentThread.CurrentUICulture <- CultureInfo(n) | None -> () - { new IDisposable with member x.Dispose() = Thread.CurrentThread.CurrentUICulture <- culture } + { new IDisposable with member _.Dispose() = Thread.CurrentThread.CurrentUICulture <- culture } //---------------------------------------------------------------------------- // Reporting - warnings, errors @@ -913,11 +1108,12 @@ type internal FsiConsolePrompt(fsiOptions: FsiCommandLineOptions, fsiConsoleOutp let prompt = if fsiOptions.UseServerPrompt then "SERVER-PROMPT>\n" else "> " member _.Print() = if dropPrompt = 0 then fsiConsoleOutput.uprintf "%s" prompt else dropPrompt <- dropPrompt - 1 + member _.PrintAhead() = dropPrompt <- dropPrompt + 1; fsiConsoleOutput.uprintf "%s" prompt - member _.SkipNext() = dropPrompt <- dropPrompt + 1 - member _.FsiOptions = fsiOptions + member _.SkipNext() = dropPrompt <- dropPrompt + 1 + member _.FsiOptions = fsiOptions //---------------------------------------------------------------------------- // Startup processing @@ -976,7 +1172,7 @@ type internal FsiConsoleInput(fsi: FsiEvaluationSessionHostConfig, fsiOptions: F // FsiDynamicCompilerState //---------------------------------------------------------------------------- -type internal FsiInteractionStepStatus = +type FsiInteractionStepStatus = | CtrlC | EndOfFile | Completed of option @@ -985,25 +1181,25 @@ type internal FsiInteractionStepStatus = [] [] -type internal FsiDynamicCompilerState = - { optEnv : Optimizer.IncrementalOptimizationEnv - emEnv : emEnv - tcGlobals : TcGlobals - tcState : TcState - tcImports : TcImports - ilxGenerator : IlxAssemblyGenerator - boundValues : NameMap +type FsiDynamicCompilerState = + { optEnv: Optimizer.IncrementalOptimizationEnv + emEnv: ILAssemblyEmitEnv + tcGlobals: TcGlobals + tcState: TcState + tcImports: TcImports + ilxGenerator: IlxAssemblyGenerator + boundValues: NameMap // Why is this not in FsiOptions? - timing : bool - debugBreak : bool } + timing: bool + debugBreak: bool } -let internal WithImplicitHome (tcConfigB, dir) f = +let WithImplicitHome (tcConfigB, dir) f = let old = tcConfigB.implicitIncludeDir tcConfigB.implicitIncludeDir <- dir; try f() finally tcConfigB.implicitIncludeDir <- old -let internal convertReflectionTypeToILTypeRef (reflectionTy: Type) = +let convertReflectionTypeToILTypeRef (reflectionTy: Type) = if reflectionTy.Assembly.IsDynamic then raise (NotSupportedException(sprintf "Unable to import type, %A, from a dynamic assembly." reflectionTy)) @@ -1030,7 +1226,7 @@ let internal convertReflectionTypeToILTypeRef (reflectionTy: Type) = let nm = names.[names.Length - 1] ILTypeRef.Create(scoref, List.ofArray enc, nm) -let rec internal convertReflectionTypeToILType (reflectionTy: Type) = +let rec convertReflectionTypeToILType (reflectionTy: Type) = let arrayRank = if reflectionTy.IsArray then reflectionTy.GetArrayRank() else 0 let reflectionTy = // Special case functions. @@ -1113,37 +1309,161 @@ type internal FsiDynamicCompiler let ilGlobals = tcGlobals.ilg let outfile = "TMPFSCI.exe" - let assemblyName = "FSI-ASSEMBLY" + + let dynamicCcuName = "FSI-ASSEMBLY" + + let maxInternalsVisibleTo = 30 // In multi-assembly emit, how many future interactions can access internals with a warning let valueBoundEvent = Control.Event<_>() let mutable fragmentId = 0 + + static let mutable dynamicAssemblyId = 0 + let mutable prevIt : ValRef option = None + let dynamicAssemblies = ResizeArray() + let mutable needsPackageResolution = false let generateDebugInfo = tcConfigB.debuginfo - let valuePrinter = FsiValuePrinter(fsi, tcConfigB, tcGlobals, generateDebugInfo, resolveAssemblyRef, outWriter) + let valuePrinter = FsiValuePrinter(fsi, outWriter) - let assemblyBuilder,moduleBuilder = mkDynamicAssemblyAndModule (assemblyName, tcConfigB.optSettings.LocalOptimizationsEnabled, generateDebugInfo, fsiCollectible) + let builders = + if tcConfigB.fsiMultiAssemblyEmit then + None + else + let assemBuilder, moduleBuilder = mkDynamicAssemblyAndModule (dynamicCcuName, tcConfigB.optSettings.LocalOptimizationsEnabled, generateDebugInfo, fsiCollectible) + dynamicAssemblies.Add(assemBuilder) + Some (assemBuilder, moduleBuilder) - let rangeStdin = rangeN stdinMockFilename 0 + let rangeStdin0 = rangeN stdinMockFilename 0 //let _writer = moduleBuilder.GetSymWriter() let infoReader = InfoReader(tcGlobals,tcImports.GetImportMap()) /// Add attributes - let CreateModuleFragment (tcConfigB: TcConfigBuilder, assemblyName, codegenResults) = - if progress then fprintfn fsiConsoleOutput.Out "Creating main module..."; - let mainModule = mkILSimpleModule assemblyName (GetGeneratedILModuleName tcConfigB.target assemblyName) (tcConfigB.target = CompilerTarget.Dll) tcConfigB.subsystemVersion tcConfigB.useHighEntropyVA (mkILTypeDefs codegenResults.ilTypeDefs) None None 0x0 (mkILExportedTypes []) "" + let CreateModuleFragment (tcConfigB: TcConfigBuilder, dynamicCcuName, codegenResults) = + if progress then fprintfn fsiConsoleOutput.Out "Creating main module..." + let mainModule = mkILSimpleModule dynamicCcuName (GetGeneratedILModuleName tcConfigB.target dynamicCcuName) (tcConfigB.target = CompilerTarget.Dll) tcConfigB.subsystemVersion tcConfigB.useHighEntropyVA (mkILTypeDefs codegenResults.ilTypeDefs) None None 0x0 (mkILExportedTypes []) "" { mainModule with Manifest = (let man = mainModule.ManifestOfAssembly Some { man with CustomAttrsStored = storeILCustomAttrs (mkILCustomAttrs codegenResults.ilAssemAttrs) }) } - let ProcessCodegenResults (ctok, errorLogger: ErrorLogger, istate, optEnv, tcState: TcState, tcConfig, prefixPath, showTypes: bool, isIncrementalFragment, fragName, declaredImpls, ilxGenerator: IlxAssemblyGenerator, codegenResults) = + /// Generate one assembly using multi-assembly emit + let EmitInMemoryAssembly (tcConfig: TcConfig, emEnv: ILMultiInMemoryAssemblyEmitEnv, ilxMainModule: ILModuleDef, m) = + + // The name of the assembly is "FSI-ASSEMBLY1" etc + dynamicAssemblyId <- dynamicAssemblyId + 1 + + let multiAssemblyName = ilxMainModule.ManifestOfAssembly.Name + string dynamicAssemblyId + + // Adjust the assembly name of this fragment, and add InternalsVisibleTo attributes to + // allow internals access by multiple future assemblies + let manifest = + let manifest = ilxMainModule.Manifest.Value + let attrs = + [ for i in 1..maxInternalsVisibleTo do + let fwdAssemblyName = ilxMainModule.ManifestOfAssembly.Name + string (dynamicAssemblyId + i) + tcGlobals.MakeInternalsVisibleToAttribute(fwdAssemblyName) + yield! manifest.CustomAttrs.AsList() ] + { manifest with + Name = multiAssemblyName + CustomAttrsStored = storeILCustomAttrs (mkILCustomAttrs attrs) + } + + let ilxMainModule = { ilxMainModule with Manifest = Some manifest } + + // Check access of internals across fragments and give warning + let refs = computeILRefs ilGlobals ilxMainModule + + for tref in refs.TypeReferences do + if emEnv.IsLocalInternalType(tref) then + warning(Error((FSIstrings.SR.fsiInternalAccess(tref.FullName)), m)) + + for mref in refs.MethodReferences do + if emEnv.IsLocalInternalMethod(mref) then + warning(Error((FSIstrings.SR.fsiInternalAccess(mref.Name)), m)) + + for fref in refs.FieldReferences do + if emEnv.IsLocalInternalField(fref) then + warning(Error((FSIstrings.SR.fsiInternalAccess(fref.Name)), m)) + + // Rewrite references to local types to their respective dynamic assemblies + let ilxMainModule = + ilxMainModule |> Morphs.morphILTypeRefsInILModuleMemoized emEnv.MapTypeRef + + let opts = + { ilg = tcGlobals.ilg + // This is not actually written, because we are writing to a stream, + // but needs to be set for some logic of ilwrite to function. + outfile = multiAssemblyName + ".dll" + // This is not actually written, because we embed debug info, + // but needs to be set for some logic of ilwrite to function. + pdbfile = (if tcConfig.debuginfo then Some (multiAssemblyName + ".pdb") else None) + emitTailcalls = tcConfig.emitTailcalls + deterministic = tcConfig.deterministic + showTimes = tcConfig.showTimes + // we always use portable for F# Interactive debug emit + portablePDB = true + // we don't use embedded for F# Interactive debug emit + embeddedPDB = false + embedAllSource = tcConfig.embedAllSource + embedSourceList = tcConfig.embedSourceList + sourceLink = tcConfig.sourceLink + checksumAlgorithm = tcConfig.checksumAlgorithm + signer = None + dumpDebugInfo = tcConfig.dumpDebugInfo + pathMap = tcConfig.pathMap } + + let normalizeAssemblyRefs = id + + let assemblyBytes, pdbBytes = WriteILBinaryInMemory (opts, ilxMainModule, normalizeAssemblyRefs) + + let asm = + match pdbBytes with + | None -> Assembly.Load(assemblyBytes) + | Some pdbBytes -> Assembly.Load(assemblyBytes, pdbBytes) + + dynamicAssemblies.Add(asm) + + let loadedTypes = [ for t in asm.GetTypes() -> t] + ignore loadedTypes + + let ilScopeRef = ILScopeRef.Assembly (ILAssemblyRef.FromAssemblyName(asm.GetName())) + + // Collect up the entry points for initialization + let entries = + let rec loop enc (tdef: ILTypeDef) = + [ for mdef in tdef.Methods do + if mdef.IsEntryPoint then + yield mkRefForILMethod ilScopeRef (enc, tdef) mdef + for ntdef in tdef.NestedTypes do + yield! loop (enc@[tdef]) ntdef ] + [ for tdef in ilxMainModule.TypeDefs do yield! loop [] tdef ] + + // Make the 'exec' functions for the entry point initializations + let execs = + [ for edef in entries do + if edef.ArgCount = 0 then + yield + (fun () -> + let typ = asm.GetType(edef.DeclaringTypeRef.BasicQualifiedName) + try + ignore (typ.InvokeMember (edef.Name, BindingFlags.InvokeMethod ||| BindingFlags.Public ||| BindingFlags.NonPublic ||| BindingFlags.Static, null, null, [| |], Globalization.CultureInfo.InvariantCulture)) + None + with :? TargetInvocationException as e -> + Some e.InnerException) ] + + emEnv.AddModuleDef asm ilScopeRef ilxMainModule + + execs + + // Emit the codegen results using the assembly writer + let ProcessCodegenResults (ctok, errorLogger: ErrorLogger, istate, optEnv, tcState: TcState, tcConfig, prefixPath, showTypes: bool, isIncrementalFragment, fragName, declaredImpls, ilxGenerator: IlxAssemblyGenerator, codegenResults, m) = let emEnv = istate.emEnv // Each input is like a small separately compiled extension to a single source file. @@ -1152,45 +1472,72 @@ type internal FsiDynamicCompiler // optimizedImpls. ilxGenerator.AddIncrementalLocalAssemblyFragment (isIncrementalFragment, fragName, declaredImpls) - ReportTime tcConfig "TAST -> ILX"; - errorLogger.AbortOnError(fsiConsoleOutput); + ReportTime tcConfig "TAST -> ILX" + errorLogger.AbortOnError(fsiConsoleOutput) - ReportTime tcConfig "Linking"; - let ilxMainModule = CreateModuleFragment (tcConfigB, assemblyName, codegenResults) + ReportTime tcConfig "Linking" + let ilxMainModule = CreateModuleFragment (tcConfigB, dynamicCcuName, codegenResults) - errorLogger.AbortOnError(fsiConsoleOutput); + errorLogger.AbortOnError(fsiConsoleOutput) - ReportTime tcConfig "Assembly refs Normalised"; - let mainmod3 = Morphs.morphILScopeRefsInILModuleMemoized (NormalizeAssemblyRefs (ctok, ilGlobals, tcImports)) ilxMainModule - errorLogger.AbortOnError(fsiConsoleOutput); + ReportTime tcConfig "Assembly refs Normalised" + let ilxMainModule = Morphs.morphILScopeRefsInILModuleMemoized (NormalizeAssemblyRefs (ctok, ilGlobals, tcImports)) ilxMainModule + errorLogger.AbortOnError(fsiConsoleOutput) #if DEBUG if fsiOptions.ShowILCode then - fsiConsoleOutput.uprintnfn "--------------------"; - ILAsciiWriter.output_module outWriter ilGlobals mainmod3; + fsiConsoleOutput.uprintnfn "--------------------" + ILAsciiWriter.output_module outWriter ilGlobals ilxMainModule fsiConsoleOutput.uprintnfn "--------------------" #else ignore(fsiOptions) #endif - ReportTime tcConfig "Reflection.Emit"; + ReportTime tcConfig "Reflection.Emit" + + let emEnv, execs = + match emEnv with + | SingleRefEmitAssembly (cenv, emEnv) -> + + let assemblyBuilder, moduleBuilder = builders.Value + + let emEnv, execs = EmitDynamicAssemblyFragment (ilGlobals, tcConfig.emitTailcalls, emEnv, assemblyBuilder, moduleBuilder, ilxMainModule, generateDebugInfo, cenv.resolveAssemblyRef, tcGlobals.TryFindSysILTypeRef) - let emEnv,execs = emitModuleFragment(ilGlobals, tcConfig.emitTailcalls, emEnv, assemblyBuilder, moduleBuilder, mainmod3, generateDebugInfo, resolveAssemblyRef, tcGlobals.TryFindSysILTypeRef) + SingleRefEmitAssembly (cenv, emEnv), execs - errorLogger.AbortOnError(fsiConsoleOutput); + | MultipleInMemoryAssemblies emEnv -> + + let execs = EmitInMemoryAssembly (tcConfig, emEnv, ilxMainModule, m) + + MultipleInMemoryAssemblies emEnv, execs + + errorLogger.AbortOnError(fsiConsoleOutput) // Explicitly register the resources with the QuotationPickler module - // We would save them as resources into the dynamic assembly but there is missing - // functionality System.Reflection for dynamic modules that means they can't be read back out - let cenv = { ilg = ilGlobals ; emitTailcalls = tcConfig.emitTailcalls; generatePdb = generateDebugInfo; resolveAssemblyRef=resolveAssemblyRef; tryFindSysILTypeRef=tcGlobals.TryFindSysILTypeRef } - for referencedTypeDefs, bytes in codegenResults.quotationResourceInfo do - let referencedTypes = - [| for tref in referencedTypeDefs do - yield LookupTypeRef cenv emEnv tref |] - Microsoft.FSharp.Quotations.Expr.RegisterReflectedDefinitions (assemblyBuilder, fragName, bytes, referencedTypes); + match emEnv with + | SingleRefEmitAssembly (cenv, emEnv) -> + + let assemblyBuilder, _moduleBuilder = builders.Value + + for referencedTypeDefs, bytes in codegenResults.quotationResourceInfo do + let referencedTypes = + [| for tref in referencedTypeDefs do + yield LookupTypeRef cenv emEnv tref |] + Quotations.Expr.RegisterReflectedDefinitions (assemblyBuilder, fragName, bytes, referencedTypes) + | MultipleInMemoryAssemblies emEnv -> + // Get the last assembly emitted + let assembly = dynamicAssemblies.[dynamicAssemblies.Count-1] + + for referencedTypeDefs, bytes in codegenResults.quotationResourceInfo do + let referencedTypes = + [| for tref in referencedTypeDefs do + yield emEnv.LookupTypeRef tref |] + + Quotations.Expr.RegisterReflectedDefinitions (assembly, fragName, bytes, referencedTypes) + + ReportTime tcConfig "Run Bindings" - ReportTime tcConfig "Run Bindings"; timeReporter.TimeOpIf istate.timing (fun () -> execs |> List.iter (fun exec -> match exec() with @@ -1203,9 +1550,9 @@ type internal FsiDynamicCompiler | _ -> raise (StopProcessingExn (Some err)) - | None -> ())) ; + | None -> ())) - errorLogger.AbortOnError(fsiConsoleOutput); + errorLogger.AbortOnError(fsiConsoleOutput) // Echo the decls (reach inside wrapping) // This code occurs AFTER the execution of the declarations. @@ -1225,16 +1572,18 @@ type internal FsiDynamicCompiler let denv = denv.AddOpenPath (pathOfLid prefixPath) for TImplFile (implExprWithSig=mexpr) in declaredImpls do - let responseL = NicePrint.layoutInferredSigOfModuleExpr false denv infoReader AccessibleFromSomewhere rangeStdin mexpr + let responseL = NicePrint.layoutInferredSigOfModuleExpr false denv infoReader AccessibleFromSomewhere m mexpr if not (isEmptyL responseL) then let opts = valuePrinter.GetFsiPrintOptions() colorPrintL outWriter opts responseL // Build the new incremental state. - let istate = {istate with optEnv = optEnv; - emEnv = emEnv; - ilxGenerator = ilxGenerator; - tcState = tcState } + let istate = + { istate with + optEnv = optEnv + emEnv = emEnv + ilxGenerator = ilxGenerator + tcState = tcState } // Return the new state and the environment at the end of the last input, ready for further inputs. (istate,declaredImpls) @@ -1248,20 +1597,20 @@ type internal FsiDynamicCompiler fprintfn fsiConsoleOutput.Out "%+A" input #endif - errorLogger.AbortOnError(fsiConsoleOutput); + errorLogger.AbortOnError(fsiConsoleOutput) let importMap = tcImports.GetImportMap() // optimize: note we collect the incremental optimization environment - let optimizedImpls, _optData, optEnv = ApplyAllOptimizations (tcConfig, tcGlobals, (LightweightTcValForUsingInBuildMethodCall tcGlobals), outfile, importMap, isIncrementalFragment, optEnv, tcState.Ccu, declaredImpls) - errorLogger.AbortOnError(fsiConsoleOutput); + let optimizedImpls, _optData, optEnv = ApplyAllOptimizations (tcConfig, tcGlobals, LightweightTcValForUsingInBuildMethodCall tcGlobals, outfile, importMap, isIncrementalFragment, optEnv, tcState.Ccu, declaredImpls) + errorLogger.AbortOnError(fsiConsoleOutput) let fragName = textOfLid prefixPath let codegenResults = GenerateIlxCode (IlReflectBackend, isInteractiveItExpr, runningOnMono, tcConfig, topCustomAttrs, optimizedImpls, fragName, ilxGenerator) - errorLogger.AbortOnError(fsiConsoleOutput); + errorLogger.AbortOnError(fsiConsoleOutput) codegenResults, optEnv, fragName - let ProcessInputs (ctok, errorLogger: ErrorLogger, istate: FsiDynamicCompilerState, inputs: ParsedInput list, showTypes: bool, isIncrementalFragment: bool, isInteractiveItExpr: bool, prefixPath: LongIdent) = + let ProcessInputs (ctok, errorLogger: ErrorLogger, istate: FsiDynamicCompilerState, inputs: ParsedInput list, showTypes: bool, isIncrementalFragment: bool, isInteractiveItExpr: bool, prefixPath: LongIdent, m) = let optEnv = istate.optEnv let tcState = istate.tcState let ilxGenerator = istate.ilxGenerator @@ -1269,11 +1618,13 @@ type internal FsiDynamicCompiler // Typecheck. The lock stops the type checker running at the same time as the // server intellisense implementation (which is currently incomplete and #if disabled) - let (tcState:TcState), topCustomAttrs, declaredImpls, tcEnvAtEndOfLastInput = + let tcState, topCustomAttrs, declaredImpls, tcEnvAtEndOfLastInput = lock tcLockObject (fun _ -> TypeCheckClosedInputSet(ctok, errorLogger.CheckForErrors, tcConfig, tcImports, tcGlobals, Some prefixPath, tcState, inputs)) let codegenResults, optEnv, fragName = ProcessTypedImpl(errorLogger, optEnv, tcState, tcConfig, isInteractiveItExpr, topCustomAttrs, prefixPath, isIncrementalFragment, declaredImpls, ilxGenerator) - let newState, declaredImpls = ProcessCodegenResults(ctok, errorLogger, istate, optEnv, tcState, tcConfig, prefixPath, showTypes, isIncrementalFragment, fragName, declaredImpls, ilxGenerator, codegenResults) + + let newState, declaredImpls = ProcessCodegenResults(ctok, errorLogger, istate, optEnv, tcState, tcConfig, prefixPath, showTypes, isIncrementalFragment, fragName, declaredImpls, ilxGenerator, codegenResults, m) + (newState, tcEnvAtEndOfLastInput, declaredImpls) let tryGetGeneratedValue istate cenv v = @@ -1283,11 +1634,13 @@ type internal FsiDynamicCompiler | _ -> None - let nextFragmentId() = fragmentId <- fragmentId + 1; fragmentId + let nextFragmentId() = + fragmentId <- fragmentId + 1 + fragmentId - let mkFragmentPath i = + let mkFragmentPath m i = // NOTE: this text shows in exn traces and type names. Make it clear and fixed width - [mkSynId rangeStdin (FsiDynamicModulePrefix + sprintf "%04d" i)] + [mkSynId m (FsiDynamicModulePrefix + sprintf "%04d" i)] let processContents istate declaredImpls = let tcState = istate.tcState @@ -1366,7 +1719,8 @@ type internal FsiDynamicCompiler | ValueSome tcref -> match tcref.CompilationPath.ILScopeRef with | ILScopeRef.Assembly aref -> - (tcImports.GetImportedAssemblies() |> List.find (fun x -> x.FSharpViewOfMetadata.AssemblyName = aref.Name)) :: ccuinfos + let ccuinfo = tcImports.GetImportedAssemblies() |> List.find (fun x -> x.FSharpViewOfMetadata.AssemblyName = aref.Name) + ccuinfo :: ccuinfos | _ -> ccuinfos | _ -> @@ -1386,33 +1740,46 @@ type internal FsiDynamicCompiler addCcusToIncrementalEnv state ccuinfos, ty let ilTys = convertReflectionTypeToILType reflectionTy - - ilTys - |> List.fold (fun (state, addedTypes) ilTy -> + + // Rewrite references to dynamic .NET assemblies back to dynamicCcuName + let ilTys = + ilTys |> List.map (fun ilTy -> + match istate.emEnv with + | MultipleInMemoryAssemblies emEnv -> + ilTy |> Morphs.morphILTypeRefsInILType emEnv.ReverseMapTypeRef + | _ -> ilTy) + + ((istate, []), ilTys) ||> List.fold (fun (state, addedTypes) ilTy -> let nextState, addedType = addTypeToEnvironment state ilTy - nextState, addedTypes @ [addedType]) (istate, []) + nextState, addedTypes @ [addedType]) - member _.DynamicAssemblyName = assemblyName + member _.DynamicAssemblies = dynamicAssemblies.ToArray() - member _.DynamicAssembly = (assemblyBuilder :> Assembly) + member _.FindDynamicAssembly(simpleAssemName) = + dynamicAssemblies |> ResizeArray.tryFind (fun asm -> asm.GetName().Name = simpleAssemName) - member _.EvalParsedSourceFiles (ctok, errorLogger, istate, inputs) = + member _.EvalParsedSourceFiles (ctok, errorLogger, istate, inputs, m) = let i = nextFragmentId() - let prefix = mkFragmentPath i + let prefix = mkFragmentPath m i // Ensure the path includes the qualifying name let inputs = inputs |> List.map (PrependPathToInput prefix) - let istate,_,_ = ProcessInputs (ctok, errorLogger, istate, inputs, true, false, false, prefix) + let isIncrementalFragment = false + let istate,_,_ = ProcessInputs (ctok, errorLogger, istate, inputs, true, isIncrementalFragment, false, prefix, m) istate /// Evaluate the given definitions and produce a new interactive state. - member _.EvalParsedDefinitions (ctok, errorLogger: ErrorLogger, istate, showTypes, isInteractiveItExpr, defs) = + member _.EvalParsedDefinitions (ctok, errorLogger: ErrorLogger, istate, showTypes, isInteractiveItExpr, defs: SynModuleDecl list) = let filename = stdinMockFilename let i = nextFragmentId() - let prefix = mkFragmentPath i + let m = match defs with [] -> rangeStdin0 | _ -> List.reduce unionRanges [for d in defs -> d.Range] + let prefix = mkFragmentPath m i let prefixPath = pathOfLid prefix - let impl = SynModuleOrNamespace(prefix,(*isRec*)false, SynModuleOrNamespaceKind.NamedModule,defs,PreXmlDoc.Empty,[],None,rangeStdin) - let input = ParsedInput.ImplFile (ParsedImplFileInput (filename,true, ComputeQualifiedNameOfFileFromUniquePath (rangeStdin,prefixPath),[],[],[impl],(true (* isLastCompiland *), false (* isExe *)) )) - let istate,tcEnvAtEndOfLastInput,declaredImpls = ProcessInputs (ctok, errorLogger, istate, [input], showTypes, true, isInteractiveItExpr, prefix) + let impl = SynModuleOrNamespace(prefix,(*isRec*)false, SynModuleOrNamespaceKind.NamedModule,defs,PreXmlDoc.Empty,[],None,m) + let isLastCompiland = true + let isExe = false + let input = ParsedInput.ImplFile (ParsedImplFileInput (filename,true, ComputeQualifiedNameOfFileFromUniquePath (m,prefixPath),[],[],[impl],(isLastCompiland, isExe) )) + let isIncrementalFragment = true + let istate,tcEnvAtEndOfLastInput,declaredImpls = ProcessInputs (ctok, errorLogger, istate, [input], showTypes, isIncrementalFragment, isInteractiveItExpr, prefix, m) let tcState = istate.tcState let newState = { istate with tcState = tcState.NextStateAfterIncrementalFragment(tcEnvAtEndOfLastInput) } processContents newState declaredImpls @@ -1442,7 +1809,7 @@ type internal FsiDynamicCompiler prevIt <- Some vref // - let optValue = istate.ilxGenerator.LookupGeneratedValue(valuePrinter.GetEvaluationContext(istate.emEnv), vref.Deref); + let optValue = istate.ilxGenerator.LookupGeneratedValue(valuePrinter.GetEvaluationContext(istate.emEnv), vref.Deref) match optValue with | Some (res, ty) -> istate, Completed(Some(FsiValue(res, ty, FSharpType(tcGlobals, istate.tcState.Ccu, istate.tcState.CcuSig, istate.tcImports, vref.Type)))) | _ -> istate, Completed None @@ -1454,20 +1821,13 @@ type internal FsiDynamicCompiler member _.BuildItBinding (expr: SynExpr) = let m = expr.Range let itName = "it" - let itID = mkSynId m itName - //let itExp = SynExpr.Ident itID - let mkBind pat expr = SynBinding (None, SynBindingKind.Do, false, (*mutable*)false, [], PreXmlDoc.Empty, SynInfo.emptySynValData, pat, None, expr, m, DebugPointAtBinding.NoneAtInvisible, SynBindingTrivia.Zero) - let bindingA = mkBind (mkSynPatVar None itID) expr (* let it = *) // NOTE: the generalizability of 'expr' must not be damaged, e.g. this can't be an application - //let saverPath = ["Microsoft";"FSharp";"Compiler";"Interactive";"RuntimeHelpers";"SaveIt"] - //let dots = List.replicate (saverPath.Length - 1) m - //let bindingB = mkBind (SynPat.Wild m) (SynExpr.App (ExprAtomicFlag.NonAtomic, false, SynExpr.LongIdent (false, LongIdentWithDots(List.map (mkSynId m) saverPath,dots),None,m), itExp,m)) (* let _ = saverPath it *) + let mkBind pat expr = SynBinding (None, SynBindingKind.Do, false, false, [], PreXmlDoc.Empty, SynInfo.emptySynValData, pat, None, expr, m, DebugPointAtBinding.NoneAtInvisible, SynBindingTrivia.Zero) + let bindingA = mkBind (mkSynPatVar None itID) expr let defA = SynModuleDecl.Let (false, [bindingA], m) - //let defB = SynModuleDecl.Let (false, [bindingB], m) - - [defA (* ; defB *) ] + [defA] - // construct an invisible call to Debugger.Break(), in the specified range + // Construct an invisible call to Debugger.Break(), in the specified range member _.CreateDebuggerBreak (m : range) = let breakPath = ["System";"Diagnostics";"Debugger";"Break"] let dots = List.replicate (breakPath.Length - 1) m @@ -1485,8 +1845,8 @@ type internal FsiDynamicCompiler let tcState = istate.tcState let tcEnv,(_dllinfos,ccuinfos) = try - RequireDLL (ctok, tcImports, tcState.TcEnvFromImpls, assemblyName, m, path) - with e -> + RequireDLL (ctok, tcImports, tcState.TcEnvFromImpls, dynamicCcuName, m, path) + with _ -> tcConfigB.RemoveReferencedAssemblyByPath(m,path) reraise() resolutions, @@ -1625,7 +1985,7 @@ type internal FsiDynamicCompiler errorLogger.AbortOnError(fsiConsoleOutput); let istate = (istate, sourceFiles, inputs) |||> List.fold2 (fun istate sourceFile input -> fsiDynamicCompiler.ProcessMetaCommandsFromInputAsInteractiveCommands(ctok, istate, sourceFile, input)) - fsiDynamicCompiler.EvalParsedSourceFiles (ctok, errorLogger, istate, inputs) + fsiDynamicCompiler.EvalParsedSourceFiles (ctok, errorLogger, istate, inputs, m) member _.GetBoundValues istate = let cenv = SymbolEnv(istate.tcGlobals, istate.tcState.Ccu, Some istate.tcState.CcuSig, istate.tcImports) @@ -1650,7 +2010,7 @@ type internal FsiDynamicCompiler | _ -> None - member this.AddBoundValue (ctok, errorLogger: ErrorLogger, istate, name: string, value: obj) = + member _.AddBoundValue (ctok, errorLogger: ErrorLogger, istate, name: string, value: obj) = try match value with | null -> nullArg "value" @@ -1675,9 +2035,10 @@ type internal FsiDynamicCompiler let amap = istate.tcImports.GetImportMap() let i = nextFragmentId() - let prefix = mkFragmentPath i + let m = rangeStdin0 + let prefix = mkFragmentPath m i let prefixPath = pathOfLid prefix - let qualifiedName = ComputeQualifiedNameOfFileFromUniquePath (rangeStdin,prefixPath) + let qualifiedName = ComputeQualifiedNameOfFileFromUniquePath (m,prefixPath) let tcConfig = TcConfig.Create(tcConfigB,validate=false) @@ -1693,7 +2054,7 @@ type internal FsiDynamicCompiler let showTypes = false let declaredImpls = [impl] let codegenResults, optEnv, fragName = ProcessTypedImpl(errorLogger, istate.optEnv, istate.tcState, tcConfig, false, EmptyTopAttrs, prefix, isIncrementalFragment, declaredImpls, ilxGenerator) - let istate, declaredImpls = ProcessCodegenResults(ctok, errorLogger, istate, optEnv, istate.tcState, tcConfig, prefix, showTypes, isIncrementalFragment, fragName, declaredImpls, ilxGenerator, codegenResults) + let istate, declaredImpls = ProcessCodegenResults(ctok, errorLogger, istate, optEnv, istate.tcState, tcConfig, prefix, showTypes, isIncrementalFragment, fragName, declaredImpls, ilxGenerator, codegenResults, m) let newState = { istate with tcState = istate.tcState.NextStateAfterIncrementalFragment tcEnvAtEndOfLastInput } // Force set the val with the given value obj. @@ -1701,22 +2062,31 @@ type internal FsiDynamicCompiler ilxGenerator.ForceSetGeneratedValue(ctxt, v, value) processContents newState declaredImpls - with - | ex -> + with ex -> istate, CompletedWithReportedError(StopProcessingExn(Some ex)) member _.GetInitialInteractiveState () = let tcConfig = TcConfig.Create(tcConfigB,validate=false) let optEnv0 = GetInitialOptimizationEnv (tcImports, tcGlobals) - let emEnv = emEnv0 - let tcEnv, openDecls0 = GetInitialTcEnv (assemblyName, rangeStdin, tcConfig, tcImports, tcGlobals) - let ccuName = assemblyName - let tcState = GetInitialTcState (rangeStdin, ccuName, tcConfig, tcGlobals, tcImports, niceNameGen, tcEnv, openDecls0) + let emEnv0 = + if tcConfigB.fsiMultiAssemblyEmit then + let emEnv = ILMultiInMemoryAssemblyEmitEnv(ilGlobals, resolveAssemblyRef, dynamicCcuName) + MultipleInMemoryAssemblies emEnv + else + let cenv = { ilg = ilGlobals; emitTailcalls = tcConfig.emitTailcalls; generatePdb = generateDebugInfo; resolveAssemblyRef=resolveAssemblyRef; tryFindSysILTypeRef=tcGlobals.TryFindSysILTypeRef } + let emEnv = ILDynamicAssemblyWriter.emEnv0 + SingleRefEmitAssembly (cenv, emEnv) + + let tcEnv, openDecls0 = GetInitialTcEnv (dynamicCcuName, rangeStdin0, tcConfig, tcImports, tcGlobals) + let ccuName = dynamicCcuName + + let tcState = GetInitialTcState (rangeStdin0, ccuName, tcConfig, tcGlobals, tcImports, niceNameGen, tcEnv, openDecls0) let ilxGenerator = CreateIlxAssemblyGenerator (tcConfig, tcImports, tcGlobals, (LightweightTcValForUsingInBuildMethodCall tcGlobals), tcState.Ccu) + {optEnv = optEnv0 - emEnv = emEnv + emEnv = emEnv0 tcGlobals = tcGlobals tcState = tcState tcImports = tcImports @@ -1828,7 +2198,7 @@ type internal FsiInterruptController(fsiOptions: FsiCommandLineOptions, fsiConso ctrlEventActions <- raiseCtrlC :: ctrlEventActions exitViaKillThread <- false // don't exit via kill thread - member x.PosixInvoke(n:int) = + member _.PosixInvoke(n:int) = // we run this code once with n = -1 to make sure it is JITted before execution begins // since we are not allowed to JIT a signal handler. This also ensures the "PosixInvoke" // method is not eliminated by dead-code elimination @@ -1896,7 +2266,7 @@ module internal MagicAssemblyResolution = let Install(tcConfigB, tcImports: TcImports, fsiDynamicCompiler: FsiDynamicCompiler, fsiConsoleOutput: FsiConsoleOutput) = - let ResolveAssembly (ctok, m, tcConfigB, tcImports: TcImports, fsiDynamicCompiler: FsiDynamicCompiler, fsiConsoleOutput: FsiConsoleOutput, fullAssemName: string) = + let ResolveAssembly (ctok, m, tcConfigB, tcImports: TcImports, _fsiDynamicCompiler: FsiDynamicCompiler, fsiConsoleOutput: FsiConsoleOutput, fullAssemName: string) = try // Grab the name of the assembly @@ -1911,9 +2281,9 @@ module internal MagicAssemblyResolution = simpleAssemName.EndsWith(".XmlSerializers", StringComparison.OrdinalIgnoreCase) || (runningOnMono && simpleAssemName = "UIAutomationWinforms") then null else - // Special case: Is this the global unique dynamic assembly for FSI code? In this case just - // return the dynamic assembly itself. - if fsiDynamicCompiler.DynamicAssemblyName = simpleAssemName then fsiDynamicCompiler.DynamicAssembly else + match fsiDynamicCompiler.FindDynamicAssembly(simpleAssemName) with + | Some asm -> asm + | None -> // Otherwise continue let assemblyReferenceTextDll = (simpleAssemName + ".dll") @@ -1994,18 +2364,18 @@ module internal MagicAssemblyResolution = stopProcessingRecovery e range0 null - let rangeStdin = rangeN stdinMockFilename 0 + let rangeStdin0 = rangeN stdinMockFilename 0 let resolveAssembly = ResolveEventHandler(fun _ args -> // Explanation: our understanding is that magic assembly resolution happens // during compilation. So we recover the CompilationThreadToken here. let ctok = AssumeCompilationThreadWithoutEvidence () - ResolveAssembly (ctok, rangeStdin, tcConfigB, tcImports, fsiDynamicCompiler, fsiConsoleOutput, args.Name)) + ResolveAssembly (ctok, rangeStdin0, tcConfigB, tcImports, fsiDynamicCompiler, fsiConsoleOutput, args.Name)) AppDomain.CurrentDomain.add_AssemblyResolve(resolveAssembly) { new IDisposable with - member x.Dispose() = + member _.Dispose() = AppDomain.CurrentDomain.remove_AssemblyResolve(resolveAssembly) } @@ -2144,7 +2514,7 @@ type internal FsiInteractionProcessor stopProcessingRecovery e range0 istate, CompletedWithReportedError e - let rangeStdin = rangeN stdinMockFilename 0 + let rangeStdin0 = rangeN stdinMockFilename 0 let ChangeDirectory (path:string) m = let tcConfig = TcConfig.Create(tcConfigB,validate=false) @@ -2324,13 +2694,16 @@ type internal FsiInteractionProcessor cancellationToken.ThrowIfCancellationRequested() let action,nextAction,istate = match action with - | None -> None,None,istate - | Some (ParsedScriptInteraction.HashDirective _) -> action,None,istate - | Some (ParsedScriptInteraction.Definitions ([],_)) -> None,None,istate + | None -> None,None,istate + + | Some (ParsedScriptInteraction.HashDirective _) -> action,None,istate + + | Some (ParsedScriptInteraction.Definitions ([],_)) -> None,None,istate + | Some (ParsedScriptInteraction.Definitions (SynModuleDecl.HashDirective(hash,mh) :: defs,m)) -> Some (ParsedScriptInteraction.HashDirective(hash,mh)),Some (ParsedScriptInteraction.Definitions(defs,m)),istate - | Some (ParsedScriptInteraction.Definitions (defs,m)) -> + | Some (ParsedScriptInteraction.Definitions (defs,m)) -> let isDefHash = function SynModuleDecl.HashDirective _ -> true | _ -> false let isBreakable def = // only add automatic debugger breaks before 'let' or 'do' expressions with sequence points @@ -2515,7 +2888,7 @@ type internal FsiInteractionProcessor | [] -> istate | sourceFile :: moreSourceFiles -> // Catch errors on a per-file basis, so results/bindings from pre-error files can be kept. - let istate,cont = InteractiveCatch errorLogger (fun istate -> processor.EvalIncludedScript (ctok, istate, sourceFile, rangeStdin, errorLogger)) istate + let istate,cont = InteractiveCatch errorLogger (fun istate -> processor.EvalIncludedScript (ctok, istate, sourceFile, rangeStdin0, errorLogger)) istate match cont with | Completed _ -> processor.EvalIncludedScripts (ctok, istate, moreSourceFiles, errorLogger) | CompletedWithAlreadyReportedError -> istate // do not process any more files @@ -2536,7 +2909,7 @@ type internal FsiInteractionProcessor if isScript1 then processor.EvalIncludedScripts (ctok, istate, sourceFiles, errorLogger) else - istate |> InteractiveCatch errorLogger (fun istate -> fsiDynamicCompiler.EvalSourceFiles(ctok, istate, rangeStdin, sourceFiles, lexResourceManager, errorLogger), Completed None) |> fst + istate |> InteractiveCatch errorLogger (fun istate -> fsiDynamicCompiler.EvalSourceFiles(ctok, istate, rangeStdin0, sourceFiles, lexResourceManager, errorLogger), Completed None) |> fst consume istate rest setCurrState (consume currState fsiOptions.SourceFiles) @@ -2683,7 +3056,7 @@ type internal FsiInteractionProcessor let ad = tcState.TcEnvFromImpls.AccessRights let nenv = tcState.TcEnvFromImpls.NameEnv - let nItems = ResolvePartialLongIdent ncenv nenv (ConstraintSolver.IsApplicableMethApprox istate.tcGlobals amap rangeStdin) rangeStdin ad lid false + let nItems = ResolvePartialLongIdent ncenv nenv (ConstraintSolver.IsApplicableMethApprox istate.tcGlobals amap rangeStdin0) rangeStdin0 ad lid false let names = nItems |> List.map (fun d -> d.DisplayName) let names = names |> List.filter (fun name -> name.StartsWithOrdinal(stem)) names @@ -2809,6 +3182,10 @@ type FsiEvaluationSession (fsi: FsiEvaluationSessionHostConfig, argv:string[], i do if isRunningOnCoreClr then SetTargetProfile tcConfigB "netcore" // always assume System.Runtime codegen #endif + // Preset: --multiemit- on .NET Framework and Mono + do if not isRunningOnCoreClr then + tcConfigB.fsiMultiAssemblyEmit <- false + // Preset: --optimize+ -g --tailcalls+ (see 4505) do SetOptimizeSwitch tcConfigB OptionSwitch.On do SetDebugSwitch tcConfigB (Some "pdbonly") OptionSwitch.On @@ -2953,43 +3330,44 @@ type FsiEvaluationSession (fsi: FsiEvaluationSessionHostConfig, argv:string[], i let dummyScriptFileName = "input.fsx" interface IDisposable with - member x.Dispose() = + member _.Dispose() = (tcImports :> IDisposable).Dispose() uninstallMagicAssemblyResolution.Dispose() /// Load the dummy interaction, load the initial files, and, /// if interacting, start the background thread to read the standard input. - member x.Interrupt() = fsiInterruptController.Interrupt() + member _.Interrupt() = fsiInterruptController.Interrupt() /// A host calls this to get the completions for a long identifier, e.g. in the console - member x.GetCompletions(longIdent) = + member _.GetCompletions(longIdent) = fsiInteractionProcessor.CompletionsForPartialLID (fsiInteractionProcessor.CurrentState, longIdent) |> Seq.ofList - member x.ParseAndCheckInteraction(code) = + member _.ParseAndCheckInteraction(code) = fsiInteractionProcessor.ParseAndCheckInteraction (legacyReferenceResolver, fsiInteractionProcessor.CurrentState, code) |> Cancellable.runWithoutCancellation - member x.InteractiveChecker = checker + member _.InteractiveChecker = checker - member x.CurrentPartialAssemblySignature = + member _.CurrentPartialAssemblySignature = fsiDynamicCompiler.CurrentPartialAssemblySignature fsiInteractionProcessor.CurrentState - member x.DynamicAssembly = - fsiDynamicCompiler.DynamicAssembly + member _.DynamicAssemblies = + fsiDynamicCompiler.DynamicAssemblies /// A host calls this to determine if the --gui parameter is active - member x.IsGui = fsiOptions.Gui + member _.IsGui = fsiOptions.Gui /// A host calls this to get the active language ID if provided by fsi-server-lcid - member x.LCID = fsiOptions.FsiLCID + member _.LCID = fsiOptions.FsiLCID #if FX_NO_APP_DOMAINS - member x.ReportUnhandledException (exn:exn) = ignore exn; () + member _.ReportUnhandledException (exn:exn) = ignore exn; () #else + /// A host calls this to report an unhandled exception in a standard way, e.g. an exception on the GUI thread gets printed to stderr member x.ReportUnhandledException exn = x.ReportUnhandledExceptionSafe true exn - member x.ReportUnhandledExceptionSafe isFromThreadException (exn:exn) = + member _.ReportUnhandledExceptionSafe isFromThreadException (exn:exn) = fsi.EventLoopInvoke ( fun () -> fprintfn fsiConsoleOutput.Error "%s" (exn.ToString()) @@ -3051,13 +3429,13 @@ type FsiEvaluationSession (fsi: FsiEvaluationSessionHostConfig, argv:string[], i ) #endif - member x.PartialAssemblySignatureUpdated = fsiInteractionProcessor.PartialAssemblySignatureUpdated + member _.PartialAssemblySignatureUpdated = fsiInteractionProcessor.PartialAssemblySignatureUpdated - member x.FormatValue(reflectionValue:obj, reflectionType) = + member _.FormatValue(reflectionValue:obj, reflectionType) = fsiDynamicCompiler.FormatValue(reflectionValue, reflectionType) - member x.EvalExpression(code) = + member _.EvalExpression(code) = // Explanation: When the user of the FsiInteractiveSession object calls this method, the // code is parsed, checked and evaluated on the calling thread. This means EvalExpression @@ -3067,7 +3445,7 @@ type FsiEvaluationSession (fsi: FsiEvaluationSessionHostConfig, argv:string[], i fsiInteractionProcessor.EvalExpression(ctok, code, dummyScriptFileName, errorLogger) |> commitResult - member x.EvalExpressionNonThrowing(code) = + member _.EvalExpressionNonThrowing(code) = // Explanation: When the user of the FsiInteractiveSession object calls this method, the // code is parsed, checked and evaluated on the calling thread. This means EvalExpression // is not safe to call concurrently. @@ -3078,7 +3456,7 @@ type FsiEvaluationSession (fsi: FsiEvaluationSessionHostConfig, argv:string[], i fsiInteractionProcessor.EvalExpression(ctok, code, dummyScriptFileName, errorLogger) |> commitResultNonThrowing errorOptions dummyScriptFileName errorLogger - member x.EvalInteraction(code, ?cancellationToken) : unit = + member _.EvalInteraction(code, ?cancellationToken) : unit = // Explanation: When the user of the FsiInteractiveSession object calls this method, the // code is parsed, checked and evaluated on the calling thread. This means EvalExpression // is not safe to call concurrently. @@ -3088,7 +3466,7 @@ type FsiEvaluationSession (fsi: FsiEvaluationSessionHostConfig, argv:string[], i |> commitResult |> ignore - member x.EvalInteractionNonThrowing(code, ?cancellationToken) = + member _.EvalInteractionNonThrowing(code, ?cancellationToken) = // Explanation: When the user of the FsiInteractiveSession object calls this method, the // code is parsed, checked and evaluated on the calling thread. This means EvalExpression // is not safe to call concurrently. @@ -3100,7 +3478,7 @@ type FsiEvaluationSession (fsi: FsiEvaluationSessionHostConfig, argv:string[], i fsiInteractionProcessor.EvalInteraction(ctok, code, dummyScriptFileName, errorLogger, cancellationToken) |> commitResultNonThrowing errorOptions "input.fsx" errorLogger - member x.EvalScript(filePath) : unit = + member _.EvalScript(filePath) : unit = // Explanation: When the user of the FsiInteractiveSession object calls this method, the // code is parsed, checked and evaluated on the calling thread. This means EvalExpression // is not safe to call concurrently. @@ -3110,7 +3488,7 @@ type FsiEvaluationSession (fsi: FsiEvaluationSessionHostConfig, argv:string[], i |> commitResult |> ignore - member x.EvalScriptNonThrowing(filePath) = + member _.EvalScriptNonThrowing(filePath) = // Explanation: When the user of the FsiInteractiveSession object calls this method, the // code is parsed, checked and evaluated on the calling thread. This means EvalExpression // is not safe to call concurrently. @@ -3277,17 +3655,17 @@ module Settings = restart | _ -> run() run(); - member x.Invoke(f : unit -> 'T) : 'T = + member _.Invoke(f : unit -> 'T) : 'T = queue <- [f >> box] setSignal runSignal waitSignal doneSignal result.Value |> unbox - member x.ScheduleRestart() = + member _.ScheduleRestart() = if running then restart <- true setSignal exitSignal interface IDisposable with - member x.Dispose() = + member _.Dispose() = runSignal.Dispose() exitSignal.Dispose() doneSignal.Dispose() @@ -3380,7 +3758,7 @@ type CompilerInputStream() = bytes.Length /// Feeds content into the stream. - member x.Add(str:string) = + member _.Add(str:string) = if (String.IsNullOrEmpty(str)) then () else lock readQueue (fun () -> @@ -3388,8 +3766,6 @@ type CompilerInputStream() = for i in 0 .. bytes.Length - 1 do readQueue.Enqueue(bytes.[i])) - - /// Defines a write-only stream used to capture output of the hosted F# Interactive dynamic compiler. [] type CompilerOutputStream() = @@ -3415,7 +3791,7 @@ type CompilerOutputStream() = for i in offset .. stop - 1 do contentQueue.Enqueue(buffer.[i])) - member x.Read() = + member _.Read() = lock contentQueue (fun () -> let n = contentQueue.Count if (n > 0) then diff --git a/src/fsharp/fsi/fsi.fsi b/src/fsharp/fsi/fsi.fsi index 30c1144455..40b263e2ef 100644 --- a/src/fsharp/fsi/fsi.fsi +++ b/src/fsharp/fsi/fsi.fsi @@ -241,8 +241,8 @@ type FsiEvaluationSession = /// Get a handle to the resolved view of the current signature of the incrementally generated assembly. member CurrentPartialAssemblySignature: FSharpAssemblySignature - /// Get a handle to the dynamically generated assembly - member DynamicAssembly: System.Reflection.Assembly + /// Get all the dynamically generated assemblies + member DynamicAssemblies: System.Reflection.Assembly[] /// A host calls this to determine if the --gui parameter is active member IsGui: bool diff --git a/src/fsharp/fsi/xlf/FSIstrings.txt.cs.xlf b/src/fsharp/fsi/xlf/FSIstrings.txt.cs.xlf index e7c41ab141..10658db3e6 100644 --- a/src/fsharp/fsi/xlf/FSIstrings.txt.cs.xlf +++ b/src/fsharp/fsi/xlf/FSIstrings.txt.cs.xlf @@ -2,11 +2,21 @@ + + Accessing the internal type, method or field '{0}' from a previous evaluation in F# Interactive is deprecated and may cause subsequent access errors. To enable the legacy generation of a single dynamic assembly that can access internals, use the '--multiemit-' option. + Accessing the internal type, method or field '{0}' from a previous evaluation in F# Interactive is deprecated and may cause subsequent access errors. To enable the legacy generation of a single dynamic assembly that can access internals, use the '--multiemit-' option. + + Include package source uri when searching for packages Při vyhledávání balíčků zahrnout identifikátor zdroje balíčku + + Emit multiple assemblies (off by default for .NET Framework) + Emit multiple assemblies (off by default for .NET Framework) + + Operation could not be completed due to earlier error Operaci nešlo dokončit z důvodu dřívější chyby. @@ -17,6 +27,11 @@ Operace nebyla úspěšná. Text chyby se vytiskl do streamu chyb. Pokud chcete vrátit odpovídající FSharpDiagnostic, použijte EvalInteractionNonThrowing, EvalScriptNonThrowing nebo EvalExpressionNonThrowing. + + Emit multiple assemblies (on by default) + Emit multiple assemblies (on by default) + + Stopped due to error\n Zastavilo se kvůli chybě.\n diff --git a/src/fsharp/fsi/xlf/FSIstrings.txt.de.xlf b/src/fsharp/fsi/xlf/FSIstrings.txt.de.xlf index e75d448790..2c9cda0941 100644 --- a/src/fsharp/fsi/xlf/FSIstrings.txt.de.xlf +++ b/src/fsharp/fsi/xlf/FSIstrings.txt.de.xlf @@ -2,11 +2,21 @@ + + Accessing the internal type, method or field '{0}' from a previous evaluation in F# Interactive is deprecated and may cause subsequent access errors. To enable the legacy generation of a single dynamic assembly that can access internals, use the '--multiemit-' option. + Accessing the internal type, method or field '{0}' from a previous evaluation in F# Interactive is deprecated and may cause subsequent access errors. To enable the legacy generation of a single dynamic assembly that can access internals, use the '--multiemit-' option. + + Include package source uri when searching for packages URI der Paketquelle bei Suche nach Paketen einschließen + + Emit multiple assemblies (off by default for .NET Framework) + Emit multiple assemblies (off by default for .NET Framework) + + Operation could not be completed due to earlier error Der Vorgang konnte aufgrund eines vorherigen Fehlers nicht abgeschlossen werden. @@ -17,6 +27,11 @@ Fehler beim Vorgang. Der Fehlertext wurde im Fehlerstream ausgegeben. Verwenden Sie "EvalInteractionNonThrowing", "EvalScriptNonThrowing" oder "EvalExpressionNonThrowing", um die entsprechende FSharpDiagnostic zurückzugeben. + + Emit multiple assemblies (on by default) + Emit multiple assemblies (on by default) + + Stopped due to error\n Aufgrund eines Fehlers beendet\n diff --git a/src/fsharp/fsi/xlf/FSIstrings.txt.es.xlf b/src/fsharp/fsi/xlf/FSIstrings.txt.es.xlf index 21655a4e01..401eb926dc 100644 --- a/src/fsharp/fsi/xlf/FSIstrings.txt.es.xlf +++ b/src/fsharp/fsi/xlf/FSIstrings.txt.es.xlf @@ -2,11 +2,21 @@ + + Accessing the internal type, method or field '{0}' from a previous evaluation in F# Interactive is deprecated and may cause subsequent access errors. To enable the legacy generation of a single dynamic assembly that can access internals, use the '--multiemit-' option. + Accessing the internal type, method or field '{0}' from a previous evaluation in F# Interactive is deprecated and may cause subsequent access errors. To enable the legacy generation of a single dynamic assembly that can access internals, use the '--multiemit-' option. + + Include package source uri when searching for packages Incluir el URI de origen del paquete al buscar paquetes + + Emit multiple assemblies (off by default for .NET Framework) + Emit multiple assemblies (off by default for .NET Framework) + + Operation could not be completed due to earlier error La operación no se pudo completar debido a un error anterior @@ -17,6 +27,11 @@ Error en la operación. El texto del error se ha impreso en la secuencia de errores. Para devolver el valor FSharpDiagnostic correspondiente, use EvalInteractionNonThrowing, EvalScriptNonThrowing o EvalExpressionNonThrowing + + Emit multiple assemblies (on by default) + Emit multiple assemblies (on by default) + + Stopped due to error\n Detenido debido a un error.\n diff --git a/src/fsharp/fsi/xlf/FSIstrings.txt.fr.xlf b/src/fsharp/fsi/xlf/FSIstrings.txt.fr.xlf index fc42cf0b81..e9885ba043 100644 --- a/src/fsharp/fsi/xlf/FSIstrings.txt.fr.xlf +++ b/src/fsharp/fsi/xlf/FSIstrings.txt.fr.xlf @@ -2,11 +2,21 @@ + + Accessing the internal type, method or field '{0}' from a previous evaluation in F# Interactive is deprecated and may cause subsequent access errors. To enable the legacy generation of a single dynamic assembly that can access internals, use the '--multiemit-' option. + Accessing the internal type, method or field '{0}' from a previous evaluation in F# Interactive is deprecated and may cause subsequent access errors. To enable the legacy generation of a single dynamic assembly that can access internals, use the '--multiemit-' option. + + Include package source uri when searching for packages Inclure l'URI de source de package au moment de la recherche des packages + + Emit multiple assemblies (off by default for .NET Framework) + Emit multiple assemblies (off by default for .NET Framework) + + Operation could not be completed due to earlier error Impossible d'exécuter l'opération en raison d'une erreur antérieure @@ -17,6 +27,11 @@ Échec de l'opération. Le texte d'erreur est affiché dans le flux d'erreur. Pour retourner le FSharpDiagnostic correspondant, utilisez EvalInteractionNonThrowing, EvalScriptNonThrowing ou EvalExpressionNonThrowing + + Emit multiple assemblies (on by default) + Emit multiple assemblies (on by default) + + Stopped due to error\n Arrêt en raison d'une erreur\n diff --git a/src/fsharp/fsi/xlf/FSIstrings.txt.it.xlf b/src/fsharp/fsi/xlf/FSIstrings.txt.it.xlf index de4f016ad9..787a769184 100644 --- a/src/fsharp/fsi/xlf/FSIstrings.txt.it.xlf +++ b/src/fsharp/fsi/xlf/FSIstrings.txt.it.xlf @@ -2,11 +2,21 @@ + + Accessing the internal type, method or field '{0}' from a previous evaluation in F# Interactive is deprecated and may cause subsequent access errors. To enable the legacy generation of a single dynamic assembly that can access internals, use the '--multiemit-' option. + Accessing the internal type, method or field '{0}' from a previous evaluation in F# Interactive is deprecated and may cause subsequent access errors. To enable the legacy generation of a single dynamic assembly that can access internals, use the '--multiemit-' option. + + Include package source uri when searching for packages Includi l'URI di origine pacchetti durante la ricerca di pacchetti + + Emit multiple assemblies (off by default for .NET Framework) + Emit multiple assemblies (off by default for .NET Framework) + + Operation could not be completed due to earlier error Non è stato possibile completare l'operazione a causa di un errore precedente @@ -17,6 +27,11 @@ L'operazione non è riuscita. Il testo dell'errore è stato stampato nel flusso degli errori. Per restituire l'elemento FSharpDiagnostic corrispondente, usare EvalInteractionNonThrowing, EvalScriptNonThrowing o EvalExpressionNonThrowing + + Emit multiple assemblies (on by default) + Emit multiple assemblies (on by default) + + Stopped due to error\n Interruzione a causa di un errore\n diff --git a/src/fsharp/fsi/xlf/FSIstrings.txt.ja.xlf b/src/fsharp/fsi/xlf/FSIstrings.txt.ja.xlf index 614ddf284a..6cbdd64e12 100644 --- a/src/fsharp/fsi/xlf/FSIstrings.txt.ja.xlf +++ b/src/fsharp/fsi/xlf/FSIstrings.txt.ja.xlf @@ -2,11 +2,21 @@ + + Accessing the internal type, method or field '{0}' from a previous evaluation in F# Interactive is deprecated and may cause subsequent access errors. To enable the legacy generation of a single dynamic assembly that can access internals, use the '--multiemit-' option. + Accessing the internal type, method or field '{0}' from a previous evaluation in F# Interactive is deprecated and may cause subsequent access errors. To enable the legacy generation of a single dynamic assembly that can access internals, use the '--multiemit-' option. + + Include package source uri when searching for packages パッケージの検索時にパッケージ ソースの URI を含める + + Emit multiple assemblies (off by default for .NET Framework) + Emit multiple assemblies (off by default for .NET Framework) + + Operation could not be completed due to earlier error 以前のエラーが原因で操作を完了できませんでした @@ -17,6 +27,11 @@ 操作に失敗しました。エラー テキストがエラー ストリームに出力されました。対応する FSharpDiagnostic を戻すには、EvalInteractionNonThrowing、EvalScriptNonThrowing、または EvalExpressionNonThrowing を使用します + + Emit multiple assemblies (on by default) + Emit multiple assemblies (on by default) + + Stopped due to error\n エラーのため停止しました\n diff --git a/src/fsharp/fsi/xlf/FSIstrings.txt.ko.xlf b/src/fsharp/fsi/xlf/FSIstrings.txt.ko.xlf index 4f132496c0..97bd1c7b08 100644 --- a/src/fsharp/fsi/xlf/FSIstrings.txt.ko.xlf +++ b/src/fsharp/fsi/xlf/FSIstrings.txt.ko.xlf @@ -2,11 +2,21 @@ + + Accessing the internal type, method or field '{0}' from a previous evaluation in F# Interactive is deprecated and may cause subsequent access errors. To enable the legacy generation of a single dynamic assembly that can access internals, use the '--multiemit-' option. + Accessing the internal type, method or field '{0}' from a previous evaluation in F# Interactive is deprecated and may cause subsequent access errors. To enable the legacy generation of a single dynamic assembly that can access internals, use the '--multiemit-' option. + + Include package source uri when searching for packages 패키지를 검색할 때 패키지 원본 URI 포함 + + Emit multiple assemblies (off by default for .NET Framework) + Emit multiple assemblies (off by default for .NET Framework) + + Operation could not be completed due to earlier error 이전 오류로 인해 작업을 완료할 수 없습니다. @@ -17,6 +27,11 @@ 작업이 실패했습니다. 오류 텍스트가 오류 스트림에 출력되었습니다. 해당 FSharpDiagnostic을 반환하려면 EvalInteractionNonThrowing, EvalScriptNonThrowing 또는 EvalExpressionNonThrowing을 사용하세요. + + Emit multiple assemblies (on by default) + Emit multiple assemblies (on by default) + + Stopped due to error\n 오류 때문에 중지되었습니다.\n diff --git a/src/fsharp/fsi/xlf/FSIstrings.txt.pl.xlf b/src/fsharp/fsi/xlf/FSIstrings.txt.pl.xlf index 8806c4ace6..93b4014656 100644 --- a/src/fsharp/fsi/xlf/FSIstrings.txt.pl.xlf +++ b/src/fsharp/fsi/xlf/FSIstrings.txt.pl.xlf @@ -2,11 +2,21 @@ + + Accessing the internal type, method or field '{0}' from a previous evaluation in F# Interactive is deprecated and may cause subsequent access errors. To enable the legacy generation of a single dynamic assembly that can access internals, use the '--multiemit-' option. + Accessing the internal type, method or field '{0}' from a previous evaluation in F# Interactive is deprecated and may cause subsequent access errors. To enable the legacy generation of a single dynamic assembly that can access internals, use the '--multiemit-' option. + + Include package source uri when searching for packages Uwzględnij identyfikator URI źródła pakietów podczas wyszukiwania pakietów + + Emit multiple assemblies (off by default for .NET Framework) + Emit multiple assemblies (off by default for .NET Framework) + + Operation could not be completed due to earlier error Nie udało się ukończyć operacji z powodu wcześniejszego błędu @@ -17,6 +27,11 @@ Operacja nie powiodła się. Tekst błędu został umieszczony w strumieniu błędów. Aby zwrócić odpowiedni element FSharpDiagnostic, użyj elementu EvalInteractionNonThrowing, eEvalScriptNonThrowing lub EvalExpressionNonThrowing + + Emit multiple assemblies (on by default) + Emit multiple assemblies (on by default) + + Stopped due to error\n Zatrzymano ze względu na błąd\n diff --git a/src/fsharp/fsi/xlf/FSIstrings.txt.pt-BR.xlf b/src/fsharp/fsi/xlf/FSIstrings.txt.pt-BR.xlf index c67ed4a0e7..7c264f5a2c 100644 --- a/src/fsharp/fsi/xlf/FSIstrings.txt.pt-BR.xlf +++ b/src/fsharp/fsi/xlf/FSIstrings.txt.pt-BR.xlf @@ -2,11 +2,21 @@ + + Accessing the internal type, method or field '{0}' from a previous evaluation in F# Interactive is deprecated and may cause subsequent access errors. To enable the legacy generation of a single dynamic assembly that can access internals, use the '--multiemit-' option. + Accessing the internal type, method or field '{0}' from a previous evaluation in F# Interactive is deprecated and may cause subsequent access errors. To enable the legacy generation of a single dynamic assembly that can access internals, use the '--multiemit-' option. + + Include package source uri when searching for packages Incluir o URI de origem do pacote ao pesquisar pacotes + + Emit multiple assemblies (off by default for .NET Framework) + Emit multiple assemblies (off by default for .NET Framework) + + Operation could not be completed due to earlier error Não foi possível concluir a operação devido a um erro anterior @@ -17,6 +27,11 @@ Falha na operação. O texto do erro foi impresso no fluxo de erros. Para retornar o FSharpDiagnostic correspondente, use EvalInteractionNonThrowing, EvalScriptNonThrowing ou EvalExpressionNonThrowing + + Emit multiple assemblies (on by default) + Emit multiple assemblies (on by default) + + Stopped due to error\n Interrompido devido a erro\n diff --git a/src/fsharp/fsi/xlf/FSIstrings.txt.ru.xlf b/src/fsharp/fsi/xlf/FSIstrings.txt.ru.xlf index efd1f83171..66b83f1f90 100644 --- a/src/fsharp/fsi/xlf/FSIstrings.txt.ru.xlf +++ b/src/fsharp/fsi/xlf/FSIstrings.txt.ru.xlf @@ -2,11 +2,21 @@ + + Accessing the internal type, method or field '{0}' from a previous evaluation in F# Interactive is deprecated and may cause subsequent access errors. To enable the legacy generation of a single dynamic assembly that can access internals, use the '--multiemit-' option. + Accessing the internal type, method or field '{0}' from a previous evaluation in F# Interactive is deprecated and may cause subsequent access errors. To enable the legacy generation of a single dynamic assembly that can access internals, use the '--multiemit-' option. + + Include package source uri when searching for packages Включать исходный URI пакета при поиске пакетов + + Emit multiple assemblies (off by default for .NET Framework) + Emit multiple assemblies (off by default for .NET Framework) + + Operation could not be completed due to earlier error Операция не может быть завершена из-за предыдущей ошибки @@ -17,6 +27,11 @@ Не удалось выполнить операцию. Текст ошибки был выведен в потоке ошибок. Чтобы вернуть соответствующие сведения FSharpDiagnostic, используйте EvalInteractionNonThrowing, EvalScriptNonThrowing или EvalExpressionNonThrowing + + Emit multiple assemblies (on by default) + Emit multiple assemblies (on by default) + + Stopped due to error\n Остановлено из-за ошибки\n diff --git a/src/fsharp/fsi/xlf/FSIstrings.txt.tr.xlf b/src/fsharp/fsi/xlf/FSIstrings.txt.tr.xlf index 0aa1916e2d..4e29bfcbf4 100644 --- a/src/fsharp/fsi/xlf/FSIstrings.txt.tr.xlf +++ b/src/fsharp/fsi/xlf/FSIstrings.txt.tr.xlf @@ -2,11 +2,21 @@ + + Accessing the internal type, method or field '{0}' from a previous evaluation in F# Interactive is deprecated and may cause subsequent access errors. To enable the legacy generation of a single dynamic assembly that can access internals, use the '--multiemit-' option. + Accessing the internal type, method or field '{0}' from a previous evaluation in F# Interactive is deprecated and may cause subsequent access errors. To enable the legacy generation of a single dynamic assembly that can access internals, use the '--multiemit-' option. + + Include package source uri when searching for packages Paketler aranırken paket kaynağı URI'si ekleyin + + Emit multiple assemblies (off by default for .NET Framework) + Emit multiple assemblies (off by default for .NET Framework) + + Operation could not be completed due to earlier error Önceki hata nedeniyle işlem tamamlanamadı @@ -17,6 +27,11 @@ İşlem başarısız oldu. Hata metni hata akışında yazdırıldı. İlgili FSharpDiagnostic'i döndürmek için EvalInteractionNonThrowing, EvalScriptNonThrowing veya EvalExpressionNonThrowing kullanın + + Emit multiple assemblies (on by default) + Emit multiple assemblies (on by default) + + Stopped due to error\n Hata nedeniyle durduruldu\n diff --git a/src/fsharp/fsi/xlf/FSIstrings.txt.zh-Hans.xlf b/src/fsharp/fsi/xlf/FSIstrings.txt.zh-Hans.xlf index d183e5f234..551291410e 100644 --- a/src/fsharp/fsi/xlf/FSIstrings.txt.zh-Hans.xlf +++ b/src/fsharp/fsi/xlf/FSIstrings.txt.zh-Hans.xlf @@ -2,11 +2,21 @@ + + Accessing the internal type, method or field '{0}' from a previous evaluation in F# Interactive is deprecated and may cause subsequent access errors. To enable the legacy generation of a single dynamic assembly that can access internals, use the '--multiemit-' option. + Accessing the internal type, method or field '{0}' from a previous evaluation in F# Interactive is deprecated and may cause subsequent access errors. To enable the legacy generation of a single dynamic assembly that can access internals, use the '--multiemit-' option. + + Include package source uri when searching for packages 搜索包时包含包源 uri + + Emit multiple assemblies (off by default for .NET Framework) + Emit multiple assemblies (off by default for .NET Framework) + + Operation could not be completed due to earlier error 由于早期错误,无法完成操作 @@ -17,6 +27,11 @@ 操作失败。错误文本已在错误流中打印。若要返回相应的 FSharpDiagnostic,请使用 EvalInteractionNonThrowing、EvalScriptNonThrowing 或 EvalExpressionNonThrowing + + Emit multiple assemblies (on by default) + Emit multiple assemblies (on by default) + + Stopped due to error\n 已因出错而停止\n diff --git a/src/fsharp/fsi/xlf/FSIstrings.txt.zh-Hant.xlf b/src/fsharp/fsi/xlf/FSIstrings.txt.zh-Hant.xlf index ccb733230c..f47ef4a242 100644 --- a/src/fsharp/fsi/xlf/FSIstrings.txt.zh-Hant.xlf +++ b/src/fsharp/fsi/xlf/FSIstrings.txt.zh-Hant.xlf @@ -2,11 +2,21 @@ + + Accessing the internal type, method or field '{0}' from a previous evaluation in F# Interactive is deprecated and may cause subsequent access errors. To enable the legacy generation of a single dynamic assembly that can access internals, use the '--multiemit-' option. + Accessing the internal type, method or field '{0}' from a previous evaluation in F# Interactive is deprecated and may cause subsequent access errors. To enable the legacy generation of a single dynamic assembly that can access internals, use the '--multiemit-' option. + + Include package source uri when searching for packages 搜尋套件時包含套件來源 URI + + Emit multiple assemblies (off by default for .NET Framework) + Emit multiple assemblies (off by default for .NET Framework) + + Operation could not be completed due to earlier error 因為先前發生錯誤,所以無法完成作業 @@ -17,6 +27,11 @@ 作業失敗。錯誤文字已列印在錯誤串流中。若要傳回相對應的 FSharpDiagnostic,請使用 EvalInteractionNonThrowing、EvalScriptNonThrowing 或 EvalExpressionNonThrowing + + Emit multiple assemblies (on by default) + Emit multiple assemblies (on by default) + + Stopped due to error\n 已因錯誤而停止\n diff --git a/src/fsharp/ilx/EraseClosures.fs b/src/fsharp/ilx/EraseClosures.fs index 9919e39c8e..6a001cd3a0 100644 --- a/src/fsharp/ilx/EraseClosures.fs +++ b/src/fsharp/ilx/EraseClosures.fs @@ -130,7 +130,7 @@ type cenv = let addMethodGeneratedAttrsToTypeDef cenv (tdef: ILTypeDef) = - tdef.With(methods = (tdef.Methods.AsList |> List.map (fun md -> md |> cenv.addMethodGeneratedAttrs) |> mkILMethods)) + tdef.With(methods = (tdef.Methods.AsList() |> List.map (fun md -> md |> cenv.addMethodGeneratedAttrs) |> mkILMethods)) let newIlxPubCloEnv(ilg, addMethodGeneratedAttrs, addFieldGeneratedAttrs, addFieldNeverAttrs) = { ilg = ilg @@ -365,7 +365,7 @@ let rec convIlxClosureDef cenv encl (td: ILTypeDef) clo = let nowTy = mkILFormalBoxedTy nowTypeRef td.GenericParams let nowCloRef = IlxClosureRef(nowTypeRef, clo.cloStructure, nowFields) let nowCloSpec = mkILFormalCloRef td.GenericParams nowCloRef clo.cloUseStaticField - let nowMethods = List.map (convMethodDef (Some nowCloSpec)) td.Methods.AsList + let nowMethods = List.map (convMethodDef (Some nowCloSpec)) (td.Methods.AsList()) let ilCloCode = Lazy.force clo.cloCode let cloDebugRange = ilCloCode.DebugRange let cloImports = ilCloCode.DebugImports @@ -497,7 +497,7 @@ let rec convIlxClosureDef cenv encl (td: ILTypeDef) clo = layout=ILTypeDefLayout.Auto, extends= Some cenv.mkILTyFuncTy, methods= mkILMethods (ctorMethodDef :: nowApplyMethDef :: nowMethods) , - fields= mkILFields (mkILCloFldDefs cenv nowFields @ td.Fields.AsList), + fields= mkILFields (mkILCloFldDefs cenv nowFields @ td.Fields.AsList()), customAttrs=emptyILCustomAttrs, methodImpls=emptyILMethodImpls, properties=emptyILProperties, @@ -593,7 +593,7 @@ let rec convIlxClosureDef cenv encl (td: ILTypeDef) clo = nestedTypes = emptyILTypeDefs, extends= Some nowEnvParentClass, methods= mkILMethods (ctorMethodDef :: nowApplyMethDef :: nowMethods), - fields= mkILFields (mkILCloFldDefs cenv nowFields @ td.Fields.AsList), + fields= mkILFields (mkILCloFldDefs cenv nowFields @ td.Fields.AsList()), customAttrs=emptyILCustomAttrs, methodImpls=emptyILMethodImpls, properties=emptyILProperties, @@ -642,7 +642,7 @@ let rec convIlxClosureDef cenv encl (td: ILTypeDef) clo = name = td.Name, genericParams= td.GenericParams, methods= mkILMethods (ctorMethodDef :: nowMethods), - fields= mkILFields (mkILCloFldDefs cenv nowFields @ td.Fields.AsList)) + fields= mkILFields (mkILCloFldDefs cenv nowFields @ td.Fields.AsList())) [cloTypeDef] diff --git a/src/fsharp/ilx/EraseUnions.fs b/src/fsharp/ilx/EraseUnions.fs index b03c89d317..580461805c 100644 --- a/src/fsharp/ilx/EraseUnions.fs +++ b/src/fsharp/ilx/EraseUnions.fs @@ -1065,8 +1065,8 @@ let mkClassUnionDef (addMethodGeneratedAttrs, addPropertyGeneratedAttrs, addProp // The class can be abstract if each alternative is represented by a derived type let isAbstract = (altTypeDefs.Length = cud.UnionCases.Length) - let existingMeths = td.Methods.AsList - let existingProps = td.Properties.AsList + let existingMeths = td.Methods.AsList() + let existingProps = td.Properties.AsList() let enumTypeDef = // The nested Tags type is elided if there is only one tag @@ -1099,10 +1099,10 @@ let mkClassUnionDef (addMethodGeneratedAttrs, addPropertyGeneratedAttrs, addProp let baseTypeDef = td.WithInitSemantics(ILTypeInit.BeforeField) - .With(nestedTypes = mkILTypeDefs (Option.toList enumTypeDef @ altTypeDefs @ altDebugTypeDefs @ td.NestedTypes.AsList), + .With(nestedTypes = mkILTypeDefs (Option.toList enumTypeDef @ altTypeDefs @ altDebugTypeDefs @ td.NestedTypes.AsList()), extends= (match td.Extends with None -> Some ilg.typ_Object | _ -> td.Extends), methods= mkILMethods (ctorMeths @ baseMethsFromAlt @ selfMeths @ tagMeths @ altUniqObjMeths @ existingMeths), - fields=mkILFields (selfAndTagFields @ List.map (fun (_,_,_,_,fdef,_) -> fdef) altNullaryFields @ td.Fields.AsList), + fields=mkILFields (selfAndTagFields @ List.map (fun (_,_,_,_,fdef,_) -> fdef) altNullaryFields @ td.Fields.AsList()), properties=mkILProperties (tagProps @ basePropsFromAlt @ selfProps @ existingProps)) // The .cctor goes on the Cases type since that's where the constant fields for nullary constructors live |> addConstFieldInit diff --git a/src/fsharp/import.fs b/src/fsharp/import.fs index cc3cb3bd64..810d5093c2 100644 --- a/src/fsharp/import.fs +++ b/src/fsharp/import.fs @@ -513,7 +513,7 @@ and ImportILTypeDefList amap m (cpath: CompilationPath) enc items = /// and ImportILTypeDefs amap m scoref cpath enc (tdefs: ILTypeDefs) = // We be very careful not to force a read of the type defs here - tdefs.AsArrayOfPreTypeDefs + tdefs.AsArrayOfPreTypeDefs() |> Array.map (fun pre -> (pre.Namespace, (pre.Name, notlazy(scoref, pre)))) |> Array.toList |> ImportILTypeDefList amap m cpath enc @@ -550,7 +550,7 @@ let ImportILAssemblyExportedType amap m auxModLoader (scoref: ILScopeRef) (expor /// Import the "exported types" table for multi-module assemblies. let ImportILAssemblyExportedTypes amap m auxModLoader scoref (exportedTypes: ILExportedTypesAndForwarders) = - [ for exportedType in exportedTypes.AsList do + [ for exportedType in exportedTypes.AsList() do yield! ImportILAssemblyExportedType amap m auxModLoader scoref exportedType ] /// Import both the main type definitions and the "exported types" table, i.e. all the @@ -566,13 +566,13 @@ let ImportILAssemblyTypeForwarders (amap, m, exportedTypes: ILExportedTypesAndFo // Note 'td' may be in another module or another assembly! // Note: it is very important that we call auxModLoader lazily [ //printfn "reading forwarders..." - for exportedType in exportedTypes.AsList do + for exportedType in exportedTypes.AsList() do let ns, n = splitILTypeName exportedType.Name //printfn "found forwarder for %s..." n let tcref = lazy ImportILTypeRefUncached (amap()) m (ILTypeRef.Create(exportedType.ScopeRef, [], exportedType.Name)) yield (Array.ofList ns, n), tcref let rec nested (nets: ILNestedExportedTypes) enc = - [ for net in nets.AsList do + [ for net in nets.AsList() do //printfn "found nested forwarder for %s..." net.Name let tcref = lazy ImportILTypeRefUncached (amap()) m (ILTypeRef.Create (exportedType.ScopeRef, enc, net.Name)) diff --git a/src/fsharp/service/FSharpCheckerResults.fs b/src/fsharp/service/FSharpCheckerResults.fs index e6549c71d9..971b859397 100644 --- a/src/fsharp/service/FSharpCheckerResults.fs +++ b/src/fsharp/service/FSharpCheckerResults.fs @@ -2265,7 +2265,8 @@ type FSharpCheckProjectResults let importMap = tcImports.GetImportMap() let optEnv0 = GetInitialOptimizationEnv (tcImports, tcGlobals) let tcConfig = getTcConfig() - let optimizedImpls, _optimizationData, _ = ApplyAllOptimizations (tcConfig, tcGlobals, (LightweightTcValForUsingInBuildMethodCall tcGlobals), outfile, importMap, false, optEnv0, thisCcu, mimpls) + let isIncrementalFragment = false + let optimizedImpls, _optimizationData, _ = ApplyAllOptimizations (tcConfig, tcGlobals, LightweightTcValForUsingInBuildMethodCall tcGlobals, outfile, importMap, isIncrementalFragment, optEnv0, thisCcu, mimpls) let mimpls = match optimizedImpls with | TypedAssemblyAfterOptimization files -> diff --git a/src/fsharp/service/service.fs b/src/fsharp/service/service.fs index 557c94acb5..91537a49e3 100644 --- a/src/fsharp/service/service.fs +++ b/src/fsharp/service/service.fs @@ -156,7 +156,7 @@ module CompileHelpers = // Also, the dynamic assembly creator can't currently handle types called "" from statically linked assemblies. let ilxMainModule = { ilxMainModule with - TypeDefs = ilxMainModule.TypeDefs.AsList |> List.filter (fun td -> not (isTypeNameForGlobalFunctions td.Name)) |> mkILTypeDefs + TypeDefs = ilxMainModule.TypeDefs.AsList() |> List.filter (fun td -> not (isTypeNameForGlobalFunctions td.Name)) |> mkILTypeDefs Resources=mkILResources [] } // The function used to resolve types while emitting the code @@ -166,7 +166,7 @@ module CompileHelpers = | None -> None // Emit the code - let _emEnv,execs = ILRuntimeWriter.emitModuleFragment(tcGlobals.ilg, tcConfig.emitTailcalls, ILRuntimeWriter.emEnv0, assemblyBuilder, moduleBuilder, ilxMainModule, debugInfo, assemblyResolver, tcGlobals.TryFindSysILTypeRef) + let _emEnv,execs = ILDynamicAssemblyWriter.EmitDynamicAssemblyFragment(tcGlobals.ilg, tcConfig.emitTailcalls, ILDynamicAssemblyWriter.emEnv0, assemblyBuilder, moduleBuilder, ilxMainModule, debugInfo, assemblyResolver, tcGlobals.TryFindSysILTypeRef) // Execute the top-level initialization, if requested if execute then @@ -178,7 +178,7 @@ module CompileHelpers = raise exn // Register the reflected definitions for the dynamically generated assembly - for resource in ilxMainModule.Resources.AsList do + for resource in ilxMainModule.Resources.AsList() do if IsReflectedDefinitionsResource resource then Quotations.Expr.RegisterReflectedDefinitions (assemblyBuilder, moduleBuilder.Name, resource.GetBytes().ToArray()) diff --git a/src/fsharp/symbols/Symbols.fs b/src/fsharp/symbols/Symbols.fs index ed1b773140..446935b206 100644 --- a/src/fsharp/symbols/Symbols.fs +++ b/src/fsharp/symbols/Symbols.fs @@ -713,9 +713,10 @@ type FSharpEntity(cenv: SymbolEnv, entity:EntityRef) = let formalTypeInst = generalizeTypars formalTypars let ty = TType_app(entity, formalTypeInst) let formalTypeInfo = ILTypeInfo.FromType cenv.g ty - tdef.Fields.AsList - |> List.map (fun tdef -> let ilFieldInfo = ILFieldInfo(formalTypeInfo, tdef) - FSharpField(cenv, FSharpFieldData.ILField ilFieldInfo )) + tdef.Fields.AsList() + |> List.map (fun tdef -> + let ilFieldInfo = ILFieldInfo(formalTypeInfo, tdef) + FSharpField(cenv, FSharpFieldData.ILField ilFieldInfo )) |> makeReadOnlyCollection else diff --git a/tests/EndToEndBuildTests/ProvidedTypes/ProvidedTypes.fsi b/tests/EndToEndBuildTests/ProvidedTypes/ProvidedTypes.fsi index c8f2a418ed..2f1042c08b 100644 --- a/tests/EndToEndBuildTests/ProvidedTypes/ProvidedTypes.fsi +++ b/tests/EndToEndBuildTests/ProvidedTypes/ProvidedTypes.fsi @@ -501,7 +501,7 @@ namespace ProviderImplementation.ProvidedTypes #if !NO_GENERATIVE /// Register that a given file is a provided generated target assembly, e.g. an assembly produced by an external - /// code generation tool. This assembly should be a target assembly, i.e. use the same asssembly references + /// code generation tool. This assembly should be a target assembly, i.e. use the same assembly references /// as given by TargetContext.ReferencedAssemblyPaths member RegisterGeneratedTargetAssembly: fileName: string -> Assembly #endif diff --git a/tests/FSharp.Compiler.Service.Tests/FSharp.CompilerService.SurfaceArea.netstandard.expected b/tests/FSharp.Compiler.Service.Tests/FSharp.CompilerService.SurfaceArea.netstandard.expected index 1da0d27699..5cd92e6f49 100644 --- a/tests/FSharp.Compiler.Service.Tests/FSharp.CompilerService.SurfaceArea.netstandard.expected +++ b/tests/FSharp.Compiler.Service.Tests/FSharp.CompilerService.SurfaceArea.netstandard.expected @@ -286,10 +286,8 @@ FSharp.Compiler.AbstractIL.IL+ILAttribute: Int32 GetHashCode(System.Collections. FSharp.Compiler.AbstractIL.IL+ILAttribute: Int32 Tag FSharp.Compiler.AbstractIL.IL+ILAttribute: Int32 get_Tag() FSharp.Compiler.AbstractIL.IL+ILAttribute: System.String ToString() -FSharp.Compiler.AbstractIL.IL+ILAttributes: ILAttribute[] AsArray -FSharp.Compiler.AbstractIL.IL+ILAttributes: ILAttribute[] get_AsArray() -FSharp.Compiler.AbstractIL.IL+ILAttributes: Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.AbstractIL.IL+ILAttribute] AsList -FSharp.Compiler.AbstractIL.IL+ILAttributes: Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.AbstractIL.IL+ILAttribute] get_AsList() +FSharp.Compiler.AbstractIL.IL+ILAttributes: ILAttribute[] AsArray() +FSharp.Compiler.AbstractIL.IL+ILAttributes: Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.AbstractIL.IL+ILAttribute] AsList() FSharp.Compiler.AbstractIL.IL+ILAttributesStored: System.String ToString() FSharp.Compiler.AbstractIL.IL+ILCallingConv: Boolean Equals(ILCallingConv) FSharp.Compiler.AbstractIL.IL+ILCallingConv: Boolean Equals(System.Object) @@ -788,11 +786,9 @@ FSharp.Compiler.AbstractIL.IL+ILMethodDef: System.Reflection.MethodImplAttribute FSharp.Compiler.AbstractIL.IL+ILMethodDef: System.String Name FSharp.Compiler.AbstractIL.IL+ILMethodDef: System.String get_Name() FSharp.Compiler.AbstractIL.IL+ILMethodDef: Void .ctor(System.String, System.Reflection.MethodAttributes, System.Reflection.MethodImplAttributes, ILCallingConv, Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.AbstractIL.IL+ILParameter], ILReturn, System.Lazy`1[FSharp.Compiler.AbstractIL.IL+MethodBody], Boolean, Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.AbstractIL.IL+ILGenericParameterDef], ILSecurityDecls, ILAttributes) -FSharp.Compiler.AbstractIL.IL+ILMethodDefs: ILMethodDef[] AsArray -FSharp.Compiler.AbstractIL.IL+ILMethodDefs: ILMethodDef[] get_AsArray() -FSharp.Compiler.AbstractIL.IL+ILMethodDefs: Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.AbstractIL.IL+ILMethodDef] AsList +FSharp.Compiler.AbstractIL.IL+ILMethodDefs: ILMethodDef[] AsArray() +FSharp.Compiler.AbstractIL.IL+ILMethodDefs: Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.AbstractIL.IL+ILMethodDef] AsList() FSharp.Compiler.AbstractIL.IL+ILMethodDefs: Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.AbstractIL.IL+ILMethodDef] FindByName(System.String) -FSharp.Compiler.AbstractIL.IL+ILMethodDefs: Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.AbstractIL.IL+ILMethodDef] get_AsList() FSharp.Compiler.AbstractIL.IL+ILMethodDefs: Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.AbstractIL.IL+ILMethodDef] TryFindInstanceByNameAndCallingSignature(System.String, ILCallingSignature) FSharp.Compiler.AbstractIL.IL+ILMethodImplDef: Boolean Equals(ILMethodImplDef) FSharp.Compiler.AbstractIL.IL+ILMethodImplDef: Boolean Equals(System.Object) @@ -1244,6 +1240,26 @@ FSharp.Compiler.AbstractIL.IL+ILPropertyDef: System.String ToString() FSharp.Compiler.AbstractIL.IL+ILPropertyDef: System.String get_Name() FSharp.Compiler.AbstractIL.IL+ILPropertyDef: Void .ctor(System.String, System.Reflection.PropertyAttributes, Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.AbstractIL.IL+ILMethodRef], Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.AbstractIL.IL+ILMethodRef], ILThisConvention, ILType, Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.AbstractIL.IL+ILFieldInit], Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.AbstractIL.IL+ILType], ILAttributes) FSharp.Compiler.AbstractIL.IL+ILPropertyDefs: System.String ToString() +FSharp.Compiler.AbstractIL.IL+ILReferences: Boolean Equals(ILReferences) +FSharp.Compiler.AbstractIL.IL+ILReferences: Boolean Equals(System.Object) +FSharp.Compiler.AbstractIL.IL+ILReferences: Boolean Equals(System.Object, System.Collections.IEqualityComparer) +FSharp.Compiler.AbstractIL.IL+ILReferences: ILAssemblyRef[] AssemblyReferences +FSharp.Compiler.AbstractIL.IL+ILReferences: ILAssemblyRef[] get_AssemblyReferences() +FSharp.Compiler.AbstractIL.IL+ILReferences: ILFieldRef[] FieldReferences +FSharp.Compiler.AbstractIL.IL+ILReferences: ILFieldRef[] get_FieldReferences() +FSharp.Compiler.AbstractIL.IL+ILReferences: ILMethodRef[] MethodReferences +FSharp.Compiler.AbstractIL.IL+ILReferences: ILMethodRef[] get_MethodReferences() +FSharp.Compiler.AbstractIL.IL+ILReferences: ILModuleRef[] ModuleReferences +FSharp.Compiler.AbstractIL.IL+ILReferences: ILModuleRef[] get_ModuleReferences() +FSharp.Compiler.AbstractIL.IL+ILReferences: ILTypeRef[] TypeReferences +FSharp.Compiler.AbstractIL.IL+ILReferences: ILTypeRef[] get_TypeReferences() +FSharp.Compiler.AbstractIL.IL+ILReferences: Int32 CompareTo(ILReferences) +FSharp.Compiler.AbstractIL.IL+ILReferences: Int32 CompareTo(System.Object) +FSharp.Compiler.AbstractIL.IL+ILReferences: Int32 CompareTo(System.Object, System.Collections.IComparer) +FSharp.Compiler.AbstractIL.IL+ILReferences: Int32 GetHashCode() +FSharp.Compiler.AbstractIL.IL+ILReferences: Int32 GetHashCode(System.Collections.IEqualityComparer) +FSharp.Compiler.AbstractIL.IL+ILReferences: System.String ToString() +FSharp.Compiler.AbstractIL.IL+ILReferences: Void .ctor(ILAssemblyRef[], ILModuleRef[], ILTypeRef[], ILMethodRef[], ILFieldRef[]) FSharp.Compiler.AbstractIL.IL+ILResources: System.String ToString() FSharp.Compiler.AbstractIL.IL+ILReturn: ILAttributes CustomAttrs FSharp.Compiler.AbstractIL.IL+ILReturn: ILAttributes get_CustomAttrs() @@ -1786,6 +1802,7 @@ FSharp.Compiler.AbstractIL.IL: FSharp.Compiler.AbstractIL.IL+ILPlatform FSharp.Compiler.AbstractIL.IL: FSharp.Compiler.AbstractIL.IL+ILPreTypeDef FSharp.Compiler.AbstractIL.IL: FSharp.Compiler.AbstractIL.IL+ILPropertyDef FSharp.Compiler.AbstractIL.IL: FSharp.Compiler.AbstractIL.IL+ILPropertyDefs +FSharp.Compiler.AbstractIL.IL: FSharp.Compiler.AbstractIL.IL+ILReferences FSharp.Compiler.AbstractIL.IL: FSharp.Compiler.AbstractIL.IL+ILResources FSharp.Compiler.AbstractIL.IL: FSharp.Compiler.AbstractIL.IL+ILReturn FSharp.Compiler.AbstractIL.IL: FSharp.Compiler.AbstractIL.IL+ILScopeRef @@ -4173,8 +4190,8 @@ FSharp.Compiler.Interactive.Shell+FsiEvaluationSession: Microsoft.FSharp.Core.FS FSharp.Compiler.Interactive.Shell+FsiEvaluationSession: Microsoft.FSharp.Core.FSharpOption`1[System.Int32] LCID FSharp.Compiler.Interactive.Shell+FsiEvaluationSession: Microsoft.FSharp.Core.FSharpOption`1[System.Int32] get_LCID() FSharp.Compiler.Interactive.Shell+FsiEvaluationSession: System.Collections.Generic.IEnumerable`1[System.String] GetCompletions(System.String) -FSharp.Compiler.Interactive.Shell+FsiEvaluationSession: System.Reflection.Assembly DynamicAssembly -FSharp.Compiler.Interactive.Shell+FsiEvaluationSession: System.Reflection.Assembly get_DynamicAssembly() +FSharp.Compiler.Interactive.Shell+FsiEvaluationSession: System.Reflection.Assembly[] DynamicAssemblies +FSharp.Compiler.Interactive.Shell+FsiEvaluationSession: System.Reflection.Assembly[] get_DynamicAssemblies() FSharp.Compiler.Interactive.Shell+FsiEvaluationSession: System.String FormatValue(System.Object, System.Type) FSharp.Compiler.Interactive.Shell+FsiEvaluationSession: System.Tuple`2[Microsoft.FSharp.Core.FSharpChoice`2[Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Interactive.Shell+FsiValue],System.Exception],FSharp.Compiler.Diagnostics.FSharpDiagnostic[]] EvalExpressionNonThrowing(System.String) FSharp.Compiler.Interactive.Shell+FsiEvaluationSession: System.Tuple`2[Microsoft.FSharp.Core.FSharpChoice`2[Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Interactive.Shell+FsiValue],System.Exception],FSharp.Compiler.Diagnostics.FSharpDiagnostic[]] EvalInteractionNonThrowing(System.String, Microsoft.FSharp.Core.FSharpOption`1[System.Threading.CancellationToken]) diff --git a/tests/FSharp.Compiler.UnitTests/FsiTests.fs b/tests/FSharp.Compiler.UnitTests/FsiTests.fs index 78a018b19c..0419ee4c15 100644 --- a/tests/FSharp.Compiler.UnitTests/FsiTests.fs +++ b/tests/FSharp.Compiler.UnitTests/FsiTests.fs @@ -10,7 +10,7 @@ open Xunit [] module FsiTests = - let createFsiSession () = + let createFsiSession (useOneDynamicAssembly: bool) = // Intialize output and input streams let inStream = new StringReader("") let outStream = new CompilerOutputStream() @@ -18,20 +18,20 @@ module FsiTests = // Build command line arguments & start FSI session let argv = [| "C:\\fsi.exe" |] - let allArgs = Array.append argv [|"--noninteractive"|] + let allArgs = Array.append argv [|"--noninteractive"; if useOneDynamicAssembly then "--multiemit-" else "--multiemit+" |] let fsiConfig = FsiEvaluationSession.GetDefaultConfiguration() FsiEvaluationSession.Create(fsiConfig, allArgs, inStream, new StreamWriter(outStream), new StreamWriter(errStream), collectible = true) [] let ``No bound values at the start of FSI session`` () = - use fsiSession = createFsiSession () + use fsiSession = createFsiSession false let values = fsiSession.GetBoundValues() Assert.shouldBeEmpty values [] let ``Bound value has correct name`` () = - use fsiSession = createFsiSession () + use fsiSession = createFsiSession false fsiSession.EvalInteraction("let x = 1") @@ -41,7 +41,7 @@ module FsiTests = [] let ``Bound value has correct value`` () = - use fsiSession = createFsiSession () + use fsiSession = createFsiSession false fsiSession.EvalInteraction("let y = 2") @@ -51,7 +51,7 @@ module FsiTests = [] let ``Bound value has correct type`` () = - use fsiSession = createFsiSession () + use fsiSession = createFsiSession false fsiSession.EvalInteraction("let z = 3") @@ -61,7 +61,7 @@ module FsiTests = [] let ``Seven bound values are ordered and have their correct name`` () = - use fsiSession = createFsiSession () + use fsiSession = createFsiSession false fsiSession.EvalInteraction("let x = 1") fsiSession.EvalInteraction("let y = 2") @@ -77,7 +77,7 @@ module FsiTests = [] let ``Seven bound values are ordered and have their correct value`` () = - use fsiSession = createFsiSession () + use fsiSession = createFsiSession false fsiSession.EvalInteraction("let x = 1") fsiSession.EvalInteraction("let y = 2") @@ -93,7 +93,7 @@ module FsiTests = [] let ``Seven bound values are ordered and have their correct type`` () = - use fsiSession = createFsiSession () + use fsiSession = createFsiSession false fsiSession.EvalInteraction("let x = 1") fsiSession.EvalInteraction("let y = 2") @@ -109,7 +109,7 @@ module FsiTests = [] let ``Able to find a bound value by the identifier`` () = - use fsiSession = createFsiSession () + use fsiSession = createFsiSession false fsiSession.EvalInteraction("let x = 1") fsiSession.EvalInteraction("let y = 2") @@ -125,7 +125,7 @@ module FsiTests = [] let ``Able to find a bound value by the identifier and has valid info`` () = - use fsiSession = createFsiSession () + use fsiSession = createFsiSession false fsiSession.EvalInteraction("let x = 1.") fsiSession.EvalInteraction("let y = 2.") @@ -143,7 +143,7 @@ module FsiTests = [] let ``Not Able to find a bound value by the identifier`` () = - use fsiSession = createFsiSession () + use fsiSession = createFsiSession false fsiSession.EvalInteraction("let x = 1") fsiSession.EvalInteraction("let y = 2") @@ -159,7 +159,7 @@ module FsiTests = [] let ``The 'it' value does not exist at the start of a FSI session`` () = - use fsiSession = createFsiSession () + use fsiSession = createFsiSession false let boundValueOpt = fsiSession.TryFindBoundValue "it" @@ -167,7 +167,7 @@ module FsiTests = [] let ``The 'it' bound value does exists after a value is not explicitly bound`` () = - use fsiSession = createFsiSession () + use fsiSession = createFsiSession false fsiSession.EvalInteraction("456") @@ -177,7 +177,7 @@ module FsiTests = [] let ``The 'it' value does exists after a value is not explicitly bound and has valid info`` () = - use fsiSession = createFsiSession () + use fsiSession = createFsiSession false fsiSession.EvalInteraction("456") @@ -189,7 +189,7 @@ module FsiTests = [] let ``The latest shadowed value is only available`` () = - use fsiSession = createFsiSession () + use fsiSession = createFsiSession false fsiSession.EvalInteraction("let x = 1") let boundValue = fsiSession.GetBoundValues() |> List.exactlyOne @@ -207,7 +207,7 @@ module FsiTests = [] let ``The latest shadowed value is only available and can be found`` () = - use fsiSession = createFsiSession () + use fsiSession = createFsiSession false fsiSession.EvalInteraction("let x = 1") let boundValue = (fsiSession.TryFindBoundValue "x").Value @@ -225,7 +225,7 @@ module FsiTests = [] let ``Values are successfully shadowed even with intermediate interactions`` () = - use fsiSession = createFsiSession () + use fsiSession = createFsiSession false fsiSession.EvalInteraction("let x = 1") fsiSession.EvalInteraction("let z = 100") @@ -250,7 +250,7 @@ module FsiTests = [] let ``Creation of a simple bound value succeeds`` () = - use fsiSession = createFsiSession () + use fsiSession = createFsiSession false fsiSession.AddBoundValue("x", 1) @@ -262,7 +262,7 @@ module FsiTests = [] let ``Creation of a bound value succeeds with underscores in the identifier`` () = - use fsiSession = createFsiSession () + use fsiSession = createFsiSession false fsiSession.AddBoundValue("x_y_z", 1) @@ -272,7 +272,7 @@ module FsiTests = [] let ``Creation of a bound value succeeds with tildes in the identifier`` () = - use fsiSession = createFsiSession () + use fsiSession = createFsiSession false fsiSession.AddBoundValue("``hello world``", 1) @@ -282,7 +282,7 @@ module FsiTests = [] let ``Creation of a bound value succeeds with 'it' as the indentifier`` () = - use fsiSession = createFsiSession () + use fsiSession = createFsiSession false fsiSession.EvalInteraction("\"test\"") @@ -300,67 +300,67 @@ module FsiTests = [] let ``Creation of a bound value fails with tildes in the identifier and with 'at' but has warning`` () = - use fsiSession = createFsiSession () + use fsiSession = createFsiSession false Assert.Throws(fun () -> fsiSession.AddBoundValue("``hello @ world``", 1)) |> ignore [] let ``Creation of a bound value fails if the name is not a valid identifier with 'at' in front`` () = - use fsiSession = createFsiSession () + use fsiSession = createFsiSession false Assert.Throws(fun () -> fsiSession.AddBoundValue("@x", 1)) |> ignore [] let ``Creation of a bound value fails if the name is not a valid identifier with 'at' in back`` () = - use fsiSession = createFsiSession () + use fsiSession = createFsiSession false Assert.Throws(fun () -> fsiSession.AddBoundValue("x@", 1)) |> ignore [] let ``Creation of a bound value fails if the name is null`` () = - use fsiSession = createFsiSession () + use fsiSession = createFsiSession false Assert.Throws(fun () -> fsiSession.AddBoundValue(null, 1)) |> ignore [] let ``Creation of a bound value fails if the name is empty`` () = - use fsiSession = createFsiSession () + use fsiSession = createFsiSession false Assert.Throws(fun () -> fsiSession.AddBoundValue("", 1)) |> ignore [] let ``Creation of a bound value fails if the name is whitespace`` () = - use fsiSession = createFsiSession () + use fsiSession = createFsiSession false Assert.Throws(fun () -> fsiSession.AddBoundValue(" ", 1)) |> ignore [] let ``Creation of a bound value fails if the name contains spaces`` () = - use fsiSession = createFsiSession () + use fsiSession = createFsiSession false Assert.Throws(fun () -> fsiSession.AddBoundValue("x x", 1)) |> ignore [] let ``Creation of a bound value fails if the name contains an operator at the end`` () = - use fsiSession = createFsiSession () + use fsiSession = createFsiSession false Assert.Throws(fun () -> fsiSession.AddBoundValue("x+", 1)) |> ignore [] let ``Creation of a bound value fails if the name contains an operator at the front`` () = - use fsiSession = createFsiSession () + use fsiSession = createFsiSession false Assert.Throws(fun () -> fsiSession.AddBoundValue("+x", 1)) |> ignore [] let ``Creation of a bound value fails if the name contains dots`` () = - use fsiSession = createFsiSession () + use fsiSession = createFsiSession false Assert.Throws(fun () -> fsiSession.AddBoundValue("x.x", 1)) |> ignore [] let ``Creation of a bound value fails if the value passed is null`` () = - use fsiSession = createFsiSession () + use fsiSession = createFsiSession false Assert.Throws(fun () -> fsiSession.AddBoundValue("x", null) |> ignore) |> ignore @@ -368,13 +368,13 @@ module FsiTests = [] let ``Creation of a bound value succeeds if the value contains types from assemblies that are not referenced in the session, due to implicit resolution`` () = - use fsiSession = createFsiSession () + use fsiSession = createFsiSession false fsiSession.AddBoundValue("x", { X = 1 }) [] let ``Creation of a bound value succeeds if the value contains types from assemblies that are not referenced in the session, due to implicit resolution, and then doing some evaluation`` () = - use fsiSession = createFsiSession () + use fsiSession = createFsiSession false fsiSession.AddBoundValue("x", { X = 1 }) fsiSession.EvalInteraction("let y = { x with X = 5 }") @@ -395,7 +395,7 @@ module FsiTests = [] let ``Creation of a bound value, of type ResizeArray, succeeds`` () = - use fsiSession = createFsiSession () + use fsiSession = createFsiSession false let xs = ResizeArray() xs.Add("banana") @@ -422,7 +422,7 @@ module FsiTests = [] let ``Creation of a bound value succeeds if the value contains types from assemblies that are not referenced in the session, due to implicit resolution, and then use a member from it`` () = - use fsiSession = createFsiSession () + use fsiSession = createFsiSession false let value = CustomType2() fsiSession.AddBoundValue("x", value) @@ -443,7 +443,7 @@ module FsiTests = [] let ``Creation of a bound value succeeds if the value contains generic types from assemblies that are not referenced in the session, due to implicit resolution, and then use a member from it`` () = - use fsiSession = createFsiSession () + use fsiSession = createFsiSession false let value = ResizeArray() value.Add(CustomType2()) @@ -466,7 +466,7 @@ module FsiTests = [] let ``Creation of a bound value succeeds if the value contains two generic types from assemblies that are not referenced in the session, due to implicit resolution`` () = - use fsiSession = createFsiSession () + use fsiSession = createFsiSession false let value = ({ X = 1 }, CustomType2()) @@ -479,8 +479,8 @@ module FsiTests = Assert.shouldBe typeof boundValue.Value.ReflectionType [] - let ``Creation of a bound value fails if the value contains types from a dynamic assembly`` () = - use fsiSession = createFsiSession () + let ``Creation of a bound value fails if the value contains types from a dynamic assembly using single assembly emit`` () = + use fsiSession = createFsiSession true fsiSession.AddBoundValue("fsiSession", fsiSession) @@ -492,27 +492,41 @@ module FsiTests = | Choice2Of2 ex -> Assert.shouldBe typeof (ex.GetType()) | _ -> failwith "Expected an exception" + [] + let ``Creation of a bound value fails if the value contains types from a dynamic assembly using ilwrite`` () = + use fsiSession = createFsiSession false + + fsiSession.AddBoundValue("fsiSession", fsiSession) + + let res, _ = fsiSession.EvalInteractionNonThrowing(""" + type TypeInDynamicAssembly() = class end + fsiSession.AddBoundValue("x", TypeInDynamicAssembly())""") + + match res with + | Choice2Of2 ex -> Assert.shouldBe typeof (ex.GetType()) + | _ -> failwith "Expected an exception" + type internal NonPublicCustomType() = class end [] let ``Creation of a bound value fails if the value's type is not public`` () = - use fsiSession = createFsiSession () + use fsiSession = createFsiSession false Assert.Throws(fun () -> fsiSession.AddBoundValue("x", NonPublicCustomType())) |> ignore [] let ``Creation of a bound value succeeds if the value is a partial application function type`` () = - use fsiSession = createFsiSession () + use fsiSession = createFsiSession false fsiSession.AddBoundValue("createFsiSession", createFsiSession) let boundValue = fsiSession.GetBoundValues() |> List.exactlyOne - Assert.shouldBe typeof FsiEvaluationSession> boundValue.Value.ReflectionType + Assert.shouldBe typeof FsiEvaluationSession> boundValue.Value.ReflectionType [] let ``Creation of a bound value succeeds if the value is a partial application function type with four arguments`` () = - use fsiSession = createFsiSession () + use fsiSession = createFsiSession false let addXYZW x y z w = x + y + z + w let addYZW = addXYZW 1 @@ -526,7 +540,7 @@ module FsiTests = [] let ``Creation of a bound value succeeds if the value is a lambda`` () = - use fsiSession = createFsiSession () + use fsiSession = createFsiSession false fsiSession.AddBoundValue("addXYZ", fun x y z -> x + y + z) @@ -543,7 +557,7 @@ module FsiTests = [] let ``Creation of a bound value succeeds if the value is a type that inherits FSharpFunc`` () = - use fsiSession = createFsiSession () + use fsiSession = createFsiSession false fsiSession.AddBoundValue("test", Test2FSharpInheritFunc()) @@ -553,7 +567,7 @@ module FsiTests = [] let ``Creation of a bound value succeeds if the value is an array of a built-in value type``() = - use fsiSession = createFsiSession () + use fsiSession = createFsiSession false let arr = [|0; 1|] fsiSession.AddBoundValue("boundMdArray", arr) let boundValue = fsiSession.GetBoundValues() |> List.exactlyOne @@ -562,7 +576,7 @@ module FsiTests = [] let ``Creation of a bound value succeeds if the value is an array of a built-in reference type``() = - use fsiSession = createFsiSession () + use fsiSession = createFsiSession false let arr = [|"zero"; "one"|] fsiSession.AddBoundValue("boundMdArray", arr) let boundValue = fsiSession.GetBoundValues() |> List.exactlyOne @@ -571,7 +585,7 @@ module FsiTests = [] let ``Creation of a bound value succeeds if the value is an array of a custom value type``() = - use fsiSession = createFsiSession () + use fsiSession = createFsiSession false let arr = [|CustomStruct(1)|] fsiSession.AddBoundValue("boundMdArray", arr) let boundValue = fsiSession.GetBoundValues() |> List.exactlyOne @@ -580,7 +594,7 @@ module FsiTests = [] let ``Creation of a bound value succeeds if the value is an array of a custom reference type``() = - use fsiSession = createFsiSession () + use fsiSession = createFsiSession false let arr = [|CustomType2()|] fsiSession.AddBoundValue("boundMdArray", arr) let boundValue = fsiSession.GetBoundValues() |> List.exactlyOne @@ -589,7 +603,7 @@ module FsiTests = [] let ``Creation of a bound value succeeds if the value is a multidimensional array of a built-in value type``() = - use fsiSession = createFsiSession () + use fsiSession = createFsiSession false let mdArr = array2D [[1; 0]; [0; 1]] fsiSession.AddBoundValue("boundMdArray", mdArr) let boundValue = fsiSession.GetBoundValues() |> List.exactlyOne @@ -598,7 +612,7 @@ module FsiTests = [] let ``Creation of a bound value succeeds if the value is a multidimensional array of a built-in reference type``() = - use fsiSession = createFsiSession () + use fsiSession = createFsiSession false let mdArr = array2D [["one"; "zero"]; ["zero"; "one"]] fsiSession.AddBoundValue("boundMdArray", mdArr) let boundValue = fsiSession.GetBoundValues() |> List.exactlyOne @@ -607,7 +621,7 @@ module FsiTests = [] let ``Creation of a bound value succeeds if the value is a multidimensional array of a custom value type``() = - use fsiSession = createFsiSession () + use fsiSession = createFsiSession false let mdArr = array2D [[CustomStruct(1); CustomStruct(1)]; [CustomStruct(1); CustomStruct(1)]] fsiSession.AddBoundValue("boundMdArray", mdArr) let boundValue = fsiSession.GetBoundValues() |> List.exactlyOne @@ -616,7 +630,7 @@ module FsiTests = [] let ``Creation of a bound value succeeds if the value is a multidimensional array of a custom reference type``() = - use fsiSession = createFsiSession () + use fsiSession = createFsiSession false let mdArr = array2D [[CustomType2(); CustomType2()]; [CustomType2(); CustomType2()]] fsiSession.AddBoundValue("boundMdArray", mdArr) let boundValue = fsiSession.GetBoundValues() |> List.exactlyOne diff --git a/tests/benchmarks/CompilerServiceBenchmarks/Benchmarks.fs b/tests/benchmarks/CompilerServiceBenchmarks/Benchmarks.fs index 434d6870bd..2a8ff70a86 100644 --- a/tests/benchmarks/CompilerServiceBenchmarks/Benchmarks.fs +++ b/tests/benchmarks/CompilerServiceBenchmarks/Benchmarks.fs @@ -11,7 +11,6 @@ open FSharp.Compiler.Text open FSharp.Compiler.AbstractIL.IL open FSharp.Compiler.AbstractIL.ILBinaryReader open BenchmarkDotNet.Attributes -open BenchmarkDotNet.Running open FSharp.Compiler.Benchmarks [] @@ -77,20 +76,8 @@ type TypeCheckingBenchmark1() = let mutable assembliesOpt = None let mutable testFileOpt = None - let parsingOptions = - { - SourceFiles = [|"decentlySizedStandAloneFile.fsx"|] - ConditionalCompilationDefines = [] - ErrorSeverityOptions = FSharpDiagnosticOptions.Default - LangVersionText = "default" - IsInteractive = false - LightSyntax = None - CompilingFsLib = false - IsExe = false - } - [] - member __.Setup() = + member _.Setup() = match checkerOpt with | None -> checkerOpt <- Some(FSharpChecker.Create(projectCacheSize = 200)) | _ -> () @@ -113,7 +100,7 @@ type TypeCheckingBenchmark1() = | _ -> () [] - member __.Run() = + member _.Run() = match checkerOpt, testFileOpt with | None, _ -> failwith "no checker" | _, None -> failwith "no test file" @@ -127,7 +114,7 @@ type TypeCheckingBenchmark1() = if results.Diagnostics.Length > 0 then failwithf "had errors: %A" results.Diagnostics [] - member __.Cleanup() = + member _.Cleanup() = match checkerOpt with | None -> failwith "no checker" | Some(checker) -> @@ -135,11 +122,6 @@ type TypeCheckingBenchmark1() = checker.ClearLanguageServiceRootCachesAndCollectAndFinalizeAllTransients() ClearAllILModuleReaderCache() -module Test = - let inline f x y = x + y - - - [] type CompilerService() = let mutable checkerOpt = None @@ -168,9 +150,10 @@ type CompilerService() = } [] - member __.Setup() = + member _.Setup() = match checkerOpt with - | None -> checkerOpt <- Some(FSharpChecker.Create(projectCacheSize = 200)) + | None -> + checkerOpt <- Some(FSharpChecker.Create(projectCacheSize = 200)) | _ -> () match sourceOpt with @@ -199,7 +182,7 @@ type CompilerService() = | _ -> () [] - member __.ParsingTypeCheckerFs() = + member _.ParsingTypeCheckerFs() = match checkerOpt, sourceOpt with | None, _ -> failwith "no checker" | _, None -> failwith "no source" @@ -208,7 +191,7 @@ type CompilerService() = if results.ParseHadErrors then failwithf "parse had errors: %A" results.Diagnostics [] - member __.ParsingTypeCheckerFsSetup() = + member _.ParsingTypeCheckerFsSetup() = match checkerOpt with | None -> failwith "no checker" | Some(checker) -> @@ -218,14 +201,13 @@ type CompilerService() = ClearAllILModuleReaderCache() [] - member __.ILReading() = + member _.ILReading() = match assembliesOpt with | None -> failwith "no assemblies" | Some(assemblies) -> // We try to read most of everything in the assembly that matter, mainly types with their properties, methods, and fields. // CustomAttrs and SecurityDecls are lazy until you call them, so we call them here for benchmarking. - assemblies - |> Array.iter (fun (fileName) -> + for fileName in assemblies do let reader = OpenILModuleReader fileName readerOptions let ilModuleDef = reader.ILModuleDef @@ -234,37 +216,26 @@ type CompilerService() = ilAssemblyManifest.CustomAttrs |> ignore ilAssemblyManifest.SecurityDecls |> ignore - ilAssemblyManifest.ExportedTypes.AsList - |> List.iter (fun x -> - x.CustomAttrs |> ignore - ) + for x in ilAssemblyManifest.ExportedTypes.AsList() do + x.CustomAttrs |> ignore ilModuleDef.CustomAttrs |> ignore - ilModuleDef.TypeDefs.AsArray - |> Array.iter (fun ilTypeDef -> + for ilTypeDef in ilModuleDef.TypeDefs.AsArray() do ilTypeDef.CustomAttrs |> ignore ilTypeDef.SecurityDecls |> ignore - ilTypeDef.Methods.AsArray - |> Array.iter (fun ilMethodDef -> + for ilMethodDef in ilTypeDef.Methods.AsArray() do ilMethodDef.CustomAttrs |> ignore ilMethodDef.SecurityDecls |> ignore - ) - ilTypeDef.Fields.AsList - |> List.iter (fun ilFieldDef -> + for ilFieldDef in ilTypeDef.Fields.AsList() do ilFieldDef.CustomAttrs |> ignore - ) - ilTypeDef.Properties.AsList - |> List.iter (fun ilPropertyDef -> + for ilPropertyDef in ilTypeDef.Properties.AsList() do ilPropertyDef.CustomAttrs |> ignore - ) - ) - ) [] - member __.ILReadingSetup() = + member _.ILReadingSetup() = // With caching, performance increases an order of magnitude when re-reading an ILModuleReader. // Clear it for benchmarking. ClearAllILModuleReaderCache() @@ -272,8 +243,7 @@ type CompilerService() = member val TypeCheckFileWith100ReferencedProjectsOptions = createProject "MainProject" [ for i = 1 to 100 do - yield - createProject ("ReferencedProject" + string i) [] + createProject ("ReferencedProject" + string i) [] ] member this.TypeCheckFileWith100ReferencedProjectsRun() = @@ -299,20 +269,15 @@ type CompilerService() = [] member this.TypeCheckFileWith100ReferencedProjectsSetup() = - this.TypeCheckFileWith100ReferencedProjectsOptions.SourceFiles - |> Seq.iter (fun file -> + for file in this.TypeCheckFileWith100ReferencedProjectsOptions.SourceFiles do File.WriteAllText(file, generateSourceCode (Path.GetFileNameWithoutExtension(file))) - ) - this.TypeCheckFileWith100ReferencedProjectsOptions.ReferencedProjects - |> Seq.iter (function + for proj in this.TypeCheckFileWith100ReferencedProjectsOptions.ReferencedProjects do + match proj with | FSharpReferencedProject.FSharpReference(_, referencedProjectOptions) -> - referencedProjectOptions.SourceFiles - |> Seq.iter (fun file -> + for file in referencedProjectOptions.SourceFiles do File.WriteAllText(file, generateSourceCode (Path.GetFileNameWithoutExtension(file))) - ) | _ -> () - ) this.TypeCheckFileWith100ReferencedProjectsRun() @@ -326,30 +291,25 @@ type CompilerService() = [] member this.TypeCheckFileWith100ReferencedProjectsCleanup() = - this.TypeCheckFileWith100ReferencedProjectsOptions.SourceFiles - |> Seq.iter (fun file -> + for file in this.TypeCheckFileWith100ReferencedProjectsOptions.SourceFiles do try File.Delete(file) with | _ -> () - ) - this.TypeCheckFileWith100ReferencedProjectsOptions.ReferencedProjects - |> Seq.iter (function + for proj in this.TypeCheckFileWith100ReferencedProjectsOptions.ReferencedProjects do + match proj with | FSharpReferencedProject.FSharpReference(_, referencedProjectOptions) -> - referencedProjectOptions.SourceFiles - |> Seq.iter (fun file -> + for file in referencedProjectOptions.SourceFiles do try File.Delete(file) with | _ -> () - ) | _ -> () - ) match checkerOpt with | None -> failwith "no checker" - | Some(checker) -> + | Some checker -> checker.InvalidateAll() checker.ClearLanguageServiceRootCachesAndCollectAndFinalizeAllTransients() ClearAllILModuleReaderCache() [] - member this.SimplifyNames() = + member _.SimplifyNames() = match decentlySizedStandAloneFileCheckResultOpt with | Some checkResult -> match checkResult with @@ -358,11 +318,10 @@ type CompilerService() = let sourceLines = decentlySizedStandAloneFile.Split ([|"\r\n"; "\n"; "\r"|], StringSplitOptions.None) let ranges = SimplifyNames.getSimplifiableNames(results, fun lineNum -> sourceLines.[Line.toZ lineNum]) |> Async.RunImmediate ignore ranges - () | _ -> failwith "oopsie" [] - member this.UnusedOpens() = + member _.UnusedOpens() = match decentlySizedStandAloneFileCheckResultOpt with | Some checkResult -> match checkResult with @@ -371,11 +330,10 @@ type CompilerService() = let sourceLines = decentlySizedStandAloneFile.Split ([|"\r\n"; "\n"; "\r"|], StringSplitOptions.None) let decls = UnusedOpens.getUnusedOpens(results, fun lineNum -> sourceLines.[Line.toZ lineNum]) |> Async.RunImmediate ignore decls - () | _ -> failwith "oopsie" [] - member this.UnusedDeclarations() = + member _.UnusedDeclarations() = match decentlySizedStandAloneFileCheckResultOpt with | Some checkResult -> match checkResult with @@ -383,5 +341,4 @@ type CompilerService() = | FSharpCheckFileAnswer.Succeeded results -> let decls = UnusedDeclarations.getUnusedDeclarations(results, true) |> Async.RunImmediate ignore decls // should be 16 - () | _ -> failwith "oopsie" \ No newline at end of file diff --git a/tests/fsharp/core/pinvoke/test.fsx b/tests/fsharp/core/pinvoke/test.fsx index 28257b0202..7f83b24fd4 100644 --- a/tests/fsharp/core/pinvoke/test.fsx +++ b/tests/fsharp/core/pinvoke/test.fsx @@ -17,7 +17,7 @@ let report_failure (s : string) = failures := !failures @ [s] // We currently build targeting netcoreapp3_1, and will continue to do so through this VS cycle -// We will use this api to see if we are running on a netcore which supports pinvoke / refemit +// We will use this api to see if we are running on a netcore which supports pinvoke / legacyemit let definePInvokeMethod = typeof.GetMethod("DefinePInvokeMethod", [| typeof diff --git a/tests/fsharp/core/printing/z.output.test.default.stderr.bsl b/tests/fsharp/core/printing/output.1000.stderr.bsl similarity index 96% rename from tests/fsharp/core/printing/z.output.test.default.stderr.bsl rename to tests/fsharp/core/printing/output.1000.stderr.bsl index 4d3209ca24..6926dcc9f3 100644 --- a/tests/fsharp/core/printing/z.output.test.default.stderr.bsl +++ b/tests/fsharp/core/printing/output.1000.stderr.bsl @@ -275,6 +275,18 @@ stdin(618,21): warning FS1172: Infix operator member '**' has no arguments. Expe stdin(623,17): warning FS0864: This new member hides the abstract member 'System.Object.ToString() : string'. Rename the member or use 'override' instead. + let x,f = it, (fun () -> !it);; // this will read from the static storage for 'it' + -------------------------^ + +stdin(643,26): info FS3370: The use of '!' from the F# library is deprecated. See https://aka.ms/fsharp-refcell-ops. For example, please change '!cell' to 'cell.Value'. + + + x := 3;; + --^^ + +stdin(645,3): info FS3370: The use of ':=' from the F# library is deprecated. See https://aka.ms/fsharp-refcell-ops. For example, please change 'cell := expr' to 'cell.Value <- expr'. + + member this.M() = "string" ----------------^ diff --git a/tests/fsharp/core/printing/z.output.test.1000.stdout.50.bsl b/tests/fsharp/core/printing/output.1000.stdout.bsl similarity index 99% rename from tests/fsharp/core/printing/z.output.test.1000.stdout.50.bsl rename to tests/fsharp/core/printing/output.1000.stdout.bsl index 54aafd9050..6cebad0208 100644 --- a/tests/fsharp/core/printing/z.output.test.1000.stdout.50.bsl +++ b/tests/fsharp/core/printing/output.1000.stdout.bsl @@ -15,6 +15,8 @@ namespace FSI_0005 val x7: System.Windows.Forms.Form val x8: int[,] val x9: Lazy + type ClassInFile1 = + new: unit -> ClassInFile1 namespace FSI_0006 val x1: int @@ -26,6 +28,8 @@ namespace FSI_0006 val x7: System.Windows.Forms.Form val x8: int[,] val x9: Lazy + type ClassInFile1 = + new: unit -> ClassInFile1 namespace FSI_0006 val x1: int @@ -37,6 +41,8 @@ namespace FSI_0006 val x7: System.Windows.Forms.Form val x8: int[,] val x9: Lazy + type ClassInFile2 = + new: unit -> ClassInFile2 > val x1: seq val x2: seq @@ -2715,4 +2721,29 @@ val ShortName: string = "hi" > val it: System.DayOfWeek = Tuesday +> val internal f: unit -> int + +> val it: int = 1 + +> type internal CInternal = + new: unit -> CInternal + +> val it: unit = () + +> type internal CPublic = + new: unit -> CPublic + member MInternal: unit -> unit + +> val it: unit = () + +> type internal CPublic2 = + new: unit -> CPublic2 + member MPublic: unit -> int + +> val it: int = 1 + +> val inst1: TestLoadFile.ClassInFile1 + +> val inst2: TestLoadFile2.ClassInFile2 + > > > diff --git a/tests/fsharp/core/printing/z.output.test.off.stderr.bsl b/tests/fsharp/core/printing/output.200.stderr.bsl similarity index 96% rename from tests/fsharp/core/printing/z.output.test.off.stderr.bsl rename to tests/fsharp/core/printing/output.200.stderr.bsl index 4d3209ca24..6926dcc9f3 100644 --- a/tests/fsharp/core/printing/z.output.test.off.stderr.bsl +++ b/tests/fsharp/core/printing/output.200.stderr.bsl @@ -275,6 +275,18 @@ stdin(618,21): warning FS1172: Infix operator member '**' has no arguments. Expe stdin(623,17): warning FS0864: This new member hides the abstract member 'System.Object.ToString() : string'. Rename the member or use 'override' instead. + let x,f = it, (fun () -> !it);; // this will read from the static storage for 'it' + -------------------------^ + +stdin(643,26): info FS3370: The use of '!' from the F# library is deprecated. See https://aka.ms/fsharp-refcell-ops. For example, please change '!cell' to 'cell.Value'. + + + x := 3;; + --^^ + +stdin(645,3): info FS3370: The use of ':=' from the F# library is deprecated. See https://aka.ms/fsharp-refcell-ops. For example, please change 'cell := expr' to 'cell.Value <- expr'. + + member this.M() = "string" ----------------^ diff --git a/tests/fsharp/core/printing/z.output.test.200.stdout.50.bsl b/tests/fsharp/core/printing/output.200.stdout.bsl similarity index 99% rename from tests/fsharp/core/printing/z.output.test.200.stdout.50.bsl rename to tests/fsharp/core/printing/output.200.stdout.bsl index b12999c287..352b5e2cbe 100644 --- a/tests/fsharp/core/printing/z.output.test.200.stdout.50.bsl +++ b/tests/fsharp/core/printing/output.200.stdout.bsl @@ -15,6 +15,8 @@ namespace FSI_0005 val x7: System.Windows.Forms.Form val x8: int[,] val x9: Lazy + type ClassInFile1 = + new: unit -> ClassInFile1 namespace FSI_0006 val x1: int @@ -26,6 +28,8 @@ namespace FSI_0006 val x7: System.Windows.Forms.Form val x8: int[,] val x9: Lazy + type ClassInFile1 = + new: unit -> ClassInFile1 namespace FSI_0006 val x1: int @@ -37,6 +41,8 @@ namespace FSI_0006 val x7: System.Windows.Forms.Form val x8: int[,] val x9: Lazy + type ClassInFile2 = + new: unit -> ClassInFile2 > val x1: seq val x2: seq @@ -1960,4 +1966,29 @@ val ShortName: string = "hi" > val it: System.DayOfWeek = Tuesday +> val internal f: unit -> int + +> val it: int = 1 + +> type internal CInternal = + new: unit -> CInternal + +> val it: unit = () + +> type internal CPublic = + new: unit -> CPublic + member MInternal: unit -> unit + +> val it: unit = () + +> type internal CPublic2 = + new: unit -> CPublic2 + member MPublic: unit -> int + +> val it: int = 1 + +> val inst1: TestLoadFile.ClassInFile1 + +> val inst2: TestLoadFile2.ClassInFile2 + > > > diff --git a/tests/fsharp/core/printing/z.output.test.1000.stderr.bsl b/tests/fsharp/core/printing/output.47.stderr.bsl similarity index 100% rename from tests/fsharp/core/printing/z.output.test.1000.stderr.bsl rename to tests/fsharp/core/printing/output.47.stderr.bsl diff --git a/tests/fsharp/core/printing/z.output.test.default.stdout.47.bsl b/tests/fsharp/core/printing/output.47.stdout.bsl similarity index 99% rename from tests/fsharp/core/printing/z.output.test.default.stdout.47.bsl rename to tests/fsharp/core/printing/output.47.stdout.bsl index 882c02cdec..4d9c46549c 100644 --- a/tests/fsharp/core/printing/z.output.test.default.stdout.47.bsl +++ b/tests/fsharp/core/printing/output.47.stdout.bsl @@ -13,6 +13,8 @@ namespace FSI_0004 val x7: System.Windows.Forms.Form val x8: int[,] val x9: Lazy + type ClassInFile1 = + new: unit -> ClassInFile1 namespace FSI_0005 val x1: int @@ -24,6 +26,8 @@ namespace FSI_0005 val x7: System.Windows.Forms.Form val x8: int[,] val x9: Lazy + type ClassInFile1 = + new: unit -> ClassInFile1 namespace FSI_0005 val x1: int @@ -35,6 +39,8 @@ namespace FSI_0005 val x7: System.Windows.Forms.Form val x8: int[,] val x9: Lazy + type ClassInFile2 = + new: unit -> ClassInFile2 > val x1: seq val x2: seq @@ -6260,4 +6266,29 @@ val ShortName: string = "hi" > val it: System.DayOfWeek = Tuesday +> val internal f: unit -> int + +> val it: int = 1 + +> type internal CInternal = + new: unit -> CInternal + +> val it: unit = () + +> type internal CPublic = + new: unit -> CPublic + member MInternal: unit -> unit + +> val it: unit = () + +> type internal CPublic2 = + new: unit -> CPublic2 + member MPublic: unit -> int + +> val it: int = 1 + +> val inst1: TestLoadFile.ClassInFile1 + +> val inst2: TestLoadFile2.ClassInFile2 + > > > diff --git a/tests/fsharp/core/printing/output.legacyemitoff.stderr.bsl b/tests/fsharp/core/printing/output.legacyemitoff.stderr.bsl new file mode 100644 index 0000000000..68785a152d --- /dev/null +++ b/tests/fsharp/core/printing/output.legacyemitoff.stderr.bsl @@ -0,0 +1,366 @@ + + #blaaaaaa // blaaaaaa is not a known command;; + ^^^^^^^^^ + +stdin(219,1): warning FS3353: Invalid directive '#blaaaaaa ' + + + type Regression4319_T0 = static member (+-+-+) = "0 arguments";; + -----------------------------------------^^^^^ + +stdin(571,42): warning FS1172: Infix operator member '+-+-+' has no arguments. Expected a tuple of 2 arguments, e.g. static member (+) (x,y) = ... + + + type Regression4319_T1 = static member (+-+-+) x = "1 argument";; + -----------------------------------------^^^^^ + +stdin(572,42): warning FS1173: Infix operator member '+-+-+' has 1 initial argument(s). Expected a tuple of 2 arguments, e.g. static member (+) (x,y) = ... + + + type Regression4319_T1b = static member (+-+-+) (x) = "1 (argument) [brackets make no diff]";; + -----------------------------------------^^^^^ + +stdin(573,42): warning FS1173: Infix operator member '+-+-+' has 1 initial argument(s). Expected a tuple of 2 arguments, e.g. static member (+) (x,y) = ... + + + type Regression4319_T1c = static member (+-+-+) x = let a,b = x in "1 argument, tuple typed from RHS. Still not OK";; + -----------------------------------------^^^^^ + +stdin(574,42): warning FS1173: Infix operator member '+-+-+' has 1 initial argument(s). Expected a tuple of 2 arguments, e.g. static member (+) (x,y) = ... + + + type Regression4319_T1d = static member (+-+-+) (x:int*int) = "1 argument, tuple typed from LHS. Still not OK";; + -----------------------------------------^^^^^ + +stdin(575,42): warning FS1173: Infix operator member '+-+-+' has 1 initial argument(s). Expected a tuple of 2 arguments, e.g. static member (+) (x,y) = ... + + + type Regression4319_T3 = static member (+-+-+) (x,y,z) = "3 arguments";; + -----------------------------------------^^^^^ + +stdin(577,42): warning FS1173: Infix operator member '+-+-+' has 3 initial argument(s). Expected a tuple of 2 arguments, e.g. static member (+) (x,y) = ... + + + type Regression4319_U1 = static member (+-+-+) x moreArgs = "1 argument and further args";; + -----------------------------------------^^^^^ + +stdin(578,42): warning FS1173: Infix operator member '+-+-+' has 1 initial argument(s). Expected a tuple of 2 arguments, e.g. static member (+) (x,y) = ... + + + type Regression4319_U1 = static member (+-+-+) x moreArgs = "1 argument and further args";; + -----------------------------------------^^^^^ + +stdin(578,42): warning FS1174: Infix operator member '+-+-+' has extra curried arguments. Expected a tuple of 2 arguments, e.g. static member (+) (x,y) = ... + + + type Regression4319_U1b = static member (+-+-+) (x) moreArgs = "1 (argument) [brackets make no diff] and further args";; + -----------------------------------------^^^^^ + +stdin(579,42): warning FS1173: Infix operator member '+-+-+' has 1 initial argument(s). Expected a tuple of 2 arguments, e.g. static member (+) (x,y) = ... + + + type Regression4319_U1b = static member (+-+-+) (x) moreArgs = "1 (argument) [brackets make no diff] and further args";; + -----------------------------------------^^^^^ + +stdin(579,42): warning FS1174: Infix operator member '+-+-+' has extra curried arguments. Expected a tuple of 2 arguments, e.g. static member (+) (x,y) = ... + + + type Regression4319_U2 = static member (+-+-+) (x,y) moreArgs = "1 argument and further args";; + -----------------------------------------^^^^^ + +stdin(580,42): warning FS1174: Infix operator member '+-+-+' has extra curried arguments. Expected a tuple of 2 arguments, e.g. static member (+) (x,y) = ... + + + type Regression4319_U3 = static member (+-+-+) (x,y,z) moreArgs = "1 argument and further args";; + -----------------------------------------^^^^^ + +stdin(581,42): warning FS1173: Infix operator member '+-+-+' has 3 initial argument(s). Expected a tuple of 2 arguments, e.g. static member (+) (x,y) = ... + + + type Regression4319_U3 = static member (+-+-+) (x,y,z) moreArgs = "1 argument and further args";; + -----------------------------------------^^^^^ + +stdin(581,42): warning FS1174: Infix operator member '+-+-+' has extra curried arguments. Expected a tuple of 2 arguments, e.g. static member (+) (x,y) = ... + + + static member (:=) = "COLON_EQUALS" + -------------------^^ + +stdin(584,20): warning FS1172: Infix operator member ':=' has no arguments. Expected a tuple of 2 arguments, e.g. static member (+) (x,y) = ... + + + static member (:=) = "COLON_EQUALS" + -------------------^^ + +stdin(584,20): warning FS0086: The name '(:=)' should not be used as a member name because it is given a standard definition in the F# library over fixed types + + + static member (&) = "AMP" + -------------------^ + +stdin(588,20): warning FS1172: Infix operator member '&' has no arguments. Expected a tuple of 2 arguments, e.g. static member (+) (x,y) = ... + + + static member (&) = "AMP" + -------------------^ + +stdin(588,20): warning FS0086: The name '(&)' should not be used as a member name. If defining a static member for use from other CLI languages then use the name 'op_Amp' instead. + + + static member (&^) = "AMP_AMP" + -------------------^^ + +stdin(589,20): warning FS1172: Infix operator member '&^' has no arguments. Expected a tuple of 2 arguments, e.g. static member (+) (x,y) = ... + + + static member (=) = "EQUALS" + -------------------^ + +stdin(590,20): warning FS1172: Infix operator member '=' has no arguments. Expected a tuple of 2 arguments, e.g. static member (+) (x,y) = ... + + + static member (=) = "EQUALS" + -------------------^ + +stdin(590,20): warning FS0086: The name '(=)' should not be used as a member name. To define equality semantics for a type, override the 'Object.Equals' member. If defining a static member for use from other CLI languages then use the name 'op_Equality' instead. + + + static member (!=) = "INFIX_COMPARE_OP" + -------------------^^ + +stdin(592,20): warning FS1172: Infix operator member '!=' has no arguments. Expected a tuple of 2 arguments, e.g. static member (+) (x,y) = ... + + + static member (...=) = "INFIX_COMPARE_OP" // with $. prefix + -------------------^^^^ + +stdin(596,20): warning FS1172: Infix operator member '...=' has no arguments. Expected a tuple of 2 arguments, e.g. static member (+) (x,y) = ... + + + static member (...!=) = "INFIX_COMPARE_OP" // with $. prefix + -------------------^^^^^ + +stdin(597,20): warning FS1172: Infix operator member '...!=' has no arguments. Expected a tuple of 2 arguments, e.g. static member (+) (x,y) = ... + + + static member (...<) = "INFIX_COMPARE_OP" // with $. prefix + -------------------^^^^ + +stdin(598,20): warning FS1172: Infix operator member '...<' has no arguments. Expected a tuple of 2 arguments, e.g. static member (+) (x,y) = ... + + + static member (...>) = "INFIX_COMPARE_OP" // with $. prefix + -------------------^^^^ + +stdin(599,20): warning FS1172: Infix operator member '...>' has no arguments. Expected a tuple of 2 arguments, e.g. static member (+) (x,y) = ... + + + static member ($) = "DOLLAR" + -------------------^ + +stdin(601,20): warning FS1172: Infix operator member '$' has no arguments. Expected a tuple of 2 arguments, e.g. static member (+) (x,y) = ... + + + static member (<) = "LESS" + -------------------^ + +stdin(602,20): warning FS1172: Infix operator member '<' has no arguments. Expected a tuple of 2 arguments, e.g. static member (+) (x,y) = ... + + + static member (<) = "LESS" + -------------------^ + +stdin(602,20): warning FS0086: The name '(<)' should not be used as a member name. To define comparison semantics for a type, implement the 'System.IComparable' interface. If defining a static member for use from other CLI languages then use the name 'op_LessThan' instead. + + + static member (>) = "GREATER" + -------------------^ + +stdin(603,20): warning FS1172: Infix operator member '>' has no arguments. Expected a tuple of 2 arguments, e.g. static member (+) (x,y) = ... + + + static member (>) = "GREATER" + -------------------^ + +stdin(603,20): warning FS0086: The name '(>)' should not be used as a member name. To define comparison semantics for a type, implement the 'System.IComparable' interface. If defining a static member for use from other CLI languages then use the name 'op_GreaterThan' instead. + + + static member (@) = "INFIX_AT_HAT_OP" + -------------------^ + +stdin(604,20): warning FS1172: Infix operator member '@' has no arguments. Expected a tuple of 2 arguments, e.g. static member (+) (x,y) = ... + + + static member (@) = "INFIX_AT_HAT_OP" + -------------------^ + +stdin(604,20): warning FS0086: The name '(@)' should not be used as a member name because it is given a standard definition in the F# library over fixed types + + + static member (^) = "INFIX_AT_HAT_OP" + -------------------^ + +stdin(605,20): warning FS1172: Infix operator member '^' has no arguments. Expected a tuple of 2 arguments, e.g. static member (+) (x,y) = ... + + + static member (^) = "INFIX_AT_HAT_OP" + -------------------^ + +stdin(605,20): warning FS0086: The name '(^)' should not be used as a member name because it is given a standard definition in the F# library over fixed types + + + static member (...@) = "INFIX_AT_HAT_OP" // with $. prefix + -------------------^^^^ + +stdin(606,20): warning FS1172: Infix operator member '...@' has no arguments. Expected a tuple of 2 arguments, e.g. static member (+) (x,y) = ... + + + static member (...^) = "INFIX_AT_HAT_OP" // with $. prefix + -------------------^^^^ + +stdin(607,20): warning FS1172: Infix operator member '...^' has no arguments. Expected a tuple of 2 arguments, e.g. static member (+) (x,y) = ... + + + static member (%) = "PERCENT_OP" + -------------------^ + +stdin(608,20): warning FS1172: Infix operator member '%' has no arguments. Expected a tuple of 2 arguments, e.g. static member (+) (x,y) = ... + + + static member (-) = "MINUS" + -------------------^ + +stdin(610,20): warning FS1172: Infix operator member '-' has no arguments. Expected a tuple of 2 arguments, e.g. static member (+) (x,y) = ... + + + static member ( * ) = "STAR" + --------------------^ + +stdin(611,21): warning FS1172: Infix operator member '*' has no arguments. Expected a tuple of 2 arguments, e.g. static member (+) (x,y) = ... + + + static member (/) = "INFIX_STAR_DIV_MOD_OP" + -------------------^ + +stdin(613,20): warning FS1172: Infix operator member '/' has no arguments. Expected a tuple of 2 arguments, e.g. static member (+) (x,y) = ... + + + static member ( ...* ) = "INFIX_STAR_DIV_MOD_OP" // with $. prefix + --------------------^^^^ + +stdin(615,21): warning FS1172: Infix operator member '...*' has no arguments. Expected a tuple of 2 arguments, e.g. static member (+) (x,y) = ... + + + static member ( .../ ) = "INFIX_STAR_DIV_MOD_OP" // with $. prefix + --------------------^^^^ + +stdin(616,21): warning FS1172: Infix operator member '.../' has no arguments. Expected a tuple of 2 arguments, e.g. static member (+) (x,y) = ... + + + static member ( ...% ) = "INFIX_STAR_DIV_MOD_OP" // with $. prefix + --------------------^^^^ + +stdin(617,21): warning FS1172: Infix operator member '...%' has no arguments. Expected a tuple of 2 arguments, e.g. static member (+) (x,y) = ... + + + static member ( ** ) = "INFIX_STAR_STAR_OP" + --------------------^^ + +stdin(618,21): warning FS1172: Infix operator member '**' has no arguments. Expected a tuple of 2 arguments, e.g. static member (+) (x,y) = ... + + + member this.ToString() = "ABC" + ----------------^^^^^^^^ + +stdin(623,17): warning FS0864: This new member hides the abstract member 'System.Object.ToString() : string'. Rename the member or use 'override' instead. + + + let x,f = it, (fun () -> !it);; // this will read from the static storage for 'it' + -------------------------^ + +stdin(643,26): info FS3370: The use of '!' from the F# library is deprecated. See https://aka.ms/fsharp-refcell-ops. For example, please change '!cell' to 'cell.Value'. + + + x := 3;; + --^^ + +stdin(645,3): info FS3370: The use of ':=' from the F# library is deprecated. See https://aka.ms/fsharp-refcell-ops. For example, please change 'cell := expr' to 'cell.Value <- expr'. + + + member this.M() = "string" + ----------------^ + +stdin(764,17): error FS0438: Duplicate method. The method 'M' has the same name and signature as another method in type 'ExpectDupMethod'. + + + member this.P = "string" + ----------------^ + +stdin(771,17): error FS0438: Duplicate method. The method 'get_P' has the same name and signature as another method in type 'ExpectDupProperty'. + + + type public IBPublic = interface inherit IAPrivate abstract Q : int end + ------------------^^^^^^^^ + +stdin(778,19): error FS0410: The type 'IAPrivate' is less accessible than the value, member or type 'IBPublic' it is used in. + + + type internal IBInternal = interface inherit IAPrivate abstract Q : int end + ------------------^^^^^^^^^^ + +stdin(783,19): error FS0410: The type 'IAPrivate' is less accessible than the value, member or type 'IBInternal' it is used in. + + + type public IBPublic = interface inherit IAInternal abstract Q : int end + ------------------^^^^^^^^ + +stdin(792,19): error FS0410: The type 'IAInternal' is less accessible than the value, member or type 'IBPublic' it is used in. + + + override x.M(a:string) = 1 + -------------------^ + +stdin(824,20): error FS0361: The override 'M: string -> int' implements more than one abstract slot, e.g. 'abstract Regression4232.D.M: 'U -> int' and 'abstract Regression4232.D.M: 'T -> int' + + + let (|A|B|) (x:int) = A x;; + -----^^^^^ + +stdin(832,6): error FS1210: Active pattern '|A|B|' has a result type containing type variables that are not determined by the input. The common cause is a when a result case is not mentioned, e.g. 'let (|A|B|) (x:int) = A x'. This can be fixed with a type constraint, e.g. 'let (|A|B|) (x:int) : Choice = A x' + + + let (|A|B|) (x:'a) = A x;; + -----^^^^^ + +stdin(835,6): error FS1210: Active pattern '|A|B|' has a result type containing type variables that are not determined by the input. The common cause is a when a result case is not mentioned, e.g. 'let (|A|B|) (x:int) = A x'. This can be fixed with a type constraint, e.g. 'let (|A|B|) (x:int) : Choice = A x' + + + let (|A|B|) (p:'a) (x:int) = A p;; + -----^^^^^ + +stdin(838,6): error FS1210: Active pattern '|A|B|' has a result type containing type variables that are not determined by the input. The common cause is a when a result case is not mentioned, e.g. 'let (|A|B|) (x:int) = A x'. This can be fixed with a type constraint, e.g. 'let (|A|B|) (x:int) : Choice = A x' + + + let (|A|B|) = failwith "" : Choice;; + -----^^^^^ + +stdin(844,6): error FS1209: Active pattern '|A|B|' is not a function + + + let internal f() = 1;; f();; // should give a warning in multi-assembly interactive emit + -----------------------^^^ + +stdin(1089,24): warning FS2303: Accessing the internal type, method or field 'f' from a previous evaluation in F# Interactive is deprecated and may cause subsequent access errors. To enable the legacy generation of a single dynamic assembly that can access internals, use the '--multiemit-' option. + + + CPublic().MInternal();; // should give a warning in multi-assembly interactive emit + ^^^^^^^^^^^^^^^^^^^^^ + +stdin(1099,1): warning FS2303: Accessing the internal type, method or field 'MInternal' from a previous evaluation in F# Interactive is deprecated and may cause subsequent access errors. To enable the legacy generation of a single dynamic assembly that can access internals, use the '--multiemit-' option. + + + CPublic2().MPublic();; // should give a warning in multi-assembly interactive emit + ^^^^^^^^^^^^^^^^^^^^ + +stdin(1105,1): warning FS2303: Accessing the internal type, method or field 'MPublic' from a previous evaluation in F# Interactive is deprecated and may cause subsequent access errors. To enable the legacy generation of a single dynamic assembly that can access internals, use the '--multiemit-' option. + diff --git a/tests/fsharp/core/printing/z.output.test.default.stdout.50.bsl b/tests/fsharp/core/printing/output.legacyemitoff.stdout.bsl similarity index 99% rename from tests/fsharp/core/printing/z.output.test.default.stdout.50.bsl rename to tests/fsharp/core/printing/output.legacyemitoff.stdout.bsl index 08090a81e2..77a168f119 100644 --- a/tests/fsharp/core/printing/z.output.test.default.stdout.50.bsl +++ b/tests/fsharp/core/printing/output.legacyemitoff.stdout.bsl @@ -13,6 +13,8 @@ namespace FSI_0004 val x7: System.Windows.Forms.Form val x8: int[,] val x9: Lazy + type ClassInFile1 = + new: unit -> ClassInFile1 namespace FSI_0005 val x1: int @@ -24,6 +26,8 @@ namespace FSI_0005 val x7: System.Windows.Forms.Form val x8: int[,] val x9: Lazy + type ClassInFile1 = + new: unit -> ClassInFile1 namespace FSI_0005 val x1: int @@ -35,6 +39,8 @@ namespace FSI_0005 val x7: System.Windows.Forms.Form val x8: int[,] val x9: Lazy + type ClassInFile2 = + new: unit -> ClassInFile2 > val x1: seq val x2: seq @@ -6262,4 +6268,29 @@ val ShortName: string = "hi" > val it: System.DayOfWeek = Tuesday +> val internal f: unit -> int + +> val it: int = 1 + +> type internal CInternal = + new: unit -> CInternal + +> val it: unit = () + +> type internal CPublic = + new: unit -> CPublic + member MInternal: unit -> unit + +> val it: unit = () + +> type internal CPublic2 = + new: unit -> CPublic2 + member MPublic: unit -> int + +> val it: int = 1 + +> val inst1: TestLoadFile.ClassInFile1 + +> val inst2: TestLoadFile2.ClassInFile2 + > > > diff --git a/tests/fsharp/core/printing/z.output.test.200.stderr.bsl b/tests/fsharp/core/printing/output.off.stderr.bsl similarity index 96% rename from tests/fsharp/core/printing/z.output.test.200.stderr.bsl rename to tests/fsharp/core/printing/output.off.stderr.bsl index 4d3209ca24..6926dcc9f3 100644 --- a/tests/fsharp/core/printing/z.output.test.200.stderr.bsl +++ b/tests/fsharp/core/printing/output.off.stderr.bsl @@ -275,6 +275,18 @@ stdin(618,21): warning FS1172: Infix operator member '**' has no arguments. Expe stdin(623,17): warning FS0864: This new member hides the abstract member 'System.Object.ToString() : string'. Rename the member or use 'override' instead. + let x,f = it, (fun () -> !it);; // this will read from the static storage for 'it' + -------------------------^ + +stdin(643,26): info FS3370: The use of '!' from the F# library is deprecated. See https://aka.ms/fsharp-refcell-ops. For example, please change '!cell' to 'cell.Value'. + + + x := 3;; + --^^ + +stdin(645,3): info FS3370: The use of ':=' from the F# library is deprecated. See https://aka.ms/fsharp-refcell-ops. For example, please change 'cell := expr' to 'cell.Value <- expr'. + + member this.M() = "string" ----------------^ diff --git a/tests/fsharp/core/printing/z.output.test.off.stdout.47.bsl b/tests/fsharp/core/printing/output.off.stdout.bsl similarity index 98% rename from tests/fsharp/core/printing/z.output.test.off.stdout.47.bsl rename to tests/fsharp/core/printing/output.off.stdout.bsl index f5f4220db9..adf4767232 100644 --- a/tests/fsharp/core/printing/z.output.test.off.stdout.47.bsl +++ b/tests/fsharp/core/printing/output.off.stdout.bsl @@ -15,6 +15,8 @@ namespace FSI_0005 val x7: System.Windows.Forms.Form val x8: int[,] val x9: Lazy + type ClassInFile1 = + new: unit -> ClassInFile1 namespace FSI_0006 val x1: int @@ -26,6 +28,8 @@ namespace FSI_0006 val x7: System.Windows.Forms.Form val x8: int[,] val x9: Lazy + type ClassInFile1 = + new: unit -> ClassInFile1 namespace FSI_0006 val x1: int @@ -37,6 +41,8 @@ namespace FSI_0006 val x7: System.Windows.Forms.Form val x8: int[,] val x9: Lazy + type ClassInFile2 = + new: unit -> ClassInFile2 > val x1: seq val x2: seq @@ -242,6 +248,8 @@ type 'a T4063 = | AT4063 of 'a #load "file.fs" ...;; // Load the given file(s) as if compiled and referenced #time ["on"|"off"];; // Toggle timing on/off #help;; // Display help + #r "nuget:FSharp.Data, 3.1.2";; // Load Nuget Package 'FSharp.Data' version '3.1.2' + #r "nuget:FSharp.Data";; // Load Nuget Package 'FSharp.Data' with the highest version #quit;; // Exit F# Interactive command line options: @@ -1728,4 +1736,29 @@ val ShortName: string = "hi" > val it: System.DayOfWeek = Tuesday +> val internal f: unit -> int + +> val it: int = 1 + +> type internal CInternal = + new: unit -> CInternal + +> val it: unit = () + +> type internal CPublic = + new: unit -> CPublic + member MInternal: unit -> unit + +> val it: unit = () + +> type internal CPublic2 = + new: unit -> CPublic2 + member MPublic: unit -> int + +> val it: int = 1 + +> val inst1: TestLoadFile.ClassInFile1 + +> val inst2: TestLoadFile2.ClassInFile2 + > > > diff --git a/tests/fsharp/core/printing/output.quiet.stderr.bsl b/tests/fsharp/core/printing/output.quiet.stderr.bsl new file mode 100644 index 0000000000..6926dcc9f3 --- /dev/null +++ b/tests/fsharp/core/printing/output.quiet.stderr.bsl @@ -0,0 +1,348 @@ + + #blaaaaaa // blaaaaaa is not a known command;; + ^^^^^^^^^ + +stdin(219,1): warning FS3353: Invalid directive '#blaaaaaa ' + + + type Regression4319_T0 = static member (+-+-+) = "0 arguments";; + -----------------------------------------^^^^^ + +stdin(571,42): warning FS1172: Infix operator member '+-+-+' has no arguments. Expected a tuple of 2 arguments, e.g. static member (+) (x,y) = ... + + + type Regression4319_T1 = static member (+-+-+) x = "1 argument";; + -----------------------------------------^^^^^ + +stdin(572,42): warning FS1173: Infix operator member '+-+-+' has 1 initial argument(s). Expected a tuple of 2 arguments, e.g. static member (+) (x,y) = ... + + + type Regression4319_T1b = static member (+-+-+) (x) = "1 (argument) [brackets make no diff]";; + -----------------------------------------^^^^^ + +stdin(573,42): warning FS1173: Infix operator member '+-+-+' has 1 initial argument(s). Expected a tuple of 2 arguments, e.g. static member (+) (x,y) = ... + + + type Regression4319_T1c = static member (+-+-+) x = let a,b = x in "1 argument, tuple typed from RHS. Still not OK";; + -----------------------------------------^^^^^ + +stdin(574,42): warning FS1173: Infix operator member '+-+-+' has 1 initial argument(s). Expected a tuple of 2 arguments, e.g. static member (+) (x,y) = ... + + + type Regression4319_T1d = static member (+-+-+) (x:int*int) = "1 argument, tuple typed from LHS. Still not OK";; + -----------------------------------------^^^^^ + +stdin(575,42): warning FS1173: Infix operator member '+-+-+' has 1 initial argument(s). Expected a tuple of 2 arguments, e.g. static member (+) (x,y) = ... + + + type Regression4319_T3 = static member (+-+-+) (x,y,z) = "3 arguments";; + -----------------------------------------^^^^^ + +stdin(577,42): warning FS1173: Infix operator member '+-+-+' has 3 initial argument(s). Expected a tuple of 2 arguments, e.g. static member (+) (x,y) = ... + + + type Regression4319_U1 = static member (+-+-+) x moreArgs = "1 argument and further args";; + -----------------------------------------^^^^^ + +stdin(578,42): warning FS1173: Infix operator member '+-+-+' has 1 initial argument(s). Expected a tuple of 2 arguments, e.g. static member (+) (x,y) = ... + + + type Regression4319_U1 = static member (+-+-+) x moreArgs = "1 argument and further args";; + -----------------------------------------^^^^^ + +stdin(578,42): warning FS1174: Infix operator member '+-+-+' has extra curried arguments. Expected a tuple of 2 arguments, e.g. static member (+) (x,y) = ... + + + type Regression4319_U1b = static member (+-+-+) (x) moreArgs = "1 (argument) [brackets make no diff] and further args";; + -----------------------------------------^^^^^ + +stdin(579,42): warning FS1173: Infix operator member '+-+-+' has 1 initial argument(s). Expected a tuple of 2 arguments, e.g. static member (+) (x,y) = ... + + + type Regression4319_U1b = static member (+-+-+) (x) moreArgs = "1 (argument) [brackets make no diff] and further args";; + -----------------------------------------^^^^^ + +stdin(579,42): warning FS1174: Infix operator member '+-+-+' has extra curried arguments. Expected a tuple of 2 arguments, e.g. static member (+) (x,y) = ... + + + type Regression4319_U2 = static member (+-+-+) (x,y) moreArgs = "1 argument and further args";; + -----------------------------------------^^^^^ + +stdin(580,42): warning FS1174: Infix operator member '+-+-+' has extra curried arguments. Expected a tuple of 2 arguments, e.g. static member (+) (x,y) = ... + + + type Regression4319_U3 = static member (+-+-+) (x,y,z) moreArgs = "1 argument and further args";; + -----------------------------------------^^^^^ + +stdin(581,42): warning FS1173: Infix operator member '+-+-+' has 3 initial argument(s). Expected a tuple of 2 arguments, e.g. static member (+) (x,y) = ... + + + type Regression4319_U3 = static member (+-+-+) (x,y,z) moreArgs = "1 argument and further args";; + -----------------------------------------^^^^^ + +stdin(581,42): warning FS1174: Infix operator member '+-+-+' has extra curried arguments. Expected a tuple of 2 arguments, e.g. static member (+) (x,y) = ... + + + static member (:=) = "COLON_EQUALS" + -------------------^^ + +stdin(584,20): warning FS1172: Infix operator member ':=' has no arguments. Expected a tuple of 2 arguments, e.g. static member (+) (x,y) = ... + + + static member (:=) = "COLON_EQUALS" + -------------------^^ + +stdin(584,20): warning FS0086: The name '(:=)' should not be used as a member name because it is given a standard definition in the F# library over fixed types + + + static member (&) = "AMP" + -------------------^ + +stdin(588,20): warning FS1172: Infix operator member '&' has no arguments. Expected a tuple of 2 arguments, e.g. static member (+) (x,y) = ... + + + static member (&) = "AMP" + -------------------^ + +stdin(588,20): warning FS0086: The name '(&)' should not be used as a member name. If defining a static member for use from other CLI languages then use the name 'op_Amp' instead. + + + static member (&^) = "AMP_AMP" + -------------------^^ + +stdin(589,20): warning FS1172: Infix operator member '&^' has no arguments. Expected a tuple of 2 arguments, e.g. static member (+) (x,y) = ... + + + static member (=) = "EQUALS" + -------------------^ + +stdin(590,20): warning FS1172: Infix operator member '=' has no arguments. Expected a tuple of 2 arguments, e.g. static member (+) (x,y) = ... + + + static member (=) = "EQUALS" + -------------------^ + +stdin(590,20): warning FS0086: The name '(=)' should not be used as a member name. To define equality semantics for a type, override the 'Object.Equals' member. If defining a static member for use from other CLI languages then use the name 'op_Equality' instead. + + + static member (!=) = "INFIX_COMPARE_OP" + -------------------^^ + +stdin(592,20): warning FS1172: Infix operator member '!=' has no arguments. Expected a tuple of 2 arguments, e.g. static member (+) (x,y) = ... + + + static member (...=) = "INFIX_COMPARE_OP" // with $. prefix + -------------------^^^^ + +stdin(596,20): warning FS1172: Infix operator member '...=' has no arguments. Expected a tuple of 2 arguments, e.g. static member (+) (x,y) = ... + + + static member (...!=) = "INFIX_COMPARE_OP" // with $. prefix + -------------------^^^^^ + +stdin(597,20): warning FS1172: Infix operator member '...!=' has no arguments. Expected a tuple of 2 arguments, e.g. static member (+) (x,y) = ... + + + static member (...<) = "INFIX_COMPARE_OP" // with $. prefix + -------------------^^^^ + +stdin(598,20): warning FS1172: Infix operator member '...<' has no arguments. Expected a tuple of 2 arguments, e.g. static member (+) (x,y) = ... + + + static member (...>) = "INFIX_COMPARE_OP" // with $. prefix + -------------------^^^^ + +stdin(599,20): warning FS1172: Infix operator member '...>' has no arguments. Expected a tuple of 2 arguments, e.g. static member (+) (x,y) = ... + + + static member ($) = "DOLLAR" + -------------------^ + +stdin(601,20): warning FS1172: Infix operator member '$' has no arguments. Expected a tuple of 2 arguments, e.g. static member (+) (x,y) = ... + + + static member (<) = "LESS" + -------------------^ + +stdin(602,20): warning FS1172: Infix operator member '<' has no arguments. Expected a tuple of 2 arguments, e.g. static member (+) (x,y) = ... + + + static member (<) = "LESS" + -------------------^ + +stdin(602,20): warning FS0086: The name '(<)' should not be used as a member name. To define comparison semantics for a type, implement the 'System.IComparable' interface. If defining a static member for use from other CLI languages then use the name 'op_LessThan' instead. + + + static member (>) = "GREATER" + -------------------^ + +stdin(603,20): warning FS1172: Infix operator member '>' has no arguments. Expected a tuple of 2 arguments, e.g. static member (+) (x,y) = ... + + + static member (>) = "GREATER" + -------------------^ + +stdin(603,20): warning FS0086: The name '(>)' should not be used as a member name. To define comparison semantics for a type, implement the 'System.IComparable' interface. If defining a static member for use from other CLI languages then use the name 'op_GreaterThan' instead. + + + static member (@) = "INFIX_AT_HAT_OP" + -------------------^ + +stdin(604,20): warning FS1172: Infix operator member '@' has no arguments. Expected a tuple of 2 arguments, e.g. static member (+) (x,y) = ... + + + static member (@) = "INFIX_AT_HAT_OP" + -------------------^ + +stdin(604,20): warning FS0086: The name '(@)' should not be used as a member name because it is given a standard definition in the F# library over fixed types + + + static member (^) = "INFIX_AT_HAT_OP" + -------------------^ + +stdin(605,20): warning FS1172: Infix operator member '^' has no arguments. Expected a tuple of 2 arguments, e.g. static member (+) (x,y) = ... + + + static member (^) = "INFIX_AT_HAT_OP" + -------------------^ + +stdin(605,20): warning FS0086: The name '(^)' should not be used as a member name because it is given a standard definition in the F# library over fixed types + + + static member (...@) = "INFIX_AT_HAT_OP" // with $. prefix + -------------------^^^^ + +stdin(606,20): warning FS1172: Infix operator member '...@' has no arguments. Expected a tuple of 2 arguments, e.g. static member (+) (x,y) = ... + + + static member (...^) = "INFIX_AT_HAT_OP" // with $. prefix + -------------------^^^^ + +stdin(607,20): warning FS1172: Infix operator member '...^' has no arguments. Expected a tuple of 2 arguments, e.g. static member (+) (x,y) = ... + + + static member (%) = "PERCENT_OP" + -------------------^ + +stdin(608,20): warning FS1172: Infix operator member '%' has no arguments. Expected a tuple of 2 arguments, e.g. static member (+) (x,y) = ... + + + static member (-) = "MINUS" + -------------------^ + +stdin(610,20): warning FS1172: Infix operator member '-' has no arguments. Expected a tuple of 2 arguments, e.g. static member (+) (x,y) = ... + + + static member ( * ) = "STAR" + --------------------^ + +stdin(611,21): warning FS1172: Infix operator member '*' has no arguments. Expected a tuple of 2 arguments, e.g. static member (+) (x,y) = ... + + + static member (/) = "INFIX_STAR_DIV_MOD_OP" + -------------------^ + +stdin(613,20): warning FS1172: Infix operator member '/' has no arguments. Expected a tuple of 2 arguments, e.g. static member (+) (x,y) = ... + + + static member ( ...* ) = "INFIX_STAR_DIV_MOD_OP" // with $. prefix + --------------------^^^^ + +stdin(615,21): warning FS1172: Infix operator member '...*' has no arguments. Expected a tuple of 2 arguments, e.g. static member (+) (x,y) = ... + + + static member ( .../ ) = "INFIX_STAR_DIV_MOD_OP" // with $. prefix + --------------------^^^^ + +stdin(616,21): warning FS1172: Infix operator member '.../' has no arguments. Expected a tuple of 2 arguments, e.g. static member (+) (x,y) = ... + + + static member ( ...% ) = "INFIX_STAR_DIV_MOD_OP" // with $. prefix + --------------------^^^^ + +stdin(617,21): warning FS1172: Infix operator member '...%' has no arguments. Expected a tuple of 2 arguments, e.g. static member (+) (x,y) = ... + + + static member ( ** ) = "INFIX_STAR_STAR_OP" + --------------------^^ + +stdin(618,21): warning FS1172: Infix operator member '**' has no arguments. Expected a tuple of 2 arguments, e.g. static member (+) (x,y) = ... + + + member this.ToString() = "ABC" + ----------------^^^^^^^^ + +stdin(623,17): warning FS0864: This new member hides the abstract member 'System.Object.ToString() : string'. Rename the member or use 'override' instead. + + + let x,f = it, (fun () -> !it);; // this will read from the static storage for 'it' + -------------------------^ + +stdin(643,26): info FS3370: The use of '!' from the F# library is deprecated. See https://aka.ms/fsharp-refcell-ops. For example, please change '!cell' to 'cell.Value'. + + + x := 3;; + --^^ + +stdin(645,3): info FS3370: The use of ':=' from the F# library is deprecated. See https://aka.ms/fsharp-refcell-ops. For example, please change 'cell := expr' to 'cell.Value <- expr'. + + + member this.M() = "string" + ----------------^ + +stdin(764,17): error FS0438: Duplicate method. The method 'M' has the same name and signature as another method in type 'ExpectDupMethod'. + + + member this.P = "string" + ----------------^ + +stdin(771,17): error FS0438: Duplicate method. The method 'get_P' has the same name and signature as another method in type 'ExpectDupProperty'. + + + type public IBPublic = interface inherit IAPrivate abstract Q : int end + ------------------^^^^^^^^ + +stdin(778,19): error FS0410: The type 'IAPrivate' is less accessible than the value, member or type 'IBPublic' it is used in. + + + type internal IBInternal = interface inherit IAPrivate abstract Q : int end + ------------------^^^^^^^^^^ + +stdin(783,19): error FS0410: The type 'IAPrivate' is less accessible than the value, member or type 'IBInternal' it is used in. + + + type public IBPublic = interface inherit IAInternal abstract Q : int end + ------------------^^^^^^^^ + +stdin(792,19): error FS0410: The type 'IAInternal' is less accessible than the value, member or type 'IBPublic' it is used in. + + + override x.M(a:string) = 1 + -------------------^ + +stdin(824,20): error FS0361: The override 'M: string -> int' implements more than one abstract slot, e.g. 'abstract Regression4232.D.M: 'U -> int' and 'abstract Regression4232.D.M: 'T -> int' + + + let (|A|B|) (x:int) = A x;; + -----^^^^^ + +stdin(832,6): error FS1210: Active pattern '|A|B|' has a result type containing type variables that are not determined by the input. The common cause is a when a result case is not mentioned, e.g. 'let (|A|B|) (x:int) = A x'. This can be fixed with a type constraint, e.g. 'let (|A|B|) (x:int) : Choice = A x' + + + let (|A|B|) (x:'a) = A x;; + -----^^^^^ + +stdin(835,6): error FS1210: Active pattern '|A|B|' has a result type containing type variables that are not determined by the input. The common cause is a when a result case is not mentioned, e.g. 'let (|A|B|) (x:int) = A x'. This can be fixed with a type constraint, e.g. 'let (|A|B|) (x:int) : Choice = A x' + + + let (|A|B|) (p:'a) (x:int) = A p;; + -----^^^^^ + +stdin(838,6): error FS1210: Active pattern '|A|B|' has a result type containing type variables that are not determined by the input. The common cause is a when a result case is not mentioned, e.g. 'let (|A|B|) (x:int) = A x'. This can be fixed with a type constraint, e.g. 'let (|A|B|) (x:int) : Choice = A x' + + + let (|A|B|) = failwith "" : Choice;; + -----^^^^^ + +stdin(844,6): error FS1209: Active pattern '|A|B|' is not a function + diff --git a/tests/fsharp/core/printing/output.quiet.stdout.bsl b/tests/fsharp/core/printing/output.quiet.stdout.bsl new file mode 100644 index 0000000000..26683b5210 --- /dev/null +++ b/tests/fsharp/core/printing/output.quiet.stdout.bsl @@ -0,0 +1,13 @@ +[Building 2 4...done] +[Building 2 6...done] +[Building 2 8...done] +[Building 2 10...done] +[Building 2 12...done] +[Building 2 14...done] +[Building 3 8...done] +[Building 4 8...done] +[Building 5 8...done] +[Building 6 8...done] +[Building 5 3...done] +Expect ABC = ABC +Expect ABC = ABC diff --git a/tests/fsharp/core/printing/output.stderr.bsl b/tests/fsharp/core/printing/output.stderr.bsl new file mode 100644 index 0000000000..6926dcc9f3 --- /dev/null +++ b/tests/fsharp/core/printing/output.stderr.bsl @@ -0,0 +1,348 @@ + + #blaaaaaa // blaaaaaa is not a known command;; + ^^^^^^^^^ + +stdin(219,1): warning FS3353: Invalid directive '#blaaaaaa ' + + + type Regression4319_T0 = static member (+-+-+) = "0 arguments";; + -----------------------------------------^^^^^ + +stdin(571,42): warning FS1172: Infix operator member '+-+-+' has no arguments. Expected a tuple of 2 arguments, e.g. static member (+) (x,y) = ... + + + type Regression4319_T1 = static member (+-+-+) x = "1 argument";; + -----------------------------------------^^^^^ + +stdin(572,42): warning FS1173: Infix operator member '+-+-+' has 1 initial argument(s). Expected a tuple of 2 arguments, e.g. static member (+) (x,y) = ... + + + type Regression4319_T1b = static member (+-+-+) (x) = "1 (argument) [brackets make no diff]";; + -----------------------------------------^^^^^ + +stdin(573,42): warning FS1173: Infix operator member '+-+-+' has 1 initial argument(s). Expected a tuple of 2 arguments, e.g. static member (+) (x,y) = ... + + + type Regression4319_T1c = static member (+-+-+) x = let a,b = x in "1 argument, tuple typed from RHS. Still not OK";; + -----------------------------------------^^^^^ + +stdin(574,42): warning FS1173: Infix operator member '+-+-+' has 1 initial argument(s). Expected a tuple of 2 arguments, e.g. static member (+) (x,y) = ... + + + type Regression4319_T1d = static member (+-+-+) (x:int*int) = "1 argument, tuple typed from LHS. Still not OK";; + -----------------------------------------^^^^^ + +stdin(575,42): warning FS1173: Infix operator member '+-+-+' has 1 initial argument(s). Expected a tuple of 2 arguments, e.g. static member (+) (x,y) = ... + + + type Regression4319_T3 = static member (+-+-+) (x,y,z) = "3 arguments";; + -----------------------------------------^^^^^ + +stdin(577,42): warning FS1173: Infix operator member '+-+-+' has 3 initial argument(s). Expected a tuple of 2 arguments, e.g. static member (+) (x,y) = ... + + + type Regression4319_U1 = static member (+-+-+) x moreArgs = "1 argument and further args";; + -----------------------------------------^^^^^ + +stdin(578,42): warning FS1173: Infix operator member '+-+-+' has 1 initial argument(s). Expected a tuple of 2 arguments, e.g. static member (+) (x,y) = ... + + + type Regression4319_U1 = static member (+-+-+) x moreArgs = "1 argument and further args";; + -----------------------------------------^^^^^ + +stdin(578,42): warning FS1174: Infix operator member '+-+-+' has extra curried arguments. Expected a tuple of 2 arguments, e.g. static member (+) (x,y) = ... + + + type Regression4319_U1b = static member (+-+-+) (x) moreArgs = "1 (argument) [brackets make no diff] and further args";; + -----------------------------------------^^^^^ + +stdin(579,42): warning FS1173: Infix operator member '+-+-+' has 1 initial argument(s). Expected a tuple of 2 arguments, e.g. static member (+) (x,y) = ... + + + type Regression4319_U1b = static member (+-+-+) (x) moreArgs = "1 (argument) [brackets make no diff] and further args";; + -----------------------------------------^^^^^ + +stdin(579,42): warning FS1174: Infix operator member '+-+-+' has extra curried arguments. Expected a tuple of 2 arguments, e.g. static member (+) (x,y) = ... + + + type Regression4319_U2 = static member (+-+-+) (x,y) moreArgs = "1 argument and further args";; + -----------------------------------------^^^^^ + +stdin(580,42): warning FS1174: Infix operator member '+-+-+' has extra curried arguments. Expected a tuple of 2 arguments, e.g. static member (+) (x,y) = ... + + + type Regression4319_U3 = static member (+-+-+) (x,y,z) moreArgs = "1 argument and further args";; + -----------------------------------------^^^^^ + +stdin(581,42): warning FS1173: Infix operator member '+-+-+' has 3 initial argument(s). Expected a tuple of 2 arguments, e.g. static member (+) (x,y) = ... + + + type Regression4319_U3 = static member (+-+-+) (x,y,z) moreArgs = "1 argument and further args";; + -----------------------------------------^^^^^ + +stdin(581,42): warning FS1174: Infix operator member '+-+-+' has extra curried arguments. Expected a tuple of 2 arguments, e.g. static member (+) (x,y) = ... + + + static member (:=) = "COLON_EQUALS" + -------------------^^ + +stdin(584,20): warning FS1172: Infix operator member ':=' has no arguments. Expected a tuple of 2 arguments, e.g. static member (+) (x,y) = ... + + + static member (:=) = "COLON_EQUALS" + -------------------^^ + +stdin(584,20): warning FS0086: The name '(:=)' should not be used as a member name because it is given a standard definition in the F# library over fixed types + + + static member (&) = "AMP" + -------------------^ + +stdin(588,20): warning FS1172: Infix operator member '&' has no arguments. Expected a tuple of 2 arguments, e.g. static member (+) (x,y) = ... + + + static member (&) = "AMP" + -------------------^ + +stdin(588,20): warning FS0086: The name '(&)' should not be used as a member name. If defining a static member for use from other CLI languages then use the name 'op_Amp' instead. + + + static member (&^) = "AMP_AMP" + -------------------^^ + +stdin(589,20): warning FS1172: Infix operator member '&^' has no arguments. Expected a tuple of 2 arguments, e.g. static member (+) (x,y) = ... + + + static member (=) = "EQUALS" + -------------------^ + +stdin(590,20): warning FS1172: Infix operator member '=' has no arguments. Expected a tuple of 2 arguments, e.g. static member (+) (x,y) = ... + + + static member (=) = "EQUALS" + -------------------^ + +stdin(590,20): warning FS0086: The name '(=)' should not be used as a member name. To define equality semantics for a type, override the 'Object.Equals' member. If defining a static member for use from other CLI languages then use the name 'op_Equality' instead. + + + static member (!=) = "INFIX_COMPARE_OP" + -------------------^^ + +stdin(592,20): warning FS1172: Infix operator member '!=' has no arguments. Expected a tuple of 2 arguments, e.g. static member (+) (x,y) = ... + + + static member (...=) = "INFIX_COMPARE_OP" // with $. prefix + -------------------^^^^ + +stdin(596,20): warning FS1172: Infix operator member '...=' has no arguments. Expected a tuple of 2 arguments, e.g. static member (+) (x,y) = ... + + + static member (...!=) = "INFIX_COMPARE_OP" // with $. prefix + -------------------^^^^^ + +stdin(597,20): warning FS1172: Infix operator member '...!=' has no arguments. Expected a tuple of 2 arguments, e.g. static member (+) (x,y) = ... + + + static member (...<) = "INFIX_COMPARE_OP" // with $. prefix + -------------------^^^^ + +stdin(598,20): warning FS1172: Infix operator member '...<' has no arguments. Expected a tuple of 2 arguments, e.g. static member (+) (x,y) = ... + + + static member (...>) = "INFIX_COMPARE_OP" // with $. prefix + -------------------^^^^ + +stdin(599,20): warning FS1172: Infix operator member '...>' has no arguments. Expected a tuple of 2 arguments, e.g. static member (+) (x,y) = ... + + + static member ($) = "DOLLAR" + -------------------^ + +stdin(601,20): warning FS1172: Infix operator member '$' has no arguments. Expected a tuple of 2 arguments, e.g. static member (+) (x,y) = ... + + + static member (<) = "LESS" + -------------------^ + +stdin(602,20): warning FS1172: Infix operator member '<' has no arguments. Expected a tuple of 2 arguments, e.g. static member (+) (x,y) = ... + + + static member (<) = "LESS" + -------------------^ + +stdin(602,20): warning FS0086: The name '(<)' should not be used as a member name. To define comparison semantics for a type, implement the 'System.IComparable' interface. If defining a static member for use from other CLI languages then use the name 'op_LessThan' instead. + + + static member (>) = "GREATER" + -------------------^ + +stdin(603,20): warning FS1172: Infix operator member '>' has no arguments. Expected a tuple of 2 arguments, e.g. static member (+) (x,y) = ... + + + static member (>) = "GREATER" + -------------------^ + +stdin(603,20): warning FS0086: The name '(>)' should not be used as a member name. To define comparison semantics for a type, implement the 'System.IComparable' interface. If defining a static member for use from other CLI languages then use the name 'op_GreaterThan' instead. + + + static member (@) = "INFIX_AT_HAT_OP" + -------------------^ + +stdin(604,20): warning FS1172: Infix operator member '@' has no arguments. Expected a tuple of 2 arguments, e.g. static member (+) (x,y) = ... + + + static member (@) = "INFIX_AT_HAT_OP" + -------------------^ + +stdin(604,20): warning FS0086: The name '(@)' should not be used as a member name because it is given a standard definition in the F# library over fixed types + + + static member (^) = "INFIX_AT_HAT_OP" + -------------------^ + +stdin(605,20): warning FS1172: Infix operator member '^' has no arguments. Expected a tuple of 2 arguments, e.g. static member (+) (x,y) = ... + + + static member (^) = "INFIX_AT_HAT_OP" + -------------------^ + +stdin(605,20): warning FS0086: The name '(^)' should not be used as a member name because it is given a standard definition in the F# library over fixed types + + + static member (...@) = "INFIX_AT_HAT_OP" // with $. prefix + -------------------^^^^ + +stdin(606,20): warning FS1172: Infix operator member '...@' has no arguments. Expected a tuple of 2 arguments, e.g. static member (+) (x,y) = ... + + + static member (...^) = "INFIX_AT_HAT_OP" // with $. prefix + -------------------^^^^ + +stdin(607,20): warning FS1172: Infix operator member '...^' has no arguments. Expected a tuple of 2 arguments, e.g. static member (+) (x,y) = ... + + + static member (%) = "PERCENT_OP" + -------------------^ + +stdin(608,20): warning FS1172: Infix operator member '%' has no arguments. Expected a tuple of 2 arguments, e.g. static member (+) (x,y) = ... + + + static member (-) = "MINUS" + -------------------^ + +stdin(610,20): warning FS1172: Infix operator member '-' has no arguments. Expected a tuple of 2 arguments, e.g. static member (+) (x,y) = ... + + + static member ( * ) = "STAR" + --------------------^ + +stdin(611,21): warning FS1172: Infix operator member '*' has no arguments. Expected a tuple of 2 arguments, e.g. static member (+) (x,y) = ... + + + static member (/) = "INFIX_STAR_DIV_MOD_OP" + -------------------^ + +stdin(613,20): warning FS1172: Infix operator member '/' has no arguments. Expected a tuple of 2 arguments, e.g. static member (+) (x,y) = ... + + + static member ( ...* ) = "INFIX_STAR_DIV_MOD_OP" // with $. prefix + --------------------^^^^ + +stdin(615,21): warning FS1172: Infix operator member '...*' has no arguments. Expected a tuple of 2 arguments, e.g. static member (+) (x,y) = ... + + + static member ( .../ ) = "INFIX_STAR_DIV_MOD_OP" // with $. prefix + --------------------^^^^ + +stdin(616,21): warning FS1172: Infix operator member '.../' has no arguments. Expected a tuple of 2 arguments, e.g. static member (+) (x,y) = ... + + + static member ( ...% ) = "INFIX_STAR_DIV_MOD_OP" // with $. prefix + --------------------^^^^ + +stdin(617,21): warning FS1172: Infix operator member '...%' has no arguments. Expected a tuple of 2 arguments, e.g. static member (+) (x,y) = ... + + + static member ( ** ) = "INFIX_STAR_STAR_OP" + --------------------^^ + +stdin(618,21): warning FS1172: Infix operator member '**' has no arguments. Expected a tuple of 2 arguments, e.g. static member (+) (x,y) = ... + + + member this.ToString() = "ABC" + ----------------^^^^^^^^ + +stdin(623,17): warning FS0864: This new member hides the abstract member 'System.Object.ToString() : string'. Rename the member or use 'override' instead. + + + let x,f = it, (fun () -> !it);; // this will read from the static storage for 'it' + -------------------------^ + +stdin(643,26): info FS3370: The use of '!' from the F# library is deprecated. See https://aka.ms/fsharp-refcell-ops. For example, please change '!cell' to 'cell.Value'. + + + x := 3;; + --^^ + +stdin(645,3): info FS3370: The use of ':=' from the F# library is deprecated. See https://aka.ms/fsharp-refcell-ops. For example, please change 'cell := expr' to 'cell.Value <- expr'. + + + member this.M() = "string" + ----------------^ + +stdin(764,17): error FS0438: Duplicate method. The method 'M' has the same name and signature as another method in type 'ExpectDupMethod'. + + + member this.P = "string" + ----------------^ + +stdin(771,17): error FS0438: Duplicate method. The method 'get_P' has the same name and signature as another method in type 'ExpectDupProperty'. + + + type public IBPublic = interface inherit IAPrivate abstract Q : int end + ------------------^^^^^^^^ + +stdin(778,19): error FS0410: The type 'IAPrivate' is less accessible than the value, member or type 'IBPublic' it is used in. + + + type internal IBInternal = interface inherit IAPrivate abstract Q : int end + ------------------^^^^^^^^^^ + +stdin(783,19): error FS0410: The type 'IAPrivate' is less accessible than the value, member or type 'IBInternal' it is used in. + + + type public IBPublic = interface inherit IAInternal abstract Q : int end + ------------------^^^^^^^^ + +stdin(792,19): error FS0410: The type 'IAInternal' is less accessible than the value, member or type 'IBPublic' it is used in. + + + override x.M(a:string) = 1 + -------------------^ + +stdin(824,20): error FS0361: The override 'M: string -> int' implements more than one abstract slot, e.g. 'abstract Regression4232.D.M: 'U -> int' and 'abstract Regression4232.D.M: 'T -> int' + + + let (|A|B|) (x:int) = A x;; + -----^^^^^ + +stdin(832,6): error FS1210: Active pattern '|A|B|' has a result type containing type variables that are not determined by the input. The common cause is a when a result case is not mentioned, e.g. 'let (|A|B|) (x:int) = A x'. This can be fixed with a type constraint, e.g. 'let (|A|B|) (x:int) : Choice = A x' + + + let (|A|B|) (x:'a) = A x;; + -----^^^^^ + +stdin(835,6): error FS1210: Active pattern '|A|B|' has a result type containing type variables that are not determined by the input. The common cause is a when a result case is not mentioned, e.g. 'let (|A|B|) (x:int) = A x'. This can be fixed with a type constraint, e.g. 'let (|A|B|) (x:int) : Choice = A x' + + + let (|A|B|) (p:'a) (x:int) = A p;; + -----^^^^^ + +stdin(838,6): error FS1210: Active pattern '|A|B|' has a result type containing type variables that are not determined by the input. The common cause is a when a result case is not mentioned, e.g. 'let (|A|B|) (x:int) = A x'. This can be fixed with a type constraint, e.g. 'let (|A|B|) (x:int) : Choice = A x' + + + let (|A|B|) = failwith "" : Choice;; + -----^^^^^ + +stdin(844,6): error FS1209: Active pattern '|A|B|' is not a function + diff --git a/tests/fsharp/core/printing/output.stdout.bsl b/tests/fsharp/core/printing/output.stdout.bsl new file mode 100644 index 0000000000..77a168f119 --- /dev/null +++ b/tests/fsharp/core/printing/output.stdout.bsl @@ -0,0 +1,6296 @@ + +> val repeatId: string = "A" + +> val repeatId: string = "B" + +namespace FSI_0004 + val x1: int + val x2: string + val x3: 'a option + val x4: int option + val x5: 'a list + val x6: int list + val x7: System.Windows.Forms.Form + val x8: int[,] + val x9: Lazy + type ClassInFile1 = + new: unit -> ClassInFile1 + +namespace FSI_0005 + val x1: int + val x2: string + val x3: 'a option + val x4: int option + val x5: 'a list + val x6: int list + val x7: System.Windows.Forms.Form + val x8: int[,] + val x9: Lazy + type ClassInFile1 = + new: unit -> ClassInFile1 + +namespace FSI_0005 + val x1: int + val x2: string + val x3: 'a option + val x4: int option + val x5: 'a list + val x6: int list + val x7: System.Windows.Forms.Form + val x8: int[,] + val x9: Lazy + type ClassInFile2 = + new: unit -> ClassInFile2 + +> val x1: seq +val x2: seq +val x3: seq +val f1: System.Windows.Forms.Form = System.Windows.Forms.Form, Text: f1 form +val fs: System.Windows.Forms.Form[] = + [|System.Windows.Forms.Form, Text: fs #0; + System.Windows.Forms.Form, Text: fs #1; + System.Windows.Forms.Form, Text: fs #2; + System.Windows.Forms.Form, Text: fs #3; + System.Windows.Forms.Form, Text: fs #4; + System.Windows.Forms.Form, Text: fs #5; + System.Windows.Forms.Form, Text: fs #6; + System.Windows.Forms.Form, Text: fs #7; + System.Windows.Forms.Form, Text: fs #8; + System.Windows.Forms.Form, Text: fs #9; + System.Windows.Forms.Form, Text: fs #10; + System.Windows.Forms.Form, Text: fs #11; + System.Windows.Forms.Form, Text: fs #12; + System.Windows.Forms.Form, Text: fs #13; + System.Windows.Forms.Form, Text: fs #14; + System.Windows.Forms.Form, Text: fs #15; + System.Windows.Forms.Form, Text: fs #16; + System.Windows.Forms.Form, Text: fs #17; + System.Windows.Forms.Form, Text: fs #18; + System.Windows.Forms.Form, Text: fs #19; + System.Windows.Forms.Form, Text: fs #20; + System.Windows.Forms.Form, Text: fs #21; + System.Windows.Forms.Form, Text: fs #22; + System.Windows.Forms.Form, Text: fs #23; + System.Windows.Forms.Form, Text: fs #24; + System.Windows.Forms.Form, Text: fs #25; + System.Windows.Forms.Form, Text: fs #26; + System.Windows.Forms.Form, Text: fs #27; + System.Windows.Forms.Form, Text: fs #28; + System.Windows.Forms.Form, Text: fs #29; + System.Windows.Forms.Form, Text: fs #30; + System.Windows.Forms.Form, Text: fs #31; + System.Windows.Forms.Form, Text: fs #32; + System.Windows.Forms.Form, Text: fs #33; + System.Windows.Forms.Form, Text: fs #34; + System.Windows.Forms.Form, Text: fs #35; + System.Windows.Forms.Form, Text: fs #36; + System.Windows.Forms.Form, Text: fs #37; + System.Windows.Forms.Form, Text: fs #38; + System.Windows.Forms.Form, Text: fs #39; + System.Windows.Forms.Form, Text: fs #40; + System.Windows.Forms.Form, Text: fs #41; + System.Windows.Forms.Form, Text: fs #42; + System.Windows.Forms.Form, Text: fs #43; + System.Windows.Forms.Form, Text: fs #44; + System.Windows.Forms.Form, Text: fs #45; + System.Windows.Forms.Form, Text: fs #46; + System.Windows.Forms.Form, Text: fs #47; + System.Windows.Forms.Form, Text: fs #48; + System.Windows.Forms.Form, Text: fs #49; + System.Windows.Forms.Form, Text: fs #50; + System.Windows.Forms.Form, Text: fs #51; + System.Windows.Forms.Form, Text: fs #52; + System.Windows.Forms.Form, Text: fs #53; + System.Windows.Forms.Form, Text: fs #54; + System.Windows.Forms.Form, Text: fs #55; + System.Windows.Forms.Form, Text: fs #56; + System.Windows.Forms.Form, Text: fs #57; + System.Windows.Forms.Form, Text: fs #58; + System.Windows.Forms.Form, Text: fs #59; + System.Windows.Forms.Form, Text: fs #60; + System.Windows.Forms.Form, Text: fs #61; + System.Windows.Forms.Form, Text: fs #62; + System.Windows.Forms.Form, Text: fs #63; + System.Windows.Forms.Form, Text: fs #64; + System.Windows.Forms.Form, Text: fs #65; + System.Windows.Forms.Form, Text: fs #66; + System.Windows.Forms.Form, Text: fs #67; + System.Windows.Forms.Form, Text: fs #68; + System.Windows.Forms.Form, Text: fs #69; + System.Windows.Forms.Form, Text: fs #70; + System.Windows.Forms.Form, Text: fs #71; + System.Windows.Forms.Form, Text: fs #72; + System.Windows.Forms.Form, Text: fs #73; + System.Windows.Forms.Form, Text: fs #74; + System.Windows.Forms.Form, Text: fs #75; + System.Windows.Forms.Form, Text: fs #76; + System.Windows.Forms.Form, Text: fs #77; + System.Windows.Forms.Form, Text: fs #78; + System.Windows.Forms.Form, Text: fs #79; + System.Windows.Forms.Form, Text: fs #80; + System.Windows.Forms.Form, Text: fs #81; + System.Windows.Forms.Form, Text: fs #82; + System.Windows.Forms.Form, Text: fs #83; + System.Windows.Forms.Form, Text: fs #84; + System.Windows.Forms.Form, Text: fs #85; + System.Windows.Forms.Form, Text: fs #86; + System.Windows.Forms.Form, Text: fs #87; + System.Windows.Forms.Form, Text: fs #88; + System.Windows.Forms.Form, Text: fs #89; + System.Windows.Forms.Form, Text: fs #90; + System.Windows.Forms.Form, Text: fs #91; + System.Windows.Forms.Form, Text: fs #92; + System.Windows.Forms.Form, Text: fs #93; + System.Windows.Forms.Form, Text: fs #94; + System.Windows.Forms.Form, Text: fs #95; + System.Windows.Forms.Form, Text: fs #96; + System.Windows.Forms.Form, Text: fs #97; + System.Windows.Forms.Form, Text: fs #98; + System.Windows.Forms.Form, Text: fs #99; ...|] +val xs: string list = + ["0"; "1"; "2"; "3"; "4"; "5"; "6"; "7"; "8"; "9"; "10"; "11"; "12"; "13"; + "14"; "15"; "16"; "17"; "18"; "19"; "20"; "21"; "22"; "23"; "24"; "25"; + "26"; "27"; "28"; "29"; "30"; "31"; "32"; "33"; "34"; "35"; "36"; "37"; + "38"; "39"; "40"; "41"; "42"; "43"; "44"; "45"; "46"; "47"; "48"; "49"; + "50"; "51"; "52"; "53"; "54"; "55"; "56"; "57"; "58"; "59"; "60"; "61"; + "62"; "63"; "64"; "65"; "66"; "67"; "68"; "69"; "70"; "71"; "72"; "73"; + "74"; "75"; "76"; "77"; "78"; "79"; "80"; "81"; "82"; "83"; "84"; "85"; + "86"; "87"; "88"; "89"; "90"; "91"; "92"; "93"; "94"; "95"; "96"; "97"; + "98"; "99"; ...] +val xa: string[] = + [|"0"; "1"; "2"; "3"; "4"; "5"; "6"; "7"; "8"; "9"; "10"; "11"; "12"; "13"; + "14"; "15"; "16"; "17"; "18"; "19"; "20"; "21"; "22"; "23"; "24"; "25"; + "26"; "27"; "28"; "29"; "30"; "31"; "32"; "33"; "34"; "35"; "36"; "37"; + "38"; "39"; "40"; "41"; "42"; "43"; "44"; "45"; "46"; "47"; "48"; "49"; + "50"; "51"; "52"; "53"; "54"; "55"; "56"; "57"; "58"; "59"; "60"; "61"; + "62"; "63"; "64"; "65"; "66"; "67"; "68"; "69"; "70"; "71"; "72"; "73"; + "74"; "75"; "76"; "77"; "78"; "79"; "80"; "81"; "82"; "83"; "84"; "85"; + "86"; "87"; "88"; "89"; "90"; "91"; "92"; "93"; "94"; "95"; "96"; "97"; + "98"; "99"; ...|] +val xa2: string[,] = [["0"; "1"; "2"; "3"; "4"; "5"; "6"; "7"] + ["10"; "11"; "12"; "13"; "14"; "15"; "16"; "17"] + ["20"; "21"; "22"; "23"; "24"; "25"; "26"; "27"] + ["30"; "31"; "32"; "33"; "34"; "35"; "36"; "37"] + ["40"; "41"; "42"; "43"; "44"; "45"; "46"; "47"] + ["50"; "51"; "52"; "53"; "54"; "55"; "56"; "57"] + ["60"; "61"; "62"; "63"; "64"; "65"; "66"; "67"] + ["70"; "71"; "72"; "73"; "74"; "75"; "76"; "77"]] +val sxs0: Set = set [] + +> val sxs1: Set = set ["0"] + +> val sxs2: Set = set ["0"; "1"] + +> val sxs3: Set = set ["0"; "1"; "2"] + +> val sxs4: Set = set ["0"; "1"; "2"; "3"] + +> val sxs200: Set = + set ["0"; "1"; "10"; "100"; "101"; "102"; "103"; "104"; "105"; ...] + +> val msxs0: Map = map [] + +> val msxs1: Map = map [(0, "0")] + +> val msxs2: Map = map [(0, "0"); (1, "1")] + +> val msxs3: Map = map [(0, "0"); (1, "1"); (2, "2")] + +> val msxs4: Map = map [(0, "0"); (1, "1"); (2, "2"); (3, "3")] + +> val msxs200: Map = + map + [(0, "0"); (1, "1"); (2, "2"); (3, "3"); (4, "4"); (5, "5"); (6, "6"); + (7, "7"); (8, "8"); ...] + +> module M = + val a: string = "sub-binding" + val b: + (seq * seq * seq * System.Windows.Forms.Form) option * + (string list * string list * string[,]) option = + (Some (, , , System.Windows.Forms.Form, Text: f1 form), + Some + (["0"; "1"; "2"; "3"; "4"; "5"; "6"; "7"; "8"; "9"; "10"; "11"; "12"; + "13"; "14"; "15"; "16"; "17"; "18"; "19"; "20"; "21"; "22"; "23"; + "24"; "25"; "26"; "27"; "28"; "29"; "30"; "31"; "32"; "33"; "34"; + "35"; "36"; "37"; "38"; "39"; "40"; "41"; "42"; "43"; "44"; "45"; + "46"; "47"; "48"; "49"; "50"; "51"; "52"; "53"; "54"; "55"; "56"; + "57"; "58"; "59"; "60"; "61"; "62"; "63"; "64"; "65"; "66"; "67"; + "68"; "69"; "70"; "71"; "72"; "73"; "74"; "75"; "76"; "77"; "78"; + "79"; "80"; "81"; "82"; "83"; "84"; "85"; "86"; "87"; "88"; "89"; + "90"; "91"; "92"; "93"; "94"; "95"; "96"; "97"; "98"; "99"; ...], + ["0"; "1"; "2"; "3"; "4"; "5"; "6"; "7"; "8"; "9"; "10"; "11"; "12"; + "13"; "14"; "15"; "16"; "17"; "18"; "19"; "20"; "21"; "22"; "23"; + "24"; "25"; "26"; "27"; "28"; "29"; "30"; "31"; "32"; "33"; "34"; + "35"; "36"; "37"; "38"; "39"; "40"; "41"; "42"; "43"; "44"; "45"; + "46"; "47"; "48"; "49"; "50"; "51"; "52"; "53"; "54"; "55"; "56"; + "57"; "58"; "59"; "60"; "61"; "62"; "63"; "64"; "65"; "66"; "67"; + "68"; "69"; "70"; "71"; "72"; "73"; "74"; "75"; "76"; "77"; "78"; + "79"; "80"; "81"; "82"; "83"; "84"; "85"; "86"; "87"; "88"; "89"; + "90"; "91"; "92"; "93"; "94"; "95"; "96"; "97"; "98"; "99"; ...], + [["0"; "1"; "2"; "3"; "4"; "5"; "6"; "7"] + ["10"; "11"; "12"; "13"; "14"; "15"; "16"; "17"] + ["20"; "21"; "22"; "23"; "24"; "25"; "26"; "27"] + ["30"; "31"; "32"; "33"; "34"; "35"; "36"; "37"] + ["40"; "41"; "42"; "43"; "44"; "45"; "46"; "47"] + ["50"; "51"; "52"; "53"; "54"; "55"; "56"; "57"] + ["60"; "61"; "62"; "63"; "64"; "65"; "66"; "67"] + ["70"; "71"; "72"; "73"; "74"; "75"; "76"; "77"]])) +type T = + new: a: int * b: int -> T + member AMethod: x: int -> int + static member StaticMethod: x: int -> int + member AProperty: int + static member StaticProperty: int +val f_as_method: x: int -> int +val f_as_thunk: (int -> int) +val refCell: string ref = { contents = "value" } +module D1 = + val words: System.Collections.Generic.IDictionary + val words2000: System.Collections.Generic.IDictionary + +> > module D2 = + val words: IDictionary + val words2000: IDictionary +val opt1: 'a option +val opt1b: int option = None +val opt4: 'a option option option option +val opt4b: int option option option option = Some (Some (Some None)) +val opt5: int list option option option option option list = + [Some (Some (Some (Some None))); + Some (Some (Some (Some (Some [1; 2; 3; 4; 5; 6])))); + Some + (Some + (Some + (Some + (Some + [1; 2; 3; 4; 5; 6; 7; 8; 9; 0; 1; 2; 3; 4; 5; 6; 7; 8; 9; 1; + 2; 3; 4; 5; 6; 7; 8; 9; 1; 2; 3; 4; 5; 6; 7; 8; 9; 1; 2; 3; + 4; 5; 6; 7; 8; 9; 1; 2; 3; 4; 5; 6; 7; 8; 9; 0]))))] +val mkStr: n: int -> string +val strs: string[] = + [|""; "-"; "--"; "---"; "----"; "-----"; "------"; "-------"; "--------"; + "---------"; "----------"; "-----------"; "------------"; "-------------"; + "--------------"; "---------------"; "----------------"; + "-----------------"; "------------------"; "-------------------"; + "--------------------"; "---------------------"; "----------------------"; + "-----------------------"; "------------------------"; + "-------------------------"; "--------------------------"; + "---------------------------"; "----------------------------"; + "-----------------------------"; "------------------------------"; + "-------------------------------"; "--------------------------------"; + "---------------------------------"; "----------------------------------"; + "-----------------------------------"; + "------------------------------------"; + "-------------------------------------"; + "--------------------------------------"; + "---------------------------------------"; + "----------------------------------------"; + "-----------------------------------------"; + "------------------------------------------"; + "-------------------------------------------"; + "--------------------------------------------"; + "---------------------------------------------"; + "----------------------------------------------"; + "-----------------------------------------------"; + "------------------------------------------------"; + "-------------------------------------------------"; + "--------------------------------------------------"; + "---------------------------------------------------"; + "----------------------------------------------------"; + "-----------------------------------------------------"; + "------------------------------------------------------"; + "-------------------------------------------------------"; + "--------------------------------------------------------"; + "---------------------------------------------------------"; + "----------------------------------------------------------"; + "-----------------------------------------------------------"; + "------------------------------------------------------------"; + "-------------------------------------------------------------"; + "--------------------------------------------------------------"; + "---------------------------------------------------------------"; + "----------------------------------------------------------------"; + "-----------------------------------------------------------------"; + "------------------------------------------------------------------"; + "-------------------------------------------------------------------"; + "--------------------------------------------------------------------"; + "---------------------------------------------------------------------"; + "----------------------------------------------------------------------"; + "-----------------------------------------------------------------------"; + "------------------------------------------------------------------------"; + "-------------------------------------------------------------"+[12 chars]; + "-------------------------------------------------------------"+[13 chars]; + "-------------------------------------------------------------"+[14 chars]; + "-------------------------------------------------------------"+[15 chars]; + "-------------------------------------------------------------"+[16 chars]; + "-------------------------------------------------------------"+[17 chars]; + "-------------------------------------------------------------"+[18 chars]; + "-------------------------------------------------------------"+[19 chars]; + "-------------------------------------------------------------"+[20 chars]; + "-------------------------------------------------------------"+[21 chars]; + "-------------------------------------------------------------"+[22 chars]; + "-------------------------------------------------------------"+[23 chars]; + "-------------------------------------------------------------"+[24 chars]; + "-------------------------------------------------------------"+[25 chars]; + "-------------------------------------------------------------"+[26 chars]; + "-------------------------------------------------------------"+[27 chars]; + "-------------------------------------------------------------"+[28 chars]; + "-------------------------------------------------------------"+[29 chars]; + "-------------------------------------------------------------"+[30 chars]; + "-------------------------------------------------------------"+[31 chars]; + "-------------------------------------------------------------"+[32 chars]; + "-------------------------------------------------------------"+[33 chars]; + "-------------------------------------------------------------"+[34 chars]; + "-------------------------------------------------------------"+[35 chars]; + "-------------------------------------------------------------"+[36 chars]; + "-------------------------------------------------------------"+[37 chars]; + "-------------------------------------------------------------"+[38 chars]|] +val str7s: string[] = + [|""; "-------"; "--------------"; "---------------------"; + "----------------------------"; "-----------------------------------"; + "------------------------------------------"; + "-------------------------------------------------"; + "--------------------------------------------------------"; + "---------------------------------------------------------------"; + "----------------------------------------------------------------------"; + "-------------------------------------------------------------"+[16 chars]; + "-------------------------------------------------------------"+[23 chars]; + "-------------------------------------------------------------"+[30 chars]; + "-------------------------------------------------------------"+[37 chars]; + "-------------------------------------------------------------"+[44 chars]; + "-------------------------------------------------------------"+[51 chars]; + "-------------------------------------------------------------"+[58 chars]; + "-------------------------------------------------------------"+[65 chars]; + "-------------------------------------------------------------"+[72 chars]; + "-------------------------------------------------------------"+[79 chars]; + "-------------------------------------------------------------"+[86 chars]; + "-------------------------------------------------------------"+[93 chars]; + "-------------------------------------------------------------"+[100 chars]; + "-------------------------------------------------------------"+[107 chars]; + "-------------------------------------------------------------"+[114 chars]; + "-------------------------------------------------------------"+[121 chars]; + "-------------------------------------------------------------"+[128 chars]; + "-------------------------------------------------------------"+[135 chars]; + "-------------------------------------------------------------"+[142 chars]; + "-------------------------------------------------------------"+[149 chars]; + "-------------------------------------------------------------"+[156 chars]; + "-------------------------------------------------------------"+[163 chars]; + "-------------------------------------------------------------"+[170 chars]; + "-------------------------------------------------------------"+[177 chars]; + "-------------------------------------------------------------"+[184 chars]; + "-------------------------------------------------------------"+[191 chars]; + "-------------------------------------------------------------"+[198 chars]; + "-------------------------------------------------------------"+[205 chars]; + "-------------------------------------------------------------"+[212 chars]; + "-------------------------------------------------------------"+[219 chars]; + "-------------------------------------------------------------"+[226 chars]; + "-------------------------------------------------------------"+[233 chars]; + "-------------------------------------------------------------"+[240 chars]; + "-------------------------------------------------------------"+[247 chars]; + "-------------------------------------------------------------"+[254 chars]; + "-------------------------------------------------------------"+[261 chars]; + "-------------------------------------------------------------"+[268 chars]; + "-------------------------------------------------------------"+[275 chars]; + "-------------------------------------------------------------"+[282 chars]; + "-------------------------------------------------------------"+[289 chars]; + "-------------------------------------------------------------"+[296 chars]; + "-------------------------------------------------------------"+[303 chars]; + "-------------------------------------------------------------"+[310 chars]; + "-------------------------------------------------------------"+[317 chars]; + "-------------------------------------------------------------"+[324 chars]; + "-------------------------------------------------------------"+[331 chars]; + "-------------------------------------------------------------"+[338 chars]; + "-------------------------------------------------------------"+[345 chars]; + "-------------------------------------------------------------"+[352 chars]; + "-------------------------------------------------------------"+[359 chars]; + "-------------------------------------------------------------"+[366 chars]; + "-------------------------------------------------------------"+[373 chars]; + "-------------------------------------------------------------"+[380 chars]; + "-------------------------------------------------------------"+[387 chars]; + "-------------------------------------------------------------"+[394 chars]; + "-------------------------------------------------------------"+[401 chars]; + "-------------------------------------------------------------"+[408 chars]; + "-------------------------------------------------------------"+[415 chars]; + "-------------------------------------------------------------"+[422 chars]; + "-------------------------------------------------------------"+[429 chars]; + "-------------------------------------------------------------"+[436 chars]; + "-------------------------------------------------------------"+[443 chars]; + "-------------------------------------------------------------"+[450 chars]; + "-------------------------------------------------------------"+[457 chars]; + "-------------------------------------------------------------"+[464 chars]; + "-------------------------------------------------------------"+[471 chars]; + "-------------------------------------------------------------"+[478 chars]; + "-------------------------------------------------------------"+[485 chars]; + "-------------------------------------------------------------"+[492 chars]; + "-------------------------------------------------------------"+[499 chars]; + "-------------------------------------------------------------"+[506 chars]; + "-------------------------------------------------------------"+[513 chars]; + "-------------------------------------------------------------"+[520 chars]; + "-------------------------------------------------------------"+[527 chars]; + "-------------------------------------------------------------"+[534 chars]; + "-------------------------------------------------------------"+[541 chars]; + "-------------------------------------------------------------"+[548 chars]; + "-------------------------------------------------------------"+[555 chars]; + "-------------------------------------------------------------"+[562 chars]; + "-------------------------------------------------------------"+[569 chars]; + "-------------------------------------------------------------"+[576 chars]; + "-------------------------------------------------------------"+[583 chars]; + "-------------------------------------------------------------"+[590 chars]; + "-------------------------------------------------------------"+[597 chars]; + "-------------------------------------------------------------"+[604 chars]; + "-------------------------------------------------------------"+[611 chars]; + "-------------------------------------------------------------"+[618 chars]; + "-------------------------------------------------------------"+[625 chars]; + "-------------------------------------------------------------"+[632 chars]|] +val grids: string[,] = + [[""; ""; ""; ""; ""; ""; ""; ""; ""; ""; ""; ""; ""; ""; ""; ""; ""; ""; ""; + ""; ""; ""; ""; ""; ""; ""; ""; ""; ""; ""; ""; ""; ""; ""; ""; ""; ""; ""; + ""; ""; ""; ""; ""; ""; ""; ""; ""; ""; ""; ""] + [""; "-"; "--"; "---"; "----"; "-----"; "------"; "-------"; "--------"; + "---------"; "----------"; "-----------"; "------------"; "-------------"; + "--------------"; "---------------"; "----------------"; + "-----------------"; "------------------"; "-------------------"; + "--------------------"; "---------------------"; "----------------------"; + "-----------------------"; "------------------------"; + "-------------------------"; "--------------------------"; + "---------------------------"; "----------------------------"; + "-----------------------------"; "------------------------------"; + "-------------------------------"; "--------------------------------"; + "---------------------------------"; "----------------------------------"; + "-----------------------------------"; + "------------------------------------"; + "-------------------------------------"; + "--------------------------------------"; + "---------------------------------------"; + "----------------------------------------"; + "-----------------------------------------"; + "------------------------------------------"; + "-------------------------------------------"; + "--------------------------------------------"; + "---------------------------------------------"; + "----------------------------------------------"; + "-----------------------------------------------"; + "------------------------------------------------"; + "-------------------------------------------------"] + [""; "--"; "----"; "------"; "--------"; "----------"; "------------"; + "--------------"; "----------------"; "------------------"; + "--------------------"; "----------------------"; + "------------------------"; "--------------------------"; + "----------------------------"; "------------------------------"; + "--------------------------------"; "----------------------------------"; + "------------------------------------"; + "--------------------------------------"; + "----------------------------------------"; + "------------------------------------------"; + "--------------------------------------------"; + "----------------------------------------------"; + "------------------------------------------------"; + "--------------------------------------------------"; + "----------------------------------------------------"; + "------------------------------------------------------"; + "--------------------------------------------------------"; + "----------------------------------------------------------"; + "------------------------------------------------------------"; + "--------------------------------------------------------------"; + "----------------------------------------------------------------"; + "------------------------------------------------------------------"; + "--------------------------------------------------------------------"; + "----------------------------------------------------------------------"; + "------------------------------------------------------------------------"; + "-------------------------------------------------------------"+[13 chars]; + "-------------------------------------------------------------"+[15 chars]; + "-------------------------------------------------------------"+[17 chars]; + "-------------------------------------------------------------"+[19 chars]; + "-------------------------------------------------------------"+[21 chars]; + "-------------------------------------------------------------"+[23 chars]; + "-------------------------------------------------------------"+[25 chars]; + "-------------------------------------------------------------"+[27 chars]; + "-------------------------------------------------------------"+[29 chars]; + "-------------------------------------------------------------"+[31 chars]; + "-------------------------------------------------------------"+[33 chars]; + "-------------------------------------------------------------"+[35 chars]; + "-------------------------------------------------------------"+[37 chars]] + [""; "---"; "------"; "---------"; "------------"; "---------------"; + "------------------"; "---------------------"; "------------------------"; + "---------------------------"; "------------------------------"; + "---------------------------------"; + "------------------------------------"; + "---------------------------------------"; + "------------------------------------------"; + "---------------------------------------------"; + "------------------------------------------------"; + "---------------------------------------------------"; + "------------------------------------------------------"; + "---------------------------------------------------------"; + "------------------------------------------------------------"; + "---------------------------------------------------------------"; + "------------------------------------------------------------------"; + "---------------------------------------------------------------------"; + "------------------------------------------------------------------------"; + "-------------------------------------------------------------"+[14 chars]; + "-------------------------------------------------------------"+[17 chars]; + "-------------------------------------------------------------"+[20 chars]; + "-------------------------------------------------------------"+[23 chars]; + "-------------------------------------------------------------"+[26 chars]; + "-------------------------------------------------------------"+[29 chars]; + "-------------------------------------------------------------"+[32 chars]; + "-------------------------------------------------------------"+[35 chars]; + "-------------------------------------------------------------"+[38 chars]; + "-------------------------------------------------------------"+[41 chars]; + "-------------------------------------------------------------"+[44 chars]; + "-------------------------------------------------------------"+[47 chars]; + "-------------------------------------------------------------"+[50 chars]; + "-------------------------------------------------------------"+[53 chars]; + "-------------------------------------------------------------"+[56 chars]; + "-------------------------------------------------------------"+[59 chars]; + "-------------------------------------------------------------"+[62 chars]; + "-------------------------------------------------------------"+[65 chars]; + "-------------------------------------------------------------"+[68 chars]; + "-------------------------------------------------------------"+[71 chars]; + "-------------------------------------------------------------"+[74 chars]; + "-------------------------------------------------------------"+[77 chars]; + "-------------------------------------------------------------"+[80 chars]; + "-------------------------------------------------------------"+[83 chars]; + "-------------------------------------------------------------"+[86 chars]] + [""; "----"; "--------"; "------------"; "----------------"; + "--------------------"; "------------------------"; + "----------------------------"; "--------------------------------"; + "------------------------------------"; + "----------------------------------------"; + "--------------------------------------------"; + "------------------------------------------------"; + "----------------------------------------------------"; + "--------------------------------------------------------"; + "------------------------------------------------------------"; + "----------------------------------------------------------------"; + "--------------------------------------------------------------------"; + "------------------------------------------------------------------------"; + "-------------------------------------------------------------"+[15 chars]; + "-------------------------------------------------------------"+[19 chars]; + "-------------------------------------------------------------"+[23 chars]; + "-------------------------------------------------------------"+[27 chars]; + "-------------------------------------------------------------"+[31 chars]; + "-------------------------------------------------------------"+[35 chars]; + "-------------------------------------------------------------"+[39 chars]; + "-------------------------------------------------------------"+[43 chars]; + "-------------------------------------------------------------"+[47 chars]; + "-------------------------------------------------------------"+[51 chars]; + "-------------------------------------------------------------"+[55 chars]; + "-------------------------------------------------------------"+[59 chars]; + "-------------------------------------------------------------"+[63 chars]; + "-------------------------------------------------------------"+[67 chars]; + "-------------------------------------------------------------"+[71 chars]; + "-------------------------------------------------------------"+[75 chars]; + "-------------------------------------------------------------"+[79 chars]; + "-------------------------------------------------------------"+[83 chars]; + "-------------------------------------------------------------"+[87 chars]; + "-------------------------------------------------------------"+[91 chars]; + "-------------------------------------------------------------"+[95 chars]; + "-------------------------------------------------------------"+[99 chars]; + "-------------------------------------------------------------"+[103 chars]; + "-------------------------------------------------------------"+[107 chars]; + "-------------------------------------------------------------"+[111 chars]; + "-------------------------------------------------------------"+[115 chars]; + "-------------------------------------------------------------"+[119 chars]; + "-------------------------------------------------------------"+[123 chars]; + "-------------------------------------------------------------"+[127 chars]; + "-------------------------------------------------------------"+[131 chars]; + "-------------------------------------------------------------"+[135 chars]] + [""; "-----"; "----------"; "---------------"; "--------------------"; + "-------------------------"; "------------------------------"; + "-----------------------------------"; + "----------------------------------------"; + "---------------------------------------------"; + "--------------------------------------------------"; + "-------------------------------------------------------"; + "------------------------------------------------------------"; + "-----------------------------------------------------------------"; + "----------------------------------------------------------------------"; + "-------------------------------------------------------------"+[14 chars]; + "-------------------------------------------------------------"+[19 chars]; + "-------------------------------------------------------------"+[24 chars]; + "-------------------------------------------------------------"+[29 chars]; + "-------------------------------------------------------------"+[34 chars]; + "-------------------------------------------------------------"+[39 chars]; + "-------------------------------------------------------------"+[44 chars]; + "-------------------------------------------------------------"+[49 chars]; + "-------------------------------------------------------------"+[54 chars]; + "-------------------------------------------------------------"+[59 chars]; + "-------------------------------------------------------------"+[64 chars]; + "-------------------------------------------------------------"+[69 chars]; + "-------------------------------------------------------------"+[74 chars]; + "-------------------------------------------------------------"+[79 chars]; + "-------------------------------------------------------------"+[84 chars]; + "-------------------------------------------------------------"+[89 chars]; + "-------------------------------------------------------------"+[94 chars]; + "-------------------------------------------------------------"+[99 chars]; + "-------------------------------------------------------------"+[104 chars]; + "-------------------------------------------------------------"+[109 chars]; + "-------------------------------------------------------------"+[114 chars]; + "-------------------------------------------------------------"+[119 chars]; + "-------------------------------------------------------------"+[124 chars]; + "-------------------------------------------------------------"+[129 chars]; + "-------------------------------------------------------------"+[134 chars]; + "-------------------------------------------------------------"+[139 chars]; + "-------------------------------------------------------------"+[144 chars]; + "-------------------------------------------------------------"+[149 chars]; + "-------------------------------------------------------------"+[154 chars]; + "-------------------------------------------------------------"+[159 chars]; + "-------------------------------------------------------------"+[164 chars]; + "-------------------------------------------------------------"+[169 chars]; + "-------------------------------------------------------------"+[174 chars]; + "-------------------------------------------------------------"+[179 chars]; + "-------------------------------------------------------------"+[184 chars]] + [""; "------"; "------------"; "------------------"; + "------------------------"; "------------------------------"; + "------------------------------------"; + "------------------------------------------"; + "------------------------------------------------"; + "------------------------------------------------------"; + "------------------------------------------------------------"; + "------------------------------------------------------------------"; + "------------------------------------------------------------------------"; + "-------------------------------------------------------------"+[17 chars]; + "-------------------------------------------------------------"+[23 chars]; + "-------------------------------------------------------------"+[29 chars]; + "-------------------------------------------------------------"+[35 chars]; + "-------------------------------------------------------------"+[41 chars]; + "-------------------------------------------------------------"+[47 chars]; + "-------------------------------------------------------------"+[53 chars]; + "-------------------------------------------------------------"+[59 chars]; + "-------------------------------------------------------------"+[65 chars]; + "-------------------------------------------------------------"+[71 chars]; + "-------------------------------------------------------------"+[77 chars]; + "-------------------------------------------------------------"+[83 chars]; + "-------------------------------------------------------------"+[89 chars]; + "-------------------------------------------------------------"+[95 chars]; + "-------------------------------------------------------------"+[101 chars]; + "-------------------------------------------------------------"+[107 chars]; + "-------------------------------------------------------------"+[113 chars]; + "-------------------------------------------------------------"+[119 chars]; + "-------------------------------------------------------------"+[125 chars]; + "-------------------------------------------------------------"+[131 chars]; + "-------------------------------------------------------------"+[137 chars]; + "-------------------------------------------------------------"+[143 chars]; + "-------------------------------------------------------------"+[149 chars]; + "-------------------------------------------------------------"+[155 chars]; + "-------------------------------------------------------------"+[161 chars]; + "-------------------------------------------------------------"+[167 chars]; + "-------------------------------------------------------------"+[173 chars]; + "-------------------------------------------------------------"+[179 chars]; + "-------------------------------------------------------------"+[185 chars]; + "-------------------------------------------------------------"+[191 chars]; + "-------------------------------------------------------------"+[197 chars]; + "-------------------------------------------------------------"+[203 chars]; + "-------------------------------------------------------------"+[209 chars]; + "-------------------------------------------------------------"+[215 chars]; + "-------------------------------------------------------------"+[221 chars]; + "-------------------------------------------------------------"+[227 chars]; + "-------------------------------------------------------------"+[233 chars]] + [""; "-------"; "--------------"; "---------------------"; + "----------------------------"; "-----------------------------------"; + "------------------------------------------"; + "-------------------------------------------------"; + "--------------------------------------------------------"; + "---------------------------------------------------------------"; + "----------------------------------------------------------------------"; + "-------------------------------------------------------------"+[16 chars]; + "-------------------------------------------------------------"+[23 chars]; + "-------------------------------------------------------------"+[30 chars]; + "-------------------------------------------------------------"+[37 chars]; + "-------------------------------------------------------------"+[44 chars]; + "-------------------------------------------------------------"+[51 chars]; + "-------------------------------------------------------------"+[58 chars]; + "-------------------------------------------------------------"+[65 chars]; + "-------------------------------------------------------------"+[72 chars]; + "-------------------------------------------------------------"+[79 chars]; + "-------------------------------------------------------------"+[86 chars]; + "-------------------------------------------------------------"+[93 chars]; + "-------------------------------------------------------------"+[100 chars]; + "-------------------------------------------------------------"+[107 chars]; + "-------------------------------------------------------------"+[114 chars]; + "-------------------------------------------------------------"+[121 chars]; + "-------------------------------------------------------------"+[128 chars]; + "-------------------------------------------------------------"+[135 chars]; + "-------------------------------------------------------------"+[142 chars]; + "-------------------------------------------------------------"+[149 chars]; + "-------------------------------------------------------------"+[156 chars]; + "-------------------------------------------------------------"+[163 chars]; + "-------------------------------------------------------------"+[170 chars]; + "-------------------------------------------------------------"+[177 chars]; + "-------------------------------------------------------------"+[184 chars]; + "-------------------------------------------------------------"+[191 chars]; + "-------------------------------------------------------------"+[198 chars]; + "-------------------------------------------------------------"+[205 chars]; + "-------------------------------------------------------------"+[212 chars]; + "-------------------------------------------------------------"+[219 chars]; + "-------------------------------------------------------------"+[226 chars]; + "-------------------------------------------------------------"+[233 chars]; + "-------------------------------------------------------------"+[240 chars]; + "-------------------------------------------------------------"+[247 chars]; + "-------------------------------------------------------------"+[254 chars]; + "-------------------------------------------------------------"+[261 chars]; + "-------------------------------------------------------------"+[268 chars]; + "-------------------------------------------------------------"+[275 chars]; + "-------------------------------------------------------------"+[282 chars]] + [""; "--------"; "----------------"; "------------------------"; + "--------------------------------"; + "----------------------------------------"; + "------------------------------------------------"; + "--------------------------------------------------------"; + "----------------------------------------------------------------"; + "------------------------------------------------------------------------"; + "-------------------------------------------------------------"+[19 chars]; + "-------------------------------------------------------------"+[27 chars]; + "-------------------------------------------------------------"+[35 chars]; + "-------------------------------------------------------------"+[43 chars]; + "-------------------------------------------------------------"+[51 chars]; + "-------------------------------------------------------------"+[59 chars]; + "-------------------------------------------------------------"+[67 chars]; + "-------------------------------------------------------------"+[75 chars]; + "-------------------------------------------------------------"+[83 chars]; + "-------------------------------------------------------------"+[91 chars]; + "-------------------------------------------------------------"+[99 chars]; + "-------------------------------------------------------------"+[107 chars]; + "-------------------------------------------------------------"+[115 chars]; + "-------------------------------------------------------------"+[123 chars]; + "-------------------------------------------------------------"+[131 chars]; + "-------------------------------------------------------------"+[139 chars]; + "-------------------------------------------------------------"+[147 chars]; + "-------------------------------------------------------------"+[155 chars]; + "-------------------------------------------------------------"+[163 chars]; + "-------------------------------------------------------------"+[171 chars]; + "-------------------------------------------------------------"+[179 chars]; + "-------------------------------------------------------------"+[187 chars]; + "-------------------------------------------------------------"+[195 chars]; + "-------------------------------------------------------------"+[203 chars]; + "-------------------------------------------------------------"+[211 chars]; + "-------------------------------------------------------------"+[219 chars]; + "-------------------------------------------------------------"+[227 chars]; + "-------------------------------------------------------------"+[235 chars]; + "-------------------------------------------------------------"+[243 chars]; + "-------------------------------------------------------------"+[251 chars]; + "-------------------------------------------------------------"+[259 chars]; + "-------------------------------------------------------------"+[267 chars]; + "-------------------------------------------------------------"+[275 chars]; + "-------------------------------------------------------------"+[283 chars]; + "-------------------------------------------------------------"+[291 chars]; + "-------------------------------------------------------------"+[299 chars]; + "-------------------------------------------------------------"+[307 chars]; + "-------------------------------------------------------------"+[315 chars]; + "-------------------------------------------------------------"+[323 chars]; + "-------------------------------------------------------------"+[331 chars]] + [""; "---------"; "------------------"; "---------------------------"; + "------------------------------------"; + "---------------------------------------------"; + "------------------------------------------------------"; + "---------------------------------------------------------------"; + "------------------------------------------------------------------------"; + "-------------------------------------------------------------"+[20 chars]; + "-------------------------------------------------------------"+[29 chars]; + "-------------------------------------------------------------"+[38 chars]; + "-------------------------------------------------------------"+[47 chars]; + "-------------------------------------------------------------"+[56 chars]; + "-------------------------------------------------------------"+[65 chars]; + "-------------------------------------------------------------"+[74 chars]; + "-------------------------------------------------------------"+[83 chars]; + "-------------------------------------------------------------"+[92 chars]; + "-------------------------------------------------------------"+[101 chars]; + "-------------------------------------------------------------"+[110 chars]; + "-------------------------------------------------------------"+[119 chars]; + "-------------------------------------------------------------"+[128 chars]; + "-------------------------------------------------------------"+[137 chars]; + "-------------------------------------------------------------"+[146 chars]; + "-------------------------------------------------------------"+[155 chars]; + "-------------------------------------------------------------"+[164 chars]; + "-------------------------------------------------------------"+[173 chars]; + "-------------------------------------------------------------"+[182 chars]; + "-------------------------------------------------------------"+[191 chars]; + "-------------------------------------------------------------"+[200 chars]; + "-------------------------------------------------------------"+[209 chars]; + "-------------------------------------------------------------"+[218 chars]; + "-------------------------------------------------------------"+[227 chars]; + "-------------------------------------------------------------"+[236 chars]; + "-------------------------------------------------------------"+[245 chars]; + "-------------------------------------------------------------"+[254 chars]; + "-------------------------------------------------------------"+[263 chars]; + "-------------------------------------------------------------"+[272 chars]; + "-------------------------------------------------------------"+[281 chars]; + "-------------------------------------------------------------"+[290 chars]; + "-------------------------------------------------------------"+[299 chars]; + "-------------------------------------------------------------"+[308 chars]; + "-------------------------------------------------------------"+[317 chars]; + "-------------------------------------------------------------"+[326 chars]; + "-------------------------------------------------------------"+[335 chars]; + "-------------------------------------------------------------"+[344 chars]; + "-------------------------------------------------------------"+[353 chars]; + "-------------------------------------------------------------"+[362 chars]; + "-------------------------------------------------------------"+[371 chars]; + "-------------------------------------------------------------"+[380 chars]] + [""; "----------"; "--------------------"; "------------------------------"; + "----------------------------------------"; + "--------------------------------------------------"; + "------------------------------------------------------------"; + "----------------------------------------------------------------------"; + "-------------------------------------------------------------"+[19 chars]; + "-------------------------------------------------------------"+[29 chars]; + "-------------------------------------------------------------"+[39 chars]; + "-------------------------------------------------------------"+[49 chars]; + "-------------------------------------------------------------"+[59 chars]; + "-------------------------------------------------------------"+[69 chars]; + "-------------------------------------------------------------"+[79 chars]; + "-------------------------------------------------------------"+[89 chars]; + "-------------------------------------------------------------"+[99 chars]; + "-------------------------------------------------------------"+[109 chars]; + "-------------------------------------------------------------"+[119 chars]; + "-------------------------------------------------------------"+[129 chars]; + "-------------------------------------------------------------"+[139 chars]; + "-------------------------------------------------------------"+[149 chars]; + "-------------------------------------------------------------"+[159 chars]; + "-------------------------------------------------------------"+[169 chars]; + "-------------------------------------------------------------"+[179 chars]; + "-------------------------------------------------------------"+[189 chars]; + "-------------------------------------------------------------"+[199 chars]; + "-------------------------------------------------------------"+[209 chars]; + "-------------------------------------------------------------"+[219 chars]; + "-------------------------------------------------------------"+[229 chars]; + "-------------------------------------------------------------"+[239 chars]; + "-------------------------------------------------------------"+[249 chars]; + "-------------------------------------------------------------"+[259 chars]; + "-------------------------------------------------------------"+[269 chars]; + "-------------------------------------------------------------"+[279 chars]; + "-------------------------------------------------------------"+[289 chars]; + "-------------------------------------------------------------"+[299 chars]; + "-------------------------------------------------------------"+[309 chars]; + "-------------------------------------------------------------"+[319 chars]; + "-------------------------------------------------------------"+[329 chars]; + "-------------------------------------------------------------"+[339 chars]; + "-------------------------------------------------------------"+[349 chars]; + "-------------------------------------------------------------"+[359 chars]; + "-------------------------------------------------------------"+[369 chars]; + "-------------------------------------------------------------"+[379 chars]; + "-------------------------------------------------------------"+[389 chars]; + "-------------------------------------------------------------"+[399 chars]; + "-------------------------------------------------------------"+[409 chars]; + "-------------------------------------------------------------"+[419 chars]; + "-------------------------------------------------------------"+[429 chars]] + [""; "-----------"; "----------------------"; + "---------------------------------"; + "--------------------------------------------"; + "-------------------------------------------------------"; + "------------------------------------------------------------------"; + "-------------------------------------------------------------"+[16 chars]; + "-------------------------------------------------------------"+[27 chars]; + "-------------------------------------------------------------"+[38 chars]; + "-------------------------------------------------------------"+[49 chars]; + "-------------------------------------------------------------"+[60 chars]; + "-------------------------------------------------------------"+[71 chars]; + "-------------------------------------------------------------"+[82 chars]; + "-------------------------------------------------------------"+[93 chars]; + "-------------------------------------------------------------"+[104 chars]; + "-------------------------------------------------------------"+[115 chars]; + "-------------------------------------------------------------"+[126 chars]; + "-------------------------------------------------------------"+[137 chars]; + "-------------------------------------------------------------"+[148 chars]; + "-------------------------------------------------------------"+[159 chars]; + "-------------------------------------------------------------"+[170 chars]; + "-------------------------------------------------------------"+[181 chars]; + "-------------------------------------------------------------"+[192 chars]; + "-------------------------------------------------------------"+[203 chars]; + "-------------------------------------------------------------"+[214 chars]; + "-------------------------------------------------------------"+[225 chars]; + "-------------------------------------------------------------"+[236 chars]; + "-------------------------------------------------------------"+[247 chars]; + "-------------------------------------------------------------"+[258 chars]; + "-------------------------------------------------------------"+[269 chars]; + "-------------------------------------------------------------"+[280 chars]; + "-------------------------------------------------------------"+[291 chars]; + "-------------------------------------------------------------"+[302 chars]; + "-------------------------------------------------------------"+[313 chars]; + "-------------------------------------------------------------"+[324 chars]; + "-------------------------------------------------------------"+[335 chars]; + "-------------------------------------------------------------"+[346 chars]; + "-------------------------------------------------------------"+[357 chars]; + "-------------------------------------------------------------"+[368 chars]; + "-------------------------------------------------------------"+[379 chars]; + "-------------------------------------------------------------"+[390 chars]; + "-------------------------------------------------------------"+[401 chars]; + "-------------------------------------------------------------"+[412 chars]; + "-------------------------------------------------------------"+[423 chars]; + "-------------------------------------------------------------"+[434 chars]; + "-------------------------------------------------------------"+[445 chars]; + "-------------------------------------------------------------"+[456 chars]; + "-------------------------------------------------------------"+[467 chars]; + "-------------------------------------------------------------"+[478 chars]] + [""; "------------"; "------------------------"; + "------------------------------------"; + "------------------------------------------------"; + "------------------------------------------------------------"; + "------------------------------------------------------------------------"; + "-------------------------------------------------------------"+[23 chars]; + "-------------------------------------------------------------"+[35 chars]; + "-------------------------------------------------------------"+[47 chars]; + "-------------------------------------------------------------"+[59 chars]; + "-------------------------------------------------------------"+[71 chars]; + "-------------------------------------------------------------"+[83 chars]; + "-------------------------------------------------------------"+[95 chars]; + "-------------------------------------------------------------"+[107 chars]; + "-------------------------------------------------------------"+[119 chars]; + "-------------------------------------------------------------"+[131 chars]; + "-------------------------------------------------------------"+[143 chars]; + "-------------------------------------------------------------"+[155 chars]; + "-------------------------------------------------------------"+[167 chars]; + "-------------------------------------------------------------"+[179 chars]; + "-------------------------------------------------------------"+[191 chars]; + "-------------------------------------------------------------"+[203 chars]; + "-------------------------------------------------------------"+[215 chars]; + "-------------------------------------------------------------"+[227 chars]; + "-------------------------------------------------------------"+[239 chars]; + "-------------------------------------------------------------"+[251 chars]; + "-------------------------------------------------------------"+[263 chars]; + "-------------------------------------------------------------"+[275 chars]; + "-------------------------------------------------------------"+[287 chars]; + "-------------------------------------------------------------"+[299 chars]; + "-------------------------------------------------------------"+[311 chars]; + "-------------------------------------------------------------"+[323 chars]; + "-------------------------------------------------------------"+[335 chars]; + "-------------------------------------------------------------"+[347 chars]; + "-------------------------------------------------------------"+[359 chars]; + "-------------------------------------------------------------"+[371 chars]; + "-------------------------------------------------------------"+[383 chars]; + "-------------------------------------------------------------"+[395 chars]; + "-------------------------------------------------------------"+[407 chars]; + "-------------------------------------------------------------"+[419 chars]; + "-------------------------------------------------------------"+[431 chars]; + "-------------------------------------------------------------"+[443 chars]; + "-------------------------------------------------------------"+[455 chars]; + "-------------------------------------------------------------"+[467 chars]; + "-------------------------------------------------------------"+[479 chars]; + "-------------------------------------------------------------"+[491 chars]; + "-------------------------------------------------------------"+[503 chars]; + "-------------------------------------------------------------"+[515 chars]; + "-------------------------------------------------------------"+[527 chars]] + [""; "-------------"; "--------------------------"; + "---------------------------------------"; + "----------------------------------------------------"; + "-----------------------------------------------------------------"; + "-------------------------------------------------------------"+[17 chars]; + "-------------------------------------------------------------"+[30 chars]; + "-------------------------------------------------------------"+[43 chars]; + "-------------------------------------------------------------"+[56 chars]; + "-------------------------------------------------------------"+[69 chars]; + "-------------------------------------------------------------"+[82 chars]; + "-------------------------------------------------------------"+[95 chars]; + "-------------------------------------------------------------"+[108 chars]; + "-------------------------------------------------------------"+[121 chars]; + "-------------------------------------------------------------"+[134 chars]; + "-------------------------------------------------------------"+[147 chars]; + "-------------------------------------------------------------"+[160 chars]; + "-------------------------------------------------------------"+[173 chars]; + "-------------------------------------------------------------"+[186 chars]; + "-------------------------------------------------------------"+[199 chars]; + "-------------------------------------------------------------"+[212 chars]; + "-------------------------------------------------------------"+[225 chars]; + "-------------------------------------------------------------"+[238 chars]; + "-------------------------------------------------------------"+[251 chars]; + "-------------------------------------------------------------"+[264 chars]; + "-------------------------------------------------------------"+[277 chars]; + "-------------------------------------------------------------"+[290 chars]; + "-------------------------------------------------------------"+[303 chars]; + "-------------------------------------------------------------"+[316 chars]; + "-------------------------------------------------------------"+[329 chars]; + "-------------------------------------------------------------"+[342 chars]; + "-------------------------------------------------------------"+[355 chars]; + "-------------------------------------------------------------"+[368 chars]; + "-------------------------------------------------------------"+[381 chars]; + "-------------------------------------------------------------"+[394 chars]; + "-------------------------------------------------------------"+[407 chars]; + "-------------------------------------------------------------"+[420 chars]; + "-------------------------------------------------------------"+[433 chars]; + "-------------------------------------------------------------"+[446 chars]; + "-------------------------------------------------------------"+[459 chars]; + "-------------------------------------------------------------"+[472 chars]; + "-------------------------------------------------------------"+[485 chars]; + "-------------------------------------------------------------"+[498 chars]; + "-------------------------------------------------------------"+[511 chars]; + "-------------------------------------------------------------"+[524 chars]; + "-------------------------------------------------------------"+[537 chars]; + "-------------------------------------------------------------"+[550 chars]; + "-------------------------------------------------------------"+[563 chars]; + "-------------------------------------------------------------"+[576 chars]] + [""; "--------------"; "----------------------------"; + "------------------------------------------"; + "--------------------------------------------------------"; + "----------------------------------------------------------------------"; + "-------------------------------------------------------------"+[23 chars]; + "-------------------------------------------------------------"+[37 chars]; + "-------------------------------------------------------------"+[51 chars]; + "-------------------------------------------------------------"+[65 chars]; + "-------------------------------------------------------------"+[79 chars]; + "-------------------------------------------------------------"+[93 chars]; + "-------------------------------------------------------------"+[107 chars]; + "-------------------------------------------------------------"+[121 chars]; + "-------------------------------------------------------------"+[135 chars]; + "-------------------------------------------------------------"+[149 chars]; + "-------------------------------------------------------------"+[163 chars]; + "-------------------------------------------------------------"+[177 chars]; + "-------------------------------------------------------------"+[191 chars]; + "-------------------------------------------------------------"+[205 chars]; + "-------------------------------------------------------------"+[219 chars]; + "-------------------------------------------------------------"+[233 chars]; + "-------------------------------------------------------------"+[247 chars]; + "-------------------------------------------------------------"+[261 chars]; + "-------------------------------------------------------------"+[275 chars]; + "-------------------------------------------------------------"+[289 chars]; + "-------------------------------------------------------------"+[303 chars]; + "-------------------------------------------------------------"+[317 chars]; + "-------------------------------------------------------------"+[331 chars]; + "-------------------------------------------------------------"+[345 chars]; + "-------------------------------------------------------------"+[359 chars]; + "-------------------------------------------------------------"+[373 chars]; + "-------------------------------------------------------------"+[387 chars]; + "-------------------------------------------------------------"+[401 chars]; + "-------------------------------------------------------------"+[415 chars]; + "-------------------------------------------------------------"+[429 chars]; + "-------------------------------------------------------------"+[443 chars]; + "-------------------------------------------------------------"+[457 chars]; + "-------------------------------------------------------------"+[471 chars]; + "-------------------------------------------------------------"+[485 chars]; + "-------------------------------------------------------------"+[499 chars]; + "-------------------------------------------------------------"+[513 chars]; + "-------------------------------------------------------------"+[527 chars]; + "-------------------------------------------------------------"+[541 chars]; + "-------------------------------------------------------------"+[555 chars]; + "-------------------------------------------------------------"+[569 chars]; + "-------------------------------------------------------------"+[583 chars]; + "-------------------------------------------------------------"+[597 chars]; + "-------------------------------------------------------------"+[611 chars]; + "-------------------------------------------------------------"+[625 chars]] + [""; "---------------"; "------------------------------"; + "---------------------------------------------"; + "------------------------------------------------------------"; + "-------------------------------------------------------------"+[14 chars]; + "-------------------------------------------------------------"+[29 chars]; + "-------------------------------------------------------------"+[44 chars]; + "-------------------------------------------------------------"+[59 chars]; + "-------------------------------------------------------------"+[74 chars]; + "-------------------------------------------------------------"+[89 chars]; + "-------------------------------------------------------------"+[104 chars]; + "-------------------------------------------------------------"+[119 chars]; + "-------------------------------------------------------------"+[134 chars]; + "-------------------------------------------------------------"+[149 chars]; + "-------------------------------------------------------------"+[164 chars]; + "-------------------------------------------------------------"+[179 chars]; + "-------------------------------------------------------------"+[194 chars]; + "-------------------------------------------------------------"+[209 chars]; + "-------------------------------------------------------------"+[224 chars]; + "-------------------------------------------------------------"+[239 chars]; + "-------------------------------------------------------------"+[254 chars]; + "-------------------------------------------------------------"+[269 chars]; + "-------------------------------------------------------------"+[284 chars]; + "-------------------------------------------------------------"+[299 chars]; + "-------------------------------------------------------------"+[314 chars]; + "-------------------------------------------------------------"+[329 chars]; + "-------------------------------------------------------------"+[344 chars]; + "-------------------------------------------------------------"+[359 chars]; + "-------------------------------------------------------------"+[374 chars]; + "-------------------------------------------------------------"+[389 chars]; + "-------------------------------------------------------------"+[404 chars]; + "-------------------------------------------------------------"+[419 chars]; + "-------------------------------------------------------------"+[434 chars]; + "-------------------------------------------------------------"+[449 chars]; + "-------------------------------------------------------------"+[464 chars]; + "-------------------------------------------------------------"+[479 chars]; + "-------------------------------------------------------------"+[494 chars]; + "-------------------------------------------------------------"+[509 chars]; + "-------------------------------------------------------------"+[524 chars]; + "-------------------------------------------------------------"+[539 chars]; + "-------------------------------------------------------------"+[554 chars]; + "-------------------------------------------------------------"+[569 chars]; + "-------------------------------------------------------------"+[584 chars]; + "-------------------------------------------------------------"+[599 chars]; + "-------------------------------------------------------------"+[614 chars]; + "-------------------------------------------------------------"+[629 chars]; + "-------------------------------------------------------------"+[644 chars]; + "-------------------------------------------------------------"+[659 chars]; + "-------------------------------------------------------------"+[674 chars]] + [""; "----------------"; "--------------------------------"; + "------------------------------------------------"; + "----------------------------------------------------------------"; + "-------------------------------------------------------------"+[19 chars]; + "-------------------------------------------------------------"+[35 chars]; + "-------------------------------------------------------------"+[51 chars]; + "-------------------------------------------------------------"+[67 chars]; + "-------------------------------------------------------------"+[83 chars]; + "-------------------------------------------------------------"+[99 chars]; + "-------------------------------------------------------------"+[115 chars]; + "-------------------------------------------------------------"+[131 chars]; + "-------------------------------------------------------------"+[147 chars]; + "-------------------------------------------------------------"+[163 chars]; + "-------------------------------------------------------------"+[179 chars]; + "-------------------------------------------------------------"+[195 chars]; + "-------------------------------------------------------------"+[211 chars]; + "-------------------------------------------------------------"+[227 chars]; + "-------------------------------------------------------------"+[243 chars]; + "-------------------------------------------------------------"+[259 chars]; + "-------------------------------------------------------------"+[275 chars]; + "-------------------------------------------------------------"+[291 chars]; + "-------------------------------------------------------------"+[307 chars]; + "-------------------------------------------------------------"+[323 chars]; + "-------------------------------------------------------------"+[339 chars]; + "-------------------------------------------------------------"+[355 chars]; + "-------------------------------------------------------------"+[371 chars]; + "-------------------------------------------------------------"+[387 chars]; + "-------------------------------------------------------------"+[403 chars]; + "-------------------------------------------------------------"+[419 chars]; + "-------------------------------------------------------------"+[435 chars]; + "-------------------------------------------------------------"+[451 chars]; + "-------------------------------------------------------------"+[467 chars]; + "-------------------------------------------------------------"+[483 chars]; + "-------------------------------------------------------------"+[499 chars]; + "-------------------------------------------------------------"+[515 chars]; + "-------------------------------------------------------------"+[531 chars]; + "-------------------------------------------------------------"+[547 chars]; + "-------------------------------------------------------------"+[563 chars]; + "-------------------------------------------------------------"+[579 chars]; + "-------------------------------------------------------------"+[595 chars]; + "-------------------------------------------------------------"+[611 chars]; + "-------------------------------------------------------------"+[627 chars]; + "-------------------------------------------------------------"+[643 chars]; + "-------------------------------------------------------------"+[659 chars]; + "-------------------------------------------------------------"+[675 chars]; + "-------------------------------------------------------------"+[691 chars]; + "-------------------------------------------------------------"+[707 chars]; + "-------------------------------------------------------------"+[723 chars]] + [""; "-----------------"; "----------------------------------"; + "---------------------------------------------------"; + "--------------------------------------------------------------------"; + "-------------------------------------------------------------"+[24 chars]; + "-------------------------------------------------------------"+[41 chars]; + "-------------------------------------------------------------"+[58 chars]; + "-------------------------------------------------------------"+[75 chars]; + "-------------------------------------------------------------"+[92 chars]; + "-------------------------------------------------------------"+[109 chars]; + "-------------------------------------------------------------"+[126 chars]; + "-------------------------------------------------------------"+[143 chars]; + "-------------------------------------------------------------"+[160 chars]; + "-------------------------------------------------------------"+[177 chars]; + "-------------------------------------------------------------"+[194 chars]; + "-------------------------------------------------------------"+[211 chars]; + "-------------------------------------------------------------"+[228 chars]; + "-------------------------------------------------------------"+[245 chars]; + "-------------------------------------------------------------"+[262 chars]; + "-------------------------------------------------------------"+[279 chars]; + "-------------------------------------------------------------"+[296 chars]; + "-------------------------------------------------------------"+[313 chars]; + "-------------------------------------------------------------"+[330 chars]; + "-------------------------------------------------------------"+[347 chars]; + "-------------------------------------------------------------"+[364 chars]; + "-------------------------------------------------------------"+[381 chars]; + "-------------------------------------------------------------"+[398 chars]; + "-------------------------------------------------------------"+[415 chars]; + "-------------------------------------------------------------"+[432 chars]; + "-------------------------------------------------------------"+[449 chars]; + "-------------------------------------------------------------"+[466 chars]; + "-------------------------------------------------------------"+[483 chars]; + "-------------------------------------------------------------"+[500 chars]; + "-------------------------------------------------------------"+[517 chars]; + "-------------------------------------------------------------"+[534 chars]; + "-------------------------------------------------------------"+[551 chars]; + "-------------------------------------------------------------"+[568 chars]; + "-------------------------------------------------------------"+[585 chars]; + "-------------------------------------------------------------"+[602 chars]; + "-------------------------------------------------------------"+[619 chars]; + "-------------------------------------------------------------"+[636 chars]; + "-------------------------------------------------------------"+[653 chars]; + "-------------------------------------------------------------"+[670 chars]; + "-------------------------------------------------------------"+[687 chars]; + "-------------------------------------------------------------"+[704 chars]; + "-------------------------------------------------------------"+[721 chars]; + "-------------------------------------------------------------"+[738 chars]; + "-------------------------------------------------------------"+[755 chars]; + "-------------------------------------------------------------"+[772 chars]] + [""; "------------------"; "------------------------------------"; + "------------------------------------------------------"; + "------------------------------------------------------------------------"; + "-------------------------------------------------------------"+[29 chars]; + "-------------------------------------------------------------"+[47 chars]; + "-------------------------------------------------------------"+[65 chars]; + "-------------------------------------------------------------"+[83 chars]; + "-------------------------------------------------------------"+[101 chars]; + "-------------------------------------------------------------"+[119 chars]; + "-------------------------------------------------------------"+[137 chars]; + "-------------------------------------------------------------"+[155 chars]; + "-------------------------------------------------------------"+[173 chars]; + "-------------------------------------------------------------"+[191 chars]; + "-------------------------------------------------------------"+[209 chars]; + "-------------------------------------------------------------"+[227 chars]; + "-------------------------------------------------------------"+[245 chars]; + "-------------------------------------------------------------"+[263 chars]; + "-------------------------------------------------------------"+[281 chars]; + "-------------------------------------------------------------"+[299 chars]; + "-------------------------------------------------------------"+[317 chars]; + "-------------------------------------------------------------"+[335 chars]; + "-------------------------------------------------------------"+[353 chars]; + "-------------------------------------------------------------"+[371 chars]; + "-------------------------------------------------------------"+[389 chars]; + "-------------------------------------------------------------"+[407 chars]; + "-------------------------------------------------------------"+[425 chars]; + "-------------------------------------------------------------"+[443 chars]; + "-------------------------------------------------------------"+[461 chars]; + "-------------------------------------------------------------"+[479 chars]; + "-------------------------------------------------------------"+[497 chars]; + "-------------------------------------------------------------"+[515 chars]; + "-------------------------------------------------------------"+[533 chars]; + "-------------------------------------------------------------"+[551 chars]; + "-------------------------------------------------------------"+[569 chars]; + "-------------------------------------------------------------"+[587 chars]; + "-------------------------------------------------------------"+[605 chars]; + "-------------------------------------------------------------"+[623 chars]; + "-------------------------------------------------------------"+[641 chars]; + "-------------------------------------------------------------"+[659 chars]; + "-------------------------------------------------------------"+[677 chars]; + "-------------------------------------------------------------"+[695 chars]; + "-------------------------------------------------------------"+[713 chars]; + "-------------------------------------------------------------"+[731 chars]; + "-------------------------------------------------------------"+[749 chars]; + "-------------------------------------------------------------"+[767 chars]; + "-------------------------------------------------------------"+[785 chars]; + "-------------------------------------------------------------"+[803 chars]; + "-------------------------------------------------------------"+[821 chars]] + [""; "-------------------"; "--------------------------------------"; + "---------------------------------------------------------"; + "-------------------------------------------------------------"+[15 chars]; + "-------------------------------------------------------------"+[34 chars]; + "-------------------------------------------------------------"+[53 chars]; + "-------------------------------------------------------------"+[72 chars]; + "-------------------------------------------------------------"+[91 chars]; + "-------------------------------------------------------------"+[110 chars]; + "-------------------------------------------------------------"+[129 chars]; + "-------------------------------------------------------------"+[148 chars]; + "-------------------------------------------------------------"+[167 chars]; + "-------------------------------------------------------------"+[186 chars]; + "-------------------------------------------------------------"+[205 chars]; + "-------------------------------------------------------------"+[224 chars]; + "-------------------------------------------------------------"+[243 chars]; + "-------------------------------------------------------------"+[262 chars]; + "-------------------------------------------------------------"+[281 chars]; + "-------------------------------------------------------------"+[300 chars]; + "-------------------------------------------------------------"+[319 chars]; + "-------------------------------------------------------------"+[338 chars]; + "-------------------------------------------------------------"+[357 chars]; + "-------------------------------------------------------------"+[376 chars]; + "-------------------------------------------------------------"+[395 chars]; + "-------------------------------------------------------------"+[414 chars]; + "-------------------------------------------------------------"+[433 chars]; + "-------------------------------------------------------------"+[452 chars]; + "-------------------------------------------------------------"+[471 chars]; + "-------------------------------------------------------------"+[490 chars]; + "-------------------------------------------------------------"+[509 chars]; + "-------------------------------------------------------------"+[528 chars]; + "-------------------------------------------------------------"+[547 chars]; + "-------------------------------------------------------------"+[566 chars]; + "-------------------------------------------------------------"+[585 chars]; + "-------------------------------------------------------------"+[604 chars]; + "-------------------------------------------------------------"+[623 chars]; + "-------------------------------------------------------------"+[642 chars]; + "-------------------------------------------------------------"+[661 chars]; + "-------------------------------------------------------------"+[680 chars]; + "-------------------------------------------------------------"+[699 chars]; + "-------------------------------------------------------------"+[718 chars]; + "-------------------------------------------------------------"+[737 chars]; + "-------------------------------------------------------------"+[756 chars]; + "-------------------------------------------------------------"+[775 chars]; + "-------------------------------------------------------------"+[794 chars]; + "-------------------------------------------------------------"+[813 chars]; + "-------------------------------------------------------------"+[832 chars]; + "-------------------------------------------------------------"+[851 chars]; + "-------------------------------------------------------------"+[870 chars]; + ...] + ...] + +> type tree = + | L + | N of tree list +val mkT: w: int -> d: int -> tree +val tree: w: int -> d: int -> tree + +> [Building 2 4...done] +val tree_2_4: tree = + N [N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]; + N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]] + +> [Building 2 6...done] +val tree_2_6: tree = + N [N [N [N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]; + N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]]; + N [N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]; + N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]]]; + N [N [N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]; + N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]]; + N [N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]; + N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]]]] + +> [Building 2 8...done] +val tree_2_8: tree = + N [N [N [N [N [N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]; + N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]]; + N [N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]; + N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]]]; + N [N [N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]; + N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]]; + N [N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]; + N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]]]]; + N [N [N [N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]; + N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]]; + N [N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]; + N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]]]; + N [N [N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]; + N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]]; + N [N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]; + N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]]]]]; + N [N [N [N [N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]; + N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]]; + N [N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]; + N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]]]; + N [N [N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]; + N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]]; + N [N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]; + N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]]]]; + N [N [N [N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]; + N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]]; + N [N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]; + N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]]]; + N [N [N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]; + N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]]; + N [N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]; + N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]]]]]] + +> [Building 2 10...done] +val tree_2_10: tree = + N [N [N [N [N [N [N [N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]; + N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]]; + N [N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]; + N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]]]; + N [N [N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]; + N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]]; + N [N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]; + N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]]]]; + N [N [N [N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]; + N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]]; + N [N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]; + N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]]]; + N [N [N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]; + N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]]; + N [N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]; + N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]]]]]; + N [N [N [N [N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]; + N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]]; + N [N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]; + N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]]]; + N [N [N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]; + N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]]; + N [N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]; + N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]]]]; + N [N [N [N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]; + N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]]; + N [N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]; + N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]]]; + N [N [N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]; + N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]]; + N [N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]; + N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]]]]]]; + N [N [N [N [N [N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]; + N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]]; + N [N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]; + N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]]]; + N [N [N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]; + N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]]; + N [N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]; + N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]]]]; + N [N [N [N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]; + N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]]; + N [N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]; + N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]]]; + N [N [N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]; + N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]]; + N [N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]; + N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]]]]]; + N [N [N [N [N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]; + N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]]; + N [N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]; + N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]]]; + N [N [N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]; + N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]]; + N [N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]; + N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]]]]; + N [N [N [N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]; + N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]]; + N [N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]; + N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]]]; + N [N [N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]; + N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]]; + N [N [N [N [L; L]; N ...; ...]; ...]; ...]; ...]; ...]; + ...]; ...]; ...]; ...] + +> [Building 2 12...done] +val tree_2_12: tree = + N [N [N [N [N [N [N [N [N [N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]; + N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]]; + N [N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]; + N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]]]; + N [N [N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]; + N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]]; + N [N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]; + N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]]]]; + N [N [N [N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]; + N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]]; + N [N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]; + N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]]]; + N [N [N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]; + N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]]; + N [N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]; + N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]]]]]; + N [N [N [N [N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]; + N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]]; + N [N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]; + N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]]]; + N [N [N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]; + N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]]; + N [N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]; + N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]]]]; + N [N [N [N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]; + N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]]; + N [N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]; + N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]]]; + N [N [N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]; + N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]]; + N [N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]; + N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]]]]]]; + N [N [N [N [N [N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]; + N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]]; + N [N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]; + N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]]]; + N [N [N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]; + N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]]; + N [N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]; + N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]]]]; + N [N [N [N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]; + N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]]; + N [N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]; + N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]]]; + N [N [N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]; + N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]]; + N [N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]; + N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]]]]]; + N [N [N [N [N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]; + N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]]; + N [N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]; + N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]]]; + N [N [N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]; + N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]]; + N [N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]; + N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]]]]; + N [N [N [N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]; + N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]]; + N [N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]; + N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]]]; + N [N [N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]; + N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]]; + N [N [N [N [L; ...]; ...]; ...]; ...]; ...]; ...]; + ...]; ...]; ...]; ...]; ...]; ...] + +> [Building 2 14...done] +val tree_2_14: tree = + N [N [N [N [N [N [N [N [N [N [N [N [N [N [L; L]; N [L; L]]; + N [N [L; L]; N [L; L]]]; + N [N [N [L; L]; N [L; L]]; + N [N [L; L]; N [L; L]]]]; + N [N [N [N [L; L]; N [L; L]]; + N [N [L; L]; N [L; L]]]; + N [N [N [L; L]; N [L; L]]; + N [N [L; L]; N [L; L]]]]]; + N [N [N [N [N [L; L]; N [L; L]]; + N [N [L; L]; N [L; L]]]; + N [N [N [L; L]; N [L; L]]; + N [N [L; L]; N [L; L]]]]; + N [N [N [N [L; L]; N [L; L]]; + N [N [L; L]; N [L; L]]]; + N [N [N [L; L]; N [L; L]]; + N [N [L; L]; N [L; L]]]]]]; + N [N [N [N [N [N [L; L]; N [L; L]]; + N [N [L; L]; N [L; L]]]; + N [N [N [L; L]; N [L; L]]; + N [N [L; L]; N [L; L]]]]; + N [N [N [N [L; L]; N [L; L]]; + N [N [L; L]; N [L; L]]]; + N [N [N [L; L]; N [L; L]]; + N [N [L; L]; N [L; L]]]]]; + N [N [N [N [N [L; L]; N [L; L]]; + N [N [L; L]; N [L; L]]]; + N [N [N [L; L]; N [L; L]]; + N [N [L; L]; N [L; L]]]]; + N [N [N [N [L; L]; N [L; L]]; + N [N [L; L]; N [L; L]]]; + N [N [N [L; L]; N [L; L]]; + N [N [L; L]; N [L; L]]]]]]]; + N [N [N [N [N [N [N [L; L]; N [L; L]]; + N [N [L; L]; N [L; L]]]; + N [N [N [L; L]; N [L; L]]; + N [N [L; L]; N [L; L]]]]; + N [N [N [N [L; L]; N [L; L]]; + N [N [L; L]; N [L; L]]]; + N [N [N [L; L]; N [L; L]]; + N [N [L; L]; N [L; L]]]]]; + N [N [N [N [N [L; L]; N [L; L]]; + N [N [L; L]; N [L; L]]]; + N [N [N [L; L]; N [L; L]]; + N [N [L; L]; N [L; L]]]]; + N [N [N [N [L; L]; N [L; L]]; + N [N [L; L]; N [L; L]]]; + N [N [N [L; L]; N [L; L]]; + N [N [L; L]; N [L; L]]]]]]; + N [N [N [N [N [N [L; L]; N [L; L]]; + N [N [L; L]; N [L; L]]]; + N [N [N [L; L]; N [L; L]]; + N [N [L; L]; N [L; L]]]]; + N [N [N [N [L; L]; N [L; L]]; + N [N [L; L]; N [L; L]]]; + N [N [N [L; L]; N [L; L]]; + N [N [L; L]; N [L; L]]]]]; + N [N [N [N [N [L; L]; N [L; L]]; + N [N [L; L]; N [L; L]]]; + N [N [N [L; L]; N [L; L]]; + N [N [L; L]; N [L; L]]]]; + N [N [N [N [L; L]; N [L; L]]; + N [N [L; L]; N [L; L]]]; + N [N [N [L; L]; N [L; L]]; + N [N [L; L]; N [L; L]]]]]]]]; + N [N [N [N [N [N [N [N [L; L]; N [L; L]]; + N [N [L; L]; N [L; L]]]; + N [N [N [L; L]; N [L; L]]; + N [N [L; L]; N [L; L]]]]; + N [N [N [N [L; L]; N [L; L]]; + N [N [L; L]; N [L; L]]]; + N [N [N [L; L]; N [L; L]]; + N [N [L; L]; N [L; L]]]]]; + N [N [N [N [N [L; L]; N [L; L]]; + N [N [L; L]; N [L; L]]]; + N [N [N [L; L]; N [L; L]]; + N [N [L; L]; N [L; L]]]]; + N [N [N [N [L; L]; N [L; L]]; + N [N [L; L]; N [L; L]]]; + N [N [N [L; L]; N [L; L]]; + N [N [L; L]; N [L; L]]]]]]; + N [N [N [N [N [N [L; L]; N [L; L]]; + N [N [L; L]; N [L; L]]]; + N [N [N [L; L]; N [L; L]]; + N [N [L; L]; N [L; L]]]]; + N [N [N [N [L; L]; N [L; L]]; + N [N [L; L]; N [L; L]]]; + N [N [N [L; L]; N [L; L]]; + N [N [L; L]; N [L; L]]]]]; + N [N [N [N [N [L; L]; N [L; L]]; + N [N [L; L]; N [L; L]]]; + N [N [N [L; L]; N [L; L]]; + N [N [L; L]; N [L; L]]]]; + N [N [N [N [L; L]; N [L; L]]; + N [N [L; L]; N [L; L]]]; + N [N [N [L; L]; N [L; L]]; + N [N [L; L]; N [L; L]]]]]]]; + N [N [N [N [N [N [N [L; L]; N [L; L]]; + N [N [L; L]; N [L; L]]]; + N [N [N [L; L]; N [L; L]]; + N [N [L; L]; N [L; L]]]]; + N [N [N [N [L; L]; N [L; L]]; + N [N [L; L]; N [L; L]]]; + N [N [N [L; L]; N [L; L]]; + N [N [L; L]; N [L; L]]]]]; + N [N [N [N [N [L; L]; N [L; L]]; + N [N [L; L]; N [L; L]]]; + N [N [N [L; L]; N [L; L]]; + N [N [L; L]; N [L; L]]]]; + N [N [N [N [L; L]; N [L; L]]; + N [N [L; L]; N [L; L]]]; + N [N [N [L; L]; N [L; L]]; + N [N [L; L]; N [L; L]]]]]]; + N [N [N [N [N [N [L; L]; N [L; L]]; + N [N [L; L]; N [L; L]]]; + N [N [N [L; L]; N [L; L]]; + N [N [L; L]; N [L; L]]]]; + N [N [N [N [L; L]; N [L; L]]; + N [N [L; L]; N [L; L]]]; + N [N [N [L; L]; N [L; L]]; + N [N [L; L]; N [L; L]]]]]; + N [N [N [N [N [L; L]; N [L; L]]; + N [N [L; L]; N [L; L]]]; + N [N [N [L; L]; N [L; L]]; + N [N [L; L]; N [L; L]]]]; + N [N [N ...; ...]; ...]; ...]; ...]; ...]; ...]; + ...]; ...]; ...]; ...]; ...]; ...] + +> [Building 3 8...done] +val tree_3_8: tree = + N [N [N [N [N [N [N [N [L; L; L]; N [L; L; L]; N [L; L; L]]; + N [N [L; L; L]; N [L; L; L]; N [L; L; L]]; + N [N [L; L; L]; N [L; L; L]; N [L; L; L]]]; + N [N [N [L; L; L]; N [L; L; L]; N [L; L; L]]; + N [N [L; L; L]; N [L; L; L]; N [L; L; L]]; + N [N [L; L; L]; N [L; L; L]; N [L; L; L]]]; + N [N [N [L; L; L]; N [L; L; L]; N [L; L; L]]; + N [N [L; L; L]; N [L; L; L]; N [L; L; L]]; + N [N [L; L; L]; N [L; L; L]; N [L; L; L]]]]; + N [N [N [N [L; L; L]; N [L; L; L]; N [L; L; L]]; + N [N [L; L; L]; N [L; L; L]; N [L; L; L]]; + N [N [L; L; L]; N [L; L; L]; N [L; L; L]]]; + N [N [N [L; L; L]; N [L; L; L]; N [L; L; L]]; + N [N [L; L; L]; N [L; L; L]; N [L; L; L]]; + N [N [L; L; L]; N [L; L; L]; N [L; L; L]]]; + N [N [N [L; L; L]; N [L; L; L]; N [L; L; L]]; + N [N [L; L; L]; N [L; L; L]; N [L; L; L]]; + N [N [L; L; L]; N [L; L; L]; N [L; L; L]]]]; + N [N [N [N [L; L; L]; N [L; L; L]; N [L; L; L]]; + N [N [L; L; L]; N [L; L; L]; N [L; L; L]]; + N [N [L; L; L]; N [L; L; L]; N [L; L; L]]]; + N [N [N [L; L; L]; N [L; L; L]; N [L; L; L]]; + N [N [L; L; L]; N [L; L; L]; N [L; L; L]]; + N [N [L; L; L]; N [L; L; L]; N [L; L; L]]]; + N [N [N [L; L; L]; N [L; L; L]; N [L; L; L]]; + N [N [L; L; L]; N [L; L; L]; N [L; L; L]]; + N [N [L; L; L]; N [L; L; L]; N [L; L; L]]]]]; + N [N [N [N [N [L; L; L]; N [L; L; L]; N [L; L; L]]; + N [N [L; L; L]; N [L; L; L]; N [L; L; L]]; + N [N [L; L; L]; N [L; L; L]; N [L; L; L]]]; + N [N [N [L; L; L]; N [L; L; L]; N [L; L; L]]; + N [N [L; L; L]; N [L; L; L]; N [L; L; L]]; + N [N [L; L; L]; N [L; L; L]; N [L; L; L]]]; + N [N [N [L; L; L]; N [L; L; L]; N [L; L; L]]; + N [N [L; L; L]; N [L; L; L]; N [L; L; L]]; + N [N [L; L; L]; N [L; L; L]; N [L; L; L]]]]; + N [N [N [N [L; L; L]; N [L; L; L]; N [L; L; L]]; + N [N [L; L; L]; N [L; L; L]; N [L; L; L]]; + N [N [L; L; L]; N [L; L; L]; N [L; L; L]]]; + N [N [N [L; L; L]; N [L; L; L]; N [L; L; L]]; + N [N [L; L; L]; N [L; L; L]; N [L; L; L]]; + N [N [L; L; L]; N [L; L; L]; N [L; L; L]]]; + N [N [N [L; L; L]; N [L; L; L]; N [L; L; L]]; + N [N [L; L; L]; N [L; L; L]; N [L; L; L]]; + N [N [L; L; L]; N [L; L; L]; N [L; L; L]]]]; + N [N [N [N [L; L; L]; N [L; L; L]; N [L; L; L]]; + N [N [L; L; L]; N [L; L; L]; N [L; L; L]]; + N [N [L; L; L]; N [L; L; L]; N [L; L; L]]]; + N [N [N [L; L; L]; N [L; L; L]; N [L; L; L]]; + N [N [L; L; L]; N [L; L; L]; N [L; L; L]]; + N [N [L; L; L]; N [L; L; L]; N [L; L; L]]]; + N [N [N [L; L; L]; N [L; L; L]; N [L; L; L]]; + N [N [L; L; L]; N [L; L; L]; N [L; L; L]]; + N [N [L; L; L]; N [L; L; L]; N [L; L; L]]]]]; + N [N [N [N [N [L; L; L]; N [L; L; L]; N [L; L; L]]; + N [N [L; L; L]; N [L; L; L]; N [L; L; L]]; + N [N [L; L; L]; N [L; L; L]; N [L; L; L]]]; + N [N [N [L; L; L]; N [L; L; L]; N [L; L; L]]; + N [N [L; L; L]; N [L; L; L]; N [L; L; L]]; + N [N [L; L; L]; N [L; L; L]; N [L; L; L]]]; + N [N [N [L; L; L]; N [L; L; L]; N [L; L; L]]; + N [N [L; L; L]; N [L; L; L]; N [L; L; L]]; + N [N [L; L; L]; N [L; L; L]; N [L; L; L]]]]; + N [N [N [N [L; L; L]; N [L; L; L]; N [L; L; L]]; + N [N [L; L; L]; N [L; L; L]; N [L; L; L]]; + N [N [L; L; L]; N [L; L; L]; N [L; L; L]]]; + N [N [N [L; L; L]; N [L; L; L]; N [L; L; L]]; + N [N [L; L; L]; N [L; L; L]; N [L; L; L]]; + N [N [L; L; L]; N [L; L; L]; N [L; L; L]]]; + N [N [N [L; L; L]; N [L; L; L]; N [L; L; L]]; + N [N [L; L; L]; N [L; L; L]; N [L; L; L]]; + N [N [L; L; L]; N [L; L; L]; N [L; L; L]]]]; + N [N [N [N [L; L; L]; N [L; L; L]; N [L; L; L]]; + N [N [L; L; L]; N [L; L; L]; N [L; ...]; ...]; ...]; ...]; + ...]; ...]; ...]; ...] + +> [Building 4 8...done] +val tree_4_8: tree = + N [N [N [N [N [N [N [N [L; L; L; L]; N [L; L; L; L]; N [L; L; L; L]; + N [L; L; L; L]]; + N [N [L; L; L; L]; N [L; L; L; L]; N [L; L; L; L]; + N [L; L; L; L]]; + N [N [L; L; L; L]; N [L; L; L; L]; N [L; L; L; L]; + N [L; L; L; L]]; + N [N [L; L; L; L]; N [L; L; L; L]; N [L; L; L; L]; + N [L; L; L; L]]]; + N [N [N [L; L; L; L]; N [L; L; L; L]; N [L; L; L; L]; + N [L; L; L; L]]; + N [N [L; L; L; L]; N [L; L; L; L]; N [L; L; L; L]; + N [L; L; L; L]]; + N [N [L; L; L; L]; N [L; L; L; L]; N [L; L; L; L]; + N [L; L; L; L]]; + N [N [L; L; L; L]; N [L; L; L; L]; N [L; L; L; L]; + N [L; L; L; L]]]; + N [N [N [L; L; L; L]; N [L; L; L; L]; N [L; L; L; L]; + N [L; L; L; L]]; + N [N [L; L; L; L]; N [L; L; L; L]; N [L; L; L; L]; + N [L; L; L; L]]; + N [N [L; L; L; L]; N [L; L; L; L]; N [L; L; L; L]; + N [L; L; L; L]]; + N [N [L; L; L; L]; N [L; L; L; L]; N [L; L; L; L]; + N [L; L; L; L]]]; + N [N [N [L; L; L; L]; N [L; L; L; L]; N [L; L; L; L]; + N [L; L; L; L]]; + N [N [L; L; L; L]; N [L; L; L; L]; N [L; L; L; L]; + N [L; L; L; L]]; + N [N [L; L; L; L]; N [L; L; L; L]; N [L; L; L; L]; + N [L; L; L; L]]; + N [N [L; L; L; L]; N [L; L; L; L]; N [L; L; L; L]; + N [L; L; L; L]]]]; + N [N [N [N [L; L; L; L]; N [L; L; L; L]; N [L; L; L; L]; + N [L; L; L; L]]; + N [N [L; L; L; L]; N [L; L; L; L]; N [L; L; L; L]; + N [L; L; L; L]]; + N [N [L; L; L; L]; N [L; L; L; L]; N [L; L; L; L]; + N [L; L; L; L]]; + N [N [L; L; L; L]; N [L; L; L; L]; N [L; L; L; L]; + N [L; L; L; L]]]; + N [N [N [L; L; L; L]; N [L; L; L; L]; N [L; L; L; L]; + N [L; L; L; L]]; + N [N [L; L; L; L]; N [L; L; L; L]; N [L; L; L; L]; + N [L; L; L; L]]; + N [N [L; L; L; L]; N [L; L; L; L]; N [L; L; L; L]; + N [L; L; L; L]]; + N [N [L; L; L; L]; N [L; L; L; L]; N [L; L; L; L]; + N [L; L; L; L]]]; + N [N [N [L; L; L; L]; N [L; L; L; L]; N [L; L; L; L]; + N [L; L; L; L]]; + N [N [L; L; L; L]; N [L; L; L; L]; N [L; L; L; L]; + N [L; L; L; L]]; + N [N [L; L; L; L]; N [L; L; L; L]; N [L; L; L; L]; + N [L; L; L; L]]; + N [N [L; L; L; L]; N [L; L; L; L]; N [L; L; L; L]; + N [L; L; L; L]]]; + N [N [N [L; L; L; L]; N [L; L; L; L]; N [L; L; L; L]; + N [L; L; L; L]]; + N [N [L; L; L; L]; N [L; L; L; L]; N [L; L; L; L]; + N [L; L; L; L]]; + N [N [L; L; L; L]; N [L; L; L; L]; N [L; L; L; L]; + N [L; L; L; L]]; + N [N [L; L; L; L]; N [L; L; L; L]; N [L; L; L; L]; + N [L; L; L; L]]]]; + N [N [N [N [L; L; L; L]; N [L; L; L; L]; N [L; L; L; L]; + N [L; L; L; L]]; + N [N [L; L; L; L]; N [L; L; L; L]; N [L; L; L; L]; + N [L; L; L; L]]; + N [N [L; L; L; L]; N [L; L; L; L]; N [L; L; L; L]; + N [L; L; L; L]]; + N [N [L; L; L; L]; N [L; L; L; L]; N [L; L; L; L]; + N [L; L; L; L]]]; + N [N [N [L; L; L; L]; N [L; L; L; L]; N [L; L; L; L]; + N [L; L; L; L]]; + N [N [L; L; L; L]; N [L; L; L; L]; N [L; L; L; L]; + N [L; L; L; L]]; + N [N [L; L; L; L]; N [L; L; L; L]; N [L; L; L; L]; + N [L; L; L; L]]; + N [N [L; L; L; L]; N [L; L; L; L]; N [L; L; L; L]; + N [L; L; L; L]]]; + N [N [N [L; L; L; L]; N [L; L; L; L]; N [L; L; L; L]; + N [L; L; L; L]]; + N [N [L; L; L; L]; N [L; L; L; L]; N [L; L; L; L]; + N [L; L; L; L]]; + N [N [L; L; L; L]; N [L; L; L; L]; N [L; L; L; L]; + N [L; L; L; L]]; + N [N [L; L; L; L]; N [L; L; L; L]; N [L; L; L; L]; + N [L; L; L; L]]]; + N [N [N [L; L; L; L]; N [L; L; L; L]; N [L; L; L; L]; + N [L; L; L; L]]; + N [N [L; L; L; L]; N [L; L; L; L]; N [L; L; L; L]; + N [L; L; L; L]]; + N [N [L; L; L; L]; N [L; L; L; L]; N [L; L; L; ...]; ...]; + ...]; ...]; ...]; ...]; ...]; ...] + +> [Building 5 8...done] +val tree_5_8: tree = + N [N [N [N [N [N [N [N [L; L; L; L; L]; N [L; L; L; L; L]; N [L; L; L; L; L]; + N [L; L; L; L; L]; N [L; L; L; L; L]]; + N [N [L; L; L; L; L]; N [L; L; L; L; L]; N [L; L; L; L; L]; + N [L; L; L; L; L]; N [L; L; L; L; L]]; + N [N [L; L; L; L; L]; N [L; L; L; L; L]; N [L; L; L; L; L]; + N [L; L; L; L; L]; N [L; L; L; L; L]]; + N [N [L; L; L; L; L]; N [L; L; L; L; L]; N [L; L; L; L; L]; + N [L; L; L; L; L]; N [L; L; L; L; L]]; + N [N [L; L; L; L; L]; N [L; L; L; L; L]; N [L; L; L; L; L]; + N [L; L; L; L; L]; N [L; L; L; L; L]]]; + N [N [N [L; L; L; L; L]; N [L; L; L; L; L]; N [L; L; L; L; L]; + N [L; L; L; L; L]; N [L; L; L; L; L]]; + N [N [L; L; L; L; L]; N [L; L; L; L; L]; N [L; L; L; L; L]; + N [L; L; L; L; L]; N [L; L; L; L; L]]; + N [N [L; L; L; L; L]; N [L; L; L; L; L]; N [L; L; L; L; L]; + N [L; L; L; L; L]; N [L; L; L; L; L]]; + N [N [L; L; L; L; L]; N [L; L; L; L; L]; N [L; L; L; L; L]; + N [L; L; L; L; L]; N [L; L; L; L; L]]; + N [N [L; L; L; L; L]; N [L; L; L; L; L]; N [L; L; L; L; L]; + N [L; L; L; L; L]; N [L; L; L; L; L]]]; + N [N [N [L; L; L; L; L]; N [L; L; L; L; L]; N [L; L; L; L; L]; + N [L; L; L; L; L]; N [L; L; L; L; L]]; + N [N [L; L; L; L; L]; N [L; L; L; L; L]; N [L; L; L; L; L]; + N [L; L; L; L; L]; N [L; L; L; L; L]]; + N [N [L; L; L; L; L]; N [L; L; L; L; L]; N [L; L; L; L; L]; + N [L; L; L; L; L]; N [L; L; L; L; L]]; + N [N [L; L; L; L; L]; N [L; L; L; L; L]; N [L; L; L; L; L]; + N [L; L; L; L; L]; N [L; L; L; L; L]]; + N [N [L; L; L; L; L]; N [L; L; L; L; L]; N [L; L; L; L; L]; + N [L; L; L; L; L]; N [L; L; L; L; L]]]; + N [N [N [L; L; L; L; L]; N [L; L; L; L; L]; N [L; L; L; L; L]; + N [L; L; L; L; L]; N [L; L; L; L; L]]; + N [N [L; L; L; L; L]; N [L; L; L; L; L]; N [L; L; L; L; L]; + N [L; L; L; L; L]; N [L; L; L; L; L]]; + N [N [L; L; L; L; L]; N [L; L; L; L; L]; N [L; L; L; L; L]; + N [L; L; L; L; L]; N [L; L; L; L; L]]; + N [N [L; L; L; L; L]; N [L; L; L; L; L]; N [L; L; L; L; L]; + N [L; L; L; L; L]; N [L; L; L; L; L]]; + N [N [L; L; L; L; L]; N [L; L; L; L; L]; N [L; L; L; L; L]; + N [L; L; L; L; L]; N [L; L; L; L; L]]]; + N [N [N [L; L; L; L; L]; N [L; L; L; L; L]; N [L; L; L; L; L]; + N [L; L; L; L; L]; N [L; L; L; L; L]]; + N [N [L; L; L; L; L]; N [L; L; L; L; L]; N [L; L; L; L; L]; + N [L; L; L; L; L]; N [L; L; L; L; L]]; + N [N [L; L; L; L; L]; N [L; L; L; L; L]; N [L; L; L; L; L]; + N [L; L; L; L; L]; N [L; L; L; L; L]]; + N [N [L; L; L; L; L]; N [L; L; L; L; L]; N [L; L; L; L; L]; + N [L; L; L; L; L]; N [L; L; L; L; L]]; + N [N [L; L; L; L; L]; N [L; L; L; L; L]; N [L; L; L; L; L]; + N [L; L; L; L; L]; N [L; L; L; L; L]]]]; + N [N [N [N [L; L; L; L; L]; N [L; L; L; L; L]; N [L; L; L; L; L]; + N [L; L; L; L; L]; N [L; L; L; L; L]]; + N [N [L; L; L; L; L]; N [L; L; L; L; L]; N [L; L; L; L; L]; + N [L; L; L; L; L]; N [L; L; L; L; L]]; + N [N [L; L; L; L; L]; N [L; L; L; L; L]; N [L; L; L; L; L]; + N [L; L; L; L; L]; N [L; L; L; L; L]]; + N [N [L; L; L; L; L]; N [L; L; L; L; L]; N [L; L; L; L; L]; + N [L; L; L; L; L]; N [L; L; L; L; L]]; + N [N [L; L; L; L; L]; N [L; L; L; L; L]; N [L; L; L; L; L]; + N [L; L; L; L; L]; N [L; L; L; L; L]]]; + N [N [N [L; L; L; L; L]; N [L; L; L; L; L]; N [L; L; L; L; L]; + N [L; L; L; L; L]; N [L; L; L; L; L]]; + N [N [L; L; L; L; L]; N [L; L; L; L; L]; N [L; L; L; L; L]; + N [L; L; L; L; L]; N ...; ...]; ...]; ...]; ...]; ...]; + ...]; ...] + +> [Building 6 8...done] +val tree_6_8: tree = + N [N [N [N [N [N [N [N [L; L; L; L; L; L]; N [L; L; L; L; L; L]; + N [L; L; L; L; L; L]; N [L; L; L; L; L; L]; + N [L; L; L; L; L; L]; N [L; L; L; L; L; L]]; + N [N [L; L; L; L; L; L]; N [L; L; L; L; L; L]; + N [L; L; L; L; L; L]; N [L; L; L; L; L; L]; + N [L; L; L; L; L; L]; N [L; L; L; L; L; L]]; + N [N [L; L; L; L; L; L]; N [L; L; L; L; L; L]; + N [L; L; L; L; L; L]; N [L; L; L; L; L; L]; + N [L; L; L; L; L; L]; N [L; L; L; L; L; L]]; + N [N [L; L; L; L; L; L]; N [L; L; L; L; L; L]; + N [L; L; L; L; L; L]; N [L; L; L; L; L; L]; + N [L; L; L; L; L; L]; N [L; L; L; L; L; L]]; + N [N [L; L; L; L; L; L]; N [L; L; L; L; L; L]; + N [L; L; L; L; L; L]; N [L; L; L; L; L; L]; + N [L; L; L; L; L; L]; N [L; L; L; L; L; L]]; + N [N [L; L; L; L; L; L]; N [L; L; L; L; L; L]; + N [L; L; L; L; L; L]; N [L; L; L; L; L; L]; + N [L; L; L; L; L; L]; N [L; L; L; L; L; L]]]; + N [N [N [L; L; L; L; L; L]; N [L; L; L; L; L; L]; + N [L; L; L; L; L; L]; N [L; L; L; L; L; L]; + N [L; L; L; L; L; L]; N [L; L; L; L; L; L]]; + N [N [L; L; L; L; L; L]; N [L; L; L; L; L; L]; + N [L; L; L; L; L; L]; N [L; L; L; L; L; L]; + N [L; L; L; L; L; L]; N [L; L; L; L; L; L]]; + N [N [L; L; L; L; L; L]; N [L; L; L; L; L; L]; + N [L; L; L; L; L; L]; N [L; L; L; L; L; L]; + N [L; L; L; L; L; L]; N [L; L; L; L; L; L]]; + N [N [L; L; L; L; L; L]; N [L; L; L; L; L; L]; + N [L; L; L; L; L; L]; N [L; L; L; L; L; L]; + N [L; L; L; L; L; L]; N [L; L; L; L; L; L]]; + N [N [L; L; L; L; L; L]; N [L; L; L; L; L; L]; + N [L; L; L; L; L; L]; N [L; L; L; L; L; L]; + N [L; L; L; L; L; L]; N [L; L; L; L; L; L]]; + N [N [L; L; L; L; L; L]; N [L; L; L; L; L; L]; + N [L; L; L; L; L; L]; N [L; L; L; L; L; L]; + N [L; L; L; L; L; L]; N [L; L; L; L; L; L]]]; + N [N [N [L; L; L; L; L; L]; N [L; L; L; L; L; L]; + N [L; L; L; L; L; L]; N [L; L; L; L; L; L]; + N [L; L; L; L; L; L]; N [L; L; L; L; L; L]]; + N [N [L; L; L; L; L; L]; N [L; L; L; L; L; L]; + N [L; L; L; L; L; L]; N [L; L; L; L; L; L]; + N [L; L; L; L; L; L]; N [L; L; L; L; L; L]]; + N [N [L; L; L; L; L; L]; N [L; L; L; L; L; L]; + N [L; L; L; L; L; L]; N [L; L; L; L; L; L]; + N [L; L; L; L; L; L]; N [L; L; L; L; L; L]]; + N [N [L; L; L; L; L; L]; N [L; L; L; L; L; L]; + N [L; L; L; L; L; L]; N [L; L; L; L; L; L]; + N [L; L; L; L; L; L]; N [L; L; L; L; L; L]]; + N [N [L; L; L; L; L; L]; N [L; L; L; L; L; L]; + N [L; L; L; L; L; L]; N [L; L; L; L; L; L]; + N [L; L; L; L; L; L]; N [L; L; L; L; L; L]]; + N [N [L; L; L; L; L; L]; N [L; L; L; L; L; L]; + N [L; L; L; L; L; L]; N [L; L; L; L; L; L]; + N [L; L; L; L; L; L]; N [L; L; L; L; L; L]]]; + N [N [N [L; L; L; L; L; L]; N [L; L; L; L; L; L]; + N [L; L; L; L; L; L]; N [L; L; L; L; L; L]; + N [L; L; L; L; L; L]; N [L; L; L; L; L; L]]; + N [N [L; L; L; L; L; L]; N [L; L; L; L; L; L]; + N [L; L; L; L; L; L]; N [L; L; L; L; L; L]; + N [L; L; L; L; L; L]; N [L; L; L; L; L; L]]; + N [N [L; L; L; L; L; L]; N [L; L; L; L; L; L]; + N [L; L; L; L; L; L]; N [L; L; L; L; L; L]; + N [L; L; L; L; L; L]; N [L; L; L; L; L; L]]; + N [N [L; L; L; L; L; L]; N [L; L; L; L; L; L]; + N [L; L; L; L; L; L]; N [L; L; L; L; L; L]; + N [L; L; L; L; L; L]; N [L; L; L; L; L; L]]; + N [N [L; L; L; L; L; L]; N [L; L; L; L; L; L]; + N [L; L; L; L; L; L]; N [L; L; L; L; L; L]; + N [L; L; L; L; L; L]; N [L; L; L; L; L; L]]; + N [N ...; ...]; ...]; ...]; ...]; ...]; ...]; ...] + +> [Building 5 3...done] +val tree_5_3: tree = + N [N [N [L; L; L; L; L]; N [L; L; L; L; L]; N [L; L; L; L; L]; + N [L; L; L; L; L]; N [L; L; L; L; L]]; + N [N [L; L; L; L; L]; N [L; L; L; L; L]; N [L; L; L; L; L]; + N [L; L; L; L; L]; N [L; L; L; L; L]]; + N [N [L; L; L; L; L]; N [L; L; L; L; L]; N [L; L; L; L; L]; + N [L; L; L; L; L]; N [L; L; L; L; L]]; + N [N [L; L; L; L; L]; N [L; L; L; L; L]; N [L; L; L; L; L]; + N [L; L; L; L; L]; N [L; L; L; L; L]]; + N [N [L; L; L; L; L]; N [L; L; L; L; L]; N [L; L; L; L; L]; + N [L; L; L; L; L]; N [L; L; L; L; L]]] + +> > type X = + | Var of int + | Bop of int * X * X +val generate: x: int -> X + +> val exps: X list = + [Bop (1, Var 0, Var 0); Var 2; + Bop (3, Bop (1, Var 0, Var 0), Bop (1, Var 0, Var 0)); Var 4; + Bop (5, Var 2, Bop (1, Var 0, Var 0)); Var 6; + Bop (7, Bop (3, Bop (1, Var 0, Var 0), Bop (1, Var 0, Var 0)), Var 2); + Var 8; + Bop (9, Var 4, Bop (3, Bop (1, Var 0, Var 0), Bop (1, Var 0, Var 0))); + Var 10; + Bop + (213, Var 106, + Bop + (71, + Bop + (35, Bop (17, Var 8, Bop (5, Var 2, Bop (1, Var 0, Var 0))), + Bop + (11, Bop (5, Var 2, Bop (1, Var 0, Var 0)), + Bop (3, Bop (1, Var 0, Var 0), Bop (1, Var 0, Var 0)))), + Bop + (23, + Bop + (11, Bop (5, Var 2, Bop (1, Var 0, Var 0)), + Bop (3, Bop (1, Var 0, Var 0), Bop (1, Var 0, Var 0))), + Bop + (7, Bop (3, Bop (1, Var 0, Var 0), Bop (1, Var 0, Var 0)), Var 2)))); + Var 21342314; Var 3214; Bop (1231357, Var 615678, Var 410452); + Bop + (5234547, Bop (2617273, Var 1308636, Var 872424), + Bop (1744849, Var 872424, Var 581616)); + Bop + (923759825, Var 461879912, Bop (307919941, Var 153959970, Var 102639980)); + Var 2435234; + Bop + (12396777, Var 6198388, + Bop + (4132259, + Bop + (2066129, Var 1033064, + Bop + (688709, Var 344354, + Bop + (229569, Var 114784, + Bop + (76523, + Bop + (38261, Var 19130, + Bop + (12753, Var 6376, + Bop + (4251, Bop (2125, Var 1062, Var 708), + Bop (1417, Var 708, Var 472)))), + Bop + (25507, + Bop + (12753, Var 6376, + Bop + (4251, Bop (2125, Var 1062, Var 708), + Bop (1417, Var 708, Var 472))), Var 8502))))), + Bop + (1377419, + Bop + (688709, Var 344354, + Bop + (229569, Var 114784, + Bop + (76523, + Bop + (38261, Var 19130, + Bop + (12753, Var 6376, + Bop + (4251, Bop (2125, Var 1062, Var 708), + Bop (1417, Var 708, Var 472)))), + Bop + (25507, + Bop + (12753, Var 6376, + Bop + (4251, Bop (2125, Var 1062, Var 708), + Bop (1417, Var 708, Var 472))), Var 8502)))), + Bop + (459139, + Bop + (229569, Var 114784, + Bop + (76523, + Bop + (38261, Var 19130, + Bop + (12753, Var 6376, + Bop + (4251, Bop (2125, Var 1062, Var 708), + Bop (1417, Var 708, Var 472)))), + Bop + (25507, + Bop + (12753, Var 6376, + Bop + (4251, Bop (2125, Var 1062, Var 708), + Bop (1417, Var 708, Var 472))), Var 8502))), + Var 153046)))); + Bop + (3333333, Var 1666666, + Bop + (1111111, + Bop + (555555, Bop (277777, Var 138888, Var 92592), + Bop (185185, Var 92592, Var 61728)), Var 370370)); + Bop + (1312311237, Var 656155618, + Bop + (437437079, + Bop + (218718539, + Bop + (109359269, Var 54679634, + Bop + (36453089, Var 18226544, + Bop + (12151029, Var 6075514, + Bop + (4050343, + Bop + (2025171, Bop (1012585, Var 506292, Var 337528), + Bop + (675057, Var 337528, + Bop + (225019, + Bop + (112509, Var 56254, + Bop + (37503, + Bop + (18751, + Bop + (9375, + Bop + (4687, + Bop + (2343, + Bop + (1171, + Bop + (585, Var 292, + Bop + (195, + Bop + (97, Var 48, + Var 32), + Bop + (65, Var 32, + Bop + (21, Var 10, + Bop + (7, + Bop + (3, + Bop + (1, + Var + 0, + Var + 0), + Bop + (1, + Var + 0, + Var + 0)), + Var 2))))), + Var 390), + Bop (781, Var 390, Var 260)), + Var 1562), + Bop + (3125, Var 1562, + Bop + (1041, Var 520, + Bop + (347, + Bop + (173, Var 86, + Bop + (57, Var 28, + Bop + (19, + Bop + (9, Var 4, + Bop + (3, + Bop + (1, + Var 0, + Var 0), + Bop + (1, + Var 0, + Var 0))), + Var 6))), + Bop + (115, + Bop + (57, Var 28, + Bop + (19, + Bop + (9, Var 4, + Bop + (3, + Bop + (1, + Var 0, + Var 0), + Bop + (1, + Var 0, + Var 0))), + Var 6)), Var 38))))), + Var 6250), + Bop + (12501, Var 6250, + Bop + (4167, + Bop + (2083, + Bop + (1041, Var 520, + Bop + (347, + Bop + (173, Var 86, + Bop + (57, Var 28, + Bop + (19, + Bop + (9, Var 4, + Bop + (3, + Bop + (1, + Var 0, + Var 0), + Bop + (1, + Var 0, + Var 0))), + Var 6))), + Bop + (115, + Bop + (57, Var 28, + Bop + (19, + Bop + (9, Var 4, + Bop + (3, + Bop + (1, + Var 0, + Var 0), + Bop + (1, + Var 0, + Var 0))), + Var 6)), Var 38))), + Var 694), + Bop + (1389, Var 694, + Bop + (463, + Bop + (231, + Bop + (115, + Bop + (57, Var 28, + Bop + (19, + Bop + (9, Var 4, + Bop + (3, + Bop + (1, + Var 0, + Var 0), + Bop + (1, + Var 0, + Var 0))), + Var 6)), Var 38), + Bop + (77, Var 38, + Bop + (25, Var 12, Var 8))), + Var 154)))))), Var 75006))), + Var 1350114)))), + Bop + (72906179, + Bop + (36453089, Var 18226544, + Bop + (12151029, Var 6075514, + Bop + (4050343, + Bop + (2025171, Bop (1012585, Var 506292, Var 337528), + Bop + (675057, Var 337528, + Bop + (225019, + Bop + (112509, Var 56254, + Bop + (37503, + Bop + (18751, + Bop + (9375, + Bop + (4687, + Bop + (2343, + Bop + (1171, + Bop + (585, Var 292, + Bop + (195, + Bop + (97, Var 48, + Var 32), + Bop + (65, Var 32, + Bop + (21, Var 10, + Bop + (7, + Bop + (3, + Bop + (1, + Var + 0, + Var + 0), + Bop + (1, + Var + 0, + Var + 0)), + Var 2))))), + Var 390), + Bop (781, Var 390, Var 260)), + Var 1562), + Bop + (3125, Var 1562, + Bop + (1041, Var 520, + Bop + (347, + Bop + (173, Var 86, + Bop + (57, Var 28, + Bop + (19, + Bop + (9, Var 4, + Bop + (3, + Bop + (1, + Var 0, + Var 0), + Bop + (1, + Var 0, + Var 0))), + Var 6))), + Bop + (115, + Bop + (57, Var 28, + Bop + (19, + Bop + (9, Var 4, + Bop + (3, + Bop + (1, + Var 0, + Var 0), + Bop + (1, + Var 0, + Var 0))), + Var 6)), Var 38))))), + Var 6250), + Bop + (12501, Var 6250, + Bop + (4167, + Bop + (2083, + Bop + (1041, Var 520, + Bop + (347, + Bop + (173, Var 86, + Bop + (57, Var 28, + Bop + (19, + Bop + (9, Var 4, + Bop + (3, + Bop + (1, + Var 0, + Var 0), + Bop + (1, + Var 0, + Var 0))), + Var 6))), + Bop + (115, + Bop + (57, Var 28, + Bop + (19, + Bop + (9, Var 4, + Bop + (3, + Bop + (1, + Var 0, + Var 0), + Bop + (1, + Var 0, + Var 0))), + Var 6)), Var 38))), + Var 694), + Bop + (1389, Var 694, + Bop + (463, + Bop + (231, + Bop + (115, + Bop + (57, Var 28, + Bop + (19, + Bop + (9, Var 4, + Bop + (3, + Bop + (1, + Var 0, + Var 0), + Bop + (1, + Var 0, + Var 0))), + Var 6)), Var 38), + Bop + (77, Var 38, + Bop + (25, Var 12, Var 8))), + Var 154)))))), Var 75006))), + Var 1350114))), + Bop (24302059, Bop (12151029, ..., ...), ...))), ...)); ...] + +> module Exprs = + val x1: X = + Bop + (213, Var 106, + Bop + (71, + Bop + (35, Bop (17, Var 8, Bop (5, Var 2, Bop (1, Var 0, Var 0))), + Bop + (11, Bop (5, Var 2, Bop (1, Var 0, Var 0)), + Bop (3, Bop (1, Var 0, Var 0), Bop (1, Var 0, Var 0)))), + Bop + (23, + Bop + (11, Bop (5, Var 2, Bop (1, Var 0, Var 0)), + Bop (3, Bop (1, Var 0, Var 0), Bop (1, Var 0, Var 0))), + Bop + (7, Bop (3, Bop (1, Var 0, Var 0), Bop (1, Var 0, Var 0)), + Var 2)))) + val x2: X = Var 21342314 + val x3: X = Var 3214 + val x4: X = Bop (1231357, Var 615678, Var 410452) + val x5: X = + Bop + (5234547, Bop (2617273, Var 1308636, Var 872424), + Bop (1744849, Var 872424, Var 581616)) + val x6: X = + Bop + (923759825, Var 461879912, Bop (307919941, Var 153959970, Var 102639980)) + val x7: X = Var 2435234 + val x8: X = + Bop + (12396777, Var 6198388, + Bop + (4132259, + Bop + (2066129, Var 1033064, + Bop + (688709, Var 344354, + Bop + (229569, Var 114784, + Bop + (76523, + Bop + (38261, Var 19130, + Bop + (12753, Var 6376, + Bop + (4251, Bop (2125, Var 1062, Var 708), + Bop (1417, Var 708, Var 472)))), + Bop + (25507, + Bop + (12753, Var 6376, + Bop + (4251, Bop (2125, Var 1062, Var 708), + Bop (1417, Var 708, Var 472))), Var 8502))))), + Bop + (1377419, + Bop + (688709, Var 344354, + Bop + (229569, Var 114784, + Bop + (76523, + Bop + (38261, Var 19130, + Bop + (12753, Var 6376, + Bop + (4251, Bop (2125, Var 1062, Var 708), + Bop (1417, Var 708, Var 472)))), + Bop + (25507, + Bop + (12753, Var 6376, + Bop + (4251, Bop (2125, Var 1062, Var 708), + Bop (1417, Var 708, Var 472))), Var 8502)))), + Bop + (459139, + Bop + (229569, Var 114784, + Bop + (76523, + Bop + (38261, Var 19130, + Bop + (12753, Var 6376, + Bop + (4251, Bop (2125, Var 1062, Var 708), + Bop (1417, Var 708, Var 472)))), + Bop + (25507, + Bop + (12753, Var 6376, + Bop + (4251, Bop (2125, Var 1062, Var 708), + Bop (1417, Var 708, Var 472))), Var 8502))), + Var 153046)))) + val x9: X = + Bop + (3333333, Var 1666666, + Bop + (1111111, + Bop + (555555, Bop (277777, Var 138888, Var 92592), + Bop (185185, Var 92592, Var 61728)), Var 370370)) + val x10: X = + Bop + (1312311237, Var 656155618, + Bop + (437437079, + Bop + (218718539, + Bop + (109359269, Var 54679634, + Bop + (36453089, Var 18226544, + Bop + (12151029, Var 6075514, + Bop + (4050343, + Bop + (2025171, Bop (1012585, Var 506292, Var 337528), + Bop + (675057, Var 337528, + Bop + (225019, + Bop + (112509, Var 56254, + Bop + (37503, + Bop + (18751, + Bop + (9375, + Bop + (4687, + Bop + (2343, + Bop + (1171, + Bop + (585, Var 292, + Bop + (195, + Bop + (97, Var 48, + Var 32), + Bop + (65, Var 32, + Bop + (21, Var 10, + Bop + (7, + Bop + (3, + Bop + (1, + Var + 0, + Var + 0), + Bop + (1, + Var + 0, + Var + 0)), + Var 2))))), + Var 390), + Bop + (781, Var 390, Var 260)), + Var 1562), + Bop + (3125, Var 1562, + Bop + (1041, Var 520, + Bop + (347, + Bop + (173, Var 86, + Bop + (57, Var 28, + Bop + (19, + Bop + (9, Var 4, + Bop + (3, + Bop + (1, + Var 0, + Var 0), + Bop + (1, + Var 0, + Var 0))), + Var 6))), + Bop + (115, + Bop + (57, Var 28, + Bop + (19, + Bop + (9, Var 4, + Bop + (3, + Bop + (1, + Var 0, + Var 0), + Bop + (1, + Var 0, + Var 0))), + Var 6)), + Var 38))))), + Var 6250), + Bop + (12501, Var 6250, + Bop + (4167, + Bop + (2083, + Bop + (1041, Var 520, + Bop + (347, + Bop + (173, Var 86, + Bop + (57, Var 28, + Bop + (19, + Bop + (9, Var 4, + Bop + (3, + Bop + (1, + Var 0, + Var 0), + Bop + (1, + Var 0, + Var 0))), + Var 6))), + Bop + (115, + Bop + (57, Var 28, + Bop + (19, + Bop + (9, Var 4, + Bop + (3, + Bop + (1, + Var 0, + Var 0), + Bop + (1, + Var 0, + Var 0))), + Var 6)), + Var 38))), Var 694), + Bop + (1389, Var 694, + Bop + (463, + Bop + (231, + Bop + (115, + Bop + (57, Var 28, + Bop + (19, + Bop + (9, Var 4, + Bop + (3, + Bop + (1, + Var 0, + Var 0), + Bop + (1, + Var 0, + Var 0))), + Var 6)), + Var 38), + Bop + (77, Var 38, + Bop + (25, Var 12, Var 8))), + Var 154)))))), Var 75006))), + Var 1350114)))), + Bop + (72906179, + Bop + (36453089, Var 18226544, + Bop + (12151029, Var 6075514, + Bop + (4050343, + Bop + (2025171, Bop (1012585, Var 506292, Var 337528), + Bop + (675057, Var 337528, + Bop + (225019, + Bop + (112509, Var 56254, + Bop + (37503, + Bop + (18751, + Bop + (9375, + Bop + (4687, + Bop + (2343, + Bop + (1171, + Bop + (585, Var 292, + Bop + (195, + Bop + (97, Var 48, + Var 32), + Bop + (65, Var 32, + Bop + (21, Var 10, + Bop + (7, + Bop + (3, + Bop + (1, + Var + 0, + Var + 0), + Bop + (1, + Var + 0, + Var + 0)), + Var 2))))), + Var 390), + Bop + (781, Var 390, Var 260)), + Var 1562), + Bop + (3125, Var 1562, + Bop + (1041, Var 520, + Bop + (347, + Bop + (173, Var 86, + Bop + (57, Var 28, + Bop + (19, + Bop + (9, Var 4, + Bop + (3, + Bop + (1, + Var 0, + Var 0), + Bop + (1, + Var 0, + Var 0))), + Var 6))), + Bop + (115, + Bop + (57, Var 28, + Bop + (19, + Bop + (9, Var 4, + Bop + (3, + Bop + (1, + Var 0, + Var 0), + Bop + (1, + Var 0, + Var 0))), + Var 6)), + Var 38))))), + Var 6250), + Bop + (12501, Var 6250, + Bop + (4167, + Bop + (2083, + Bop + (1041, Var 520, + Bop + (347, + Bop + (173, Var 86, + Bop + (57, Var 28, + Bop + (19, + Bop + (9, Var 4, + Bop + (3, + Bop + (1, + Var 0, + Var 0), + Bop + (1, + Var 0, + Var 0))), + Var 6))), + Bop + (115, + Bop + (57, Var 28, + Bop + (19, + Bop + (9, Var 4, + Bop + (3, + Bop + (1, + Var 0, + Var 0), + Bop + (1, + Var 0, + Var 0))), + Var 6)), + Var 38))), Var 694), + Bop + (1389, Var 694, + Bop + (463, + Bop + (231, + Bop + (115, + Bop + (57, Var 28, + Bop + (19, + Bop + (9, Var 4, + Bop + (3, + Bop + (1, + Var 0, + Var 0), + Bop + (1, + Var 0, + Var 0))), + Var 6)), + Var 38), + Bop + (77, Var 38, + Bop + (25, Var 12, Var 8))), + Var 154)))))), Var 75006))), + Var 1350114))), + Bop + (24302059, + Bop + (12151029, Var 6075514, + Bop + (4050343, + Bop + (2025171, Bop (1012585, Var 506292, Var 337528), + Bop + (675057, Var 337528, + Bop + (225019, + Bop + (112509, Var 56254, + Bop + (37503, + Bop + (18751, + Bop + (9375, + Bop + (4687, + Bop + (2343, + Bop + (1171, + Bop + (585, Var 292, + Bop + (195, + Bop + (97, Var 48, + Var 32), + Bop + (65, Var 32, + Bop + (21, Var 10, + Bop + (7, + Bop + (3, + Bop + (1, + Var + 0, + Var + 0), + Bop + (1, + Var + 0, + Var + 0)), + Var 2))))), + Var 390), + Bop + (781, Var 390, Var 260)), + Var 1562), + Bop + (3125, Var 1562, + Bop + (1041, Var 520, + Bop + (347, + Bop + (173, Var 86, + Bop + (57, Var 28, + Bop + (19, + Bop + (9, Var 4, + Bop + (3, + Bop + (1, + Var 0, + Var 0), + Bop + (1, + Var 0, + Var 0))), + Var 6))), + Bop + (115, + Bop + (57, Var 28, + Bop + (19, + Bop + (9, Var 4, + Bop + (3, + Bop + (1, + Var 0, + Var 0), + Bop + (1, + Var 0, + Var 0))), + Var 6)), + Var 38))))), + Var 6250), + Bop + (12501, Var 6250, + Bop + (4167, + Bop + (2083, + Bop + (1041, Var 520, + Bop + (347, + Bop + (173, Var 86, + Bop + (57, Var 28, + Bop + (19, + Bop + (9, Var 4, + Bop + (3, + Bop + (1, + Var 0, + Var 0), + Bop + (1, + Var 0, + Var 0))), + Var 6))), + Bop + (115, + Bop + (57, Var 28, + Bop + (19, + Bop + (9, Var 4, + Bop + (3, + Bop + (1, + Var 0, + Var 0), + Bop + (1, + Var 0, + Var 0))), + Var 6)), + Var 38))), Var 694), + Bop + (1389, Var 694, + Bop + (463, + Bop + (231, + Bop + (115, + Bop + (57, Var 28, + Bop + (19, + Bop + (9, Var 4, + Bop + (3, + Bop + (1, + Var 0, + Var 0), + Bop + (1, + Var 0, + Var 0))), + Var 6)), + Var 38), + Bop + (77, Var 38, + Bop + (25, Var 12, Var 8))), + Var 154)))))), Var 75006))), + Var 1350114)), Var 8100686))), + Bop + (145812359, + Bop + (72906179, + Bop + (36453089, Var 18226544, + Bop + (12151029, Var 6075514, + Bop + (4050343, + Bop + (2025171, Bop (1012585, Var 506292, Var 337528), + Bop + (675057, Var 337528, + Bop + (225019, + Bop + (112509, Var 56254, + Bop + (37503, + Bop + (18751, + Bop + (9375, + Bop + (4687, + Bop + (2343, + Bop + (1171, + Bop + (585, Var 292, + Bop + (195, + Bop + (97, Var 48, + Var 32), + Bop + (65, Var 32, + Bop + (21, Var 10, + Bop + (7, + Bop + (3, + Bop + (1, + Var + 0, + Var + 0), + Bop + (1, + Var + 0, + Var + 0)), + Var 2))))), + Var 390), + Bop + (781, Var 390, Var 260)), + Var 1562), + Bop + (3125, Var 1562, + Bop + (1041, Var 520, + Bop + (347, + Bop + (173, Var 86, + Bop + (57, Var 28, + Bop + (19, + Bop + (9, Var 4, + ...), ...))), + ...)))), ...), ...)), + ...))), ...))), ...), ...))) + val x11: X = + Bop + (2147483647, + Bop + (1073741823, + Bop + (536870911, + Bop + (268435455, + Bop + (134217727, + Bop + (67108863, + Bop + (33554431, + Bop + (16777215, + Bop + (8388607, + Bop + (4194303, + Bop + (2097151, + Bop + (1048575, + Bop + (524287, + Bop + (262143, + Bop + (131071, + Bop + (65535, + Bop + (32767, + Bop + (16383, + Bop + (8191, + Bop + (4095, + Bop + (2047, + Bop + (1023, + Bop + (511, + Bop + (255, + Bop + (127, + Bop + (63, + Bop + (31, + Bop + (15, + Bop + (7, + Bop + (3, + Bop + (1, + Var + 0, + Var + 0), + Bop + (1, + Var + 0, + Var + 0)), + Var + 2), + Bop + (5, + Var + 2, + Bop + (1, + Var + 0, + Var + 0))), + Var + 10), + Bop + (21, + Var + 10, + Bop + (7, + Bop + (3, + Bop + (1, + Var + 0, + Var + 0), + Bop + (1, + Var + 0, + Var + 0)), + Var + 2))), + Var + 42), + Bop + (85, + Var + 42, + Var + 28)), + Var + 170), + Bop + (341, + Var + 170, + Bop + (113, + Var + 56, + Bop + (37, + Var + 18, + Var + 12)))), + Var 682), + Bop + (1365, + Var 682, + Bop + (455, + Bop + (227, + Bop + (113, + Var + 56, + Bop + (37, + Var + 18, + Var + 12)), + Bop + (75, + Bop + (37, + Var + 18, + Var + 12), + Bop + (25, + Var + 12, + Var + 8))), + Bop + (151, + Bop + (75, + Bop + (37, + Var + 18, + Var + 12), + Bop + (25, + Var + 12, + Var + 8)), + Var + 50)))), + Var 2730), + Bop + (5461, Var 2730, + Var 1820)), + Var 10922), + Bop + (21845, Var 10922, + Bop + (7281, Var 3640, + Bop + (2427, + Bop + (1213, Var 606, + Var 404), + Bop + (809, Var 404, + Bop + (269, + Var 134, + Bop + (89, + Var 44, + Bop + (29, + Var + 14, + Bop + (9, + Var + 4, + Bop + (3, + Bop + (1, + Var + 0, + Var + 0), + Bop + (1, + Var + 0, + Var + 0))))))))))), + Var 43690), + Bop + (87381, Var 43690, + Bop + (29127, + Bop + (14563, + Bop + (7281, Var 3640, + Bop + (2427, + Bop + (1213, Var 606, + Var 404), + Bop + (809, Var 404, + Bop + (269, + Var 134, + Bop + (89, + Var 44, + Bop + (29, + Var + 14, + Bop + (9, + Var + 4, + Bop + (3, + Bop + (1, + Var + 0, + Var + 0), + Bop + (1, + Var + 0, + Var + 0))))))))), + Var 4854), + Bop + (9709, Var 4854, + Var 3236)))), + Var 174762), + Bop (349525, Var 174762, Var 116508)), + Var 699050), + Bop + (1398101, Var 699050, + Bop (466033, Var 233016, Var 155344))), + Var 2796202), + Bop + (5592405, Var 2796202, + Bop + (1864135, + Bop + (932067, + Bop (466033, Var 233016, Var 155344), + Bop + (310689, Var 155344, + Bop + (103563, + Bop (51781, Var 25890, Var 17260), + Bop + (34521, Var 17260, + Bop + (11507, + Bop + (5753, Var 2876, + Bop + (1917, Var 958, + Bop + (639, + Bop + (319, + Bop + (159, + Bop + (79, + Bop + (39, + Bop + (19, + Bop + (9, + Var + 4, + Bop + (3, + Bop + (1, + Var + 0, + Var + 0), + Bop + (1, + Var + 0, + Var + 0))), + Var 6), + Bop + (13, + Var 6, + Var 4)), + Var 26), + Bop + (53, Var 26, + Bop + (17, + Var 8, + Bop + (5, + Var 2, + Bop + (1, + Var + 0, + Var + 0))))), + Var 106), + Bop + (213, Var 106, + Bop + (71, + Bop + (35, + Bop + (17, + Var 8, + Bop + (5, + Var 2, + Bop + (1, + Var + 0, + Var + 0))), + Bop + (11, + Bop + (5, + Var 2, + Bop + (1, + Var + 0, + Var + 0)), + Bop + (3, + Bop + (1, + Var + 0, + Var + 0), + Bop + (1, + Var + 0, + Var + 0)))), + Bop + (23, + Bop + (11, + Bop + (5, + Var 2, + Bop + (1, + Var + 0, + Var + 0)), + Bop + (3, + Bop + (1, + Var + 0, + Var + 0), + Bop + (1, + Var + 0, + Var + 0))), + Bop + (7, + Bop + (3, + Bop + (1, + Var + 0, + Var + 0), + Bop + (1, + Var + 0, + Var + 0)), + Var 2))))))), + Bop + (3835, + Bop + (1917, Var 958, + Bop + (639, + Bop + (319, + Bop + (159, + Bop + (79, + Bop + (39, + Bop + (19, + Bop + (9, + Var + 4, + Bop + (3, + Bop + (1, + Var + 0, + Var + 0), + Bop + (1, + Var + 0, + Var + 0))), + Var 6), + Bop + (13, + Var 6, + Var 4)), + Var 26), + Bop + (53, Var 26, + Bop + (17, + Var 8, + Bop + (5, + Var 2, + Bop + (1, + Var + 0, + Var + 0))))), + Var 106), + Bop + (213, Var 106, + Bop + (71, + Bop + (35, + Bop + (17, + Var 8, + Bop + (5, + Var 2, + Bop + (1, + Var + 0, + Var + 0))), + Bop + (11, + Bop + (5, + Var 2, + Bop + (1, + Var + 0, + Var + 0)), + Bop + (3, + Bop + (1, + Var + 0, + Var + 0), + Bop + (1, + Var + 0, + Var + 0)))), + Bop + (23, + Bop + (11, + Bop + (5, + Var 2, + Bop + (1, + Var + 0, + Var + 0)), + Bop + (3, + Bop + (1, + Var + 0, + Var + 0), + Bop + (1, + Var + 0, + Var + 0))), + Bop + (7, + Bop + (3, + Bop + (1, + Var + 0, + Var + 0), + Bop + (1, + Var + 0, + Var + 0)), + Var 2)))))), + Var 1278)))))), Var 621378))), + Var 11184810), + Bop (22369621, Var 11184810, Var 7456540)), Var 44739242), + Bop + (89478485, Var 44739242, + Bop + (29826161, Var 14913080, + Bop + (9942053, Var 4971026, + Bop (3314017, Var 1657008, Var 1104672))))), + Var 178956970), + Bop + (357913941, Var 178956970, + Bop + (119304647, + Bop + (59652323, + Bop + (29826161, Var 14913080, + Bop + (9942053, Var 4971026, + Bop (3314017, Var 1657008, Var 1104672))), + Bop + (19884107, + Bop + (9942053, Var 4971026, + Bop (3314017, Var 1657008, Var 1104672)), + Bop + (6628035, Bop (3314017, Var 1657008, Var 1104672), + Bop (2209345, Var 1104672, Var 736448)))), + Bop + (39768215, + Bop + (19884107, + Bop + (9942053, Var 4971026, + Bop (3314017, Var 1657008, Var 1104672)), + Bop + (6628035, Bop (3314017, Var 1657008, Var 1104672), + Bop (2209345, Var 1104672, Var 736448))), + Bop + (13256071, + Bop + (6628035, Bop (3314017, Var 1657008, Var 1104672), + Bop (2209345, Var 1104672, Var 736448)), Var 4418690))))), + Var 715827882) + +> type C = + new: x: string -> C + override ToString: unit -> string +val c1: C = +val csA: C[] = + [|; ; + ; ; + ; ; + ; ; + ; ; + ; ; + ; ; + ; ; + ; ; + ; ; + ; ; + ; ; + ; ; + ; ; + ; ; + ; ; + ; ; + ; ; + ; ; + ; ; + ; ; + ; ; + ; ; + ; ; + ; ; + ; ; + ; ; + ; ; + ; ; + ; ; + ; ; + ; ; + ; ; + ; ; + ; ; + ; ; + ; ; + ; ; + ; ; + ; ; + ; ; + ; ; + ; ; + ; ; + ; ; + ; ; + ; ; + ; ; + ; ; + ; ; ...|] +val csB: C[] = + [|; ; + ; ; + ; ; + ; ; + ; ; + ; ; + ; ; + ; ; + ; ; + ; ; + ; ; + ; ; + ; ; + ; ; + ; ; + ; ; + ; ; + ; ; + ; ; + ; ; + ; ; + ; ; + ; ; + ; ; + ; ; + ; ; + ; ; + ; ; + ; ; + ; ; + ; ; + ; ; + ; ; + ; ; + ; ; + ; ; + ; ; + ; ; + ; ; + ; ; + ; ; + ; ; + ; ; + ; ; + ; ; + ; ; + ; ; + ; ; + ; ; + ; ; ...|] +val csC: C[] = + [|; ; + ; ; + ; ; + ; ; + ; ; + ; ; + ; ; + ; ; + ; ; + ; ; + ; ; + ; ; + ; ; + ; ; + ; ; + ; ; + ; ; + ; ; + ; ; + ; ; + ; ; + ; ; + ; ; + ; ; + ; ; + ; ; + ; ; + ; ; + ; ; + ; ; + ; ; + ; ; + ; ; + ; ; + ; ; + ; ; + ; ; + ; ; + ; ; + ; ; + ; ; + ; ; + ; ; + ; ; + ; ; + ; ; + ; ; + ; ; + ; ; + ; ; ...|] + +> exception Abc + +> exception AbcInt of int + +> exception AbcString of string + +> exception AbcExn of exn list + +> exception AbcException of System.Exception list + +> val exA1: exn = Abc +val exA2: exn = AbcInt 2 +val exA3: exn = AbcString "3" +val exA4: exn = AbcExn [Abc; AbcInt 2; AbcString "3"] +val exA5: exn = AbcException [AbcExn [Abc; AbcInt 2; AbcString "3"]] +exception Ex0 +exception ExUnit of unit +exception ExUnits of unit * unit +exception ExUnitOption of unit option +val ex0: exn = Ex0 +val exU: exn = ExUnit () +val exUs: exn = ExUnits ((), ()) +val exUSome: exn = ExUnitOption (Some ()) +val exUNone: exn = ExUnitOption None +type 'a T4063 = | AT4063 of 'a + +> val valAT3063_12: int T4063 = AT4063 12 + +> val valAT3063_True: bool T4063 = AT4063 true + +> val valAT3063_text: string T4063 = AT4063 "text" + +> val valAT3063_null: System.Object T4063 = AT4063 null + +> type M4063<'a> = + new: x: 'a -> M4063<'a> + +> val v4063: M4063 + +> type Taaaaa<'a> = + new: unit -> Taaaaa<'a> + +> type Taaaaa2<'a> = + inherit Taaaaa<'a> + new: unit -> Taaaaa2<'a> + member M: unit -> Taaaaa2<'a> + +> type Tbbbbb<'a> = + new: x: 'a -> Tbbbbb<'a> + member M: unit -> 'a + +> type Tbbbbb2 = + inherit Tbbbbb + new: x: string -> Tbbbbb2 + +> val it: (unit -> string) = + +> module RepeatedModule = + val repeatedByteLiteral: byte[] = [|12uy; 13uy; 14uy|] + +> module RepeatedModule = + val repeatedByteLiteral: byte[] = [|12uy; 13uy; 14uy|] + +> val it: string = "Check #help" + +> + F# Interactive directives: + + #r "file.dll";; // Reference (dynamically load) the given DLL + #i "package source uri";; // Include package source uri when searching for packages + #I "path";; // Add the given search path for referenced DLLs + #load "file.fs" ...;; // Load the given file(s) as if compiled and referenced + #time ["on"|"off"];; // Toggle timing on/off + #help;; // Display help + #r "nuget:FSharp.Data, 3.1.2";; // Load Nuget Package 'FSharp.Data' version '3.1.2' + #r "nuget:FSharp.Data";; // Load Nuget Package 'FSharp.Data' with the highest version + #quit;; // Exit + + F# Interactive command line options: + + + +> val it: string = "Check #time on and then off" + +> +--> Timing now on + +> +--> Timing now off + +> val it: string = "Check #unknown command" + +> val it: string = + "Check #I with a known directory (to avoid a warning, which includes the location of this file, which is fragile...)" + +> +--> Added '/' to library include path + +> type internal T1 = + | A + | B + +> type internal T2 = + { x: int } + +> type internal T3 + +> type internal T4 = + new: unit -> T4 + +> type T1 = + internal | A + | B + +> type T2 = + internal { x: int } + +> type private T1 = + | A + | B + +> type private T2 = + { x: int } + +> type T1 = + private | A + | B + +> type T2 = + private { x: int } + +> type internal T1 = + private | A + | B + +> type internal T2 = + private { x: int } + +> type private T3 + +> type private T4 = + new: unit -> T4 + +> exception X1 of int + +> exception private X2 of int + +> exception internal X3 of int + +> type T0 = + new: unit -> T0 +type T1Post<'a> = + new: unit -> T1Post<'a> +type 'a T1Pre = + new: unit -> 'a T1Pre + +> type T0 with + member M: unit -> T0 list +type T0 with + member P: T0 * T0 +type T0 with + member E: IEvent + +> type T1Post<'a> with + member M: unit -> T1Post<'a> list +type T1Post<'a> with + member P: T1Post<'a> * T1Post<'a> +type T1Post<'a> with + member E: IEvent + +> type 'a T1Pre with + member M: unit -> 'a T1Pre list +type 'a T1Pre with + member P: 'a T1Pre * 'a T1Pre +type 'a T1Pre with + member E: IEvent + +> type T1Post<'a> with + member M: unit -> T1Post<'a> list +type T1Post<'a> with + member P: T1Post<'a> * T1Post<'a> +type T1Post<'a> with + member E: IEvent + +> type 'a T1Pre with + member M: unit -> 'a T1Pre list +type 'a T1Pre with + member P: 'a T1Pre * 'a T1Pre +type 'a T1Pre with + member E: IEvent + +> type r = + { + f0: int + f1: int + f2: int + f3: int + f4: int + f5: int + f6: int + f7: int + f8: int + f9: int + } +val r10: r = { f0 = 0 + f1 = 1 + f2 = 2 + f3 = 3 + f4 = 4 + f5 = 5 + f6 = 6 + f7 = 7 + f8 = 8 + f9 = 9 } +val r10s: r[] = + [|{ f0 = 0 + f1 = 1 + f2 = 2 + f3 = 3 + f4 = 4 + f5 = 5 + f6 = 6 + f7 = 7 + f8 = 8 + f9 = 9 }; { f0 = 0 + f1 = 1 + f2 = 2 + f3 = 3 + f4 = 4 + f5 = 5 + f6 = 6 + f7 = 7 + f8 = 8 + f9 = 9 }; { f0 = 0 + f1 = 1 + f2 = 2 + f3 = 3 + f4 = 4 + f5 = 5 + f6 = 6 + f7 = 7 + f8 = 8 + f9 = 9 }; { f0 = 0 + f1 = 1 + f2 = 2 + f3 = 3 + f4 = 4 + f5 = 5 + f6 = 6 + f7 = 7 + f8 = 8 + f9 = 9 }; { f0 = 0 + f1 = 1 + f2 = 2 + f3 = 3 + f4 = 4 + f5 = 5 + f6 = 6 + f7 = 7 + f8 = 8 + f9 = 9 }; { f0 = 0 + f1 = 1 + f2 = 2 + f3 = 3 + f4 = 4 + f5 = 5 + f6 = 6 + f7 = 7 + f8 = 8 + f9 = 9 }; + { f0 = 0 + f1 = 1 + f2 = 2 + f3 = 3 + f4 = 4 + f5 = 5 + f6 = 6 + f7 = 7 + f8 = 8 + f9 = 9 }; { f0 = 0 + f1 = 1 + f2 = 2 + f3 = 3 + f4 = 4 + f5 = 5 + f6 = 6 + f7 = 7 + f8 = 8 + f9 = 9 }; { f0 = 0 + f1 = 1 + f2 = 2 + f3 = 3 + f4 = 4 + f5 = 5 + f6 = 6 + f7 = 7 + f8 = 8 + f9 = 9 }; { f0 = 0 + f1 = 1 + f2 = 2 + f3 = 3 + f4 = 4 + f5 = 5 + f6 = 6 + f7 = 7 + f8 = 8 + f9 = 9 }; { f0 = 0 + f1 = 1 + f2 = 2 + f3 = 3 + f4 = 4 + f5 = 5 + f6 = 6 + f7 = 7 + f8 = 8 + f9 = 9 }; { f0 = 0 + f1 = 1 + f2 = 2 + f3 = 3 + f4 = 4 + f5 = 5 + f6 = 6 + f7 = 7 + f8 = 8 + f9 = 9 }; + { f0 = 0 + f1 = 1 + f2 = 2 + f3 = 3 + f4 = 4 + f5 = 5 + f6 = 6 + f7 = 7 + f8 = 8 + f9 = 9 }; { f0 = 0 + f1 = 1 + f2 = 2 + f3 = 3 + f4 = 4 + f5 = 5 + f6 = 6 + f7 = 7 + f8 = 8 + f9 = 9 }; { f0 = 0 + f1 = 1 + f2 = 2 + f3 = 3 + f4 = 4 + f5 = 5 + f6 = 6 + f7 = 7 + f8 = 8 + f9 = 9 }; { f0 = 0 + f1 = 1 + f2 = 2 + f3 = 3 + f4 = 4 + f5 = 5 + f6 = 6 + f7 = 7 + f8 = 8 + f9 = 9 }; { f0 = 0 + f1 = 1 + f2 = 2 + f3 = 3 + f4 = 4 + f5 = 5 + f6 = 6 + f7 = 7 + f8 = 8 + f9 = 9 }; { f0 = 0 + f1 = 1 + f2 = 2 + f3 = 3 + f4 = 4 + f5 = 5 + f6 = 6 + f7 = 7 + f8 = 8 + f9 = 9 }; + { f0 = 0 + f1 = 1 + f2 = 2 + f3 = 3 + f4 = 4 + f5 = 5 + f6 = 6 + f7 = 7 + f8 = 8 + f9 = 9 }; { f0 = 0 + f1 = 1 + f2 = 2 + f3 = 3 + f4 = 4 + f5 = 5 + f6 = 6 + f7 = 7 + f8 = 8 + f9 = 9 }; { f0 = 0 + f1 = 1 + f2 = 2 + f3 = 3 + f4 = 4 + f5 = 5 + f6 = 6 + f7 = 7 + f8 = 8 + f9 = 9 }; { f0 = 0 + f1 = 1 + f2 = 2 + f3 = 3 + f4 = 4 + f5 = 5 + f6 = 6 + f7 = 7 + f8 = 8 + f9 = 9 }; { f0 = 0 + f1 = 1 + f2 = 2 + f3 = 3 + f4 = 4 + f5 = 5 + f6 = 6 + f7 = 7 + f8 = 8 + f9 = 9 }; { f0 = 0 + f1 = 1 + f2 = 2 + f3 = 3 + f4 = 4 + f5 = 5 + f6 = 6 + f7 = 7 + f8 = 8 + f9 = 9 }; + { f0 = 0 + f1 = 1 + f2 = 2 + f3 = 3 + f4 = 4 + f5 = 5 + f6 = 6 + f7 = 7 + f8 = 8 + f9 = 9 }; { f0 = 0 + f1 = 1 + f2 = 2 + f3 = 3 + f4 = 4 + f5 = 5 + f6 = 6 + f7 = 7 + f8 = 8 + f9 = 9 }; { f0 = 0 + f1 = 1 + f2 = 2 + f3 = 3 + f4 = 4 + f5 = 5 + f6 = 6 + f7 = 7 + f8 = 8 + f9 = 9 }; { f0 = 0 + f1 = 1 + f2 = 2 + f3 = 3 + f4 = 4 + f5 = 5 + f6 = 6 + f7 = 7 + f8 = 8 + f9 = 9 }; { f0 = 0 + f1 = 1 + f2 = 2 + f3 = 3 + f4 = 4 + f5 = 5 + f6 = 6 + f7 = 7 + f8 = 8 + f9 = 9 }; { f0 = 0 + f1 = 1 + f2 = 2 + f3 = 3 + f4 = 4 + f5 = 5 + f6 = 6 + f7 = 7 + f8 = 8 + f9 = 9 }; + { f0 = 0 + f1 = 1 + f2 = 2 + f3 = 3 + f4 = 4 + f5 = 5 + f6 = 6 + f7 = 7 + f8 = 8 + f9 = 9 }; { f0 = 0 + f1 = 1 + f2 = 2 + f3 = 3 + f4 = 4 + f5 = 5 + f6 = 6 + f7 = 7 + f8 = 8 + f9 = 9 }; { f0 = 0 + f1 = 1 + f2 = 2 + f3 = 3 + f4 = 4 + f5 = 5 + f6 = 6 + f7 = 7 + f8 = 8 + f9 = 9 }; { f0 = 0 + f1 = 1 + f2 = 2 + f3 = 3 + f4 = 4 + f5 = 5 + f6 = 6 + f7 = 7 + f8 = 8 + f9 = 9 }; { f0 = 0 + f1 = 1 + f2 = 2 + f3 = 3 + f4 = 4 + f5 = 5 + f6 = 6 + f7 = 7 + f8 = 8 + f9 = 9 }; { f0 = 0 + f1 = 1 + f2 = 2 + f3 = 3 + f4 = 4 + f5 = 5 + f6 = 6 + f7 = 7 + f8 = 8 + f9 = 9 }; + { f0 = 0 + f1 = 1 + f2 = 2 + f3 = 3 + f4 = 4 + f5 = 5 + f6 = 6 + f7 = 7 + f8 = 8 + f9 = 9 }|] +val r10s': string * r[] = + ("one extra node", + [|{ f0 = 0 + f1 = 1 + f2 = 2 + f3 = 3 + f4 = 4 + f5 = 5 + f6 = 6 + f7 = 7 + f8 = 8 + f9 = 9 }; { f0 = 0 + f1 = 1 + f2 = 2 + f3 = 3 + f4 = 4 + f5 = 5 + f6 = 6 + f7 = 7 + f8 = 8 + f9 = 9 }; { f0 = 0 + f1 = 1 + f2 = 2 + f3 = 3 + f4 = 4 + f5 = 5 + f6 = 6 + f7 = 7 + f8 = 8 + f9 = 9 }; { f0 = 0 + f1 = 1 + f2 = 2 + f3 = 3 + f4 = 4 + f5 = 5 + f6 = 6 + f7 = 7 + f8 = 8 + f9 = 9 }; { f0 = 0 + f1 = 1 + f2 = 2 + f3 = 3 + f4 = 4 + f5 = 5 + f6 = 6 + f7 = 7 + f8 = 8 + f9 = 9 }; { f0 = 0 + f1 = 1 + f2 = 2 + f3 = 3 + f4 = 4 + f5 = 5 + f6 = 6 + f7 = 7 + f8 = 8 + f9 = 9 }; + { f0 = 0 + f1 = 1 + f2 = 2 + f3 = 3 + f4 = 4 + f5 = 5 + f6 = 6 + f7 = 7 + f8 = 8 + f9 = 9 }; { f0 = 0 + f1 = 1 + f2 = 2 + f3 = 3 + f4 = 4 + f5 = 5 + f6 = 6 + f7 = 7 + f8 = 8 + f9 = 9 }; { f0 = 0 + f1 = 1 + f2 = 2 + f3 = 3 + f4 = 4 + f5 = 5 + f6 = 6 + f7 = 7 + f8 = 8 + f9 = 9 }; { f0 = 0 + f1 = 1 + f2 = 2 + f3 = 3 + f4 = 4 + f5 = 5 + f6 = 6 + f7 = 7 + f8 = 8 + f9 = 9 }; { f0 = 0 + f1 = 1 + f2 = 2 + f3 = 3 + f4 = 4 + f5 = 5 + f6 = 6 + f7 = 7 + f8 = 8 + f9 = 9 }; { f0 = 0 + f1 = 1 + f2 = 2 + f3 = 3 + f4 = 4 + f5 = 5 + f6 = 6 + f7 = 7 + f8 = 8 + f9 = 9 }; + { f0 = 0 + f1 = 1 + f2 = 2 + f3 = 3 + f4 = 4 + f5 = 5 + f6 = 6 + f7 = 7 + f8 = 8 + f9 = 9 }; { f0 = 0 + f1 = 1 + f2 = 2 + f3 = 3 + f4 = 4 + f5 = 5 + f6 = 6 + f7 = 7 + f8 = 8 + f9 = 9 }; { f0 = 0 + f1 = 1 + f2 = 2 + f3 = 3 + f4 = 4 + f5 = 5 + f6 = 6 + f7 = 7 + f8 = 8 + f9 = 9 }; { f0 = 0 + f1 = 1 + f2 = 2 + f3 = 3 + f4 = 4 + f5 = 5 + f6 = 6 + f7 = 7 + f8 = 8 + f9 = 9 }; { f0 = 0 + f1 = 1 + f2 = 2 + f3 = 3 + f4 = 4 + f5 = 5 + f6 = 6 + f7 = 7 + f8 = 8 + f9 = 9 }; { f0 = 0 + f1 = 1 + f2 = 2 + f3 = 3 + f4 = 4 + f5 = 5 + f6 = 6 + f7 = 7 + f8 = 8 + f9 = 9 }; + { f0 = 0 + f1 = 1 + f2 = 2 + f3 = 3 + f4 = 4 + f5 = 5 + f6 = 6 + f7 = 7 + f8 = 8 + f9 = 9 }; { f0 = 0 + f1 = 1 + f2 = 2 + f3 = 3 + f4 = 4 + f5 = 5 + f6 = 6 + f7 = 7 + f8 = 8 + f9 = 9 }; { f0 = 0 + f1 = 1 + f2 = 2 + f3 = 3 + f4 = 4 + f5 = 5 + f6 = 6 + f7 = 7 + f8 = 8 + f9 = 9 }; { f0 = 0 + f1 = 1 + f2 = 2 + f3 = 3 + f4 = 4 + f5 = 5 + f6 = 6 + f7 = 7 + f8 = 8 + f9 = 9 }; { f0 = 0 + f1 = 1 + f2 = 2 + f3 = 3 + f4 = 4 + f5 = 5 + f6 = 6 + f7 = 7 + f8 = 8 + f9 = 9 }; { f0 = 0 + f1 = 1 + f2 = 2 + f3 = 3 + f4 = 4 + f5 = 5 + f6 = 6 + f7 = 7 + f8 = 8 + f9 = 9 }; + { f0 = 0 + f1 = 1 + f2 = 2 + f3 = 3 + f4 = 4 + f5 = 5 + f6 = 6 + f7 = 7 + f8 = 8 + f9 = 9 }; { f0 = 0 + f1 = 1 + f2 = 2 + f3 = 3 + f4 = 4 + f5 = 5 + f6 = 6 + f7 = 7 + f8 = 8 + f9 = 9 }; { f0 = 0 + f1 = 1 + f2 = 2 + f3 = 3 + f4 = 4 + f5 = 5 + f6 = 6 + f7 = 7 + f8 = 8 + f9 = 9 }; { f0 = 0 + f1 = 1 + f2 = 2 + f3 = 3 + f4 = 4 + f5 = 5 + f6 = 6 + f7 = 7 + f8 = 8 + f9 = 9 }; { f0 = 0 + f1 = 1 + f2 = 2 + f3 = 3 + f4 = 4 + f5 = 5 + f6 = 6 + f7 = 7 + f8 = 8 + f9 = 9 }; { f0 = 0 + f1 = 1 + f2 = 2 + f3 = 3 + f4 = 4 + f5 = 5 + f6 = 6 + f7 = 7 + f8 = 8 + f9 = 9 }; + { f0 = 0 + f1 = 1 + f2 = 2 + f3 = 3 + f4 = 4 + f5 = 5 + f6 = 6 + f7 = 7 + f8 = 8 + f9 = 9 }; { f0 = 0 + f1 = 1 + f2 = 2 + f3 = 3 + f4 = 4 + f5 = 5 + f6 = 6 + f7 = 7 + f8 = 8 + f9 = 9 }; { f0 = 0 + f1 = 1 + f2 = 2 + f3 = 3 + f4 = 4 + f5 = 5 + f6 = 6 + f7 = 7 + f8 = 8 + f9 = 9 }; { f0 = 0 + f1 = 1 + f2 = 2 + f3 = 3 + f4 = 4 + f5 = 5 + f6 = 6 + f7 = 7 + f8 = 8 + f9 = 9 }; { f0 = 0 + f1 = 1 + f2 = 2 + f3 = 3 + f4 = 4 + f5 = 5 + f6 = 6 + f7 = 7 + f8 = 8 + f9 = 9 }; { f0 = 0 + f1 = 1 + f2 = 2 + f3 = 3 + f4 = 4 + f5 = 5 + f6 = 6 + f7 = 7 + f8 = 8 + f9 = 9 }; + { f0 = 0 + f1 = 1 + f2 = 2 + f3 = 3 + f4 = 4 + f5 = 5 + f6 = 6 + f7 = 7 + f8 = 8 + f9 = 9 }|]) + +> val x1564_A1: int = 1 + + +--> Added '\' to library include path + +val x1564_A2: int = 2 + + +--> Added '\' to library include path + +val x1564_A3: int = 3 + +> type internal Foo2 = + private new: x: int * y: int * z: int -> Foo2 + 3 overloads + member Prop1: int + member Prop2: int + member private Prop3: int + +> module internal InternalM = + val x: int = 1 + type Foo2 = + private new: x: int * y: int * z: int -> Foo2 + 3 overloads + member Prop1: int + member Prop2: int + member private Prop3: int + type private Foo3 = + new: x: int * y: int * z: int -> Foo3 + 3 overloads + member Prop1: int + member Prop2: int + member Prop3: int + type T1 = + | A + | B + type T2 = + { x: int } + type T3 + type T4 = + new: unit -> T4 + type T5 = + | A + | B + type T6 = + { x: int } + type private T7 = + | A + | B + type private T8 = + { x: int } + type T9 = + private | A + | B + type T10 = + private { x: int } + type T11 = + private | A + | B + type T12 = + private { x: int } + type private T13 + type private T14 = + new: unit -> T14 +module internal PrivateM = + val private x: int = 1 + type private Foo2 = + new: x: int * y: int * z: int -> Foo2 + 3 overloads + member Prop1: int + member Prop2: int + member Prop3: int + type T1 = + | A + | B + type T2 = + { x: int } + type T3 + type T4 = + new: unit -> T4 + type T5 = + | A + | B + type T6 = + { x: int } + type private T7 = + | A + | B + type private T8 = + { x: int } + type T9 = + private | A + | B + type T10 = + private { x: int } + type T11 = + private | A + | B + type T12 = + private { x: int } + type private T13 + type private T14 = + new: unit -> T14 + +> val it: seq = + seq + [(43, "10/28/2008", 1); (46, "11/18/2008", 1); (56, "1/27/2009", 2); + (58, "2/10/2009", 1)] + +> module Test4343a = + val mk: i: int -> string + val x100: string = + "0123456789012345678901234567890123456789012345678901234567890"+[39 chars] + val x90: string = + "0123456789012345678901234567890123456789012345678901234567890"+[29 chars] + val x80: string = + "0123456789012345678901234567890123456789012345678901234567890"+[19 chars] + val x75: string = + "0123456789012345678901234567890123456789012345678901234567890"+[14 chars] + val x74: string = + "0123456789012345678901234567890123456789012345678901234567890"+[13 chars] + val x73: string = + "0123456789012345678901234567890123456789012345678901234567890"+[12 chars] + val x72: string = + "012345678901234567890123456789012345678901234567890123456789012345678901" + val x71: string = + "01234567890123456789012345678901234567890123456789012345678901234567890" + val x70: string = + "0123456789012345678901234567890123456789012345678901234567890123456789" +module Test4343b = + val fA: x: int -> int + val fB: x: 'a -> y: 'a -> 'a list + val gA: (int -> int) + val gB: ('a -> 'a -> 'a list) + val gAB: (int -> int) * ('a -> 'a -> 'a list) + val hB: ('a -> 'a -> 'a list) + val hA: (int -> int) +module Test4343c = + val typename<'a> : string + val typename2<'a> : string * string +module Test4343d = + val xList: int list = [1; 2; 3] + val xArray: int[] = [|1; 2; 3|] + val xString: string = "abcdef" + val xOption: int option = Some 12 + val xArray2: (int * int)[,] = [[(0, 0); (0, 1)] + [(1, 0); (1, 1)]] + val xSeq: seq +module Test4343e = + type C = + new: x: int -> C + val cA: C + val cB: C + val cAB: C * C * C list = + (FSI_0090+Test4343e+C, FSI_0090+Test4343e+C, + [FSI_0090+Test4343e+C; FSI_0090+Test4343e+C]) + type D = + new: x: int -> D + override ToString: unit -> string + val dA: D = D(1) + val dB: D = D(2) + val dAB: D * D * D list = (D(1), D(2), [D(1); D(2)]) + module Generic = + type CGeneric<'a> = + new: x: 'a -> CGeneric<'a> + val cA: C + val cB: C + val cAB: C * C * C list = + (FSI_0090+Test4343e+C, FSI_0090+Test4343e+C, + [FSI_0090+Test4343e+C; FSI_0090+Test4343e+C]) + type D<'a> = + new: x: 'a -> D<'a> + override ToString: unit -> string + val dA: D = D(1) + val dB: D = D(2) + val dAB: D * D * D list = (D(1), D(2), [D(1); D(2)]) + val dC: D = D(True) + val boxed_dABC: obj list = [D(1); D(2); D(True)] +type F1 = + inherit System.Windows.Forms.Form + interface System.IDisposable + val x: F1 + val x2: F1 + member B: unit -> int + member D: x: int -> int + 2 overloads + abstract MMM: bool -> bool + override ToString: unit -> string + static member A: unit -> int + static member C: unit -> int + abstract AAA: int + abstract BBB: bool with set + member D2: int + member E: int + abstract ZZZ: int + static val mutable private sx: F1 + static val mutable private sx2: F1 +[] +type IP = + new: x: int * y: int -> IP + static val mutable private AA: IP +module Regression4643 = + [] + type RIP = + new: x: int -> RIP + static val mutable private y: RIP + [] + type arg_unused_is_RIP = + new: x: RIP -> arg_unused_is_RIP + [] + type arg_used_is_RIP = + new: x: RIP -> arg_used_is_RIP + member X: RIP + [] + type field_is_RIP = + val x: RIP +type Either<'a,'b> = + | This of 'a + | That of 'b +val catch: f: (unit -> 'a) -> Either<'a,(string * string)> +val seqFindIndexFailure: Either = + That + ("System.Collections.Generic.KeyNotFoundException", + "An index satisfying the predicate was not found in the collection.") +val seqFindFailure: Either = + That + ("System.Collections.Generic.KeyNotFoundException", + "An index satisfying the predicate was not found in the collection.") +val seqPickFailure: Either = + That + ("System.Collections.Generic.KeyNotFoundException", + "An index satisfying the predicate was not found in the collection.") +module Regression5218 = + val t1: int = 1 + val t2: int * int = (1, 2) + val t3: int * int * int = (1, 2, 3) + val t4: int * int * int * int = (1, 2, 3, 4) + val t5: int * int * int * int * int = (1, 2, 3, 4, 5) + val t6: int * int * int * int * int * int = (1, 2, 3, 4, 5, 6) + val t7: int * int * int * int * int * int * int = (1, 2, 3, 4, 5, 6, 7) + val t8: int * int * int * int * int * int * int * int = + (1, 2, 3, 4, 5, 6, 7, 8) + val t9: int * int * int * int * int * int * int * int * int = + (1, 2, 3, 4, 5, 6, 7, 8, 9) + val t10: int * int * int * int * int * int * int * int * int * int = + (1, 2, 3, 4, 5, 6, 7, 8, 9, 10) + val t11: int * int * int * int * int * int * int * int * int * int * int = + (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11) + val t12: + int * int * int * int * int * int * int * int * int * int * int * int = + (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12) + val t13: + int * int * int * int * int * int * int * int * int * int * int * int * + int = (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13) + val t14: + int * int * int * int * int * int * int * int * int * int * int * int * + int * int = (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14) + val t15: + int * int * int * int * int * int * int * int * int * int * int * int * + int * int * int = (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) + +> module Regression3739 = + type IB = + abstract AbstractMember: int -> int + type C<'a when 'a :> IB> = + new: unit -> C<'a> + static member StaticMember: x: 'a -> int + +> module Regression3739 = + type IB = + abstract AbstractMember: int -> int + type C<'a when 'a :> IB> = + new: unit -> C<'a> + static member StaticMember: x: 'a -> int + +> module Regression3740 = + type Writer<'a> = + abstract get_path: unit -> string + type MyClass = + interface Writer + val path: string + +> type Regression4319_T2 = + static member (+-+-+) : x: 'a * y: 'b -> string + +> type Regression4319_T0 = + static member (+-+-+) : string + +> type Regression4319_T1 = + static member (+-+-+) : x: 'a -> string + +> type Regression4319_T1b = + static member (+-+-+) : x: 'a -> string + +> type Regression4319_T1c = + static member (+-+-+) : x: ('a * 'b) -> string + +> type Regression4319_T1d = + static member (+-+-+) : x: (int * int) -> string + +> type Regression4319_T3 = + static member (+-+-+) : x: 'a * y: 'b * z: 'c -> string + +> type Regression4319_U1 = + static member (+-+-+) : x: 'a -> moreArgs: 'b -> string + +> type Regression4319_U1b = + static member (+-+-+) : x: 'a -> moreArgs: 'b -> string + +> type Regression4319_U2 = + static member (+-+-+) : x: 'a * y: 'b -> moreArgs: 'c -> string + +> type Regression4319_U3 = + static member (+-+-+) : x: 'a * y: 'b * z: 'c -> moreArgs: 'd -> string + +> type Regression4319_check = + static member (&) : string + static member (&^) : string + static member (@) : string + static member (!=) : string + static member (:=) : string + static member (^) : string + static member (/) : string + static member ($) : string + static member (...@) : string + static member (...!=) : string + static member (.../) : string + static member (...=) : string + static member (...>) : string + static member (...^) : string + static member (...<) : string + static member ( ...* ) : string + static member (...%) : string + static member (=) : string + static member ( ** ) : string + static member (>) : string + static member (<) : string + static member (%) : string + static member ( * ) : string + static member (-) : string + +> Expect ABC = ABC +type Regression4469 = + new: unit -> Regression4469 + member ToString: unit -> string +val r4469: Regression4469 = FSI_0106+Regression4469 +val it: unit = () + +> Expect ABC = ABC +val it: unit = () + +> module Regression1019_short = + val double_nan: float = nan + val double_infinity: float = infinity + val single_nan: float32 = nanf + val single_infinity: float32 = infinityf +module Regression1019_long = + val double_nan: float = nan + val double_infinity: float = infinity + val single_nan: float32 = nanf + val single_infinity: float32 = infinityf + +> val it: int ref = { contents = 1 } + +> val x: int ref = { contents = 1 } +val f: (unit -> int) + +> val it: int = 1 + +> val it: unit = () + +> val it: int = 3 + +> val it: int[] = + [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + ...|] + +> val it: int[] = + [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + ...|] + +> val it: int[] = + [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + ...|] + +> val it: int[] = + [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + ...|] + +> val it: int[] = + [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + ...|] + +> val it: int[] = + [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + ...|] + +> val it: int[] = + [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + ...|] + +> val it: int[] = + [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + ...|] + +> val it: int[] = + [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + ...|] + +> val it: int[] = + [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + ...|] + +> val it: int[] = + [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + ...|] + +> val it: int[] = + [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + ...|] + +> val it: int[] = + [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + ...|] + +> val it: int[] = + [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + ...|] + +> val it: int[] = + [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + ...|] + +> val it: int[] = + [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + ...|] + +> val it: int[] = + [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + ...|] + +> val it: int[] = + [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + ...|] + +> val it: int[] = + [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + ...|] + +> val it: int[] = + [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + ...|] + +> val it: int[] = + [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + ...|] + +> val it: int[] = + [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + ...|] + +> val it: int[] = + [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + ...|] + +> val it: int[] = + [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + ...|] + +> val it: int[] = + [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + ...|] + +> val it: int[] = + [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + ...|] + +> val it: int[] = + [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + ...|] + +> val it: int[] = + [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + ...|] + +> val it: int[] = + [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + ...|] + +> val it: int[] = + [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + ...|] + +> val it: int[] = + [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + ...|] + +> val it: int[] = + [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + ...|] + +> val it: int[] = + [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + ...|] + +> val it: int[] = + [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + ...|] + +> val it: int[] = + [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + ...|] + +> val it: int[] = + [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + ...|] + +> val it: int[] = + [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + ...|] + +> val it: int[] = + [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + ...|] + +> val it: int[] = + [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + ...|] + +> val it: int[] = + [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + ...|] + +> val it: int[] = + [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + ...|] + +> val it: int[] = + [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + ...|] + +> val it: int[] = + [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + ...|] + +> val it: int[] = + [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + ...|] + +> val it: int[] = + [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + ...|] + +> val it: int[] = + [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + ...|] + +> val it: int[] = + [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + ...|] + +> val it: int[] = + [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + ...|] + +> val it: int[] = + [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + ...|] + +> val it: int[] = + [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + ...|] + +> val it: int[] = + [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + ...|] + +> val it: int[] = + [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + ...|] + +> val it: int[] = + [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + ...|] + +> val it: int[] = + [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + ...|] + +> val it: int[] = + [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + ...|] + +> val it: int[] = + [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + ...|] + +> val it: int[] = + [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + ...|] + +> val it: int[] = + [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + ...|] + +> val it: int[] = + [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + ...|] + +> val it: int[] = + [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + ...|] + +> val it: int[] = + [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + ...|] + +> val it: int[] = + [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + ...|] + +> val it: int[] = + [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + ...|] + +> val it: int[] = + [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + ...|] + +> val it: int[] = + [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + ...|] + +> val it: int[] = + [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + ...|] + +> val it: int[] = + [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + ...|] + +> val it: int[] = + [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + ...|] + +> val it: int[] = + [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + ...|] + +> val it: int[] = + [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + ...|] + +> val it: int[] = + [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + ...|] + +> val it: int[] = + [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + ...|] + +> val it: int[] = + [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + ...|] + +> val it: int[] = + [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + ...|] + +> val it: int[] = + [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + ...|] + +> val it: int[] = + [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + ...|] + +> val it: int[] = + [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + ...|] + +> val it: int[] = + [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + ...|] + +> val it: int[] = + [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + ...|] + +> val it: int[] = + [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + ...|] + +> val it: int[] = + [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + ...|] + +> val it: int[] = + [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + ...|] + +> val it: int[] = + [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + ...|] + +> val it: int[] = + [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + ...|] + +> val it: int[] = + [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + ...|] + +> val it: int[] = + [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + ...|] + +> val it: int[] = + [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + ...|] + +> val it: int[] = + [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + ...|] + +> val it: int[] = + [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + ...|] + +> val it: int[] = + [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + ...|] + +> val it: int[] = + [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + ...|] + +> val it: int[] = + [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + ...|] + +> val it: int[] = + [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + ...|] + +> val it: int[] = + [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + ...|] + +> val it: int[] = + [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + ...|] + +> val it: int[] = + [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + ...|] + +> val it: int[] = + [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + ...|] + +> val it: int[] = + [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + ...|] + +> val it: int[] = + [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + ...|] + +> val it: int[] = + [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + ...|] + +> val it: int[] = + [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + ...|] + +> val it: 'a list + +> val it: 'a list list + +> val it: 'a option + +> val it: 'a list * 'b list + +> val it: x: 'a -> 'a + +> val fff: x: 'a -> 'a + +> val it: ('a -> 'a) + +> val note_ExpectDupMethod: string = + "Regression4927: Expect error due to duplicate methods in the "+[20 chars] + +> > val note_ExpectDupProperty: string = + "Regression4927: Expect error due to duplicate properties in t"+[23 chars] + +> > > val it: string = "NOTE: Expect IAPrivate less accessible IBPublic" + +> > val it: string = "NOTE: Expect IAPrivate less accessible IBInternal" + +> > module Regression5265_PriPri = + type private IAPrivate = + abstract P: int + type private IBPrivate = + inherit IAPrivate + abstract Q: int + +> val it: string = "NOTE: Expect IAInternal less accessible IBPublic" + +> > module Regression5265_IntInt = + type internal IAInternal = + abstract P: int + type internal IBInternal = + inherit IAInternal + abstract Q: int + +> module Regression5265_IntPri = + type internal IAInternal = + abstract P: int + type private IBPrivate = + inherit IAInternal + abstract Q: int + +> module Regression5265_PubPub = + type IAPublic = + abstract P: int + type IBPublic = + inherit IAPublic + abstract Q: int + +> module Regression5265_PubInt = + type IAPublic = + abstract P: int + type internal IBInternal = + inherit IAPublic + abstract Q: int + +> module Regression5265_PubPri = + type IAPublic = + abstract P: int + type private IBPrivate = + inherit IAPublic + abstract Q: int + +> val it: string = + "Regression4232: Expect an error about duplicate virtual methods from parent type" + +> > val it: string = + "** Expect AnAxHostSubClass to be accepted. AxHost has a newslot virtual RightToLeft property outscope RightToLeft on Control" + +> type AnAxHostSubClass = + inherit System.Windows.Forms.AxHost + new: x: string -> AnAxHostSubClass + +> val it: string = + "** Expect error because the active pattern result contains free type variables" + +> > val it: string = + "** Expect error because the active pattern result contains free type variables (match value generic)" + +> > val it: string = + "** Expect error because the active pattern result contains free type variables (when active pattern also has parameters)" + +> > val it: string = + "** Expect OK, since error message says constraint should work!" + +> val (|A|B|) : x: int -> Choice + +> val it: string = "** Expect error since active pattern is not a function!" + +> > val it: string = + "** Expect OK since active pattern result is not too generic, typars depend on match val" + +> val (|A|B|) : p: bool -> 'a * 'b -> Choice<'a,'b> + +> val it: string = + "** Expect OK since active pattern result is not too generic, typars depend on parameters" + +> val (|A|B|) : aval: 'a -> bval: 'b -> x: bool -> Choice<'a,'b> + +> val it: string = + "** Expect OK since active pattern result is generic, but it typar from closure, so OK" + +> val outer: x: 'a -> (int -> 'a option) + +> val it: string = + "** Expect OK, BUG 472278: revert unintended breaking change to Active Patterns in F# 3.0" + +> val (|Check1|) : a: int -> int * 'a option + +> > module ReflectionEmit = + type IA = + abstract M: #IB -> int + and IB = + abstract M: #IA -> int + type IA2<'a when 'a :> IB2<'a> and 'a :> IA2<'a>> = + abstract M: int + and IB2<'b when 'b :> IA2<'b> and 'b :> IB2<'b>> = + abstract M: int + +> val it: string = + "Regression_139182: Expect the follow code to be accepted without error" + +> [] +type S = + member TheMethod: unit -> int64 +val theMethod: s: S -> int64 +type T = + new: unit -> T + member Prop5: int64 + static member Prop1: int64 + static member Prop2: int64 + static member Prop3: int64 + static member Prop4: string + +> val it: System.Threading.ThreadLocal list = [0 {IsValueCreated = false; + Values = ?;}] + +> type MyDU = + | Case1 of Val1: int * Val2: string + | Case2 of string * V2: bool * float + | Case3 of int + | Case4 of Item1: bool + | Case5 of bool * string + | Case6 of Val1: int * bool * string + | Case7 of ``Big Name`` : int +val namedFieldVar1: MyDU = Case1 (5, "") +val namedFieldVar2: MyDU = Case7 25 + +> exception MyNamedException1 of Val1: int * Val2: string +exception MyNamedException2 of string * V2: bool * float +exception MyNamedException3 of Data: int +exception MyNamedException4 of bool +exception MyNamedException5 of int * string +exception MyNamedException6 of Val1: int * bool * string * Data8: float +exception MyNamedException7 of ``Big Named Field`` : int +val namedEx1: exn = MyNamedException1 (5, "") +val namedEx2: exn = MyNamedException7 25 + +> type optionRecord = + { x: int option } +val x: optionRecord = { x = None } + +> type optionRecord = + { x: obj } +val x: optionRecord = { x = null } + +> type RecordWithMembers = + { x: obj } + member Method: unit -> int + member Property: int + +> type UnionWithMembers = + | Case1 + | Case2 of int + member Method: unit -> int + member Property: int + +> type OneFieldRecordNoXmlDoc = + { OneField: obj } + +> type OneFieldRecordXmlDoc = + { + OneField: obj + } + +> type TwoFieldRecordNoXmlDoc = + { + TwoFields1: obj + TwoFields2: obj + } + +> type TwoFieldRecordXmlDoc = + { + TwoFields1: obj + TwoFields2: obj + } + +> type Int32 with + member ExtrinsicExtensionProperty: int +type Int32 with + member ExtrinsicExtensionMethod: unit -> int + +> val ``value with spaces in name`` : bool = true + +> val functionWhichTakesLongNameMixedParameters: + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa: int * + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb: int + -> ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc: int * + dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd: int + -> int + +> val functionWhichTakesLongNameTupledParameters: + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa: int * + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb: int * + ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc: int * + ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd: int + -> int + +> val functionWhichTakesLongNameCurriedParameters: + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa: int + -> bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb: int + -> cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc: int + -> dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd: int + -> int + +> val functionWhichTakesMixedLengthCurriedParametersA: + a: 'a -> b: 'b -> c: 'c -> ddddddddddddddddddddddddddddddddddddddddddddd: 'd + -> int + +> val functionWhichTakesMixedLengthCurriedParametersB: + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa: 'a -> b: 'b -> c: 'c -> d: 'd -> int + +> val f: ``parameter with spaces in name`` : int -> int + +> val functionWhichTakesAParameterPeeciselyPlusButNotOpAddition: + ``+`` : (int -> int -> int) -> int + +> val functionWhichTakesAParameterOpAddition: (+) : (int -> int -> int) -> int + +> val functionWhichTakesAParameterCalled_land: + ``land`` : (int -> int -> int) -> int + +> type RecordWithStrangeNames = + { + ``funky name`` : obj + op_Addition: obj + ``+`` : obj + ``land`` : obj + ``base`` : obj + } + +> type UnionWithSpacesInNamesOfCases = + | ``Funky name`` + | ``Funky name 2`` + +> type ``Type with spaces in name`` = + | A + | B + +> type op_Addition = + | A + | B + +> type ``land`` = + | A + | B + +> module ``Module with spaces in name`` = + val x: int = 1 + +> module op_Addition = + val x: int = 1 + +> module ``land`` = + val x: int = 1 + +> val ``+`` : x: 'a -> y: 'b -> int + +> val (+) : x: int -> y: int -> int + +> val ``base`` : int = 2 + +> val (mod) : int = 2 + +> val ``or`` : int = 2 + +> val ``land`` : int = 2 + +> val ``.ctor`` : int = 2 + +> val ``.cctor`` : int = 2 + +> [] +val SomeLiteralWithASomewhatLongName: string + = "SomeVeryLongLiteralValueWithLotsOfCharacters" +[] +val SomeLiteralWithASomewhatLongName2: string + = + "SomeVeryLongLiteralValueWithLotsOfCharactersSomeVeryLongLiteralValueWithLotsOfCharactersSomeVeryLongLiteralValueWithLotsOfCharacters" +[] +val ShortName: string = "hi" + +> val it: System.DayOfWeek = Tuesday + +> val internal f: unit -> int + +> val it: int = 1 + +> type internal CInternal = + new: unit -> CInternal + +> val it: unit = () + +> type internal CPublic = + new: unit -> CPublic + member MInternal: unit -> unit + +> val it: unit = () + +> type internal CPublic2 = + new: unit -> CPublic2 + member MPublic: unit -> int + +> val it: int = 1 + +> val inst1: TestLoadFile.ClassInFile1 + +> val inst2: TestLoadFile2.ClassInFile2 + +> > > diff --git a/tests/fsharp/core/printing/test.fsx b/tests/fsharp/core/printing/test.fsx index f0002eeba0..aeb00fc5bb 100644 --- a/tests/fsharp/core/printing/test.fsx +++ b/tests/fsharp/core/printing/test.fsx @@ -1086,6 +1086,27 @@ let ShortName = "hi" System.DayOfWeek.Tuesday ;; +let internal f() = 1;; f();; // should give a warning in multi-assembly interactive emit + + +type internal CInternal() = class end;; + +CInternal() |> ignore;; // should give a warning in multi-assembly interactive emit + +type internal CPublic() = + member internal _.MInternal() = ();; + +CPublic().MInternal();; // should give a warning in multi-assembly interactive emit + +type internal CPublic2() = + let mutable x = 1 + member _.MPublic() = x;; + +CPublic2().MPublic();; // should give a warning in multi-assembly interactive emit + +let inst1 = TestLoadFile.ClassInFile1();; // should load ok + +let inst2 = TestLoadFile2.ClassInFile2();; // should load ok ;; (* ;; needed, to isolate error regressions *) diff --git a/tests/fsharp/core/printing/testLoadFile.fsx b/tests/fsharp/core/printing/testLoadFile.fsx index 85347b365b..1874fb8c6a 100644 --- a/tests/fsharp/core/printing/testLoadFile.fsx +++ b/tests/fsharp/core/printing/testLoadFile.fsx @@ -8,3 +8,4 @@ let x6 = [1;2;3] let x7 = new System.Windows.Forms.Form(Text="x7 form") let x8 = Array2D.init 5 5 (fun i j -> i*10 + j) let x9 = lazy (exit 999; "this lazy value should not be forced!!") +type ClassInFile1() = class end \ No newline at end of file diff --git a/tests/fsharp/core/printing/testLoadFile2.fsx b/tests/fsharp/core/printing/testLoadFile2.fsx index ab00483c81..0135662d80 100644 --- a/tests/fsharp/core/printing/testLoadFile2.fsx +++ b/tests/fsharp/core/printing/testLoadFile2.fsx @@ -12,3 +12,4 @@ let x6 = [1;2;3] let x7 = new System.Windows.Forms.Form(Text="x7 form") let x8 = Array2D.init 5 5 (fun i j -> i*10 + j) let x9 = lazy (exit 999; "this lazy value should not be forced!!") +type ClassInFile2() = class end \ No newline at end of file diff --git a/tests/fsharp/core/printing/z.output.test.1000.stdout.47.bsl b/tests/fsharp/core/printing/z.output.test.1000.stdout.47.bsl deleted file mode 100644 index fd1ea3b817..0000000000 --- a/tests/fsharp/core/printing/z.output.test.1000.stdout.47.bsl +++ /dev/null @@ -1,2716 +0,0 @@ - -> val it: unit = () - -> val repeatId: string = "A" - -> val repeatId: string = "B" - -namespace FSI_0005 - val x1: int - val x2: string - val x3: 'a option - val x4: int option - val x5: 'a list - val x6: int list - val x7: System.Windows.Forms.Form - val x8: int[,] - val x9: Lazy - -namespace FSI_0006 - val x1: int - val x2: string - val x3: 'a option - val x4: int option - val x5: 'a list - val x6: int list - val x7: System.Windows.Forms.Form - val x8: int[,] - val x9: Lazy - -namespace FSI_0006 - val x1: int - val x2: string - val x3: 'a option - val x4: int option - val x5: 'a list - val x6: int list - val x7: System.Windows.Forms.Form - val x8: int[,] - val x9: Lazy - -> val x1: seq -val x2: seq -val x3: seq -val f1: System.Windows.Forms.Form = System.Windows.Forms.Form, Text: f1 form -val fs: System.Windows.Forms.Form[] = - [|System.Windows.Forms.Form, Text: fs #0; - System.Windows.Forms.Form, Text: fs #1; - System.Windows.Forms.Form, Text: fs #2; - System.Windows.Forms.Form, Text: fs #3; - System.Windows.Forms.Form, Text: fs #4; - System.Windows.Forms.Form, Text: fs #5; - System.Windows.Forms.Form, Text: fs #6; - System.Windows.Forms.Form, Text: fs #7; - System.Windows.Forms.Form, Text: fs #8; - System.Windows.Forms.Form, Text: fs #9; - System.Windows.Forms.Form, Text: fs #10; - System.Windows.Forms.Form, Text: fs #11; - System.Windows.Forms.Form, Text: fs #12; - System.Windows.Forms.Form, Text: fs #13; - System.Windows.Forms.Form, Text: fs #14; - System.Windows.Forms.Form, Text: fs #15; - System.Windows.Forms.Form, Text: fs #16; - System.Windows.Forms.Form, Text: fs #17; - System.Windows.Forms.Form, Text: fs #18; - System.Windows.Forms.Form, Text: fs #19; - System.Windows.Forms.Form, Text: fs #20; - System.Windows.Forms.Form, Text: fs #21; - System.Windows.Forms.Form, Text: fs #22; - System.Windows.Forms.Form, Text: fs #23; - System.Windows.Forms.Form, Text: fs #24; - System.Windows.Forms.Form, Text: fs #25; - System.Windows.Forms.Form, Text: fs #26; - System.Windows.Forms.Form, Text: fs #27; - System.Windows.Forms.Form, Text: fs #28; - System.Windows.Forms.Form, Text: fs #29; - System.Windows.Forms.Form, Text: fs #30; - System.Windows.Forms.Form, Text: fs #31; - System.Windows.Forms.Form, Text: fs #32; - System.Windows.Forms.Form, Text: fs #33; - System.Windows.Forms.Form, Text: fs #34; - System.Windows.Forms.Form, Text: fs #35; - System.Windows.Forms.Form, Text: fs #36; - System.Windows.Forms.Form, Text: fs #37; - System.Windows.Forms.Form, Text: fs #38; - System.Windows.Forms.Form, Text: fs #39; - System.Windows.Forms.Form, Text: fs #40; - System.Windows.Forms.Form, Text: fs #41; - System.Windows.Forms.Form, Text: fs #42; - System.Windows.Forms.Form, Text: fs #43; - System.Windows.Forms.Form, Text: fs #44; - System.Windows.Forms.Form, Text: fs #45; - System.Windows.Forms.Form, Text: fs #46; - System.Windows.Forms.Form, Text: fs #47; - System.Windows.Forms.Form, Text: fs #48; - System.Windows.Forms.Form, Text: fs #49; - System.Windows.Forms.Form, Text: fs #50; - System.Windows.Forms.Form, Text: fs #51; - System.Windows.Forms.Form, Text: fs #52; - System.Windows.Forms.Form, Text: fs #53; - System.Windows.Forms.Form, Text: fs #54; - System.Windows.Forms.Form, Text: fs #55; - System.Windows.Forms.Form, Text: fs #56; - System.Windows.Forms.Form, Text: fs #57; - System.Windows.Forms.Form, Text: fs #58; - System.Windows.Forms.Form, Text: fs #59; - System.Windows.Forms.Form, Text: fs #60; - System.Windows.Forms.Form, Text: fs #61; - System.Windows.Forms.Form, Text: fs #62; - System.Windows.Forms.Form, Text: fs #63; - System.Windows.Forms.Form, Text: fs #64; - System.Windows.Forms.Form, Text: fs #65; - System.Windows.Forms.Form, Text: fs #66; - System.Windows.Forms.Form, Text: fs #67; - System.Windows.Forms.Form, Text: fs #68; - System.Windows.Forms.Form, Text: fs #69; - System.Windows.Forms.Form, Text: fs #70; - System.Windows.Forms.Form, Text: fs #71; - System.Windows.Forms.Form, Text: fs #72; - System.Windows.Forms.Form, Text: fs #73; - System.Windows.Forms.Form, Text: fs #74; - System.Windows.Forms.Form, Text: fs #75; - System.Windows.Forms.Form, Text: fs #76; - System.Windows.Forms.Form, Text: fs #77; - System.Windows.Forms.Form, Text: fs #78; - System.Windows.Forms.Form, Text: fs #79; - System.Windows.Forms.Form, Text: fs #80; - System.Windows.Forms.Form, Text: fs #81; - System.Windows.Forms.Form, Text: fs #82; - System.Windows.Forms.Form, Text: fs #83; - System.Windows.Forms.Form, Text: fs #84; - System.Windows.Forms.Form, Text: fs #85; - System.Windows.Forms.Form, Text: fs #86; - System.Windows.Forms.Form, Text: fs #87; - System.Windows.Forms.Form, Text: fs #88; - System.Windows.Forms.Form, Text: fs #89; - System.Windows.Forms.Form, Text: fs #90; - System.Windows.Forms.Form, Text: fs #91; - System.Windows.Forms.Form, Text: fs #92; - System.Windows.Forms.Form, Text: fs #93; - System.Windows.Forms.Form, Text: fs #94; - System.Windows.Forms.Form, Text: fs #95; - System.Windows.Forms.Form, Text: fs #96; - System.Windows.Forms.Form, Text: fs #97; - System.Windows.Forms.Form, Text: fs #98; - System.Windows.Forms.Form, Text: fs #99; ...|] -val xs: string list = - ["0"; "1"; "2"; "3"; "4"; "5"; "6"; "7"; "8"; "9"; "10"; "11"; "12"; "13"; - "14"; "15"; "16"; "17"; "18"; "19"; "20"; "21"; "22"; "23"; "24"; "25"; - "26"; "27"; "28"; "29"; "30"; "31"; "32"; "33"; "34"; "35"; "36"; "37"; - "38"; "39"; "40"; "41"; "42"; "43"; "44"; "45"; "46"; "47"; "48"; "49"; - "50"; "51"; "52"; "53"; "54"; "55"; "56"; "57"; "58"; "59"; "60"; "61"; - "62"; "63"; "64"; "65"; "66"; "67"; "68"; "69"; "70"; "71"; "72"; "73"; - "74"; "75"; "76"; "77"; "78"; "79"; "80"; "81"; "82"; "83"; "84"; "85"; - "86"; "87"; "88"; "89"; "90"; "91"; "92"; "93"; "94"; "95"; "96"; "97"; - "98"; "99"; ...] -val xa: string[] = - [|"0"; "1"; "2"; "3"; "4"; "5"; "6"; "7"; "8"; "9"; "10"; "11"; "12"; "13"; - "14"; "15"; "16"; "17"; "18"; "19"; "20"; "21"; "22"; "23"; "24"; "25"; - "26"; "27"; "28"; "29"; "30"; "31"; "32"; "33"; "34"; "35"; "36"; "37"; - "38"; "39"; "40"; "41"; "42"; "43"; "44"; "45"; "46"; "47"; "48"; "49"; - "50"; "51"; "52"; "53"; "54"; "55"; "56"; "57"; "58"; "59"; "60"; "61"; - "62"; "63"; "64"; "65"; "66"; "67"; "68"; "69"; "70"; "71"; "72"; "73"; - "74"; "75"; "76"; "77"; "78"; "79"; "80"; "81"; "82"; "83"; "84"; "85"; - "86"; "87"; "88"; "89"; "90"; "91"; "92"; "93"; "94"; "95"; "96"; "97"; - "98"; "99"; ...|] -val xa2: string[,] = [["0"; "1"; "2"; "3"; "4"; "5"; "6"; "7"] - ["10"; "11"; "12"; "13"; "14"; "15"; "16"; "17"] - ["20"; "21"; "22"; "23"; "24"; "25"; "26"; "27"] - ["30"; "31"; "32"; "33"; "34"; "35"; "36"; "37"] - ["40"; "41"; "42"; "43"; "44"; "45"; "46"; "47"] - ["50"; "51"; "52"; "53"; "54"; "55"; "56"; "57"] - ["60"; "61"; "62"; "63"; "64"; "65"; "66"; "67"] - ["70"; "71"; "72"; "73"; "74"; "75"; "76"; "77"]] -val sxs0: Set = set [] - -> val sxs1: Set = set ["0"] - -> val sxs2: Set = set ["0"; "1"] - -> val sxs3: Set = set ["0"; "1"; "2"] - -> val sxs4: Set = set ["0"; "1"; "2"; "3"] - -> val sxs200: Set = - set ["0"; "1"; "10"; "100"; "101"; "102"; "103"; "104"; "105"; ...] - -> val msxs0: Map = map [] - -> val msxs1: Map = map [(0, "0")] - -> val msxs2: Map = map [(0, "0"); (1, "1")] - -> val msxs3: Map = map [(0, "0"); (1, "1"); (2, "2")] - -> val msxs4: Map = map [(0, "0"); (1, "1"); (2, "2"); (3, "3")] - -> val msxs200: Map = - map - [(0, "0"); (1, "1"); (2, "2"); (3, "3"); (4, "4"); (5, "5"); (6, "6"); - (7, "7"); (8, "8"); ...] - -> module M = - val a: string = "sub-binding" - val b: - (seq * seq * seq * System.Windows.Forms.Form) option * - (string list * string list * string[,]) option = - (Some (, , , System.Windows.Forms.Form, Text: f1 form), - Some - (["0"; "1"; "2"; "3"; "4"; "5"; "6"; "7"; "8"; "9"; "10"; "11"; "12"; - "13"; "14"; "15"; "16"; "17"; "18"; "19"; "20"; "21"; "22"; "23"; - "24"; "25"; "26"; "27"; "28"; "29"; "30"; "31"; "32"; "33"; "34"; - "35"; "36"; "37"; "38"; "39"; "40"; "41"; "42"; "43"; "44"; "45"; - "46"; "47"; "48"; "49"; "50"; "51"; "52"; "53"; "54"; "55"; "56"; - "57"; "58"; "59"; "60"; "61"; "62"; "63"; "64"; "65"; "66"; "67"; - "68"; "69"; "70"; "71"; "72"; "73"; "74"; "75"; "76"; "77"; "78"; - "79"; "80"; "81"; "82"; "83"; "84"; "85"; "86"; "87"; "88"; "89"; - "90"; "91"; "92"; "93"; "94"; "95"; "96"; ...], ..., ...)) -type T = - new: a: int * b: int -> T - member AMethod: x: int -> int - static member StaticMethod: x: int -> int - member AProperty: int - static member StaticProperty: int -val f_as_method: x: int -> int -val f_as_thunk: (int -> int) -val refCell: string ref = { contents = "value" } -module D1 = - val words: System.Collections.Generic.IDictionary - val words2000: System.Collections.Generic.IDictionary - -> > module D2 = - val words: IDictionary - val words2000: IDictionary -val opt1: 'a option -val opt1b: int option = None -val opt4: 'a option option option option -val opt4b: int option option option option = Some (Some (Some None)) -val opt5: int list option option option option option list = - [Some (Some (Some (Some None))); - Some (Some (Some (Some (Some [1; 2; 3; 4; 5; 6])))); - Some - (Some - (Some - (Some - (Some - [1; 2; 3; 4; 5; 6; 7; 8; 9; 0; 1; 2; 3; 4; 5; 6; 7; 8; 9; 1; - 2; 3; 4; 5; 6; 7; 8; 9; 1; 2; 3; 4; 5; 6; 7; 8; 9; 1; 2; 3; - 4; 5; 6; 7; 8; 9; 1; 2; 3; 4; 5; 6; 7; 8; 9; 0]))))] -val mkStr: n: int -> string -val strs: string[] = - [|""; "-"; "--"; "---"; "----"; "-----"; "------"; "-------"; "--------"; - "---------"; "----------"; "-----------"; "------------"; "-------------"; - "--------------"; "---------------"; "----------------"; - "-----------------"; "------------------"; "-------------------"; - "--------------------"; "---------------------"; "----------------------"; - "-----------------------"; "------------------------"; - "-------------------------"; "--------------------------"; - "---------------------------"; "----------------------------"; - "-----------------------------"; "------------------------------"; - "-------------------------------"; "--------------------------------"; - "---------------------------------"; "----------------------------------"; - "-----------------------------------"; - "------------------------------------"; - "-------------------------------------"; - "--------------------------------------"; - "---------------------------------------"; - "----------------------------------------"; - "-----------------------------------------"; - "------------------------------------------"; - "-------------------------------------------"; - "--------------------------------------------"; - "---------------------------------------------"; - "----------------------------------------------"; - "-----------------------------------------------"; - "------------------------------------------------"; - "-------------------------------------------------"; - "--------------------------------------------------"; - "---------------------------------------------------"; - "----------------------------------------------------"; - "-----------------------------------------------------"; - "------------------------------------------------------"; - "-------------------------------------------------------"; - "--------------------------------------------------------"; - "---------------------------------------------------------"; - "----------------------------------------------------------"; - "-----------------------------------------------------------"; - "------------------------------------------------------------"; - "-------------------------------------------------------------"; - "--------------------------------------------------------------"; - "---------------------------------------------------------------"; - "----------------------------------------------------------------"; - "-----------------------------------------------------------------"; - "------------------------------------------------------------------"; - "-------------------------------------------------------------------"; - "--------------------------------------------------------------------"; - "---------------------------------------------------------------------"; - "----------------------------------------------------------------------"; - "-----------------------------------------------------------------------"; - "------------------------------------------------------------------------"; - "-------------------------------------------------------------"+[12 chars]; - "-------------------------------------------------------------"+[13 chars]; - "-------------------------------------------------------------"+[14 chars]; - "-------------------------------------------------------------"+[15 chars]; - "-------------------------------------------------------------"+[16 chars]; - "-------------------------------------------------------------"+[17 chars]; - "-------------------------------------------------------------"+[18 chars]; - "-------------------------------------------------------------"+[19 chars]; - "-------------------------------------------------------------"+[20 chars]; - "-------------------------------------------------------------"+[21 chars]; - "-------------------------------------------------------------"+[22 chars]; - "-------------------------------------------------------------"+[23 chars]; - "-------------------------------------------------------------"+[24 chars]; - "-------------------------------------------------------------"+[25 chars]; - "-------------------------------------------------------------"+[26 chars]; - "-------------------------------------------------------------"+[27 chars]; - "-------------------------------------------------------------"+[28 chars]; - "-------------------------------------------------------------"+[29 chars]; - "-------------------------------------------------------------"+[30 chars]; - "-------------------------------------------------------------"+[31 chars]; - "-------------------------------------------------------------"+[32 chars]; - "-------------------------------------------------------------"+[33 chars]; - "-------------------------------------------------------------"+[34 chars]; - "-------------------------------------------------------------"+[35 chars]; - "-------------------------------------------------------------"+[36 chars]; - "-------------------------------------------------------------"+[37 chars]; - "-------------------------------------------------------------"+[38 chars]; - ...|] -val str7s: string[] = - [|""; "-------"; "--------------"; "---------------------"; - "----------------------------"; "-----------------------------------"; - "------------------------------------------"; - "-------------------------------------------------"; - "--------------------------------------------------------"; - "---------------------------------------------------------------"; - "----------------------------------------------------------------------"; - "-------------------------------------------------------------"+[16 chars]; - "-------------------------------------------------------------"+[23 chars]; - "-------------------------------------------------------------"+[30 chars]; - "-------------------------------------------------------------"+[37 chars]; - "-------------------------------------------------------------"+[44 chars]; - "-------------------------------------------------------------"+[51 chars]; - "-------------------------------------------------------------"+[58 chars]; - "-------------------------------------------------------------"+[65 chars]; - "-------------------------------------------------------------"+[72 chars]; - "-------------------------------------------------------------"+[79 chars]; - "-------------------------------------------------------------"+[86 chars]; - "-------------------------------------------------------------"+[93 chars]; - "-------------------------------------------------------------"+[100 chars]; - "-------------------------------------------------------------"+[107 chars]; - "-------------------------------------------------------------"+[114 chars]; - "-------------------------------------------------------------"+[121 chars]; - "-------------------------------------------------------------"+[128 chars]; - "-------------------------------------------------------------"+[135 chars]; - "-------------------------------------------------------------"+[142 chars]; - "-------------------------------------------------------------"+[149 chars]; - "-------------------------------------------------------------"+[156 chars]; - "-------------------------------------------------------------"+[163 chars]; - "-------------------------------------------------------------"+[170 chars]; - "-------------------------------------------------------------"+[177 chars]; - "-------------------------------------------------------------"+[184 chars]; - "-------------------------------------------------------------"+[191 chars]; - "-------------------------------------------------------------"+[198 chars]; - "-------------------------------------------------------------"+[205 chars]; - "-------------------------------------------------------------"+[212 chars]; - "-------------------------------------------------------------"+[219 chars]; - "-------------------------------------------------------------"+[226 chars]; - "-------------------------------------------------------------"+[233 chars]; - "-------------------------------------------------------------"+[240 chars]; - "-------------------------------------------------------------"+[247 chars]; - "-------------------------------------------------------------"+[254 chars]; - "-------------------------------------------------------------"+[261 chars]; - "-------------------------------------------------------------"+[268 chars]; - "-------------------------------------------------------------"+[275 chars]; - "-------------------------------------------------------------"+[282 chars]; - "-------------------------------------------------------------"+[289 chars]; - "-------------------------------------------------------------"+[296 chars]; - "-------------------------------------------------------------"+[303 chars]; - "-------------------------------------------------------------"+[310 chars]; - "-------------------------------------------------------------"+[317 chars]; - "-------------------------------------------------------------"+[324 chars]; - "-------------------------------------------------------------"+[331 chars]; - "-------------------------------------------------------------"+[338 chars]; - "-------------------------------------------------------------"+[345 chars]; - "-------------------------------------------------------------"+[352 chars]; - "-------------------------------------------------------------"+[359 chars]; - "-------------------------------------------------------------"+[366 chars]; - "-------------------------------------------------------------"+[373 chars]; - "-------------------------------------------------------------"+[380 chars]; - "-------------------------------------------------------------"+[387 chars]; - "-------------------------------------------------------------"+[394 chars]; - "-------------------------------------------------------------"+[401 chars]; - "-------------------------------------------------------------"+[408 chars]; - "-------------------------------------------------------------"+[415 chars]; - "-------------------------------------------------------------"+[422 chars]; - "-------------------------------------------------------------"+[429 chars]; - "-------------------------------------------------------------"+[436 chars]; - "-------------------------------------------------------------"+[443 chars]; - "-------------------------------------------------------------"+[450 chars]; - "-------------------------------------------------------------"+[457 chars]; - "-------------------------------------------------------------"+[464 chars]; - "-------------------------------------------------------------"+[471 chars]; - "-------------------------------------------------------------"+[478 chars]; - "-------------------------------------------------------------"+[485 chars]; - "-------------------------------------------------------------"+[492 chars]; - "-------------------------------------------------------------"+[499 chars]; - "-------------------------------------------------------------"+[506 chars]; - "-------------------------------------------------------------"+[513 chars]; - "-------------------------------------------------------------"+[520 chars]; - "-------------------------------------------------------------"+[527 chars]; - "-------------------------------------------------------------"+[534 chars]; - "-------------------------------------------------------------"+[541 chars]; - "-------------------------------------------------------------"+[548 chars]; - "-------------------------------------------------------------"+[555 chars]; - "-------------------------------------------------------------"+[562 chars]; - "-------------------------------------------------------------"+[569 chars]; - "-------------------------------------------------------------"+[576 chars]; - "-------------------------------------------------------------"+[583 chars]; - "-------------------------------------------------------------"+[590 chars]; - "-------------------------------------------------------------"+[597 chars]; - "-------------------------------------------------------------"+[604 chars]; - "-------------------------------------------------------------"+[611 chars]; - "-------------------------------------------------------------"+[618 chars]; - "-------------------------------------------------------------"+[625 chars]; - "-------------------------------------------------------------"+[632 chars]; - ...|] -val grids: string[,] = - [[""; ""; ""; ""; ""; ""; ""; ""; ""; ""; ""; ""; ""; ""; ""; ""; ""; ""; ""; - ""; ""; ""; ""; ""; ""; ""; ""; ""; ""; ""; ""; ""; ""; ""; ""; ""; ""; ""; - ""; ""; ""; ""; ""; ""; ""; ""; ""; ""; ""; ""] - [""; "-"; "--"; "---"; "----"; "-----"; "------"; "-------"; "--------"; - "---------"; "----------"; "-----------"; "------------"; "-------------"; - "--------------"; "---------------"; "----------------"; - "-----------------"; "------------------"; "-------------------"; - "--------------------"; "---------------------"; "----------------------"; - "-----------------------"; "------------------------"; - "-------------------------"; "--------------------------"; - "---------------------------"; "----------------------------"; - "-----------------------------"; "------------------------------"; - "-------------------------------"; "--------------------------------"; - "---------------------------------"; "----------------------------------"; - "-----------------------------------"; - "------------------------------------"; - "-------------------------------------"; - "--------------------------------------"; - "---------------------------------------"; - "----------------------------------------"; - "-----------------------------------------"; - "------------------------------------------"; - "-------------------------------------------"; - "--------------------------------------------"; - "---------------------------------------------"; - "----------------------------------------------"; - "-----------------------------------------------"; - "------------------------------------------------"; - "-------------------------------------------------"; ...] - ...] - -> type tree = - | L - | N of tree list -val mkT: w: int -> d: int -> tree -val tree: w: int -> d: int -> tree - -> [Building 2 4...done] -val tree_2_4: tree = - N [N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]; - N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]] - -> [Building 2 6...done] -val tree_2_6: tree = - N [N [N [N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]; - N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]]; - N [N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]; - N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]]]; - N [N [N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]; - N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]]; - N [N [N [N ...; ...]; ...]; ...]; ...]; ...] - -> [Building 2 8...done] -val tree_2_8: tree = - N [N [N [N [N [N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]; - N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]]; - N [N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]; - N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]]]; - N [N [N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]; - N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]]; - N [N ...; ...]; ...]; ...]; ...]; ...] - -> [Building 2 10...done] -val tree_2_10: tree = - N [N [N [N [N [N [N [N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]; - N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]]; - N [N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]; - N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]]]; - N [N [N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]; - N [N [N [L; L]; N [L; L]]; - N [N [L; L]; N [L; L; ...]; ...]; ...]; ...]; ...]; - ...]; ...]; ...]; ...]; ...] - -> [Building 2 12...done] -val tree_2_12: tree = - N [N [N [N [N [N [N [N [N [N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]; - N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]]; - N [N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]; - N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]]]; - N [N [N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]; - N [N [N [L; L]; N [L; L]]; - N [N [L; L]; N ...; ...]; ...]; ...]; ...]; - ...]; ...]; ...]; ...]; ...]; ...]; ...] - -> [Building 2 14...done] -val tree_2_14: tree = - N [N [N [N [N [N [N [N [N [N [N [N [N [N [L; L]; N [L; L]]; - N [N [L; L]; N [L; L]]]; - N [N [N [L; L]; N [L; L]]; - N [N [L; L]; N [L; L]]]]; - N [N [N [N [L; L]; N [L; L]]; - N [N [L; L]; N [L; L]]]; - N [N [N [L; L]; N [L; L]]; - N [N [L; L]; N [L; L]]]]]; - N [N [N [N [N [L; L]; N [L; L]]; - N [N [L; L]; N [L; L]]]; - N [N [N [L; L]; N [L; L]]; - N [N [L; ...]; ...]; ...]; ...]; ...]; - ...]; ...]; ...]; ...]; ...]; ...]; ...]; ...]; - ...] - -> [Building 3 8...done] -val tree_3_8: tree = - N [N [N [N [N [N [N [N [L; L; L]; N [L; L; L]; N [L; L; L]]; - N [N [L; L; L]; N [L; L; L]; N [L; L; L]]; - N [N [L; L; L]; N [L; L; L]; N [L; L; L]]]; - N [N [N [L; L; L]; N [L; L; L]; N [L; L; L]]; - N [N [L; L; L]; N [L; L; L]; N [L; L; L]]; - N [N [L; L; L]; N [L; L; L]; N [L; L; L]]]; - N [N [N [L; L; L]; N [L; L; L]; N [L; L; L]]; N ...; ...]; - ...]; ...]; ...]; ...]; ...] - -> [Building 4 8...done] -val tree_4_8: tree = - N [N [N [N [N [N [N [N [L; L; L; L]; N [L; L; L; L]; N [L; L; L; L]; - N [L; L; L; L]]; - N [N [L; L; L; L]; N [L; L; L; L]; N [L; L; L; L]; - N [L; L; L; L]]; - N [N [L; L; L; L]; N [L; L; L; L]; N [L; L; L; L]; - N [L; L; L; L]]; - N [N [L; L; L; L]; N [L; L; L; L]; N [L; L; L; L]; - N [L; L; L; L]]]; - N [N [N [L; L; L; L]; N [L; L; ...]; ...]; ...]; ...]; ...]; - ...]; ...]; ...] - -> [Building 5 8...done] -val tree_5_8: tree = - N [N [N [N [N [N [N [N [L; L; L; L; L]; N [L; L; L; L; L]; N [L; L; L; L; L]; - N [L; L; L; L; L]; N [L; L; L; L; L]]; - N [N [L; L; L; L; L]; N [L; L; L; L; L]; N [L; L; L; L; L]; - N [L; L; L; L; L]; N [L; L; L; L; L]]; - N [N [L; L; L; L; L]; N [L; L; L; L; L]; N [L; L; L; L; L]; - N [L; L; L; L; L]; N [L; L; L; L; L]]; N ...; ...]; ...]; - ...]; ...]; ...]; ...] - -> [Building 6 8...done] -val tree_6_8: tree = - N [N [N [N [N [N [N [N [L; L; L; L; L; L]; N [L; L; L; L; L; L]; - N [L; L; L; L; L; L]; N [L; L; L; L; L; L]; - N [L; L; L; L; L; L]; N [L; L; L; L; L; L]]; - N [N [L; L; L; L; L; L]; N [L; L; L; L; L; L]; - N [L; L; L; L; L; L]; N [L; L; L; L; L; L]; - N [L; L; L; L; L; L]; N [L; L; L; L; L; L]]; - N [N [L; L; L; L; L; L; ...]; ...]; ...]; ...]; ...]; ...]; - ...]; ...] - -> [Building 5 3...done] -val tree_5_3: tree = - N [N [N [L; L; L; L; L]; N [L; L; L; L; L]; N [L; L; L; L; L]; - N [L; L; L; L; L]; N [L; L; L; L; L]]; - N [N [L; L; L; L; L]; N [L; L; L; L; L]; N [L; L; L; L; L]; - N [L; L; L; L; L]; N [L; L; L; L; L]]; - N [N [L; L; L; L; L]; N [L; L; L; L; L]; N [L; L; L; L; L]; - N [L; L; L; L; L]; N [L; L; L; L; L]]; N [N [L; L; L; L; ...]; ...]; - ...] - -> > type X = - | Var of int - | Bop of int * X * X -val generate: x: int -> X - -> val exps: X list = - [Bop (1, Var 0, Var 0); Var 2; - Bop (3, Bop (1, Var 0, Var 0), Bop (1, Var 0, Var 0)); Var 4; - Bop (5, Var 2, Bop (1, Var 0, Var 0)); Var 6; - Bop (7, Bop (3, Bop (1, Var 0, Var 0), Bop (1, Var 0, Var 0)), Var 2); - Var 8; - Bop (9, Var 4, Bop (3, Bop (1, Var 0, Var 0), Bop (1, Var 0, Var 0))); - Var 10; - Bop - (213, Var 106, - Bop - (71, - Bop - (35, Bop (17, Var 8, Bop (5, Var 2, Bop (1, Var 0, Var 0))), - Bop (11, ..., ...)), ...)); ...] - -> module Exprs = - val x1: X = - Bop - (213, Var 106, - Bop - (71, - Bop - (35, Bop (17, Var 8, Bop (5, Var 2, Bop (1, Var 0, Var 0))), - Bop - (11, Bop (5, Var 2, Bop (1, Var 0, Var 0)), - Bop (3, Bop (1, Var 0, Var 0), Bop (1, Var 0, Var 0)))), - Bop - (23, - Bop - (11, Bop (5, Var 2, Bop (1, Var 0, Var 0)), - Bop (3, Bop (1, Var 0, Var 0), Bop (1, Var 0, Var 0))), - Bop - (7, Bop (3, Bop (1, Var 0, Var 0), Bop (1, Var 0, Var 0)), - Var 2)))) - val x2: X = Var 21342314 - val x3: X = Var 3214 - val x4: X = Bop (1231357, Var 615678, Var 410452) - val x5: X = - Bop - (5234547, Bop (2617273, Var 1308636, Var 872424), - Bop (1744849, Var 872424, Var 581616)) - val x6: X = - Bop - (923759825, Var 461879912, Bop (307919941, Var 153959970, Var 102639980)) - val x7: X = Var 2435234 - val x8: X = - Bop - (12396777, Var 6198388, - Bop - (4132259, - Bop - (2066129, Var 1033064, - Bop - (688709, Var 344354, - Bop - (229569, Var 114784, - Bop - (76523, - Bop - (38261, Var 19130, - Bop - (12753, Var 6376, - Bop - (4251, Bop (2125, Var 1062, Var 708), - Bop (1417, Var 708, Var 472)))), - Bop - (25507, - Bop - (12753, Var 6376, - Bop - (4251, Bop (2125, Var 1062, Var 708), - Bop (1417, Var 708, Var 472))), Var 8502))))), - Bop - (1377419, - Bop - (688709, Var 344354, - Bop - (229569, Var 114784, - Bop - (76523, - Bop - (38261, Var 19130, - Bop - (12753, Var 6376, - Bop - (4251, Bop (2125, Var 1062, Var 708), - Bop (1417, Var 708, Var 472)))), - Bop (25507, ..., ...)))), ...))) - val x9: X = - Bop - (3333333, Var 1666666, - Bop - (1111111, - Bop - (555555, Bop (277777, Var 138888, Var 92592), - Bop (185185, Var 92592, Var 61728)), Var 370370)) - val x10: X = - Bop - (1312311237, Var 656155618, - Bop - (437437079, - Bop - (218718539, - Bop - (109359269, Var 54679634, - Bop - (36453089, Var 18226544, - Bop - (12151029, Var 6075514, - Bop - (4050343, - Bop - (2025171, Bop (1012585, Var 506292, Var 337528), - Bop - (675057, Var 337528, - Bop - (225019, - Bop - (112509, Var 56254, - Bop - (37503, - Bop - (18751, - Bop - (9375, - Bop - (4687, - Bop - (2343, - Bop - (1171, - Bop - (585, Var 292, - Bop - (195, - Bop - (97, Var 48, - Var 32), - Bop - (65, Var 32, - Bop - (21, Var 10, - Bop - (7, - Bop - (3, - Bop - (1, - Var - 0, - Var - 0), - Bop - (1, - Var - 0, - Var - 0)), - Var 2))))), - Var 390), - Bop - (781, Var 390, Var 260)), - Var 1562), ...), ...), ...)), - ...))), ...)))), ...), ...)) - val x11: X = - Bop - (2147483647, - Bop - (1073741823, - Bop - (536870911, - Bop - (268435455, - Bop - (134217727, - Bop - (67108863, - Bop - (33554431, - Bop - (16777215, - Bop - (8388607, - Bop - (4194303, - Bop - (2097151, - Bop - (1048575, - Bop - (524287, - Bop - (262143, - Bop - (131071, - Bop - (65535, - Bop - (32767, - Bop - (16383, - Bop - (8191, - Bop - (4095, - Bop - (2047, - Bop - (1023, - Bop - (511, - Bop - (255, - Bop - (127, - Bop - (63, - Bop - (31, - Bop - (15, - Bop - (7, - Bop - (3, - Bop - (1, - Var - 0, - Var - 0), - Bop - (1, - Var - 0, - Var - 0)), - Var - 2), - Bop - (5, - Var - 2, - Bop - (1, - Var - 0, - Var - 0))), - Var - 10), - Bop - (21, - Var - 10, - Bop - (7, - Bop - (3, - Bop - (1, - Var - 0, - Var - 0), - ...), - ...))), - ...), - ...), - ...), - ...), - ...), ...), - ...), ...), ...), - ...), ...), ...), ...), - ...), ...), ...), ...), ...), ...), - ...), ...), ...), ...), ...), ...) - -> type C = - new: x: string -> C - override ToString: unit -> string -val c1: C = -val csA: C[] = - [|; ; - ; ; - ; ; - ; ; - ; ; - ; ; - ; ; - ; ; - ; ; - ; ; - ; ; - ; ; - ; ; - ; ; - ; ; - ; ; - ; ; - ; ; - ; ; - ; ; - ; ; - ; ; - ; ; - ; ; - ; ; - ; ; - ; ; - ; ; - ; ; - ; ; - ; ; - ; ; - ; ; - ; ; - ; ; - ; ; - ; ; - ; ; - ; ; - ; ; - ; ; - ; ; - ; ; - ; ; - ; ; - ; ; - ; ; - ; ; - ; ; - ; ; ...|] -val csB: C[] = - [|; ; - ; ; - ; ; - ; ; - ; ; - ; ; - ; ; - ; ; - ; ; - ; ; - ; ; - ; ; - ; ; - ; ; - ; ; - ; ; - ; ; - ; ; - ; ; - ; ; - ; ; - ; ; - ; ; - ; ; - ; ; - ; ; - ; ; - ; ; - ; ; - ; ; - ; ; - ; ; - ; ; - ; ; - ; ; - ; ; - ; ; - ; ; - ; ; - ; ; - ; ; - ; ; - ; ; - ; ; - ; ; - ; ; - ; ; - ; ; - ; ; - ; ; ...|] -val csC: C[] = - [|; ; - ; ; - ; ; - ; ; - ; ; - ; ; - ; ; - ; ; - ; ; - ; ; - ; ; - ; ; - ; ; - ; ; - ; ; - ; ; - ; ; - ; ; - ; ; - ; ; - ; ; - ; ; - ; ; - ; ; - ; ; - ; ; - ; ; - ; ; - ; ; - ; ; - ; ; - ; ; - ; ; - ; ; - ; ; - ; ; - ; ; - ; ; - ; ; - ; ; - ; ; - ; ; - ; ; - ; ; - ; ; - ; ; - ; ; - ; ; - ; ; - ; ; ...|] - -> exception Abc - -> exception AbcInt of int - -> exception AbcString of string - -> exception AbcExn of exn list - -> exception AbcException of System.Exception list - -> val exA1: exn = Abc -val exA2: exn = AbcInt 2 -val exA3: exn = AbcString "3" -val exA4: exn = AbcExn [Abc; AbcInt 2; AbcString "3"] -val exA5: exn = AbcException [AbcExn [Abc; AbcInt 2; AbcString "3"]] -exception Ex0 -exception ExUnit of unit -exception ExUnits of unit * unit -exception ExUnitOption of unit option -val ex0: exn = Ex0 -val exU: exn = ExUnit () -val exUs: exn = ExUnits ((), ()) -val exUSome: exn = ExUnitOption (Some ()) -val exUNone: exn = ExUnitOption None -type 'a T4063 = | AT4063 of 'a - -> val valAT3063_12: int T4063 = AT4063 12 - -> val valAT3063_True: bool T4063 = AT4063 true - -> val valAT3063_text: string T4063 = AT4063 "text" - -> val valAT3063_null: System.Object T4063 = AT4063 null - -> type M4063<'a> = - new: x: 'a -> M4063<'a> - -> val v4063: M4063 - -> type Taaaaa<'a> = - new: unit -> Taaaaa<'a> - -> type Taaaaa2<'a> = - inherit Taaaaa<'a> - new: unit -> Taaaaa2<'a> - member M: unit -> Taaaaa2<'a> - -> type Tbbbbb<'a> = - new: x: 'a -> Tbbbbb<'a> - member M: unit -> 'a - -> type Tbbbbb2 = - inherit Tbbbbb - new: x: string -> Tbbbbb2 - -> val it: (unit -> string) = - -> module RepeatedModule = - val repeatedByteLiteral: byte[] = [|12uy; 13uy; 14uy|] - -> module RepeatedModule = - val repeatedByteLiteral: byte[] = [|12uy; 13uy; 14uy|] - -> val it: string = "Check #help" - -> - F# Interactive directives: - - #r "file.dll";; // Reference (dynamically load) the given DLL - #i "package source uri";; // Include package source uri when searching for packages - #I "path";; // Add the given search path for referenced DLLs - #load "file.fs" ...;; // Load the given file(s) as if compiled and referenced - #time ["on"|"off"];; // Toggle timing on/off - #help;; // Display help - #quit;; // Exit - - F# Interactive command line options: - - - -> val it: string = "Check #time on and then off" - -> ---> Timing now on - -> ---> Timing now off - -> val it: string = "Check #unknown command" - -> val it: string = - "Check #I with a known directory (to avoid a warning, which includes the location of this file, which is fragile...)" - -> ---> Added '/' to library include path - -> type internal T1 = - | A - | B - -> type internal T2 = - { x: int } - -> type internal T3 - -> type internal T4 = - new: unit -> T4 - -> type T1 = - internal | A - | B - -> type T2 = - internal { x: int } - -> type private T1 = - | A - | B - -> type private T2 = - { x: int } - -> type T1 = - private | A - | B - -> type T2 = - private { x: int } - -> type internal T1 = - private | A - | B - -> type internal T2 = - private { x: int } - -> type private T3 - -> type private T4 = - new: unit -> T4 - -> exception X1 of int - -> exception private X2 of int - -> exception internal X3 of int - -> type T0 = - new: unit -> T0 -type T1Post<'a> = - new: unit -> T1Post<'a> -type 'a T1Pre = - new: unit -> 'a T1Pre - -> type T0 with - member M: unit -> T0 list -type T0 with - member P: T0 * T0 -type T0 with - member E: IEvent - -> type T1Post<'a> with - member M: unit -> T1Post<'a> list -type T1Post<'a> with - member P: T1Post<'a> * T1Post<'a> -type T1Post<'a> with - member E: IEvent - -> type 'a T1Pre with - member M: unit -> 'a T1Pre list -type 'a T1Pre with - member P: 'a T1Pre * 'a T1Pre -type 'a T1Pre with - member E: IEvent - -> type T1Post<'a> with - member M: unit -> T1Post<'a> list -type T1Post<'a> with - member P: T1Post<'a> * T1Post<'a> -type T1Post<'a> with - member E: IEvent - -> type 'a T1Pre with - member M: unit -> 'a T1Pre list -type 'a T1Pre with - member P: 'a T1Pre * 'a T1Pre -type 'a T1Pre with - member E: IEvent - -> type r = - { - f0: int - f1: int - f2: int - f3: int - f4: int - f5: int - f6: int - f7: int - f8: int - f9: int - } -val r10: r = { f0 = 0 - f1 = 1 - f2 = 2 - f3 = 3 - f4 = 4 - f5 = 5 - f6 = 6 - f7 = 7 - f8 = 8 - f9 = 9 } -val r10s: r[] = - [|{ f0 = 0 - f1 = 1 - f2 = 2 - f3 = 3 - f4 = 4 - f5 = 5 - f6 = 6 - f7 = 7 - f8 = 8 - f9 = 9 }; { f0 = 0 - f1 = 1 - f2 = 2 - f3 = 3 - f4 = 4 - f5 = 5 - f6 = 6 - f7 = 7 - f8 = 8 - f9 = 9 }; { f0 = 0 - f1 = 1 - f2 = 2 - f3 = 3 - f4 = 4 - f5 = 5 - f6 = 6 - f7 = 7 - f8 = 8 - f9 = 9 }; { f0 = 0 - f1 = 1 - f2 = 2 - f3 = 3 - f4 = 4 - f5 = 5 - f6 = 6 - f7 = 7 - f8 = 8 - f9 = 9 }; { f0 = 0 - f1 = 1 - f2 = 2 - f3 = 3 - f4 = 4 - f5 = 5 - f6 = 6 - f7 = 7 - f8 = 8 - f9 = 9 }; ...|] -val r10s': string * r[] = - ("one extra node", - [|{ f0 = 0 - f1 = 1 - f2 = 2 - f3 = 3 - f4 = 4 - f5 = 5 - f6 = 6 - f7 = 7 - f8 = 8 - f9 = 9 }; { f0 = 0 - f1 = 1 - f2 = 2 - f3 = 3 - f4 = 4 - f5 = 5 - f6 = 6 - f7 = 7 - f8 = 8 - f9 = 9 }; { f0 = 0 - f1 = 1 - f2 = 2 - f3 = 3 - f4 = 4 - f5 = 5 - f6 = 6 - f7 = 7 - f8 = 8 - f9 = 9 }; { f0 = 0 - f1 = 1 - f2 = 2 - f3 = 3 - f4 = 4 - f5 = 5 - f6 = 6 - f7 = 7 - f8 = 8 - f9 = 9 }; { f0 = 0 - f1 = 1 - f2 = 2 - f3 = 3 - f4 = 4 - f5 = 5 - f6 = 6 - f7 = 7 - f8 = 8 - f9 = ... }; ...|]) - -> val x1564_A1: int = 1 - - ---> Added '\' to library include path - -val x1564_A2: int = 2 - - ---> Added '\' to library include path - -val x1564_A3: int = 3 - -> type internal Foo2 = - private new: x: int * y: int * z: int -> Foo2 + 3 overloads - member Prop1: int - member Prop2: int - member private Prop3: int - -> module internal InternalM = - val x: int = 1 - type Foo2 = - private new: x: int * y: int * z: int -> Foo2 + 3 overloads - member Prop1: int - member Prop2: int - member private Prop3: int - type private Foo3 = - new: x: int * y: int * z: int -> Foo3 + 3 overloads - member Prop1: int - member Prop2: int - member Prop3: int - type T1 = - | A - | B - type T2 = - { x: int } - type T3 - type T4 = - new: unit -> T4 - type T5 = - | A - | B - type T6 = - { x: int } - type private T7 = - | A - | B - type private T8 = - { x: int } - type T9 = - private | A - | B - type T10 = - private { x: int } - type T11 = - private | A - | B - type T12 = - private { x: int } - type private T13 - type private T14 = - new: unit -> T14 -module internal PrivateM = - val private x: int = 1 - type private Foo2 = - new: x: int * y: int * z: int -> Foo2 + 3 overloads - member Prop1: int - member Prop2: int - member Prop3: int - type T1 = - | A - | B - type T2 = - { x: int } - type T3 - type T4 = - new: unit -> T4 - type T5 = - | A - | B - type T6 = - { x: int } - type private T7 = - | A - | B - type private T8 = - { x: int } - type T9 = - private | A - | B - type T10 = - private { x: int } - type T11 = - private | A - | B - type T12 = - private { x: int } - type private T13 - type private T14 = - new: unit -> T14 - -> val it: seq = - seq - [(43, "10/28/2008", 1); (46, "11/18/2008", 1); (56, "1/27/2009", 2); - (58, "2/10/2009", 1)] - -> module Test4343a = - val mk: i: int -> string - val x100: string = - "0123456789012345678901234567890123456789012345678901234567890"+[39 chars] - val x90: string = - "0123456789012345678901234567890123456789012345678901234567890"+[29 chars] - val x80: string = - "0123456789012345678901234567890123456789012345678901234567890"+[19 chars] - val x75: string = - "0123456789012345678901234567890123456789012345678901234567890"+[14 chars] - val x74: string = - "0123456789012345678901234567890123456789012345678901234567890"+[13 chars] - val x73: string = - "0123456789012345678901234567890123456789012345678901234567890"+[12 chars] - val x72: string = - "012345678901234567890123456789012345678901234567890123456789012345678901" - val x71: string = - "01234567890123456789012345678901234567890123456789012345678901234567890" - val x70: string = - "0123456789012345678901234567890123456789012345678901234567890123456789" -module Test4343b = - val fA: x: int -> int - val fB: x: 'a -> y: 'a -> 'a list - val gA: (int -> int) - val gB: ('a -> 'a -> 'a list) - val gAB: (int -> int) * ('a -> 'a -> 'a list) - val hB: ('a -> 'a -> 'a list) - val hA: (int -> int) -module Test4343c = - val typename<'a> : string - val typename2<'a> : string * string -module Test4343d = - val xList: int list = [1; 2; 3] - val xArray: int[] = [|1; 2; 3|] - val xString: string = "abcdef" - val xOption: int option = Some 12 - val xArray2: (int * int)[,] = [[(0, 0); (0, 1)] - [(1, 0); (1, 1)]] - val xSeq: seq -module Test4343e = - type C = - new: x: int -> C - val cA: C - val cB: C - val cAB: C * C * C list = - (FSI_0091+Test4343e+C, FSI_0091+Test4343e+C, - [FSI_0091+Test4343e+C; FSI_0091+Test4343e+C]) - type D = - new: x: int -> D - override ToString: unit -> string - val dA: D = D(1) - val dB: D = D(2) - val dAB: D * D * D list = (D(1), D(2), [D(1); D(2)]) - module Generic = - type CGeneric<'a> = - new: x: 'a -> CGeneric<'a> - val cA: C - val cB: C - val cAB: C * C * C list = - (FSI_0091+Test4343e+C, FSI_0091+Test4343e+C, - [FSI_0091+Test4343e+C; FSI_0091+Test4343e+C]) - type D<'a> = - new: x: 'a -> D<'a> - override ToString: unit -> string - val dA: D = D(1) - val dB: D = D(2) - val dAB: D * D * D list = (D(1), D(2), [D(1); D(2)]) - val dC: D = D(True) - val boxed_dABC: obj list = [D(1); D(2); D(True)] -type F1 = - inherit System.Windows.Forms.Form - interface System.IDisposable - val x: F1 - val x2: F1 - member B: unit -> int - member D: x: int -> int + 2 overloads - abstract MMM: bool -> bool - override ToString: unit -> string - static member A: unit -> int - static member C: unit -> int - abstract AAA: int - abstract BBB: bool with set - member D2: int - member E: int - abstract ZZZ: int - static val mutable private sx: F1 - static val mutable private sx2: F1 -[] -type IP = - new: x: int * y: int -> IP - static val mutable private AA: IP -module Regression4643 = - [] - type RIP = - new: x: int -> RIP - static val mutable private y: RIP - [] - type arg_unused_is_RIP = - new: x: RIP -> arg_unused_is_RIP - [] - type arg_used_is_RIP = - new: x: RIP -> arg_used_is_RIP - member X: RIP - [] - type field_is_RIP = - val x: RIP -type Either<'a,'b> = - | This of 'a - | That of 'b -val catch: f: (unit -> 'a) -> Either<'a,(string * string)> -val seqFindIndexFailure: Either = - That - ("System.Collections.Generic.KeyNotFoundException", - "An index satisfying the predicate was not found in the collection.") -val seqFindFailure: Either = - That - ("System.Collections.Generic.KeyNotFoundException", - "An index satisfying the predicate was not found in the collection.") -val seqPickFailure: Either = - That - ("System.Collections.Generic.KeyNotFoundException", - "An index satisfying the predicate was not found in the collection.") -module Regression5218 = - val t1: int = 1 - val t2: int * int = (1, 2) - val t3: int * int * int = (1, 2, 3) - val t4: int * int * int * int = (1, 2, 3, 4) - val t5: int * int * int * int * int = (1, 2, 3, 4, 5) - val t6: int * int * int * int * int * int = (1, 2, 3, 4, 5, 6) - val t7: int * int * int * int * int * int * int = (1, 2, 3, 4, 5, 6, 7) - val t8: int * int * int * int * int * int * int * int = - (1, 2, 3, 4, 5, 6, 7, 8) - val t9: int * int * int * int * int * int * int * int * int = - (1, 2, 3, 4, 5, 6, 7, 8, 9) - val t10: int * int * int * int * int * int * int * int * int * int = - (1, 2, 3, 4, 5, 6, 7, 8, 9, 10) - val t11: int * int * int * int * int * int * int * int * int * int * int = - (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11) - val t12: - int * int * int * int * int * int * int * int * int * int * int * int = - (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12) - val t13: - int * int * int * int * int * int * int * int * int * int * int * int * - int = (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13) - val t14: - int * int * int * int * int * int * int * int * int * int * int * int * - int * int = (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14) - val t15: - int * int * int * int * int * int * int * int * int * int * int * int * - int * int * int = (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) - -> module Regression3739 = - type IB = - abstract AbstractMember: int -> int - type C<'a when 'a :> IB> = - new: unit -> C<'a> - static member StaticMember: x: 'a -> int - -> module Regression3739 = - type IB = - abstract AbstractMember: int -> int - type C<'a when 'a :> IB> = - new: unit -> C<'a> - static member StaticMember: x: 'a -> int - -> module Regression3740 = - type Writer<'a> = - abstract get_path: unit -> string - type MyClass = - interface Writer - val path: string - -> type Regression4319_T2 = - static member (+-+-+) : x: 'a * y: 'b -> string - -> type Regression4319_T0 = - static member (+-+-+) : string - -> type Regression4319_T1 = - static member (+-+-+) : x: 'a -> string - -> type Regression4319_T1b = - static member (+-+-+) : x: 'a -> string - -> type Regression4319_T1c = - static member (+-+-+) : x: ('a * 'b) -> string - -> type Regression4319_T1d = - static member (+-+-+) : x: (int * int) -> string - -> type Regression4319_T3 = - static member (+-+-+) : x: 'a * y: 'b * z: 'c -> string - -> type Regression4319_U1 = - static member (+-+-+) : x: 'a -> moreArgs: 'b -> string - -> type Regression4319_U1b = - static member (+-+-+) : x: 'a -> moreArgs: 'b -> string - -> type Regression4319_U2 = - static member (+-+-+) : x: 'a * y: 'b -> moreArgs: 'c -> string - -> type Regression4319_U3 = - static member (+-+-+) : x: 'a * y: 'b * z: 'c -> moreArgs: 'd -> string - -> type Regression4319_check = - static member (&) : string - static member (&^) : string - static member (@) : string - static member (!=) : string - static member (:=) : string - static member (^) : string - static member (/) : string - static member ($) : string - static member (...@) : string - static member (...!=) : string - static member (.../) : string - static member (...=) : string - static member (...>) : string - static member (...^) : string - static member (...<) : string - static member ( ...* ) : string - static member (...%) : string - static member (=) : string - static member ( ** ) : string - static member (>) : string - static member (<) : string - static member (%) : string - static member ( * ) : string - static member (-) : string - -> Expect ABC = ABC -type Regression4469 = - new: unit -> Regression4469 - member ToString: unit -> string -val r4469: Regression4469 = FSI_0107+Regression4469 -val it: unit = () - -> Expect ABC = ABC -val it: unit = () - -> module Regression1019_short = - val double_nan: float = nan - val double_infinity: float = infinity - val single_nan: float32 = nanf - val single_infinity: float32 = infinityf -module Regression1019_long = - val double_nan: float = nan - val double_infinity: float = infinity - val single_nan: float32 = nanf - val single_infinity: float32 = infinityf - -> val it: int ref = { contents = 1 } - -> val x: int ref = { contents = 1 } -val f: (unit -> int) - -> val it: int = 1 - -> val it: unit = () - -> val it: int = 3 - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: 'a list - -> val it: 'a list list - -> val it: 'a option - -> val it: 'a list * 'b list - -> val it: x: 'a -> 'a - -> val fff: x: 'a -> 'a - -> val it: ('a -> 'a) - -> val note_ExpectDupMethod: string = - "Regression4927: Expect error due to duplicate methods in the "+[20 chars] - -> > val note_ExpectDupProperty: string = - "Regression4927: Expect error due to duplicate properties in t"+[23 chars] - -> > > val it: string = "NOTE: Expect IAPrivate less accessible IBPublic" - -> > val it: string = "NOTE: Expect IAPrivate less accessible IBInternal" - -> > module Regression5265_PriPri = - type private IAPrivate = - abstract P: int - type private IBPrivate = - inherit IAPrivate - abstract Q: int - -> val it: string = "NOTE: Expect IAInternal less accessible IBPublic" - -> > module Regression5265_IntInt = - type internal IAInternal = - abstract P: int - type internal IBInternal = - inherit IAInternal - abstract Q: int - -> module Regression5265_IntPri = - type internal IAInternal = - abstract P: int - type private IBPrivate = - inherit IAInternal - abstract Q: int - -> module Regression5265_PubPub = - type IAPublic = - abstract P: int - type IBPublic = - inherit IAPublic - abstract Q: int - -> module Regression5265_PubInt = - type IAPublic = - abstract P: int - type internal IBInternal = - inherit IAPublic - abstract Q: int - -> module Regression5265_PubPri = - type IAPublic = - abstract P: int - type private IBPrivate = - inherit IAPublic - abstract Q: int - -> val it: string = - "Regression4232: Expect an error about duplicate virtual methods from parent type" - -> > val it: string = - "** Expect AnAxHostSubClass to be accepted. AxHost has a newslot virtual RightToLeft property outscope RightToLeft on Control" - -> type AnAxHostSubClass = - inherit System.Windows.Forms.AxHost - new: x: string -> AnAxHostSubClass - -> val it: string = - "** Expect error because the active pattern result contains free type variables" - -> > val it: string = - "** Expect error because the active pattern result contains free type variables (match value generic)" - -> > val it: string = - "** Expect error because the active pattern result contains free type variables (when active pattern also has parameters)" - -> > val it: string = - "** Expect OK, since error message says constraint should work!" - -> val (|A|B|) : x: int -> Choice - -> val it: string = "** Expect error since active pattern is not a function!" - -> > val it: string = - "** Expect OK since active pattern result is not too generic, typars depend on match val" - -> val (|A|B|) : p: bool -> 'a * 'b -> Choice<'a,'b> - -> val it: string = - "** Expect OK since active pattern result is not too generic, typars depend on parameters" - -> val (|A|B|) : aval: 'a -> bval: 'b -> x: bool -> Choice<'a,'b> - -> val it: string = - "** Expect OK since active pattern result is generic, but it typar from closure, so OK" - -> val outer: x: 'a -> (int -> 'a option) - -> val it: string = - "** Expect OK, BUG 472278: revert unintended breaking change to Active Patterns in F# 3.0" - -> val (|Check1|) : a: int -> int * 'a option - -> > module ReflectionEmit = - type IA = - abstract M: #IB -> int - and IB = - abstract M: #IA -> int - type IA2<'a when 'a :> IB2<'a> and 'a :> IA2<'a>> = - abstract M: int - and IB2<'b when 'b :> IA2<'b> and 'b :> IB2<'b>> = - abstract M: int - -> val it: string = - "Regression_139182: Expect the follow code to be accepted without error" - -> [] -type S = - member TheMethod: unit -> int64 -val theMethod: s: S -> int64 -type T = - new: unit -> T - member Prop5: int64 - static member Prop1: int64 - static member Prop2: int64 - static member Prop3: int64 - static member Prop4: string - -> val it: System.Threading.ThreadLocal list = [0 {IsValueCreated = false; - Values = ?;}] - -> type MyDU = - | Case1 of Val1: int * Val2: string - | Case2 of string * V2: bool * float - | Case3 of int - | Case4 of Item1: bool - | Case5 of bool * string - | Case6 of Val1: int * bool * string - | Case7 of ``Big Name`` : int -val namedFieldVar1: MyDU = Case1 (5, "") -val namedFieldVar2: MyDU = Case7 25 - -> exception MyNamedException1 of Val1: int * Val2: string -exception MyNamedException2 of string * V2: bool * float -exception MyNamedException3 of Data: int -exception MyNamedException4 of bool -exception MyNamedException5 of int * string -exception MyNamedException6 of Val1: int * bool * string * Data8: float -exception MyNamedException7 of ``Big Named Field`` : int -val namedEx1: exn = MyNamedException1 (5, "") -val namedEx2: exn = MyNamedException7 25 - -> type optionRecord = - { x: int option } -val x: optionRecord = { x = None } - -> type optionRecord = - { x: obj } -val x: optionRecord = { x = null } - -> type RecordWithMembers = - { x: obj } - member Method: unit -> int - member Property: int - -> type UnionWithMembers = - | Case1 - | Case2 of int - member Method: unit -> int - member Property: int - -> type OneFieldRecordNoXmlDoc = - { OneField: obj } - -> type OneFieldRecordXmlDoc = - { - OneField: obj - } - -> type TwoFieldRecordNoXmlDoc = - { - TwoFields1: obj - TwoFields2: obj - } - -> type TwoFieldRecordXmlDoc = - { - TwoFields1: obj - TwoFields2: obj - } - -> type Int32 with - member ExtrinsicExtensionProperty: int -type Int32 with - member ExtrinsicExtensionMethod: unit -> int - -> val ``value with spaces in name`` : bool = true - -> val functionWhichTakesLongNameMixedParameters: - aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa: int * - bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb: int - -> ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc: int * - dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd: int - -> int - -> val functionWhichTakesLongNameTupledParameters: - aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa: int * - bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb: int * - ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc: int * - ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd: int - -> int - -> val functionWhichTakesLongNameCurriedParameters: - aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa: int - -> bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb: int - -> cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc: int - -> dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd: int - -> int - -> val functionWhichTakesMixedLengthCurriedParametersA: - a: 'a -> b: 'b -> c: 'c -> ddddddddddddddddddddddddddddddddddddddddddddd: 'd - -> int - -> val functionWhichTakesMixedLengthCurriedParametersB: - aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa: 'a -> b: 'b -> c: 'c -> d: 'd -> int - -> val f: ``parameter with spaces in name`` : int -> int - -> val functionWhichTakesAParameterPeeciselyPlusButNotOpAddition: - ``+`` : (int -> int -> int) -> int - -> val functionWhichTakesAParameterOpAddition: (+) : (int -> int -> int) -> int - -> val functionWhichTakesAParameterCalled_land: - ``land`` : (int -> int -> int) -> int - -> type RecordWithStrangeNames = - { - ``funky name`` : obj - op_Addition: obj - ``+`` : obj - ``land`` : obj - ``base`` : obj - } - -> type UnionWithSpacesInNamesOfCases = - | ``Funky name`` - | ``Funky name 2`` - -> type ``Type with spaces in name`` = - | A - | B - -> type op_Addition = - | A - | B - -> type ``land`` = - | A - | B - -> module ``Module with spaces in name`` = - val x: int = 1 - -> module op_Addition = - val x: int = 1 - -> module ``land`` = - val x: int = 1 - -> val ``+`` : x: 'a -> y: 'b -> int - -> val (+) : x: int -> y: int -> int - -> val ``base`` : int = 2 - -> val (mod) : int = 2 - -> val ``or`` : int = 2 - -> val ``land`` : int = 2 - -> val ``.ctor`` : int = 2 - -> val ``.cctor`` : int = 2 - -> [] -val SomeLiteralWithASomewhatLongName: string - = "SomeVeryLongLiteralValueWithLotsOfCharacters" -[] -val SomeLiteralWithASomewhatLongName2: string - = - "SomeVeryLongLiteralValueWithLotsOfCharactersSomeVeryLongLiteralValueWithLotsOfCharactersSomeVeryLongLiteralValueWithLotsOfCharacters" -[] -val ShortName: string = "hi" - -> val it: System.DayOfWeek = Tuesday - -> > > diff --git a/tests/fsharp/core/printing/z.output.test.200.stdout.47.bsl b/tests/fsharp/core/printing/z.output.test.200.stdout.47.bsl deleted file mode 100644 index 7937acddb6..0000000000 --- a/tests/fsharp/core/printing/z.output.test.200.stdout.47.bsl +++ /dev/null @@ -1,1961 +0,0 @@ - -> val it: unit = () - -> val repeatId: string = "A" - -> val repeatId: string = "B" - -namespace FSI_0005 - val x1: int - val x2: string - val x3: 'a option - val x4: int option - val x5: 'a list - val x6: int list - val x7: System.Windows.Forms.Form - val x8: int[,] - val x9: Lazy - -namespace FSI_0006 - val x1: int - val x2: string - val x3: 'a option - val x4: int option - val x5: 'a list - val x6: int list - val x7: System.Windows.Forms.Form - val x8: int[,] - val x9: Lazy - -namespace FSI_0006 - val x1: int - val x2: string - val x3: 'a option - val x4: int option - val x5: 'a list - val x6: int list - val x7: System.Windows.Forms.Form - val x8: int[,] - val x9: Lazy - -> val x1: seq -val x2: seq -val x3: seq -val f1: System.Windows.Forms.Form = System.Windows.Forms.Form, Text: f1 form -val fs: System.Windows.Forms.Form[] = - [|System.Windows.Forms.Form, Text: fs #0; - System.Windows.Forms.Form, Text: fs #1; - System.Windows.Forms.Form, Text: fs #2; - System.Windows.Forms.Form, Text: fs #3; - System.Windows.Forms.Form, Text: fs #4; - System.Windows.Forms.Form, Text: fs #5; - System.Windows.Forms.Form, Text: fs #6; - System.Windows.Forms.Form, Text: fs #7; - System.Windows.Forms.Form, Text: fs #8; - System.Windows.Forms.Form, Text: fs #9; - System.Windows.Forms.Form, Text: fs #10; - System.Windows.Forms.Form, Text: fs #11; - System.Windows.Forms.Form, Text: fs #12; - System.Windows.Forms.Form, Text: fs #13; - System.Windows.Forms.Form, Text: fs #14; - System.Windows.Forms.Form, Text: fs #15; - System.Windows.Forms.Form, Text: fs #16; - System.Windows.Forms.Form, Text: fs #17; - System.Windows.Forms.Form, Text: fs #18; - System.Windows.Forms.Form, Text: fs #19; ...|] -val xs: string list = - ["0"; "1"; "2"; "3"; "4"; "5"; "6"; "7"; "8"; "9"; "10"; "11"; "12"; "13"; - "14"; "15"; "16"; "17"; "18"; "19"; ...] -val xa: string[] = - [|"0"; "1"; "2"; "3"; "4"; "5"; "6"; "7"; "8"; "9"; "10"; "11"; "12"; "13"; - "14"; "15"; "16"; "17"; "18"; "19"; ...|] -val xa2: string[,] = [["0"; "1"; "2"; "3"; "4"; "5"; "6"; "7"] - ["10"; "11"; "12"; "13"; "14"; "15"; "16"; "17"] - ["20"; "21"; "22"; "23"; ...] - ...] -val sxs0: Set = set [] - -> val sxs1: Set = set ["0"] - -> val sxs2: Set = set ["0"; "1"] - -> val sxs3: Set = set ["0"; "1"; "2"] - -> val sxs4: Set = set ["0"; "1"; "2"; "3"] - -> val sxs200: Set = - set ["0"; "1"; "10"; "100"; "101"; "102"; "103"; "104"; "105"; ...] - -> val msxs0: Map = map [] - -> val msxs1: Map = map [(0, "0")] - -> val msxs2: Map = map [(0, "0"); (1, "1")] - -> val msxs3: Map = map [(0, "0"); (1, "1"); (2, "2")] - -> val msxs4: Map = map [(0, "0"); (1, "1"); (2, "2"); (3, "3")] - -> val msxs200: Map = - map - [(0, "0"); (1, "1"); (2, "2"); (3, "3"); (4, "4"); (5, "5"); (6, "6"); - (7, "7"); (8, "8"); ...] - -> module M = - val a: string = "sub-binding" - val b: - (seq * seq * seq * System.Windows.Forms.Form) option * - (string list * string list * string[,]) option = - (Some (, , , System.Windows.Forms.Form, Text: f1 form), - Some - (["0"; "1"; "2"; "3"; "4"; "5"; "6"; "7"; "8"; "9"; "10"; "11"; "12"; - "13"; "14"; "15"; "16"; ...], ..., ...)) -type T = - new: a: int * b: int -> T - member AMethod: x: int -> int - static member StaticMethod: x: int -> int - member AProperty: int - static member StaticProperty: int -val f_as_method: x: int -> int -val f_as_thunk: (int -> int) -val refCell: string ref = { contents = "value" } -module D1 = - val words: System.Collections.Generic.IDictionary - val words2000: System.Collections.Generic.IDictionary - -> > module D2 = - val words: IDictionary - val words2000: IDictionary -val opt1: 'a option -val opt1b: int option = None -val opt4: 'a option option option option -val opt4b: int option option option option = Some (Some (Some None)) -val opt5: int list option option option option option list = - [Some (Some (Some (Some None))); - Some (Some (Some (Some (Some [1; 2; 3; 4; 5; 6])))); - Some (Some (Some (Some ...))); ...] -val mkStr: n: int -> string -val strs: string[] = - [|""; "-"; "--"; "---"; "----"; "-----"; "------"; "-------"; "--------"; - "---------"; "----------"; "-----------"; "------------"; "-------------"; - "--------------"; "---------------"; "----------------"; - "-----------------"; "------------------"; "-------------------"; ...|] -val str7s: string[] = - [|""; "-------"; "--------------"; "---------------------"; - "----------------------------"; "-----------------------------------"; - "------------------------------------------"; - "-------------------------------------------------"; - "--------------------------------------------------------"; - "---------------------------------------------------------------"; - "----------------------------------------------------------------------"; - "-------------------------------------------------------------"+[16 chars]; - "-------------------------------------------------------------"+[23 chars]; - "-------------------------------------------------------------"+[30 chars]; - "-------------------------------------------------------------"+[37 chars]; - "-------------------------------------------------------------"+[44 chars]; - "-------------------------------------------------------------"+[51 chars]; - "-------------------------------------------------------------"+[58 chars]; - "-------------------------------------------------------------"+[65 chars]; - "-------------------------------------------------------------"+[72 chars]; - ...|] -val grids: string[,] = - [[""; ""; ""; ""; ""; ""; ""; ""; ""; ""; ""; ""; ""; ""; ""; ""; ""; ""; ""; - ""; ...] - ...] - -> type tree = - | L - | N of tree list -val mkT: w: int -> d: int -> tree -val tree: w: int -> d: int -> tree - -> [Building 2 4...done] -val tree_2_4: tree = - N [N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]; - N [N [N [L; ...]; ...]; ...]; ...] - -> [Building 2 6...done] -val tree_2_6: tree = - N [N [N [N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L]]]; N [N ...; ...]; - ...]; ...]; ...] - -> [Building 2 8...done] -val tree_2_8: tree = - N [N [N [N [N [N [N [N [L; L]; N [L; L]]; N [N [L; L]; N [L; L; ...]; ...]; - ...]; ...]; ...]; ...]; ...]; ...] - -> [Building 2 10...done] -val tree_2_10: tree = - N [N [N [N [N [N [N [N [N [N [L; L]; N [L; L]]; N [N [L; L]; N ...; ...]; - ...]; ...]; ...]; ...]; ...]; ...]; ...]; ...] - -> [Building 2 12...done] -val tree_2_12: tree = - N [N [N [N [N [N [N [N [N [N [N [N [L; L]; N [L; L]]; N [N [L; ...]; ...]; - ...]; ...]; ...]; ...]; ...]; ...]; ...]; ...]; - ...]; ...] - -> [Building 2 14...done] -val tree_2_14: tree = - N [N [N [N [N [N [N [N [N [N [N [N [N [N [L; L]; N [L; L]]; N ...; ...]; ...]; - ...]; ...]; ...]; ...]; ...]; ...]; ...]; ...]; - ...]; ...] - -> [Building 3 8...done] -val tree_3_8: tree = - N [N [N [N [N [N [N [N [L; L; L]; N [L; L; L]; N [L; L; L]]; N ...; ...]; - ...]; ...]; ...]; ...]; ...] - -> [Building 4 8...done] -val tree_4_8: tree = - N [N [N [N [N [N [N [N [L; L; L; L]; N [L; L; L; L]; N [L; L; ...]; ...]; - ...]; ...]; ...]; ...]; ...]; ...] - -> [Building 5 8...done] -val tree_5_8: tree = - N [N [N [N [N [N [N [N [L; L; L; L; L]; N [L; L; L; L; L]; N ...; ...]; ...]; - ...]; ...]; ...]; ...]; ...] - -> [Building 6 8...done] -val tree_6_8: tree = - N [N [N [N [N [N [N [N [L; L; L; L; L; L]; N [L; L; L; L; L; ...]; ...]; ...]; - ...]; ...]; ...]; ...]; ...] - -> [Building 5 3...done] -val tree_5_3: tree = - N [N [N [L; L; L; L; L]; N [L; L; L; L; L]; N [L; L; L; L; L; ...]; ...]; - ...] - -> > type X = - | Var of int - | Bop of int * X * X -val generate: x: int -> X - -> val exps: X list = - [Bop (1, Var 0, Var 0); Var 2; - Bop (3, Bop (1, Var 0, Var 0), Bop (1, Var 0, ...)); ...] - -> module Exprs = - val x1: X = - Bop - (213, Var 106, - Bop - (71, - Bop (35, Bop (17, Var 8, Bop (5, Var 2, Bop (1, Var 0, ...))), ...), - ...)) - val x2: X = Var 21342314 - val x3: X = Var 3214 - val x4: X = Bop (1231357, Var 615678, Var 410452) - val x5: X = - Bop - (5234547, Bop (2617273, Var 1308636, Var 872424), - Bop (1744849, Var 872424, Var 581616)) - val x6: X = - Bop - (923759825, Var 461879912, Bop (307919941, Var 153959970, Var 102639980)) - val x7: X = Var 2435234 - val x8: X = - Bop - (12396777, Var 6198388, - Bop - (4132259, - Bop - (2066129, Var 1033064, - Bop - (688709, Var 344354, - Bop (229569, Var 114784, Bop (76523, ..., ...)))), ...)) - val x9: X = - Bop - (3333333, Var 1666666, - Bop - (1111111, - Bop - (555555, Bop (277777, Var 138888, Var 92592), - Bop (185185, Var 92592, Var 61728)), ...)) - val x10: X = - Bop - (1312311237, Var 656155618, - Bop - (437437079, - Bop - (218718539, - Bop - (109359269, Var 54679634, - Bop (36453089, Var 18226544, Bop (12151029, Var 6075514, ...))), - ...), ...)) - val x11: X = - Bop - (2147483647, - Bop - (1073741823, - Bop - (536870911, - Bop - (268435455, - Bop - (134217727, - Bop - (67108863, - Bop - (33554431, - Bop - (16777215, - Bop (8388607, Bop (4194303, ..., ...), ...), ...), - ...), ...), ...), ...), ...), ...), ...) - -> type C = - new: x: string -> C - override ToString: unit -> string -val c1: C = -val csA: C[] = - [|; ; - ; ; - ; ; - ; ; - ; ; - ; ; - ; ; - ; ; - ; ; - ; ; ...|] -val csB: C[] = - [|; ; - ; ; - ; ; - ; ; - ; ; - ; ; - ; ; - ; ; - ; ; - ; ; ...|] -val csC: C[] = - [|; ; - ; ; - ; ; - ; ; - ; ; - ; ; - ; ; - ; ; - ; ; - ; ; ...|] - -> exception Abc - -> exception AbcInt of int - -> exception AbcString of string - -> exception AbcExn of exn list - -> exception AbcException of System.Exception list - -> val exA1: exn = Abc -val exA2: exn = AbcInt 2 -val exA3: exn = AbcString "3" -val exA4: exn = AbcExn [Abc; AbcInt 2; AbcString "3"] -val exA5: exn = AbcException [AbcExn [Abc; AbcInt 2; AbcString "3"]] -exception Ex0 -exception ExUnit of unit -exception ExUnits of unit * unit -exception ExUnitOption of unit option -val ex0: exn = Ex0 -val exU: exn = ExUnit () -val exUs: exn = ExUnits ((), ()) -val exUSome: exn = ExUnitOption (Some ()) -val exUNone: exn = ExUnitOption None -type 'a T4063 = | AT4063 of 'a - -> val valAT3063_12: int T4063 = AT4063 12 - -> val valAT3063_True: bool T4063 = AT4063 true - -> val valAT3063_text: string T4063 = AT4063 "text" - -> val valAT3063_null: System.Object T4063 = AT4063 null - -> type M4063<'a> = - new: x: 'a -> M4063<'a> - -> val v4063: M4063 - -> type Taaaaa<'a> = - new: unit -> Taaaaa<'a> - -> type Taaaaa2<'a> = - inherit Taaaaa<'a> - new: unit -> Taaaaa2<'a> - member M: unit -> Taaaaa2<'a> - -> type Tbbbbb<'a> = - new: x: 'a -> Tbbbbb<'a> - member M: unit -> 'a - -> type Tbbbbb2 = - inherit Tbbbbb - new: x: string -> Tbbbbb2 - -> val it: (unit -> string) = - -> module RepeatedModule = - val repeatedByteLiteral: byte[] = [|12uy; 13uy; 14uy|] - -> module RepeatedModule = - val repeatedByteLiteral: byte[] = [|12uy; 13uy; 14uy|] - -> val it: string = "Check #help" - -> - F# Interactive directives: - - #r "file.dll";; // Reference (dynamically load) the given DLL - #i "package source uri";; // Include package source uri when searching for packages - #I "path";; // Add the given search path for referenced DLLs - #load "file.fs" ...;; // Load the given file(s) as if compiled and referenced - #time ["on"|"off"];; // Toggle timing on/off - #help;; // Display help - #quit;; // Exit - - F# Interactive command line options: - - - -> val it: string = "Check #time on and then off" - -> ---> Timing now on - -> ---> Timing now off - -> val it: string = "Check #unknown command" - -> val it: string = - "Check #I with a known directory (to avoid a warning, which includes the location of this file, which is fragile...)" - -> ---> Added '/' to library include path - -> type internal T1 = - | A - | B - -> type internal T2 = - { x: int } - -> type internal T3 - -> type internal T4 = - new: unit -> T4 - -> type T1 = - internal | A - | B - -> type T2 = - internal { x: int } - -> type private T1 = - | A - | B - -> type private T2 = - { x: int } - -> type T1 = - private | A - | B - -> type T2 = - private { x: int } - -> type internal T1 = - private | A - | B - -> type internal T2 = - private { x: int } - -> type private T3 - -> type private T4 = - new: unit -> T4 - -> exception X1 of int - -> exception private X2 of int - -> exception internal X3 of int - -> type T0 = - new: unit -> T0 -type T1Post<'a> = - new: unit -> T1Post<'a> -type 'a T1Pre = - new: unit -> 'a T1Pre - -> type T0 with - member M: unit -> T0 list -type T0 with - member P: T0 * T0 -type T0 with - member E: IEvent - -> type T1Post<'a> with - member M: unit -> T1Post<'a> list -type T1Post<'a> with - member P: T1Post<'a> * T1Post<'a> -type T1Post<'a> with - member E: IEvent - -> type 'a T1Pre with - member M: unit -> 'a T1Pre list -type 'a T1Pre with - member P: 'a T1Pre * 'a T1Pre -type 'a T1Pre with - member E: IEvent - -> type T1Post<'a> with - member M: unit -> T1Post<'a> list -type T1Post<'a> with - member P: T1Post<'a> * T1Post<'a> -type T1Post<'a> with - member E: IEvent - -> type 'a T1Pre with - member M: unit -> 'a T1Pre list -type 'a T1Pre with - member P: 'a T1Pre * 'a T1Pre -type 'a T1Pre with - member E: IEvent - -> type r = - { - f0: int - f1: int - f2: int - f3: int - f4: int - f5: int - f6: int - f7: int - f8: int - f9: int - } -val r10: r = { f0 = 0 - f1 = 1 - f2 = 2 - f3 = 3 - f4 = 4 - f5 = 5 - f6 = 6 - f7 = 7 - f8 = 8 - f9 = 9 } -val r10s: r[] = [|{ f0 = 0 - f1 = 1 - f2 = 2 - f3 = 3 - f4 = 4 - f5 = 5 - f6 = 6 - f7 = 7 - f8 = 8 - f9 = 9 }; ...|] -val r10s': string * r[] = ("one extra node", [|{ f0 = 0 - f1 = 1 - f2 = 2 - f3 = 3 - f4 = 4 - f5 = 5 - f6 = 6 - f7 = 7 - f8 = 8 - f9 = ... }; ...|]) - -> val x1564_A1: int = 1 - - ---> Added '\' to library include path - -val x1564_A2: int = 2 - - ---> Added '\' to library include path - -val x1564_A3: int = 3 - -> type internal Foo2 = - private new: x: int * y: int * z: int -> Foo2 + 3 overloads - member Prop1: int - member Prop2: int - member private Prop3: int - -> module internal InternalM = - val x: int = 1 - type Foo2 = - private new: x: int * y: int * z: int -> Foo2 + 3 overloads - member Prop1: int - member Prop2: int - member private Prop3: int - type private Foo3 = - new: x: int * y: int * z: int -> Foo3 + 3 overloads - member Prop1: int - member Prop2: int - member Prop3: int - type T1 = - | A - | B - type T2 = - { x: int } - type T3 - type T4 = - new: unit -> T4 - type T5 = - | A - | B - type T6 = - { x: int } - type private T7 = - | A - | B - type private T8 = - { x: int } - type T9 = - private | A - | B - type T10 = - private { x: int } - type T11 = - private | A - | B - type T12 = - private { x: int } - type private T13 - type private T14 = - new: unit -> T14 -module internal PrivateM = - val private x: int = 1 - type private Foo2 = - new: x: int * y: int * z: int -> Foo2 + 3 overloads - member Prop1: int - member Prop2: int - member Prop3: int - type T1 = - | A - | B - type T2 = - { x: int } - type T3 - type T4 = - new: unit -> T4 - type T5 = - | A - | B - type T6 = - { x: int } - type private T7 = - | A - | B - type private T8 = - { x: int } - type T9 = - private | A - | B - type T10 = - private { x: int } - type T11 = - private | A - | B - type T12 = - private { x: int } - type private T13 - type private T14 = - new: unit -> T14 - -> val it: seq = - seq - [(43, "10/28/2008", 1); (46, "11/18/2008", 1); (56, "1/27/2009", 2); - (58, "2/10/2009", 1)] - -> module Test4343a = - val mk: i: int -> string - val x100: string = - "0123456789012345678901234567890123456789012345678901234567890"+[39 chars] - val x90: string = - "0123456789012345678901234567890123456789012345678901234567890"+[29 chars] - val x80: string = - "0123456789012345678901234567890123456789012345678901234567890"+[19 chars] - val x75: string = - "0123456789012345678901234567890123456789012345678901234567890"+[14 chars] - val x74: string = - "0123456789012345678901234567890123456789012345678901234567890"+[13 chars] - val x73: string = - "0123456789012345678901234567890123456789012345678901234567890"+[12 chars] - val x72: string = - "012345678901234567890123456789012345678901234567890123456789012345678901" - val x71: string = - "01234567890123456789012345678901234567890123456789012345678901234567890" - val x70: string = - "0123456789012345678901234567890123456789012345678901234567890123456789" -module Test4343b = - val fA: x: int -> int - val fB: x: 'a -> y: 'a -> 'a list - val gA: (int -> int) - val gB: ('a -> 'a -> 'a list) - val gAB: (int -> int) * ('a -> 'a -> 'a list) - val hB: ('a -> 'a -> 'a list) - val hA: (int -> int) -module Test4343c = - val typename<'a> : string - val typename2<'a> : string * string -module Test4343d = - val xList: int list = [1; 2; 3] - val xArray: int[] = [|1; 2; 3|] - val xString: string = "abcdef" - val xOption: int option = Some 12 - val xArray2: (int * int)[,] = [[(0, 0); (0, 1)] - [(1, 0); (1, 1)]] - val xSeq: seq -module Test4343e = - type C = - new: x: int -> C - val cA: C - val cB: C - val cAB: C * C * C list = - (FSI_0091+Test4343e+C, FSI_0091+Test4343e+C, - [FSI_0091+Test4343e+C; FSI_0091+Test4343e+C]) - type D = - new: x: int -> D - override ToString: unit -> string - val dA: D = D(1) - val dB: D = D(2) - val dAB: D * D * D list = (D(1), D(2), [D(1); D(2)]) - module Generic = - type CGeneric<'a> = - new: x: 'a -> CGeneric<'a> - val cA: C - val cB: C - val cAB: C * C * C list = - (FSI_0091+Test4343e+C, FSI_0091+Test4343e+C, - [FSI_0091+Test4343e+C; FSI_0091+Test4343e+C]) - type D<'a> = - new: x: 'a -> D<'a> - override ToString: unit -> string - val dA: D = D(1) - val dB: D = D(2) - val dAB: D * D * D list = (D(1), D(2), [D(1); D(2)]) - val dC: D = D(True) - val boxed_dABC: obj list = [D(1); D(2); D(True)] -type F1 = - inherit System.Windows.Forms.Form - interface System.IDisposable - val x: F1 - val x2: F1 - member B: unit -> int - member D: x: int -> int + 2 overloads - abstract MMM: bool -> bool - override ToString: unit -> string - static member A: unit -> int - static member C: unit -> int - abstract AAA: int - abstract BBB: bool with set - member D2: int - member E: int - abstract ZZZ: int - static val mutable private sx: F1 - static val mutable private sx2: F1 -[] -type IP = - new: x: int * y: int -> IP - static val mutable private AA: IP -module Regression4643 = - [] - type RIP = - new: x: int -> RIP - static val mutable private y: RIP - [] - type arg_unused_is_RIP = - new: x: RIP -> arg_unused_is_RIP - [] - type arg_used_is_RIP = - new: x: RIP -> arg_used_is_RIP - member X: RIP - [] - type field_is_RIP = - val x: RIP -type Either<'a,'b> = - | This of 'a - | That of 'b -val catch: f: (unit -> 'a) -> Either<'a,(string * string)> -val seqFindIndexFailure: Either = - That - ("System.Collections.Generic.KeyNotFoundException", - "An index satisfying the predicate was not found in the collection.") -val seqFindFailure: Either = - That - ("System.Collections.Generic.KeyNotFoundException", - "An index satisfying the predicate was not found in the collection.") -val seqPickFailure: Either = - That - ("System.Collections.Generic.KeyNotFoundException", - "An index satisfying the predicate was not found in the collection.") -module Regression5218 = - val t1: int = 1 - val t2: int * int = (1, 2) - val t3: int * int * int = (1, 2, 3) - val t4: int * int * int * int = (1, 2, 3, 4) - val t5: int * int * int * int * int = (1, 2, 3, 4, 5) - val t6: int * int * int * int * int * int = (1, 2, 3, 4, 5, 6) - val t7: int * int * int * int * int * int * int = (1, 2, 3, 4, 5, 6, 7) - val t8: int * int * int * int * int * int * int * int = - (1, 2, 3, 4, 5, 6, 7, 8) - val t9: int * int * int * int * int * int * int * int * int = - (1, 2, 3, 4, 5, 6, 7, 8, 9) - val t10: int * int * int * int * int * int * int * int * int * int = - (1, 2, 3, 4, 5, 6, 7, 8, 9, 10) - val t11: int * int * int * int * int * int * int * int * int * int * int = - (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11) - val t12: - int * int * int * int * int * int * int * int * int * int * int * int = - (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12) - val t13: - int * int * int * int * int * int * int * int * int * int * int * int * - int = (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13) - val t14: - int * int * int * int * int * int * int * int * int * int * int * int * - int * int = (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14) - val t15: - int * int * int * int * int * int * int * int * int * int * int * int * - int * int * int = (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) - -> module Regression3739 = - type IB = - abstract AbstractMember: int -> int - type C<'a when 'a :> IB> = - new: unit -> C<'a> - static member StaticMember: x: 'a -> int - -> module Regression3739 = - type IB = - abstract AbstractMember: int -> int - type C<'a when 'a :> IB> = - new: unit -> C<'a> - static member StaticMember: x: 'a -> int - -> module Regression3740 = - type Writer<'a> = - abstract get_path: unit -> string - type MyClass = - interface Writer - val path: string - -> type Regression4319_T2 = - static member (+-+-+) : x: 'a * y: 'b -> string - -> type Regression4319_T0 = - static member (+-+-+) : string - -> type Regression4319_T1 = - static member (+-+-+) : x: 'a -> string - -> type Regression4319_T1b = - static member (+-+-+) : x: 'a -> string - -> type Regression4319_T1c = - static member (+-+-+) : x: ('a * 'b) -> string - -> type Regression4319_T1d = - static member (+-+-+) : x: (int * int) -> string - -> type Regression4319_T3 = - static member (+-+-+) : x: 'a * y: 'b * z: 'c -> string - -> type Regression4319_U1 = - static member (+-+-+) : x: 'a -> moreArgs: 'b -> string - -> type Regression4319_U1b = - static member (+-+-+) : x: 'a -> moreArgs: 'b -> string - -> type Regression4319_U2 = - static member (+-+-+) : x: 'a * y: 'b -> moreArgs: 'c -> string - -> type Regression4319_U3 = - static member (+-+-+) : x: 'a * y: 'b * z: 'c -> moreArgs: 'd -> string - -> type Regression4319_check = - static member (&) : string - static member (&^) : string - static member (@) : string - static member (!=) : string - static member (:=) : string - static member (^) : string - static member (/) : string - static member ($) : string - static member (...@) : string - static member (...!=) : string - static member (.../) : string - static member (...=) : string - static member (...>) : string - static member (...^) : string - static member (...<) : string - static member ( ...* ) : string - static member (...%) : string - static member (=) : string - static member ( ** ) : string - static member (>) : string - static member (<) : string - static member (%) : string - static member ( * ) : string - static member (-) : string - -> Expect ABC = ABC -type Regression4469 = - new: unit -> Regression4469 - member ToString: unit -> string -val r4469: Regression4469 = FSI_0107+Regression4469 -val it: unit = () - -> Expect ABC = ABC -val it: unit = () - -> module Regression1019_short = - val double_nan: float = nan - val double_infinity: float = infinity - val single_nan: float32 = nanf - val single_infinity: float32 = infinityf -module Regression1019_long = - val double_nan: float = nan - val double_infinity: float = infinity - val single_nan: float32 = nanf - val single_infinity: float32 = infinityf - -> val it: int ref = { contents = 1 } - -> val x: int ref = { contents = 1 } -val f: (unit -> int) - -> val it: int = 1 - -> val it: unit = () - -> val it: int = 3 - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: int[] = - [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; - ...|] - -> val it: 'a list - -> val it: 'a list list - -> val it: 'a option - -> val it: 'a list * 'b list - -> val it: x: 'a -> 'a - -> val fff: x: 'a -> 'a - -> val it: ('a -> 'a) - -> val note_ExpectDupMethod: string = - "Regression4927: Expect error due to duplicate methods in the "+[20 chars] - -> > val note_ExpectDupProperty: string = - "Regression4927: Expect error due to duplicate properties in t"+[23 chars] - -> > > val it: string = "NOTE: Expect IAPrivate less accessible IBPublic" - -> > val it: string = "NOTE: Expect IAPrivate less accessible IBInternal" - -> > module Regression5265_PriPri = - type private IAPrivate = - abstract P: int - type private IBPrivate = - inherit IAPrivate - abstract Q: int - -> val it: string = "NOTE: Expect IAInternal less accessible IBPublic" - -> > module Regression5265_IntInt = - type internal IAInternal = - abstract P: int - type internal IBInternal = - inherit IAInternal - abstract Q: int - -> module Regression5265_IntPri = - type internal IAInternal = - abstract P: int - type private IBPrivate = - inherit IAInternal - abstract Q: int - -> module Regression5265_PubPub = - type IAPublic = - abstract P: int - type IBPublic = - inherit IAPublic - abstract Q: int - -> module Regression5265_PubInt = - type IAPublic = - abstract P: int - type internal IBInternal = - inherit IAPublic - abstract Q: int - -> module Regression5265_PubPri = - type IAPublic = - abstract P: int - type private IBPrivate = - inherit IAPublic - abstract Q: int - -> val it: string = - "Regression4232: Expect an error about duplicate virtual methods from parent type" - -> > val it: string = - "** Expect AnAxHostSubClass to be accepted. AxHost has a newslot virtual RightToLeft property outscope RightToLeft on Control" - -> type AnAxHostSubClass = - inherit System.Windows.Forms.AxHost - new: x: string -> AnAxHostSubClass - -> val it: string = - "** Expect error because the active pattern result contains free type variables" - -> > val it: string = - "** Expect error because the active pattern result contains free type variables (match value generic)" - -> > val it: string = - "** Expect error because the active pattern result contains free type variables (when active pattern also has parameters)" - -> > val it: string = - "** Expect OK, since error message says constraint should work!" - -> val (|A|B|) : x: int -> Choice - -> val it: string = "** Expect error since active pattern is not a function!" - -> > val it: string = - "** Expect OK since active pattern result is not too generic, typars depend on match val" - -> val (|A|B|) : p: bool -> 'a * 'b -> Choice<'a,'b> - -> val it: string = - "** Expect OK since active pattern result is not too generic, typars depend on parameters" - -> val (|A|B|) : aval: 'a -> bval: 'b -> x: bool -> Choice<'a,'b> - -> val it: string = - "** Expect OK since active pattern result is generic, but it typar from closure, so OK" - -> val outer: x: 'a -> (int -> 'a option) - -> val it: string = - "** Expect OK, BUG 472278: revert unintended breaking change to Active Patterns in F# 3.0" - -> val (|Check1|) : a: int -> int * 'a option - -> > module ReflectionEmit = - type IA = - abstract M: #IB -> int - and IB = - abstract M: #IA -> int - type IA2<'a when 'a :> IB2<'a> and 'a :> IA2<'a>> = - abstract M: int - and IB2<'b when 'b :> IA2<'b> and 'b :> IB2<'b>> = - abstract M: int - -> val it: string = - "Regression_139182: Expect the follow code to be accepted without error" - -> [] -type S = - member TheMethod: unit -> int64 -val theMethod: s: S -> int64 -type T = - new: unit -> T - member Prop5: int64 - static member Prop1: int64 - static member Prop2: int64 - static member Prop3: int64 - static member Prop4: string - -> val it: System.Threading.ThreadLocal list = [0 {IsValueCreated = false; - Values = ?;}] - -> type MyDU = - | Case1 of Val1: int * Val2: string - | Case2 of string * V2: bool * float - | Case3 of int - | Case4 of Item1: bool - | Case5 of bool * string - | Case6 of Val1: int * bool * string - | Case7 of ``Big Name`` : int -val namedFieldVar1: MyDU = Case1 (5, "") -val namedFieldVar2: MyDU = Case7 25 - -> exception MyNamedException1 of Val1: int * Val2: string -exception MyNamedException2 of string * V2: bool * float -exception MyNamedException3 of Data: int -exception MyNamedException4 of bool -exception MyNamedException5 of int * string -exception MyNamedException6 of Val1: int * bool * string * Data8: float -exception MyNamedException7 of ``Big Named Field`` : int -val namedEx1: exn = MyNamedException1 (5, "") -val namedEx2: exn = MyNamedException7 25 - -> type optionRecord = - { x: int option } -val x: optionRecord = { x = None } - -> type optionRecord = - { x: obj } -val x: optionRecord = { x = null } - -> type RecordWithMembers = - { x: obj } - member Method: unit -> int - member Property: int - -> type UnionWithMembers = - | Case1 - | Case2 of int - member Method: unit -> int - member Property: int - -> type OneFieldRecordNoXmlDoc = - { OneField: obj } - -> type OneFieldRecordXmlDoc = - { - OneField: obj - } - -> type TwoFieldRecordNoXmlDoc = - { - TwoFields1: obj - TwoFields2: obj - } - -> type TwoFieldRecordXmlDoc = - { - TwoFields1: obj - TwoFields2: obj - } - -> type Int32 with - member ExtrinsicExtensionProperty: int -type Int32 with - member ExtrinsicExtensionMethod: unit -> int - -> val ``value with spaces in name`` : bool = true - -> val functionWhichTakesLongNameMixedParameters: - aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa: int * - bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb: int - -> ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc: int * - dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd: int - -> int - -> val functionWhichTakesLongNameTupledParameters: - aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa: int * - bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb: int * - ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc: int * - ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd: int - -> int - -> val functionWhichTakesLongNameCurriedParameters: - aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa: int - -> bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb: int - -> cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc: int - -> dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd: int - -> int - -> val functionWhichTakesMixedLengthCurriedParametersA: - a: 'a -> b: 'b -> c: 'c -> ddddddddddddddddddddddddddddddddddddddddddddd: 'd - -> int - -> val functionWhichTakesMixedLengthCurriedParametersB: - aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa: 'a -> b: 'b -> c: 'c -> d: 'd -> int - -> val f: ``parameter with spaces in name`` : int -> int - -> val functionWhichTakesAParameterPeeciselyPlusButNotOpAddition: - ``+`` : (int -> int -> int) -> int - -> val functionWhichTakesAParameterOpAddition: (+) : (int -> int -> int) -> int - -> val functionWhichTakesAParameterCalled_land: - ``land`` : (int -> int -> int) -> int - -> type RecordWithStrangeNames = - { - ``funky name`` : obj - op_Addition: obj - ``+`` : obj - ``land`` : obj - ``base`` : obj - } - -> type UnionWithSpacesInNamesOfCases = - | ``Funky name`` - | ``Funky name 2`` - -> type ``Type with spaces in name`` = - | A - | B - -> type op_Addition = - | A - | B - -> type ``land`` = - | A - | B - -> module ``Module with spaces in name`` = - val x: int = 1 - -> module op_Addition = - val x: int = 1 - -> module ``land`` = - val x: int = 1 - -> val ``+`` : x: 'a -> y: 'b -> int - -> val (+) : x: int -> y: int -> int - -> val ``base`` : int = 2 - -> val (mod) : int = 2 - -> val ``or`` : int = 2 - -> val ``land`` : int = 2 - -> val ``.ctor`` : int = 2 - -> val ``.cctor`` : int = 2 - -> [] -val SomeLiteralWithASomewhatLongName: string - = "SomeVeryLongLiteralValueWithLotsOfCharacters" -[] -val SomeLiteralWithASomewhatLongName2: string - = - "SomeVeryLongLiteralValueWithLotsOfCharactersSomeVeryLongLiteralValueWithLotsOfCharactersSomeVeryLongLiteralValueWithLotsOfCharacters" -[] -val ShortName: string = "hi" - -> val it: System.DayOfWeek = Tuesday - -> > > diff --git a/tests/fsharp/tests.fs b/tests/fsharp/tests.fs index a849aa0d57..62314c3968 100644 --- a/tests/fsharp/tests.fs +++ b/tests/fsharp/tests.fs @@ -1026,8 +1026,12 @@ module CoreTests = // Debug with // ..\..\..\..\debug\net40\bin\fsi.exe --nologo < test.fsx >a.out 2>a.err // then - /// windiff z.output.test.default.stdout.bsl a.out - let printing flag diffFileOut expectedFileOut diffFileErr expectedFileErr = + /// windiff output.stdout.bsl a.out + let runPrintingTest flag baseFile = + let diffFileOut = baseFile + ".stdout.txt" + let expectedFileOut = baseFile + ".stdout.bsl" + let diffFileErr = baseFile + ".stderr.txt" + let expectedFileErr = baseFile + ".stderr.bsl" let cfg = testConfig "core/printing" if requireENCulture () then @@ -1071,40 +1075,47 @@ module CoreTests = | diffs -> Assert.Fail (sprintf "'%s' and '%s' differ; %A" diffFileErr expectedFileErr diffs) [] - let ``printing-default-stdout-47 --langversion:4_7`` () = - printing "--langversion:4.7" "z.output.test.default.stdout.47.txt" "z.output.test.default.stdout.47.bsl" "z.output.test.default.stderr.txt" "z.output.test.default.stderr.bsl" + let ``printing`` () = + runPrintingTest "--multiemit- --debug+" "output" + // F# 5.0 changed some things printing output [] - let ``printing-default-stdout-50 --langversion:5_0`` () = - printing "--langversion:5.0" "z.output.test.default.stdout.50.txt" "z.output.test.default.stdout.50.bsl" "z.output.test.default.stderr.txt" "z.output.test.default.stderr.bsl" + let ``printing-langversion47`` () = + runPrintingTest "--langversion:4.7" "output.47" + // Output should not change with optimization off [] - let ``printing-1000-stdout-47 --langversion:4_7`` () = - printing "--langversion:4.7 --use:preludePrintSize1000.fsx" "z.output.test.1000.stdout.47.txt" "z.output.test.1000.stdout.47.bsl" "z.output.test.1000.stderr.txt" "z.output.test.1000.stderr.bsl" + let ``printing-optimizeoff`` () = + runPrintingTest "--multiemit- --debug+ --optimize-" "output" + // Legacy one-dynamic-assembly emit is the default for .NET Framework, which these tests are using + // Turning that off enables multi-assembly-emit. The printing test is useful for testing multi-assembly-emit + // as it feeds in many incremental fragments into stdin of the FSI process. [] - let ``printing-1000-stdout-50 --langversion:5_0`` () = - printing "--langversion:5.0 --use:preludePrintSize1000.fsx" "z.output.test.1000.stdout.50.txt" "z.output.test.1000.stdout.50.bsl" "z.output.test.1000.stderr.txt" "z.output.test.1000.stderr.bsl" + let ``printing-legacyemitoff`` () = + runPrintingTest "--multiemit+ --debug+" "output.legacyemitoff" + // Multi-assembly-emit establishes some slightly different rules regarding internals, and this + // needs to be tested with optimizations off. The output should not change. [] - let ``printing-200-stdout-47 --langversion:4_7`` () = - printing "--langversion:4.7 --use:preludePrintSize200.fsx" "z.output.test.200.stdout.47.txt" "z.output.test.200.stdout.47.bsl" "z.output.test.200.stderr.txt" "z.output.test.200.stderr.bsl" + let ``printing-legacyemitoff-optimizeoff`` () = + runPrintingTest "--multiemit+ --debug+ --optimize-" "output.legacyemitoff" [] - let ``printing-200-stdout-50 --langversion:5_0`` () = - printing "--langversion:5.0 --use:preludePrintSize200.fsx" "z.output.test.200.stdout.50.txt" "z.output.test.200.stdout.50.bsl" "z.output.test.200.stderr.txt" "z.output.test.200.stderr.bsl" + let ``printing-width-1000`` () = + runPrintingTest "--use:preludePrintSize1000.fsx" "output.1000" [] - let ``printing-off-stdout-47 --langversion:4_7`` () = - printing "--langversion:4.7 --use:preludeShowDeclarationValuesFalse.fsx" "z.output.test.off.stdout.47.txt" "z.output.test.off.stdout.47.bsl" "z.output.test.off.stderr.txt" "z.output.test.off.stderr.bsl" + let ``printing-width-200`` () = + runPrintingTest "--use:preludePrintSize200.fsx" "output.200" [] - let ``printing-off-stdout-50 --langversion:5_0`` () = - printing "--langversion:5.0 --use:preludeShowDeclarationValuesFalse.fsx" "z.output.test.off.stdout.50.txt" "z.output.test.off.stdout.50.bsl" "z.output.test.off.stderr.txt" "z.output.test.off.stderr.bsl" + let ``printing-off`` () = + runPrintingTest "--use:preludeShowDeclarationValuesFalse.fsx" "output.off" [] - let ``printing-quiet-stdout`` () = - printing "--quiet" "z.output.test.quiet.stdout.txt" "z.output.test.quiet.stdout.bsl" "z.output.test.quiet.stderr.txt" "z.output.test.quiet.stderr.bsl" + let ``printing-quiet`` () = + runPrintingTest "--quiet" "output.quiet" type SigningType = | DelaySigned diff --git a/tests/fsharpqa/Source/CompilerOptions/fsi/exename/help40.437.1033.bsl b/tests/fsharpqa/Source/CompilerOptions/fsi/exename/help40.437.1033.bsl index b4c1b49040..845f944307 100644 --- a/tests/fsharpqa/Source/CompilerOptions/fsi/exename/help40.437.1033.bsl +++ b/tests/fsharpqa/Source/CompilerOptions/fsi/exename/help40.437.1033.bsl @@ -103,3 +103,5 @@ Usage: fsharpi [script.fsx []] --quotations-debug[+|-] Emit debug information in quotations --shadowcopyreferences[+|-] Prevents references from being locked by the F# Interactive process +--multiemit[+|-] Emit multiple assemblies (off by + default for .NET Framework) \ No newline at end of file diff --git a/tests/fsharpqa/Source/CompilerOptions/fsi/help/help40-nologo.437.1033.bsl b/tests/fsharpqa/Source/CompilerOptions/fsi/help/help40-nologo.437.1033.bsl index d95678648c..f0af4efa4b 100644 --- a/tests/fsharpqa/Source/CompilerOptions/fsi/help/help40-nologo.437.1033.bsl +++ b/tests/fsharpqa/Source/CompilerOptions/fsi/help/help40-nologo.437.1033.bsl @@ -103,3 +103,5 @@ Usage: fsiAnyCpu [script.fsx []] --quotations-debug[+|-] Emit debug information in quotations --shadowcopyreferences[+|-] Prevents references from being locked by the F# Interactive process +--multiemit[+|-] Emit multiple assemblies (off by + default for .NET Framework) \ No newline at end of file diff --git a/tests/fsharpqa/Source/CompilerOptions/fsi/help/help40.437.1033.bsl b/tests/fsharpqa/Source/CompilerOptions/fsi/help/help40.437.1033.bsl index cbedecea48..34c66f728e 100644 --- a/tests/fsharpqa/Source/CompilerOptions/fsi/help/help40.437.1033.bsl +++ b/tests/fsharpqa/Source/CompilerOptions/fsi/help/help40.437.1033.bsl @@ -105,3 +105,5 @@ Usage: fsiAnyCpu [script.fsx []] --quotations-debug[+|-] Emit debug information in quotations --shadowcopyreferences[+|-] Prevents references from being locked by the F# Interactive process +--multiemit[+|-] Emit multiple assemblies (off by + default for .NET Framework) \ No newline at end of file diff --git a/tests/fsharpqa/Source/EntryPoint/env.lst b/tests/fsharpqa/Source/EntryPoint/env.lst index 7d37209c97..c21c93e5d2 100644 --- a/tests/fsharpqa/Source/EntryPoint/env.lst +++ b/tests/fsharpqa/Source/EntryPoint/env.lst @@ -10,8 +10,8 @@ NoMT SOURCE=inamodule001.fs # inamodule001.fs SOURCE=entrypointfunctionnotmain001.fs # entrypointfunctionnotmain001.fs SOURCE=E_invalidsignature001.fs SCFLAGS="--test:ErrorRanges" # E_invalidsignature001.fs SOURCE=E_InvalidSignature02.fs SCFLAGS="--test:ErrorRanges" # E_InvalidSignature02 -NoMT SOURCE=entrypointandFSI.fs FSIMODE=PIPE COMPILE_ONLY=1 # entrypointandFSI.fs -NoMT SOURCE=entrypointandFSI02.fsx FSIMODE=EXEC COMPILE_ONLY=1 # entrypointandFSI02.fsx +NoMT SOURCE=entrypointandFSI.fs SCFLAGS="--multiemit-" FSIMODE=PIPE COMPILE_ONLY=1 # entrypointandFSI.fs +NoMT SOURCE=entrypointandFSI02.fsx SCFLAGS="--multiemit-" FSIMODE=EXEC COMPILE_ONLY=1 # entrypointandFSI02.fsx SOURCE=E_CompilingToALibrary01.fs SCFLAGS="--test:ErrorRanges --target:library" # E_CompilingToALibrary01.fs diff --git a/tests/service/data/TestTP/ProvidedTypes.fsi b/tests/service/data/TestTP/ProvidedTypes.fsi index c3adbe8283..935f1cd563 100644 --- a/tests/service/data/TestTP/ProvidedTypes.fsi +++ b/tests/service/data/TestTP/ProvidedTypes.fsi @@ -509,7 +509,7 @@ type TypeProviderForNamespaces = #if !NO_GENERATIVE /// Register that a given file is a provided generated target assembly, e.g. an assembly produced by an external - /// code generation tool. This assembly should be a target assembly, i.e. use the same asssembly references + /// code generation tool. This assembly should be a target assembly, i.e. use the same assembly references /// as given by TargetContext.ReferencedAssemblyPaths member RegisterGeneratedTargetAssembly: fileName: string -> Assembly #endif diff --git a/vsintegration/src/FSharp.VS.FSI/fsiSessionToolWindow.fs b/vsintegration/src/FSharp.VS.FSI/fsiSessionToolWindow.fs index 61ff177fd3..927690ce79 100644 --- a/vsintegration/src/FSharp.VS.FSI/fsiSessionToolWindow.fs +++ b/vsintegration/src/FSharp.VS.FSI/fsiSessionToolWindow.fs @@ -121,7 +121,7 @@ type internal FsiToolWindow() as this = // Create the stream on top of the text buffer. let textStream = new TextBufferStream(textViewAdapter.GetDataBuffer(textLines), contentTypeRegistry) let synchronizationContext = System.Threading.SynchronizationContext.Current - let win32win = { new System.Windows.Forms.IWin32Window with member this.Handle = textView.GetWindowHandle()} + let win32win = { new System.Windows.Forms.IWin32Window with member _.Handle = textView.GetWindowHandle()} let mutable textView = textView let mutable textLines = textLines let mutable commandService = null @@ -491,6 +491,9 @@ type internal FsiToolWindow() as this = // checks if current session is configured such that debugging will work well // if not, pops a dialog warning the user let checkDebuggability () = + if not sessions.Alive then + sessions.Restart(null) + // debug experience is good when optimizations are off and debug info is produced if ArgParsing.debugInfoEnabled sessions.ProcessArgs && not (ArgParsing.optimizationsEnabled sessions.ProcessArgs) then true @@ -619,15 +622,15 @@ type internal FsiToolWindow() as this = do this.BitmapIndex <- 0 do this.Caption <- VFSIstrings.SR.fsharpInteractive() - member this.MLSendSelection(obj,e) = onMLSendSelection obj e - member this.MLSendLine(obj,e) = onMLSendLine obj e - member this.MLDebugSelection(obj,e) = onMLDebugSelection obj e + member _.MLSendSelection(obj,e) = onMLSendSelection obj e + member _.MLSendLine(obj,e) = onMLSendLine obj e + member _.MLDebugSelection(obj,e) = onMLDebugSelection obj e - member this.GetDebuggerState() = + member _.GetDebuggerState() = let (state, _) = getDebuggerState () state - member this.AddReferences(references : string[]) = + member _.AddReferences(references : string[]) = let text = references |> Array.map (sprintf "#r @\"%s\"") @@ -735,29 +738,30 @@ type internal FsiToolWindow() as this = interface ITestVFSI with /// Send a string; the ';;' will be added to the end; does not interact with history - member this.SendTextInteraction(s:string) = + member _.SendTextInteraction(s:string) = let dummyLineNum = 1 executeInteraction false (System.IO.Path.GetTempPath()) "DummyTestFilename.fs" 1 s + /// Returns the n most recent lines in the view. After SendTextInteraction, can poll for a prompt to know when interaction finished. - member this.GetMostRecentLines(n:int) : string[] = + member _.GetMostRecentLines(n:int) : string[] = lock textLines (fun () -> try - let lineCount = ref 0 - textLines.GetLineCount(&lineCount.contents) |> throwOnFailure0 + let mutable lineCount = 0 + textLines.GetLineCount(&lineCount) |> throwOnFailure0 - let lastLineLen = ref 0 - textLines.GetLengthOfLine(!lineCount - 1, &lastLineLen.contents) |> throwOnFailure0 + let mutable lastLineLen = 0 + textLines.GetLengthOfLine(lineCount - 1, &lastLineLen) |> throwOnFailure0 - let text = ref "" + let mutable text = "" // Cap number of lines returned to the total number of lines - let mutable startLine = max (!lineCount - 1 - n) 0 - let mutable endLine = max (!lineCount - 1) 0 + let mutable startLine = max (lineCount - 1 - n) 0 + let mutable endLine = max (lineCount - 1) 0 let mutable startCol = 0 - let mutable endCol = max (!lastLineLen - 1) 0 + let mutable endCol = max (lastLineLen - 1) 0 - textLines.GetLineText(startLine, startCol, endLine, endCol, &text.contents) |> throwOnFailure0 - (!text).Split([|"\r\n"; "\r"; "\n"|], StringSplitOptions.RemoveEmptyEntries) + textLines.GetLineText(startLine, startCol, endLine, endCol, &text) |> throwOnFailure0 + text.Split([|"\r\n"; "\r"; "\n"|], StringSplitOptions.RemoveEmptyEntries) with | ex -> let returnVal = [| "Unhandled Exception"; ex.Message |] @@ -765,7 +769,7 @@ type internal FsiToolWindow() as this = ) interface IOleCommandTarget with - member this.QueryStatus (guid, cCmds, prgCmds, pCmdText)= + member _.QueryStatus (guid, cCmds, prgCmds, pCmdText)= // Added to prevent command processing when the zoom control in the margin is focused let wpfTextView = textViewAdapter.GetWpfTextView(textView) @@ -797,7 +801,7 @@ type internal FsiToolWindow() as this = let target : IOleCommandTarget = upcast commandService target.QueryStatus(&guid, cCmds, prgCmds, pCmdText) - member this.Exec (guid, nCmdId, nCmdExcept, pIn, pOut) = + member _.Exec (guid, nCmdId, nCmdExcept, pIn, pOut) = let target : IOleCommandTarget = upcast commandService // for typing, Delete and Paste: @@ -825,29 +829,29 @@ type internal FsiToolWindow() as this = false interface IVsUIElementPane with - member this.CloseUIElementPane() = + member _.CloseUIElementPane() = let mutable hr = VSConstants.S_OK if null <> textView then hr <- (textView :?> IVsUIElementPane).CloseUIElementPane() this.Dispose(true) hr - member this.CreateUIElementPane o = + member _.CreateUIElementPane o = (textView :?> IVsUIElementPane).CreateUIElementPane(&o) - member this.GetDefaultUIElementSize(pSize:SIZE[]) = + member _.GetDefaultUIElementSize(pSize:SIZE[]) = (textView :?> IVsUIElementPane).GetDefaultUIElementSize(pSize) - member this.LoadUIElementState(pStream:IStream) = + member _.LoadUIElementState(pStream:IStream) = (textView :?> IVsUIElementPane).LoadUIElementState(pStream) - member this.SaveUIElementState(pStream:IStream) = + member _.SaveUIElementState(pStream:IStream) = (textView :?> IVsUIElementPane).SaveUIElementState(pStream) - member this.SetUIElementSite(psp:Microsoft.VisualStudio.OLE.Interop.IServiceProvider) = + member _.SetUIElementSite(psp:Microsoft.VisualStudio.OLE.Interop.IServiceProvider) = (textView :?> IVsUIElementPane).SetUIElementSite(psp) - member this.TranslateUIElementAccelerator(lpmsg:MSG[]) = + member _.TranslateUIElementAccelerator(lpmsg:MSG[]) = (textView :?> IVsUIElementPane).TranslateUIElementAccelerator(lpmsg) // This follows directly the IronPython sample. @@ -859,22 +863,22 @@ type internal FsiToolWindow() as this = this.Dispose(true) hr - member this.CreatePaneWindow(hwndParent:IntPtr,x:int,y:int,cx:int,cy:int,hwnd:IntPtr byref) = + member _.CreatePaneWindow(hwndParent:IntPtr,x:int,y:int,cx:int,cy:int,hwnd:IntPtr byref) = (textView :?> IVsWindowPane).CreatePaneWindow(hwndParent, x, y, cx, cy, &hwnd) - member this.GetDefaultSize(pSize:SIZE[]) = + member _.GetDefaultSize(pSize:SIZE[]) = (textView :?> IVsWindowPane).GetDefaultSize(pSize) - member this.LoadViewState(pStream:IStream) = + member _.LoadViewState(pStream:IStream) = (textView :?> IVsWindowPane).LoadViewState(pStream) - member this.SaveViewState(pStream:IStream) = + member _.SaveViewState(pStream:IStream) = (textView :?> IVsWindowPane).SaveViewState(pStream) - member this.SetSite(psp:Microsoft.VisualStudio.OLE.Interop.IServiceProvider) = + member _.SetSite(psp:Microsoft.VisualStudio.OLE.Interop.IServiceProvider) = (textView :?> IVsWindowPane).SetSite(psp) - member this.TranslateAccelerator(lpmsg:MSG[]) = + member _.TranslateAccelerator(lpmsg:MSG[]) = (textView :?> IVsWindowPane).TranslateAccelerator(lpmsg) diff --git a/vsintegration/src/FSharp.VS.FSI/sessions.fs b/vsintegration/src/FSharp.VS.FSI/sessions.fs index 8758f3b062..460d97233e 100644 --- a/vsintegration/src/FSharp.VS.FSI/sessions.fs +++ b/vsintegration/src/FSharp.VS.FSI/sessions.fs @@ -6,8 +6,7 @@ open System open System.IO open System.Text open System.Diagnostics -open System.Runtime.Remoting -open System.Runtime.Remoting.Lifetime +open System.Threading #nowarn "52" // The value has been copied to ensure the original is not mutated by this operation @@ -17,18 +16,18 @@ let mutable timeoutAppShowMessageOnTimeOut = true open Microsoft.FSharp.Control // Wrapper around ManualResetEvent which will ignore Sets on disposed object type internal EventWrapper() = - let waitHandle = new System.Threading.ManualResetEvent(false) + let waitHandle = new ManualResetEvent(false) let guard = new obj() let mutable disposed = false - member this.Set() = + member _.Set() = lock guard (fun () -> if not disposed then waitHandle.Set() |> ignore) - member this.Dispose() = + member _.Dispose() = lock guard (fun () -> disposed <- true; (waitHandle :> IDisposable).Dispose()) - member this.WaitOne(timeout : int) = + member _.WaitOne(timeout : int) = waitHandle.WaitOne(timeout, true) interface IDisposable with @@ -40,7 +39,7 @@ type internal EventWrapper() = let timeoutApp descr timeoutMS (f : 'a -> 'b) (arg:'a) = use ev = new EventWrapper() let mutable r = None - System.Threading.ThreadPool.QueueUserWorkItem(fun _ -> + ThreadPool.QueueUserWorkItem(fun _ -> r <- try f arg |> Some @@ -220,6 +219,7 @@ let fsiStartInfo channelName sourceFile = let fsiPath, fsiFirstArgs, fsiSupportsServer, fsiSupportsShadowcopy = determineFsiPath () procInfo.FileName <- fsiPath + // Mismatched encoding on I/O streams between VS addin and it's FSI session. // Fix: pin down the input/output encodings precisely (force I/O to use UTF8 regardless). // Send codepage preferences to the FSI. @@ -233,8 +233,7 @@ let fsiStartInfo channelName sourceFile = fsiFirstArgs |> addStringOption true "fsi-server-output-codepage" outCP |> addStringOption true "fsi-server-input-codepage" inCP - |> addStringOption true "fsi-server-lcid" System.Threading.Thread.CurrentThread.CurrentUICulture.LCID - //|> addStringOption true "fsi-server-association-file" sourceFile + |> addStringOption true "fsi-server-lcid" Thread.CurrentThread.CurrentUICulture.LCID |> addStringOption true "fsi-server" channelName |> (fun s -> s + sprintf " %s" SessionsProperties.fsiArgs) |> addBoolOption fsiSupportsShadowcopy "shadowcopyreferences" SessionsProperties.fsiShadowCopy @@ -257,8 +256,10 @@ let fsiStartInfo channelName sourceFile = match sourceFile with | path when path <> null && Directory.Exists(Path.GetDirectoryName(path)) -> Path.GetDirectoryName(path) | _ -> Path.GetTempPath() + if Directory.Exists(initialPath) then procInfo.WorkingDirectory <- initialPath + procInfo, fsiSupportsServer @@ -274,19 +275,46 @@ type FsiSession(sourceFile: string) = sprintf "FSIChannel_%d_%d_%d" pid tick salt let procInfo, fsiSupportsServer = fsiStartInfo channelName sourceFile + + let usingNetCore = SessionsProperties.fsiUseNetCore + let cmdProcess = new Process(StartInfo=procInfo) let fsiOutput = Event<_>() let fsiError = Event<_>() do cmdProcess.Start() |> ignore + let mutable cmdProcessPid = cmdProcess.Id + let mutable trueProcessPid = if usingNetCore then None else Some cmdProcessPid + let trueProcessIdFile = Path.GetTempFileName() + ".pid" + + let mutable seenPidJunkOutput = false + let mutable skipLines = 0 + // hook up stdout\stderr data events - do readLinesAsync cmdProcess.StandardOutput (catchAll fsiOutput.Trigger) + do readLinesAsync cmdProcess.StandardOutput (fun line -> + // For .NET Core, the "dotnet fsi ..." starts a second process "dotnet ..../fsi.dll ..." + // So the first thing we ask a .NET Core F# Interactive to do is report its true process ID. + // + // After it executes the request it will print: + // LINE1 --> val it: unit = () + // LINE2 --> + // LINE3 --> SERVER-PROMPT> + // + // We skip these lines. + if usingNetCore && not seenPidJunkOutput && line.StartsWith("val ") then + skipLines <- 2 + seenPidJunkOutput <- true + elif skipLines > 0 then + skipLines <- skipLines - 1 + else + catchAll fsiOutput.Trigger line) + do readLinesAsync cmdProcess.StandardError (catchAll fsiError.Trigger) let inputQueue = // Write the input asynchronously, freeing up the IDE thread to contrinue doing work - // Fix 982: Force input to be written in UTF8 regardless of the apparent encoding. + // Force input to be written in UTF8 regardless of the apparent encoding. let inputWriter = new StreamWriter(cmdProcess.StandardInput.BaseStream, new UTF8Encoding(encoderShouldEmitUTF8Identifier=false), AutoFlush = false) MailboxProcessor.Start(fun inbox -> async { @@ -298,6 +326,9 @@ type FsiSession(sourceFile: string) = with _ -> () // if writing or flushing fails then just give up on this F# Interactive session }) + do if usingNetCore then + inputQueue.Post($"""System.IO.File.WriteAllText(@"{trueProcessIdFile}", string (System.Diagnostics.Process.GetCurrentProcess().Id));;""") + do cmdProcess.EnableRaisingEvents <- true let clientConnection = @@ -310,47 +341,46 @@ type FsiSession(sourceFile: string) = /// interrupt timeout in miliseconds let interruptTimeoutMS = 1000 - let checkLeaseStatus myService = - if false then - let myLease = RemotingServices.GetLifetimeService(myService) :?> ILease - match myLease with - | null -> printf "Cannot get lease.\n" - | _ -> - ignore (System.Windows.Forms.MessageBox.Show - (sprintf "Initial lease time is %s\n" (myLease.InitialLeaseTime .ToString()) + - sprintf "Current lease time is %s\n" (myLease.CurrentLeaseTime .ToString()) + - sprintf "Renew on call time is %s\n" (myLease.RenewOnCallTime .ToString()) + - sprintf "Sponsorship timeout is %s\n" (myLease.SponsorshipTimeout.ToString()) + - sprintf "Current lease state is %s\n" (myLease.CurrentState .ToString()))) - - // Create session object - member x.Interrupt() = + member _.Interrupt() = match clientConnection with | None -> false | Some client -> - checkLeaseStatus client match timeoutApp "VFSI interrupt" interruptTimeoutMS (fun () -> client.Interrupt()) () with | Some () -> true | None -> false - member x.SendInput (str: string) = inputQueue.Post(str) + member _.SendInput (str: string) = inputQueue.Post(str) - member x.Output = Observable.filter nonNull fsiOutput.Publish + member _.Output = Observable.filter nonNull fsiOutput.Publish - member x.Error = Observable.filter nonNull fsiError.Publish + member _.Error = Observable.filter nonNull fsiError.Publish - member x.Exited = (cmdProcess.Exited |> Observable.map id) + member _.Exited = (cmdProcess.Exited |> Observable.map id) - member x.Alive = not cmdProcess.HasExited + member _.Alive = not cmdProcess.HasExited - member x.SupportsInterrupt = not cmdProcess.HasExited && clientConnection.IsSome // clientConnection not on .NET Core + member _.SupportsInterrupt = not cmdProcess.HasExited && clientConnection.IsSome // clientConnection not on .NET Core - member x.ProcessID = cmdProcess.Id + member _.ProcessID = + // When using .NET Core, allow up to 2 seconds to allow detection of process ID + // of inner process to complete on startup. The only scenario where we ask for the process ID immediately after + // process startup is when the user clicks "Start Debugging" before the process has started. + for i in 0..10 do + if SessionsProperties.fsiUseNetCore && trueProcessPid.IsNone then + if File.Exists(trueProcessIdFile) then + trueProcessPid <- Some (File.ReadAllText trueProcessIdFile |> int) + File.Delete(trueProcessIdFile) + else + System.Threading.Thread.Sleep(200) + + match trueProcessPid with + | None -> cmdProcessPid + | Some pid -> pid - member x.ProcessArgs = procInfo.Arguments + member _.ProcessArgs = procInfo.Arguments - member x.Kill() = + member _.Kill() = let verboseSession = false try if verboseSession then fsiOutput.Trigger ("Kill process " + cmdProcess.Id.ToString()) @@ -397,36 +427,36 @@ type FsiSessions() = let ensure(sourceFile) = if sessionR.IsNone then restart(sourceFile) - member x.Interrupt() = + member _.Interrupt() = sessionR |> Option.forall (fun session -> session.Interrupt()) - member x.SendInput s = + member _.SendInput s = sessionR |> Option.iter (fun session -> session.SendInput s) - member x.Output = fsiOut.Publish + member _.Output = fsiOut.Publish - member x.Error = fsiError.Publish + member _.Error = fsiError.Publish - member x.Alive = + member _.Alive = sessionR |> Option.exists (fun session -> session.Alive) - member x.SupportsInterrupt = + member _.SupportsInterrupt = sessionR |> Option.exists (fun session -> session.SupportsInterrupt) - member x.ProcessID = + member _.ProcessID = match sessionR with | None -> -1 (* -1 assumed to never be a valid process ID *) | Some session -> session.ProcessID - member x.ProcessArgs = + member _.ProcessArgs = match sessionR with | None -> "" | Some session -> session.ProcessArgs - member x.Kill() = kill() + member _.Kill() = kill() - member x.Ensure(sourceFile) = ensure(sourceFile) + member _.Ensure(sourceFile) = ensure(sourceFile) - member x.Restart(sourceFile) = restart(sourceFile) + member _.Restart(sourceFile) = restart(sourceFile) - member x.Exited = fsiExited.Publish + member _.Exited = fsiExited.Publish diff --git a/vsintegration/tests/MockTypeProviders/DummyProviderForLanguageServiceTesting/ProvidedTypes.fs b/vsintegration/tests/MockTypeProviders/DummyProviderForLanguageServiceTesting/ProvidedTypes.fs index 70203708ee..d0921f566e 100644 --- a/vsintegration/tests/MockTypeProviders/DummyProviderForLanguageServiceTesting/ProvidedTypes.fs +++ b/vsintegration/tests/MockTypeProviders/DummyProviderForLanguageServiceTesting/ProvidedTypes.fs @@ -13034,7 +13034,7 @@ namespace ProviderImplementation.ProvidedTypes showTimes: bool dumpDebugInfo:bool } - let WriteILBinary (outfile, (args: options), modul) = + let WriteILBinaryFile (outfile, (args: options), modul) = writeBinaryAndReportMappings (outfile, args.ilg, args.pdbfile, (* args.signer, *) args.portablePDB, args.embeddedPDB, args.embedAllSource, args.embedSourceList, args.sourceLink, args.emitTailcalls, args.deterministic, args.showTimes, args.dumpDebugInfo) modul @@ -13342,7 +13342,7 @@ namespace ProviderImplementation.ProvidedTypes member _.Save() = let il = mb.Content let options: BinaryWriter.options = { ilg = ilg; pdbfile = None; portablePDB = false; embeddedPDB = false; embedAllSource = false; embedSourceList = []; sourceLink = ""; emitTailcalls = true; deterministic = false; showTimes = false; dumpDebugInfo = false } - BinaryWriter.WriteILBinary (fileName, options, il) + BinaryWriter.WriteILBinaryFile (fileName, options, il) override _.ToString() = "builder for " + (assemblyName.ToString()) diff --git a/vsintegration/tests/MockTypeProviders/DummyProviderForLanguageServiceTesting/ProvidedTypes.fsi b/vsintegration/tests/MockTypeProviders/DummyProviderForLanguageServiceTesting/ProvidedTypes.fsi index 65784ae9e7..877a06435f 100644 --- a/vsintegration/tests/MockTypeProviders/DummyProviderForLanguageServiceTesting/ProvidedTypes.fsi +++ b/vsintegration/tests/MockTypeProviders/DummyProviderForLanguageServiceTesting/ProvidedTypes.fsi @@ -502,7 +502,7 @@ namespace ProviderImplementation.ProvidedTypes #if !NO_GENERATIVE /// Register that a given file is a provided generated target assembly, e.g. an assembly produced by an external - /// code generation tool. This assembly should be a target assembly, i.e. use the same asssembly references + /// code generation tool. This assembly should be a target assembly, i.e. use the same assembly references /// as given by TargetContext.ReferencedAssemblyPaths member RegisterGeneratedTargetAssembly: fileName: string -> Assembly #endif