From 5988f34cfcb3d637c0117d394a5ece0ddca94f62 Mon Sep 17 00:00:00 2001 From: Don Syme Date: Fri, 11 Feb 2022 22:57:09 +0000 Subject: [PATCH 01/17] muti-assembly and debug emit for FSI --- src/fsharp/IlxGen.fs | 6 +- src/fsharp/IlxGen.fsi | 2 - src/fsharp/absil/ilreflect.fs | 6 +- src/fsharp/absil/ilreflect.fsi | 15 +- src/fsharp/absil/ilwrite.fs | 358 ++++++++++++++++++++------------- src/fsharp/absil/ilwrite.fsi | 2 +- src/fsharp/fsi/fsi.fs | 268 ++++++++++++++++++++++-- src/fsharp/fsi/fsi.fsi | 2 + 8 files changed, 476 insertions(+), 183 deletions(-) diff --git a/src/fsharp/IlxGen.fs b/src/fsharp/IlxGen.fs index a32fe936ae7..a9896c872e1 100644 --- a/src/fsharp/IlxGen.fs +++ b/src/fsharp/IlxGen.fs @@ -8754,9 +8754,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 @@ -8778,7 +8776,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 7fe28f1616b..d4184d75c15 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/absil/ilreflect.fs b/src/fsharp/absil/ilreflect.fs index 2eff2b6d4ee..235c608741a 100644 --- a/src/fsharp/absil/ilreflect.fs +++ b/src/fsharp/absil/ilreflect.fs @@ -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 ILReflectEmitEnv = { emTypMap: Zmap emConsMap: Zmap emMethMap: Zmap @@ -2134,7 +2134,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 61d9102fc9e..d3fda5ca8b4 100644 --- a/src/fsharp/absil/ilreflect.fsi +++ b/src/fsharp/absil/ilreflect.fsi @@ -17,26 +17,23 @@ type cenv = generatePdb: bool resolveAssemblyRef: ILAssemblyRef -> Choice option } -type emEnv +type ILReflectEmitEnv -val emEnv0: emEnv +val emEnv0: ILReflectEmitEnv val emitModuleFragment: ilg: ILGlobals * emitTailcalls: bool * - emEnv: emEnv * + emEnv: ILReflectEmitEnv * asmB: AssemblyBuilder * modB: ModuleBuilder * modul: ILModuleDef * debugInfo: bool * resolveAssemblyRef: (ILAssemblyRef -> Choice option) * tryFindSysILTypeRef: (string -> ILTypeRef option) -> - emEnv * (unit -> exn option) list + ILReflectEmitEnv * (unit -> exn option) list -val LookupTypeRef: cenv: cenv -> emEnv: emEnv -> tref: ILTypeRef -> System.Type +val LookupTypeRef: cenv: cenv -> emEnv: ILReflectEmitEnv -> tref: ILTypeRef -> System.Type -val LookupType: cenv: cenv -> emEnv: emEnv -> ty: ILType -> System.Type +val LookupType: cenv: cenv -> emEnv: ILReflectEmitEnv -> 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 7ddd68e404c..e6918a0d339 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 @@ -3542,53 +3542,116 @@ 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, + signer: ILStrongNameSigner option, + deterministic, + pathMap, + pdbData, + pdbOpt, + 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 = + // 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 fpdb -> try - let res = writeBinaryAndReportMappingsAux(stream, false, ilg, pdbfile, signer, portablePDB, embeddedPDB, embedAllSource, embedSourceList, sourceLink, - checksumAlgorithm, emitTailcalls, deterministic, showTimes, pathMap) modul normalizeAssemblyRefs + 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 - FileSystemUtilities.setExecutablePermission outfile - with _ -> - () + // 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 - res - with - | _ -> - try FileSystem.FileDeleteShim outfile with | _ -> () + // 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 -> 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" + +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 +3682,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, pdbOpt, debugDirectoryChunk, debugDataChunk, debugChecksumPdbChunk, debugEmbeddedPdbChunk, debugDeterministicPdbChunk, textV2P, mappings = - try + + use os = new BinaryWriter(stream, System.Text.Encoding.UTF8) let imageBaseReal = modul.ImageBase // FIXED CHOICE let alignVirt = modul.VirtualAlignment // FIXED CHOICE @@ -3790,7 +3851,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 +3872,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 +3898,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 +3916,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 +4006,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 +4018,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 +4030,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,98 +4310,102 @@ 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() - reportTime showTimes "Writing Image" pdbData, pdbOpt, debugDirectoryChunk, debugDataChunk, debugChecksumPdbChunk, debugEmbeddedPdbChunk, debugDeterministicPdbChunk, textV2P, mappings -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 writeBinaryFiles (outfile, + ilg: ILGlobals, + pdbfile: string option, + signer: ILStrongNameSigner option, + portablePDB, + embeddedPDB, + embedAllSource, + embedSourceList, + sourceLink, + checksumAlgorithm, + emitTailcalls, + deterministic, + showTimes, + dumpDebugInfo, + pathMap, + modul, normalizeAssemblyRefs) = - // 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 stream = 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" + // 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) + + let pdbData, pdbOpt, debugDirectoryChunk, debugDataChunk, debugChecksumPdbChunk, debugEmbeddedPdbChunk, debugDeterministicPdbChunk, textV2P, mappings = + try + let res = + writeBinaryAux( + stream, ilg, pdbfile, signer, + portablePDB, embeddedPDB, embedAllSource, + embedSourceList, sourceLink, + checksumAlgorithm, emitTailcalls, deterministic, showTimes, pathMap, + modul, normalizeAssemblyRefs) - // 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 + FileSystemUtilities.setExecutablePermission outfile + with _ -> + () - // 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 -> + res + with + | _ -> + try FileSystem.FileDeleteShim outfile with | _ -> () reraise() - end - reportTime showTimes "Finalize PDB" + writePdb + (dumpDebugInfo, showTimes, portablePDB, embeddedPDB, pdbfile, outfile, signer, deterministic, pathMap, + pdbData, pdbOpt, debugDirectoryChunk, debugDataChunk, debugChecksumPdbChunk, debugEmbeddedPdbChunk, + debugDeterministicPdbChunk, textV2P) - // 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 _ -> ()) - () + mappings + +let writeBinaryStream ( + outfile: string, + stream: Stream, + ilg: ILGlobals, + pdbfile: string option, + signer: ILStrongNameSigner option, + portablePDB, + embeddedPDB, + embedAllSource, + embedSourceList, + sourceLink, + checksumAlgorithm, + emitTailcalls, deterministic, + showTimes, + dumpDebugInfo, + pathMap, + modul, + normalizeAssemblyRefs) = + + let pdbData, pdbOpt, debugDirectoryChunk, debugDataChunk, debugChecksumPdbChunk, debugEmbeddedPdbChunk, debugDeterministicPdbChunk, textV2P, mappings = + writeBinaryAux(stream, ilg, + pdbfile, signer, + portablePDB, embeddedPDB, embedAllSource, + embedSourceList, sourceLink, + checksumAlgorithm, emitTailcalls, + deterministic, showTimes, pathMap, modul, normalizeAssemblyRefs) + + writePdb + (dumpDebugInfo, showTimes, portablePDB, embeddedPDB, pdbfile, + outfile, signer, deterministic, pathMap, + pdbData, pdbOpt, debugDirectoryChunk, debugDataChunk, + debugChecksumPdbChunk, debugEmbeddedPdbChunk, + debugDeterministicPdbChunk, textV2P) - reportTime showTimes "Signing Image" - //Finished writing and signing the binary and debug info... mappings + type options = { ilg: ILGlobals pdbfile: string option @@ -4363,14 +4422,27 @@ 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 WriteILBinary (outfile, options: options, inputModule, normalizeAssemblyRefs) = + writeBinaryFiles (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 +let WriteILBinaryStream (stream, options: options, inputModule: ILModuleDef, normalizeAssemblyRefs) = + if options.pdbfile.IsSome then invalidArg "options" "can't emit PDB when writing to stream unless embedded" + let outfile = inputModule.Name // this is unused when writing to stream + writeBinaryStream (outfile, + stream, + 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 diff --git a/src/fsharp/absil/ilwrite.fsi b/src/fsharp/absil/ilwrite.fsi index 152c9abc45f..2414e997d7b 100644 --- a/src/fsharp/absil/ilwrite.fsi +++ b/src/fsharp/absil/ilwrite.fsi @@ -29,4 +29,4 @@ type options = val WriteILBinary: filename: string * 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 +val WriteILBinaryStream: stream: Stream * options: options * inputModule: ILModuleDef * (ILAssemblyRef -> ILAssemblyRef) -> unit \ No newline at end of file diff --git a/src/fsharp/fsi/fsi.fs b/src/fsharp/fsi/fsi.fs index 9e9b829cf87..d34a5c8a345 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.ILRuntimeWriter open FSharp.Compiler.AccessibilityLogic open FSharp.Compiler.CheckDeclarations open FSharp.Compiler.CheckExpressions @@ -222,6 +223,130 @@ type internal FsiTimeReporter(outWriter: TextWriter) = member tr.TimeOpIf flag f = if flag then tr.TimeOp f else f () +#if !SINGLE_ASSEMBLY +type ILDynamicEmitEnv = + { ilg: ILGlobals + resolveAssemblyRef: ILAssemblyRef -> Choice option + TypeMap: Zmap } + + member _.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) + let setVersion (version: ILVersionInfo) = + asmName.Version <- Version (int32 version.Major, int32 version.Minor, int32 version.Build, int32 version.Revision) + Option.iter setVersion aref.Version + // asmName.ProcessorArchitecture <- System.Reflection.ProcessorArchitecture.MSIL + //Option.iter (fun name -> asmName.CultureInfo <- System.Globalization.CultureInfo.CreateSpecificCulture name) aref.Locale + asmName.CultureInfo <- System.Globalization.CultureInfo.InvariantCulture + asmName + + member cenv.convResolveAssemblyRef (asmref: ILAssemblyRef) qualifiedName = + let assembly = + match cenv.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 = cenv.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 Reflection.Emit System.Type value. + // This ought to be an adequate substitute for this whole function, but it needs + // to be thoroughly tested. + // Type.GetType(tref.QualifiedName) + // [] , name -> name + // [ns] , name -> ns+name + // [ns;typeA;typeB], name -> ns+typeA+typeB+name + member cenv.convTypeRefAux (tref: ILTypeRef) = + let qualifiedName = (String.concat "+" (tref.Enclosing @ [ tref.Name ])).Replace(",", @"\,") + match tref.Scope with + | ILScopeRef.Assembly asmref -> + cenv.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 -> + cenv.convResolveAssemblyRef cenv.ilg.primaryAssemblyRef qualifiedName + + member emEnv.LookupTypeRef (tref: ILTypeRef) = + let key = tref.BasicQualifiedName + //printfn $"lookup {tref.BasicQualifiedName}" + //if not (emEnv.TypeMap.ContainsKey(key)) then + //printfn $"keys = %A{[ for (KeyValue(k,_)) in emEnv.TypeMap -> k ]}" + + let typ, _ = emEnv.TypeMap.[key] + typ + + member emEnv.LookupType (ty: ILType) = + let rec convTypeSpec (tspec: ILTypeSpec) = + let tref = tspec.TypeRef + let typT = + if tref.Scope.IsLocalRef then + emEnv.LookupTypeRef tref + else + emEnv.convTypeRefAux 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" + convTypeAux ty + + member emEnv.AddTypeDef (asm: Assembly) ilScopeRef enc (tdef: ILTypeDef) = + let tref = mkRefForNestedILTypeDef ilScopeRef (enc, tdef) + let key = tref.BasicQualifiedName + let typ = asm.GetType(key) + //printfn "Adding %s --> %s" key typ.FullName + let tref = ILTypeRef.Create(ilScopeRef, [ for e in enc -> e.Name ], typ.Name) + let emEnv = + { emEnv with + TypeMap = Zmap.add key (typ, tref) emEnv.TypeMap } + emEnv.AddTypeDefs asm ilScopeRef (enc@[tdef]) tdef.NestedTypes.AsList + + member emEnv.AddTypeDefs asm ilScopeRef enc (tdefs: ILTypeDef list) = + (emEnv, tdefs) ||> List.fold (fun emEnv tdef -> emEnv.AddTypeDef asm ilScopeRef enc tdef) + + +#endif type internal FsiValuePrinterMode = | PrintExpr @@ -312,7 +437,7 @@ type FsiEvaluationSessionHostConfig () = /// 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, _tcConfigB: TcConfigBuilder, _g: TcGlobals, _generateDebugInfo, _resolveAssemblyRef, outWriter: TextWriter) = /// This printer is used by F# Interactive if no other printers apply. let DefaultPrintingIntercept (ienv: IEnvironment) (obj:obj) = @@ -383,12 +508,16 @@ type internal FsiValuePrinter(fsi: FsiEvaluationSessionHostConfig, tcConfigB: Tc ShowIEnumerable = fsi.ShowIEnumerable; } /// Get the evaluation context used when inverting the storage mapping of the ILRuntimeWriter. - member _.GetEvaluationContext emEnv = +#if DYNAMIC_ASSEMBLY + member _.GetEvaluationContext (emEnv: ILReflectEmitEnv) = 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 + { LookupTypeRef = LookupTypeRef cenv emEnv LookupType = LookupType cenv emEnv } +#else + member _.GetEvaluationContext (emEnv: ILDynamicEmitEnv) = + { LookupTypeRef = emEnv.LookupTypeRef + LookupType = emEnv.LookupType } +#endif /// 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 +576,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) -> @@ -983,11 +1109,16 @@ type internal FsiInteractionStepStatus = | CompletedWithAlreadyReportedError | CompletedWithReportedError of exn + [] [] type internal FsiDynamicCompilerState = { optEnv : Optimizer.IncrementalOptimizationEnv - emEnv : emEnv +#if SINGLE_ASSEMBLY + emEnv : ILDynamicEmitEnv +#else + emEnv : ILDynamicEmitEnv +#endif tcGlobals : TcGlobals tcState : TcState tcImports : TcImports @@ -1106,7 +1237,7 @@ type internal FsiDynamicCompiler tcGlobals: TcGlobals, fsiOptions : FsiCommandLineOptions, fsiConsoleOutput : FsiConsoleOutput, - fsiCollectible: bool, + _fsiCollectible: bool, niceNameGen, resolveAssemblyRef) = @@ -1118,15 +1249,18 @@ type internal FsiDynamicCompiler let valueBoundEvent = Control.Event<_>() let mutable fragmentId = 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 assemblyBuilder,moduleBuilder = mkDynamicAssemblyAndModule (assemblyName, tcConfigB.optSettings.LocalOptimizationsEnabled, generateDebugInfo, fsiCollectible) + //let assemblyBuilder,moduleBuilder = mkDynamicAssemblyAndModule (assemblyName, tcConfigB.optSettings.LocalOptimizationsEnabled, generateDebugInfo, fsiCollectible) let rangeStdin = rangeN stdinMockFilename 0 @@ -1175,20 +1309,101 @@ type internal FsiDynamicCompiler ReportTime tcConfig "Reflection.Emit"; +#if SINGLE_ASSEMBLY let emEnv,execs = emitModuleFragment(ilGlobals, tcConfig.emitTailcalls, emEnv, assemblyBuilder, moduleBuilder, mainmod3, generateDebugInfo, resolveAssemblyRef, tcGlobals.TryFindSysILTypeRef) +#else + // Generate assemblies into their respective fragments + let assemblyName = ilxMainModule.ManifestOfAssembly.Name + string fragmentId + + let ilxMainModule = { ilxMainModule with Manifest = Some { ilxMainModule.Manifest.Value with Name = assemblyName } } + + let rwTypeRef (tref: ILTypeRef) = + if tref.Scope.IsLocalRef then + let nm = tref.BasicQualifiedName + if emEnv.TypeMap.ContainsKey(nm) then + let _, tgt = emEnv.TypeMap.[nm] + //printfn $"rewriting {tref.QualifiedName} to {tgt.QualifiedName}" + tgt + else + //printfn $"no rewrite found for {nm}, assuming in this fragment" + tref + else + tref + + // Rewrite target types to their respective assemblies + let ilxMainModule = ilxMainModule |> Morphs.morphILTypeRefsInILModuleMemoized rwTypeRef + + let opts = + { ilg = tcGlobals.ilg + pdbfile = None // TODO + emitTailcalls = tcConfig.emitTailcalls + deterministic = tcConfig.deterministic + showTimes = tcConfig.showTimes + portablePDB = true // tcConfig.portablePDB + embeddedPDB = true // tcConfig.embeddedPDB + embedAllSource = tcConfig.embedAllSource + embedSourceList = tcConfig.embedSourceList + sourceLink = tcConfig.sourceLink + checksumAlgorithm = tcConfig.checksumAlgorithm + signer = None + dumpDebugInfo = tcConfig.dumpDebugInfo + pathMap = tcConfig.pathMap } + + let normalizeAssemblyRefs = id + + let bytes = + let stream = new MemoryStream() + WriteILBinaryStream (stream, opts, ilxMainModule, normalizeAssemblyRefs) + stream.Close() + stream.ToArray() + + let asm = System.Reflection.Assembly.Load(bytes) + + dynamicAssemblies.Add(asm) + + let ilScopeRef = ILScopeRef.Assembly (ILAssemblyRef.FromAssemblyName(asm.GetName())) + + 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 ] + + let execs = + [ for edef in entries -> + (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) ] + + let emEnv = emEnv.AddTypeDefs asm ilScopeRef [] ilxMainModule.TypeDefs.AsList +#endif 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 +#if SINGLE_ASSEMBLY 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); - +#else + for referencedTypeDefs, bytes in codegenResults.quotationResourceInfo do + let referencedTypes = + [| for tref in referencedTypeDefs do + yield emEnv.LookupTypeRef tref |] + Microsoft.FSharp.Quotations.Expr.RegisterReflectedDefinitions (asm, fragName, bytes, referencedTypes); +#endif ReportTime tcConfig "Run Bindings"; timeReporter.TimeOpIf istate.timing (fun () -> @@ -1392,9 +1607,15 @@ type internal FsiDynamicCompiler let nextState, addedType = addTypeToEnvironment state ilTy nextState, addedTypes @ [addedType]) (istate, []) +#if SINGLE_ASSEMBLY member _.DynamicAssemblyName = assemblyName member _.DynamicAssembly = (assemblyBuilder :> Assembly) +#else + member _.FindDynamicAssembly(simpleAssemName) = + //printfn $"searching for {simpleAssemName}" + dynamicAssemblies |> ResizeArray.tryFind (fun asm -> asm.GetName().Name = simpleAssemName) +#endif member _.EvalParsedSourceFiles (ctok, errorLogger, istate, inputs) = let i = nextFragmentId() @@ -1708,7 +1929,7 @@ type internal FsiDynamicCompiler member _.GetInitialInteractiveState () = let tcConfig = TcConfig.Create(tcConfigB,validate=false) let optEnv0 = GetInitialOptimizationEnv (tcImports, tcGlobals) - let emEnv = emEnv0 + let emEnv0 = { ilg = tcGlobals.ilg; resolveAssemblyRef = resolveAssemblyRef; TypeMap = Zmap.empty ComparisonIdentity.Structural } let tcEnv, openDecls0 = GetInitialTcEnv (assemblyName, rangeStdin, tcConfig, tcImports, tcGlobals) let ccuName = assemblyName @@ -1716,7 +1937,7 @@ type internal FsiDynamicCompiler let ilxGenerator = CreateIlxAssemblyGenerator (tcConfig, tcImports, tcGlobals, (LightweightTcValForUsingInBuildMethodCall tcGlobals), tcState.Ccu) {optEnv = optEnv0 - emEnv = emEnv + emEnv = emEnv0 tcGlobals = tcGlobals tcState = tcState tcImports = tcImports @@ -1896,7 +2117,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 +2132,16 @@ module internal MagicAssemblyResolution = simpleAssemName.EndsWith(".XmlSerializers", StringComparison.OrdinalIgnoreCase) || (runningOnMono && simpleAssemName = "UIAutomationWinforms") then null else +#if SINGLE_ASSEMBLY // 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 +#else + match fsiDynamicCompiler.FindDynamicAssembly(simpleAssemName) with + | Some asm -> asm + | None -> + +#endif // Otherwise continue let assemblyReferenceTextDll = (simpleAssemName + ".dll") @@ -2974,8 +3202,10 @@ type FsiEvaluationSession (fsi: FsiEvaluationSessionHostConfig, argv:string[], i member x.CurrentPartialAssemblySignature = fsiDynamicCompiler.CurrentPartialAssemblySignature fsiInteractionProcessor.CurrentState +#if SINGLE_ASSEMBLY member x.DynamicAssembly = fsiDynamicCompiler.DynamicAssembly +#endif /// A host calls this to determine if the --gui parameter is active member x.IsGui = fsiOptions.Gui diff --git a/src/fsharp/fsi/fsi.fsi b/src/fsharp/fsi/fsi.fsi index 30c11444556..e22b60e9c4a 100644 --- a/src/fsharp/fsi/fsi.fsi +++ b/src/fsharp/fsi/fsi.fsi @@ -241,8 +241,10 @@ type FsiEvaluationSession = /// Get a handle to the resolved view of the current signature of the incrementally generated assembly. member CurrentPartialAssemblySignature: FSharpAssemblySignature +#if SINGLE_ASSEMBLY /// Get a handle to the dynamically generated assembly member DynamicAssembly: System.Reflection.Assembly +#endif /// A host calls this to determine if the --gui parameter is active member IsGui: bool From 5af93486cd64832962b6dc657b5e1b6316a67829 Mon Sep 17 00:00:00 2001 From: Don Syme Date: Sat, 12 Feb 2022 00:46:03 +0000 Subject: [PATCH 02/17] various fixes --- src/fsharp/absil/ilwrite.fs | 215 ++++++++++-------- src/fsharp/absil/ilwrite.fsi | 18 +- src/fsharp/absil/ilwritepdb.fs | 46 ++-- src/fsharp/absil/ilwritepdb.fsi | 8 +- src/fsharp/fsc.fs | 8 +- src/fsharp/fsi/fsi.fs | 56 +++-- .../ProvidedTypes.fs | 4 +- 7 files changed, 189 insertions(+), 166 deletions(-) diff --git a/src/fsharp/absil/ilwrite.fs b/src/fsharp/absil/ilwrite.fs index e6918a0d339..0231fde1ad7 100644 --- a/src/fsharp/absil/ilwrite.fs +++ b/src/fsharp/absil/ilwrite.fs @@ -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 @@ -3549,6 +3550,8 @@ let writePdb ( embeddedPDB, pdbfile, outfile, + reopenOutput, + writePdbInMemory, signer: ILStrongNameSigner option, deterministic, pathMap, @@ -3563,6 +3566,9 @@ let writePdb ( if dumpDebugInfo then logDebugInfo outfile pdbData + // Used to capture the pdb file bytes in the case we're generating in-memory + let mutable pdbBytes = None + // Now we've done the bulk of the binary, do the PDB file and fixup the binary. match pdbfile with | None -> () @@ -3570,52 +3576,58 @@ let writePdb ( | Some fmdb when runningOnMono && not portablePDB -> writeMdbInfo fmdb outfile pdbData #endif - | Some fpdb -> - 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 + | Some pdbfile -> + let idd = + match pdbOpt 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 - writePortablePdbInfo contentId stream showTimes fpdb pathMap debugDataChunk debugDeterministicPdbChunk debugChecksumPdbChunk algorithmName checkSum embeddedPDB deterministic - | None -> + 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 - Array.empty + [| |] #else - writePdbInfo showTimes outfile fpdb pdbData debugDataChunk + writePdbInfo showTimes outfile pdbfile 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() + 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 = 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() reportTime showTimes "Finalize PDB" @@ -3634,6 +3646,7 @@ let writePdb ( () reportTime showTimes "Signing Image" + pdbBytes let writeBinaryAux ( stream: Stream, @@ -3691,7 +3704,7 @@ let writeBinaryAux ( let pdbData, pdbOpt, debugDirectoryChunk, debugDataChunk, debugChecksumPdbChunk, debugEmbeddedPdbChunk, debugDeterministicPdbChunk, textV2P, mappings = - use os = new BinaryWriter(stream, System.Text.Encoding.UTF8) + let os = new BinaryWriter(stream, System.Text.Encoding.UTF8) let imageBaseReal = modul.ImageBase // FIXED CHOICE let alignVirt = modul.VirtualAlignment // FIXED CHOICE @@ -3701,7 +3714,6 @@ let writeBinaryAux ( let numSections = 3 // .text, .sdata, .reloc - // HEADERS let next = 0x0 let headerSectionPhysLoc = 0x0 @@ -3800,8 +3812,8 @@ let writeBinaryAux ( 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) + let compressedStream = compressPortablePdbStream stream + Some (uncompressedLength, contentId, compressedStream, algorithmName, checkSum) else Some pdbStream | _ -> None @@ -4343,35 +4355,40 @@ let writeBinaryFiles (outfile, let pdbData, pdbOpt, debugDirectoryChunk, debugDataChunk, debugChecksumPdbChunk, debugEmbeddedPdbChunk, debugDeterministicPdbChunk, textV2P, mappings = try - let res = + try writeBinaryAux( stream, ilg, pdbfile, signer, portablePDB, embeddedPDB, embedAllSource, embedSourceList, sourceLink, checksumAlgorithm, emitTailcalls, deterministic, showTimes, pathMap, modul, normalizeAssemblyRefs) + finally + stream.Close() - try - FileSystemUtilities.setExecutablePermission outfile - with _ -> - () - - res - with - | _ -> + with _ -> try FileSystem.FileDeleteShim outfile with | _ -> () reraise() - writePdb - (dumpDebugInfo, showTimes, portablePDB, embeddedPDB, pdbfile, outfile, signer, deterministic, pathMap, - pdbData, pdbOpt, debugDirectoryChunk, debugDataChunk, debugChecksumPdbChunk, debugEmbeddedPdbChunk, - debugDeterministicPdbChunk, textV2P) + try + FileSystemUtilities.setExecutablePermission 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, pdbOpt, debugDirectoryChunk, + debugDataChunk, debugChecksumPdbChunk, debugEmbeddedPdbChunk, + debugDeterministicPdbChunk, textV2P) |> ignore mappings -let writeBinaryStream ( +let writeBinaryInMemory ( outfile: string, - stream: Stream, ilg: ILGlobals, pdbfile: string option, signer: ILStrongNameSigner option, @@ -4388,7 +4405,8 @@ let writeBinaryStream ( modul, normalizeAssemblyRefs) = - let pdbData, pdbOpt, debugDirectoryChunk, debugDataChunk, debugChecksumPdbChunk, debugEmbeddedPdbChunk, debugDeterministicPdbChunk, textV2P, mappings = + let stream = new MemoryStream() + let pdbData, pdbOpt, debugDirectoryChunk, debugDataChunk, debugChecksumPdbChunk, debugEmbeddedPdbChunk, debugDeterministicPdbChunk, textV2P, _mappings = writeBinaryAux(stream, ilg, pdbfile, signer, portablePDB, embeddedPDB, embedAllSource, @@ -4396,18 +4414,25 @@ let writeBinaryStream ( checksumAlgorithm, emitTailcalls, deterministic, showTimes, pathMap, modul, normalizeAssemblyRefs) - writePdb - (dumpDebugInfo, showTimes, portablePDB, embeddedPDB, pdbfile, - outfile, signer, deterministic, pathMap, - pdbData, pdbOpt, debugDirectoryChunk, debugDataChunk, - debugChecksumPdbChunk, debugEmbeddedPdbChunk, - debugDeterministicPdbChunk, textV2P) + let reopenOutput () = stream - mappings + let pdbBytes = + writePdb (dumpDebugInfo, + showTimes, portablePDB, embeddedPDB, pdbfile, + outfile, reopenOutput, true, + signer, deterministic, pathMap, + pdbData, pdbOpt, debugDirectoryChunk, debugDataChunk, + debugChecksumPdbChunk, debugEmbeddedPdbChunk, + debugDeterministicPdbChunk, textV2P) + + stream.Close() + + stream.ToArray(), pdbBytes type options = { ilg: ILGlobals + outfile: string pdbfile: string option portablePDB: bool embeddedPDB: bool @@ -4422,8 +4447,8 @@ type options = dumpDebugInfo: bool pathMap: PathMap } -let WriteILBinary (outfile, options: options, inputModule, normalizeAssemblyRefs) = - writeBinaryFiles (outfile, +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, @@ -4432,11 +4457,8 @@ let WriteILBinary (outfile, options: options, inputModule, normalizeAssemblyRefs inputModule, normalizeAssemblyRefs) |> ignore -let WriteILBinaryStream (stream, options: options, inputModule: ILModuleDef, normalizeAssemblyRefs) = - if options.pdbfile.IsSome then invalidArg "options" "can't emit PDB when writing to stream unless embedded" - let outfile = inputModule.Name // this is unused when writing to stream - writeBinaryStream (outfile, - stream, +let WriteILBinaryInMemory (options: options, inputModule: ILModuleDef, normalizeAssemblyRefs) = + writeBinaryInMemory (options.outfile, options.ilg, options.pdbfile, options.signer, @@ -4445,4 +4467,3 @@ let WriteILBinaryStream (stream, options: options, inputModule: ILModuleDef, nor options.emitTailcalls, options.deterministic, options.showTimes, options.dumpDebugInfo, options.pathMap, inputModule, normalizeAssemblyRefs) - |> ignore diff --git a/src/fsharp/absil/ilwrite.fsi b/src/fsharp/absil/ilwrite.fsi index 2414e997d7b..2c1cab018b1 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 WriteILBinaryStream: 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 75cfd3dcacf..e299213fcca 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 f4f1eb86f96..ed88eaec873 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 26d1b81f71f..2c5d58c62a3 100644 --- a/src/fsharp/fsc.fs +++ b/src/fsharp/fsc.fs @@ -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/fsi.fs b/src/fsharp/fsi/fsi.fs index d34a5c8a345..236448bcd2b 100644 --- a/src/fsharp/fsi/fsi.fs +++ b/src/fsharp/fsi/fsi.fs @@ -1307,40 +1307,47 @@ type internal FsiDynamicCompiler ignore(fsiOptions) #endif - ReportTime tcConfig "Reflection.Emit"; + ReportTime tcConfig "Reflection.Emit" #if SINGLE_ASSEMBLY let emEnv,execs = emitModuleFragment(ilGlobals, tcConfig.emitTailcalls, emEnv, assemblyBuilder, moduleBuilder, mainmod3, generateDebugInfo, resolveAssemblyRef, tcGlobals.TryFindSysILTypeRef) #else - // Generate assemblies into their respective fragments + // Generate assemblies into multiple fragments let assemblyName = ilxMainModule.ManifestOfAssembly.Name + string fragmentId + // Adjust the assembly name of this fragment let ilxMainModule = { ilxMainModule with Manifest = Some { ilxMainModule.Manifest.Value with Name = assemblyName } } - let rwTypeRef (tref: ILTypeRef) = - if tref.Scope.IsLocalRef then - let nm = tref.BasicQualifiedName - if emEnv.TypeMap.ContainsKey(nm) then - let _, tgt = emEnv.TypeMap.[nm] - //printfn $"rewriting {tref.QualifiedName} to {tgt.QualifiedName}" - tgt + // Rewrite references to target types to their respective dynamic assemblies + let ilxMainModule = + ilxMainModule |> Morphs.morphILTypeRefsInILModuleMemoized (fun tref -> + if tref.Scope.IsLocalRef then + let nm = tref.BasicQualifiedName + if emEnv.TypeMap.ContainsKey(nm) then + let _, tgt = emEnv.TypeMap.[nm] + //printfn $"rewriting {tref.QualifiedName} to {tgt.QualifiedName}" + tgt + else + //printfn $"no rewrite found for {nm}, assuming in this fragment" + tref else - //printfn $"no rewrite found for {nm}, assuming in this fragment" - tref - else - tref - - // Rewrite target types to their respective assemblies - let ilxMainModule = ilxMainModule |> Morphs.morphILTypeRefsInILModuleMemoized rwTypeRef + tref) let opts = { ilg = tcGlobals.ilg - pdbfile = None // TODO + // 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 = assemblyName + ".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 (assemblyName + ".pdb") else None) emitTailcalls = tcConfig.emitTailcalls deterministic = tcConfig.deterministic showTimes = tcConfig.showTimes - portablePDB = true // tcConfig.portablePDB - embeddedPDB = true // tcConfig.embeddedPDB + // 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 @@ -1351,13 +1358,12 @@ type internal FsiDynamicCompiler let normalizeAssemblyRefs = id - let bytes = - let stream = new MemoryStream() - WriteILBinaryStream (stream, opts, ilxMainModule, normalizeAssemblyRefs) - stream.Close() - stream.ToArray() + let assemblyBytes, pdbBytes = WriteILBinaryInMemory (opts, ilxMainModule, normalizeAssemblyRefs) - let asm = System.Reflection.Assembly.Load(bytes) + let asm = + match pdbBytes with + | None -> System.Reflection.Assembly.Load(assemblyBytes) + | Some pdbBytes -> System.Reflection.Assembly.Load(assemblyBytes, pdbBytes) dynamicAssemblies.Add(asm) diff --git a/vsintegration/tests/MockTypeProviders/DummyProviderForLanguageServiceTesting/ProvidedTypes.fs b/vsintegration/tests/MockTypeProviders/DummyProviderForLanguageServiceTesting/ProvidedTypes.fs index 70203708ee9..d0921f566e4 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()) From 23b4f3bca3e502b9f738cf1682fbe06c00e8a0fe Mon Sep 17 00:00:00 2001 From: Don Syme Date: Sat, 12 Feb 2022 01:31:14 +0000 Subject: [PATCH 03/17] various fixes --- src/fsharp/fsi/fsi.fs | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/fsharp/fsi/fsi.fs b/src/fsharp/fsi/fsi.fs index 236448bcd2b..dd5a8f31459 100644 --- a/src/fsharp/fsi/fsi.fs +++ b/src/fsharp/fsi/fsi.fs @@ -1295,13 +1295,13 @@ type internal FsiDynamicCompiler errorLogger.AbortOnError(fsiConsoleOutput); ReportTime tcConfig "Assembly refs Normalised"; - let mainmod3 = Morphs.morphILScopeRefsInILModuleMemoized (NormalizeAssemblyRefs (ctok, ilGlobals, tcImports)) ilxMainModule + 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; + ILAsciiWriter.output_module outWriter ilGlobals ilxMainModule; fsiConsoleOutput.uprintnfn "--------------------" #else ignore(fsiOptions) @@ -1310,7 +1310,7 @@ type internal FsiDynamicCompiler ReportTime tcConfig "Reflection.Emit" #if SINGLE_ASSEMBLY - let emEnv,execs = emitModuleFragment(ilGlobals, tcConfig.emitTailcalls, emEnv, assemblyBuilder, moduleBuilder, mainmod3, generateDebugInfo, resolveAssemblyRef, tcGlobals.TryFindSysILTypeRef) + let emEnv,execs = emitModuleFragment(ilGlobals, tcConfig.emitTailcalls, emEnv, assemblyBuilder, moduleBuilder, ilxMainModule, generateDebugInfo, resolveAssemblyRef, tcGlobals.TryFindSysILTypeRef) #else // Generate assemblies into multiple fragments let assemblyName = ilxMainModule.ManifestOfAssembly.Name + string fragmentId @@ -1369,6 +1369,7 @@ type internal FsiDynamicCompiler 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 @@ -1378,6 +1379,7 @@ type internal FsiDynamicCompiler 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 -> (fun () -> @@ -1391,7 +1393,7 @@ type internal FsiDynamicCompiler let emEnv = emEnv.AddTypeDefs asm ilScopeRef [] ilxMainModule.TypeDefs.AsList #endif - errorLogger.AbortOnError(fsiConsoleOutput); + 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 From 6a1bce1db81db7c70a9c3030c64e77b6432c7b19 Mon Sep 17 00:00:00 2001 From: Don Syme Date: Sun, 13 Feb 2022 17:42:29 +0000 Subject: [PATCH 04/17] Add warning for access to internal type, method or field from previous evaluation;; --- src/fsharp/AttributeChecking.fs | 8 +- src/fsharp/CompilerConfig.fs | 4 + src/fsharp/CompilerConfig.fsi | 1 + src/fsharp/CompilerImports.fs | 14 +- src/fsharp/IlxGen.fs | 28 +- src/fsharp/InfoReader.fs | 10 +- src/fsharp/PatternMatchCompilation.fs | 2 +- src/fsharp/StaticLinking.fs | 29 +- src/fsharp/TcGlobals.fs | 12 +- src/fsharp/TypedTree.fs | 4 +- src/fsharp/TypedTreeOps.fs | 6 +- src/fsharp/absil/il.fs | 133 +++-- src/fsharp/absil/il.fsi | 44 +- src/fsharp/absil/ilmorph.fs | 21 +- src/fsharp/absil/ilprint.fs | 67 +-- src/fsharp/absil/ilreflect.fs | 45 +- src/fsharp/absil/ilreflect.fsi | 16 +- src/fsharp/absil/ilwrite.fs | 39 +- src/fsharp/fsi/FSIstrings.txt | 2 + src/fsharp/fsi/fsi.fs | 519 ++++++++++-------- src/fsharp/fsi/fsi.fsi | 6 +- src/fsharp/fsi/xlf/FSIstrings.txt.cs.xlf | 10 + src/fsharp/fsi/xlf/FSIstrings.txt.de.xlf | 10 + src/fsharp/fsi/xlf/FSIstrings.txt.es.xlf | 10 + src/fsharp/fsi/xlf/FSIstrings.txt.fr.xlf | 10 + src/fsharp/fsi/xlf/FSIstrings.txt.it.xlf | 10 + src/fsharp/fsi/xlf/FSIstrings.txt.ja.xlf | 10 + src/fsharp/fsi/xlf/FSIstrings.txt.ko.xlf | 10 + src/fsharp/fsi/xlf/FSIstrings.txt.pl.xlf | 10 + src/fsharp/fsi/xlf/FSIstrings.txt.pt-BR.xlf | 10 + src/fsharp/fsi/xlf/FSIstrings.txt.ru.xlf | 10 + src/fsharp/fsi/xlf/FSIstrings.txt.tr.xlf | 10 + src/fsharp/fsi/xlf/FSIstrings.txt.zh-Hans.xlf | 10 + src/fsharp/fsi/xlf/FSIstrings.txt.zh-Hant.xlf | 10 + src/fsharp/ilx/EraseClosures.fs | 10 +- src/fsharp/ilx/EraseUnions.fs | 8 +- src/fsharp/import.fs | 8 +- src/fsharp/service/service.fs | 6 +- src/fsharp/symbols/Symbols.fs | 7 +- .../ProvidedTypes/ProvidedTypes.fsi | 2 +- ...erService.SurfaceArea.netstandard.expected | 4 +- .../fsi/exename/help40.437.1033.bsl | 1 + .../fsi/help/help40-nologo.437.1033.bsl | 1 + .../fsi/help/help40.437.1033.bsl | 1 + tests/service/data/TestTP/ProvidedTypes.fsi | 2 +- .../ProvidedTypes.fsi | 2 +- 46 files changed, 725 insertions(+), 467 deletions(-) diff --git a/src/fsharp/AttributeChecking.fs b/src/fsharp/AttributeChecking.fs index 8c5302a97de..94a01f5fb79 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 dae491a9d44..70c7718b62c 100644 --- a/src/fsharp/CompilerConfig.fs +++ b/src/fsharp/CompilerConfig.fs @@ -480,6 +480,9 @@ type TcConfigBuilder = mutable useSdkRefs: bool mutable fxResolver: FxResolver option + // Is F# Interactive using multi-assembly emit? + mutable fsiSingleDynamicAsembly: bool + /// specify the error range for FxResolver rangeForErrors: range @@ -660,6 +663,7 @@ type TcConfigBuilder = shadowCopyReferences = false useSdkRefs = true fxResolver = None + fsiSingleDynamicAsembly = false internalTestSpanStackReferring = false noConditionalErasure = false pathMap = PathMap.empty diff --git a/src/fsharp/CompilerConfig.fsi b/src/fsharp/CompilerConfig.fsi index 4a80fea97d1..3158627443e 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 fsiSingleDynamicAsembly: bool rangeForErrors: range sdkDirOverride: string option diff --git a/src/fsharp/CompilerImports.fs b/src/fsharp/CompilerImports.fs index 7013a767976..00f24672d7d 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 a9896c872e1..8920c343f48 100644 --- a/src/fsharp/IlxGen.fs +++ b/src/fsharp/IlxGen.fs @@ -1562,11 +1562,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 @@ -1615,11 +1615,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 = @@ -1701,7 +1701,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 @@ -4699,7 +4701,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)) = @@ -5210,7 +5212,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) diff --git a/src/fsharp/InfoReader.fs b/src/fsharp/InfoReader.fs index 1abbb388202..255a447de67 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/PatternMatchCompilation.fs b/src/fsharp/PatternMatchCompilation.fs index bf33354f082..94d94278bbd 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 c2a1e9c25ce..2d0a40e0c04 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 65fdea4b6d6..91da47c3bf0 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" [] @@ -776,6 +778,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 @@ -794,7 +797,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) let addPropertyGeneratedAttrs (pdef:ILPropertyDef) = pdef.With(customAttrs = addGeneratedAttrs pdef.CustomAttrs) @@ -814,7 +817,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)], []) @@ -1255,7 +1258,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" @@ -1615,6 +1618,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 75b9073f9a9..d6fbb70e65f 100644 --- a/src/fsharp/TypedTree.fs +++ b/src/fsharp/TypedTree.fs @@ -5284,7 +5284,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) @@ -5304,7 +5304,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 87dfcfdeb37..fb40b624f7c 100644 --- a/src/fsharp/TypedTreeOps.fs +++ b/src/fsharp/TypedTreeOps.fs @@ -3084,10 +3084,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 @@ -3212,7 +3212,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 diff --git a/src/fsharp/absil/il.fs b/src/fsharp/absil/il.fs index 11ebf120e15..55a45dee3fa 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 @@ -1809,9 +1819,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 @@ -1866,7 +1876,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] @@ -1915,7 +1925,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) = @@ -1973,7 +1985,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] @@ -1985,7 +1997,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 @@ -2191,9 +2203,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) @@ -2202,7 +2214,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 @@ -2255,7 +2267,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 = @@ -2275,7 +2287,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 @@ -2311,7 +2323,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 @@ -2582,7 +2594,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 @@ -2598,7 +2610,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. @@ -3372,7 +3384,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 @@ -3467,7 +3479,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"))) } @@ -4158,17 +4170,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 @@ -4209,8 +4230,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 @@ -4231,9 +4256,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 @@ -4309,7 +4336,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 @@ -4318,15 +4346,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 @@ -4340,8 +4371,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 @@ -4354,7 +4385,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 @@ -4366,7 +4398,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 @@ -4381,11 +4414,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 d214323f2b0..0d54d35c85c 100644 --- a/src/fsharp/absil/il.fsi +++ b/src/fsharp/absil/il.fsi @@ -840,9 +840,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. [] @@ -907,7 +907,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. [] @@ -1097,8 +1097,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 @@ -1150,7 +1150,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. @@ -1188,7 +1189,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 @@ -1228,7 +1230,9 @@ type ILPropertyDef = [] [] type ILPropertyDefs = - member internal AsList: ILPropertyDef list + + member internal AsList: unit -> ILPropertyDef list + member internal LookupByName: string -> ILPropertyDef list /// Method Impls @@ -1238,7 +1242,7 @@ type ILMethodImplDef = [] type ILMethodImplDefs = - member internal AsList: ILMethodImplDef list + member internal AsList: unit -> ILMethodImplDef list /// Type Layout information. [] @@ -1285,12 +1289,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 @@ -1391,7 +1395,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. /// @@ -1449,7 +1453,7 @@ type ILExportedTypeOrForwarder = [] [] type ILExportedTypesAndForwarders = - member internal AsList: ILExportedTypeOrForwarder list + member internal AsList: unit -> ILExportedTypeOrForwarder list member internal TryFindByName: string -> ILExportedTypeOrForwarder option [] @@ -1489,7 +1493,7 @@ type internal ILResource = [] [] type ILResources = - member internal AsList: ILResource list + member internal AsList: unit -> ILResource list [] type ILAssemblyLongevity = @@ -2096,11 +2100,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/ilmorph.fs b/src/fsharp/absil/ilmorph.fs index 558bae43600..a9b5aaa5b62 100644 --- a/src/fsharp/absil/ilmorph.fs +++ b/src/fsharp/absil/ilmorph.fs @@ -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, @@ -197,13 +197,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())) + +let fdefs_fdef2fdef f (m:ILFieldDefs) = mkILFields (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 morphILTypeDefs f (m: ILTypeDefs) = mkILTypeDefsFromArray (Array.map f (m.AsArray())) let locals_ty2ty f ls = List.map (local_ty2ty f) ls @@ -254,10 +255,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 diff --git a/src/fsharp/absil/ilprint.fs b/src/fsharp/absil/ilprint.fs index 0a1a58c753b..7dd61ab7d1c 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 235c608741a..3ee20370907 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 ILReflectEmitEnv = +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 diff --git a/src/fsharp/absil/ilreflect.fsi b/src/fsharp/absil/ilreflect.fsi index d3fda5ca8b4..4913f85109c 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,23 +17,23 @@ type cenv = generatePdb: bool resolveAssemblyRef: ILAssemblyRef -> Choice option } -type ILReflectEmitEnv +type ILDynamicAssemblyEmitEnv -val emEnv0: ILReflectEmitEnv +val emEnv0: ILDynamicAssemblyEmitEnv -val emitModuleFragment: +val EmitDynamicAssemblyFragment: ilg: ILGlobals * emitTailcalls: bool * - emEnv: ILReflectEmitEnv * + emEnv: ILDynamicAssemblyEmitEnv * asmB: AssemblyBuilder * modB: ModuleBuilder * modul: ILModuleDef * debugInfo: bool * resolveAssemblyRef: (ILAssemblyRef -> Choice option) * tryFindSysILTypeRef: (string -> ILTypeRef option) -> - ILReflectEmitEnv * (unit -> exn option) list + ILDynamicAssemblyEmitEnv * (unit -> exn option) list -val LookupTypeRef: cenv: cenv -> emEnv: ILReflectEmitEnv -> tref: ILTypeRef -> System.Type +val LookupTypeRef: cenv: cenv -> emEnv: ILDynamicAssemblyEmitEnv -> tref: ILTypeRef -> System.Type -val LookupType: cenv: cenv -> emEnv: ILReflectEmitEnv -> ty: ILType -> System.Type +val LookupType: cenv: cenv -> emEnv: ILDynamicAssemblyEmitEnv -> ty: ILType -> System.Type diff --git a/src/fsharp/absil/ilwrite.fs b/src/fsharp/absil/ilwrite.fs index 0231fde1ad7..a3180cb3be3 100644 --- a/src/fsharp/absil/ilwrite.fs +++ b/src/fsharp/absil/ilwrite.fs @@ -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 @@ -2482,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 @@ -2588,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 -> @@ -2742,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 -> () @@ -2758,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() @@ -2779,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() @@ -2788,7 +2788,6 @@ let rec GenTypeDefPass4 enc cenv (td: ILTypeDef) = and GenTypeDefsPass4 enc cenv tds = List.iter (GenTypeDefPass4 enc cenv) tds - let timestamp = absilWriteGetTimeStamp () // -------------------------------------------------------------------- @@ -2809,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 @@ -2827,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 @@ -2859,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. @@ -2912,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 diff --git a/src/fsharp/fsi/FSIstrings.txt b/src/fsharp/fsi/FSIstrings.txt index dbd7642476b..20b84226645 100644 --- a/src/fsharp/fsi/FSIstrings.txt +++ b/src/fsharp/fsi/FSIstrings.txt @@ -54,3 +54,5 @@ 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" +fsiUseSingleDynamicAssembly,"Use a single dynamic assembly" +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" \ No newline at end of file diff --git a/src/fsharp/fsi/fsi.fs b/src/fsharp/fsi/fsi.fs index dd5a8f31459..48165824272 100644 --- a/src/fsharp/fsi/fsi.fs +++ b/src/fsharp/fsi/fsi.fs @@ -31,7 +31,7 @@ open FSharp.Compiler.AbstractIL.Diagnostics open FSharp.Compiler.AbstractIL.IL open FSharp.Compiler.AbstractIL.ILBinaryReader open FSharp.Compiler.AbstractIL.ILBinaryWriter -//open FSharp.Compiler.AbstractIL.ILRuntimeWriter +open FSharp.Compiler.AbstractIL.ILDynamicAssemblyWriter open FSharp.Compiler.AccessibilityLogic open FSharp.Compiler.CheckDeclarations open FSharp.Compiler.CheckExpressions @@ -74,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 [] @@ -103,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 @@ -223,11 +225,13 @@ type internal FsiTimeReporter(outWriter: TextWriter) = member tr.TimeOpIf flag f = if flag then tr.TimeOp f else f () -#if !SINGLE_ASSEMBLY -type ILDynamicEmitEnv = +type ILMultiInMemoryAssemblyEmitEnv = { ilg: ILGlobals resolveAssemblyRef: ILAssemblyRef -> Choice option - TypeMap: Zmap } + TypeMap: Dictionary + InternalTypes: HashSet + InternalMethods: HashSet + InternalFields: HashSet } member _.convAssemblyRef (aref: ILAssemblyRef) = let asmName = AssemblyName() @@ -239,14 +243,12 @@ type ILDynamicEmitEnv = let setVersion (version: ILVersionInfo) = asmName.Version <- Version (int32 version.Major, int32 version.Minor, int32 version.Build, int32 version.Revision) Option.iter setVersion aref.Version - // asmName.ProcessorArchitecture <- System.Reflection.ProcessorArchitecture.MSIL - //Option.iter (fun name -> asmName.CultureInfo <- System.Globalization.CultureInfo.CreateSpecificCulture name) aref.Locale asmName.CultureInfo <- System.Globalization.CultureInfo.InvariantCulture asmName - member cenv.convResolveAssemblyRef (asmref: ILAssemblyRef) qualifiedName = + member emEnv.convResolveAssemblyRef (asmref: ILAssemblyRef) qualifiedName = let assembly = - match cenv.resolveAssemblyRef asmref with + match emEnv.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) @@ -255,7 +257,7 @@ type ILDynamicEmitEnv = | Some (Choice2Of2 assembly) -> assembly | None -> - let asmName = cenv.convAssemblyRef asmref + let asmName = emEnv.convAssemblyRef asmref FileSystem.AssemblyLoader.AssemblyLoad asmName let typT = assembly.GetType qualifiedName match typT with @@ -269,11 +271,11 @@ type ILDynamicEmitEnv = // [] , name -> name // [ns] , name -> ns+name // [ns;typeA;typeB], name -> ns+typeA+typeB+name - member cenv.convTypeRefAux (tref: ILTypeRef) = + member emEnv.convTypeRefAux (tref: ILTypeRef) = let qualifiedName = (String.concat "+" (tref.Enclosing @ [ tref.Name ])).Replace(",", @"\,") match tref.Scope with | ILScopeRef.Assembly asmref -> - cenv.convResolveAssemblyRef asmref qualifiedName + emEnv.convResolveAssemblyRef asmref qualifiedName | ILScopeRef.Module _ | ILScopeRef.Local _ -> let typT = Type.GetType qualifiedName @@ -281,15 +283,16 @@ type ILDynamicEmitEnv = | null -> error(Error(FSComp.SR.itemNotFoundDuringDynamicCodeGen ("type", qualifiedName, ""), range0)) | res -> res | ILScopeRef.PrimaryAssembly -> - cenv.convResolveAssemblyRef cenv.ilg.primaryAssemblyRef qualifiedName + emEnv.convResolveAssemblyRef emEnv.ilg.primaryAssemblyRef qualifiedName member emEnv.LookupTypeRef (tref: ILTypeRef) = - let key = tref.BasicQualifiedName + assert tref.Scope.IsLocalRef + //let key = tref.BasicQualifiedName //printfn $"lookup {tref.BasicQualifiedName}" //if not (emEnv.TypeMap.ContainsKey(key)) then //printfn $"keys = %A{[ for (KeyValue(k,_)) in emEnv.TypeMap -> k ]}" - let typ, _ = emEnv.TypeMap.[key] + let typ, _ = emEnv.TypeMap.[tref] typ member emEnv.LookupType (ty: ILType) = @@ -332,21 +335,42 @@ type ILDynamicEmitEnv = convTypeAux ty 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 tref = ILTypeRef.Create(ilScopeRef, [ for e in enc -> e.Name ], typ.Name) - let emEnv = - { emEnv with - TypeMap = Zmap.add key (typ, tref) emEnv.TypeMap } - emEnv.AddTypeDefs asm ilScopeRef (enc@[tdef]) tdef.NestedTypes.AsList - - member emEnv.AddTypeDefs asm ilScopeRef enc (tdefs: ILTypeDef list) = - (emEnv, tdefs) ||> List.fold (fun emEnv tdef -> emEnv.AddTypeDef asm ilScopeRef enc tdef) + emEnv.TypeMap.Add(ltref, (typ, tref)) + emEnv.AddTypeDefs asm ilScopeRef (enc@[tdef]) (tdef.NestedTypes.AsArray()) + + // 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 + emEnv.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 + emEnv.InternalMethods.Add(lmref) |> ignore + match tdef.Access with + | ILTypeDefAccess.Public + | ILTypeDefAccess.Nested ILMemberAccess.Public -> () + | _ -> + emEnv.InternalTypes.Add(ltref) |> ignore + + member emEnv.AddTypeDefs asm ilScopeRef enc (tdefs: ILTypeDef[]) = + for tdef in tdefs do + emEnv.AddTypeDef asm ilScopeRef enc tdef -#endif +type ILAssemblyEmitEnv = + | SingleDynamicAssembly of ILDynamicAssemblyWriter.cenv * ILDynamicAssemblyEmitEnv + | MultipleInMemoryAssemblies of ILMultiInMemoryAssemblyEmitEnv type internal FsiValuePrinterMode = | PrintExpr @@ -354,35 +378,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 @@ -390,7 +424,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. /// @@ -431,13 +464,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) = @@ -507,17 +541,15 @@ type internal FsiValuePrinter(fsi: FsiEvaluationSessionHostConfig, _tcConfigB: T ShowProperties = fsi.ShowProperties; ShowIEnumerable = fsi.ShowIEnumerable; } - /// Get the evaluation context used when inverting the storage mapping of the ILRuntimeWriter. -#if DYNAMIC_ASSEMBLY - member _.GetEvaluationContext (emEnv: ILReflectEmitEnv) = - let cenv = { ilg = g.ilg ; emitTailcalls= tcConfigB.emitTailcalls; generatePdb = generateDebugInfo; resolveAssemblyRef=resolveAssemblyRef; tryFindSysILTypeRef=g.TryFindSysILTypeRef } - { LookupTypeRef = LookupTypeRef cenv emEnv - LookupType = LookupType cenv emEnv } -#else - member _.GetEvaluationContext (emEnv: ILDynamicEmitEnv) = - { LookupTypeRef = emEnv.LookupTypeRef - LookupType = emEnv.LookupType } -#endif + /// Get the evaluation context used when inverting the storage mapping of the ILDynamicAssemblyWriter. + member _.GetEvaluationContext (emEnv: ILAssemblyEmitEnv) = + match emEnv with + | SingleDynamicAssembly (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) = @@ -621,15 +653,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 @@ -663,8 +695,6 @@ 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) = @@ -687,10 +717,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 @@ -876,13 +906,13 @@ 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())) + CompilerOption("dynamicassembly", tagNone, OptionSwitch(fun flag -> tcConfigB.fsiSingleDynamicAsembly <- flag <> OptionSwitch.On), None, Some(FSIstrings.SR.fsiUseSingleDynamicAssembly())) ]); ] @@ -948,7 +978,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)) @@ -984,7 +1014,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 @@ -1039,11 +1069,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 @@ -1102,39 +1133,34 @@ type internal FsiConsoleInput(fsi: FsiEvaluationSessionHostConfig, fsiOptions: F // FsiDynamicCompilerState //---------------------------------------------------------------------------- -type internal FsiInteractionStepStatus = +type FsiInteractionStepStatus = | CtrlC | EndOfFile | Completed of option | CompletedWithAlreadyReportedError | CompletedWithReportedError of exn - [] [] -type internal FsiDynamicCompilerState = - { optEnv : Optimizer.IncrementalOptimizationEnv -#if SINGLE_ASSEMBLY - emEnv : ILDynamicEmitEnv -#else - emEnv : ILDynamicEmitEnv -#endif - 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)) @@ -1161,7 +1187,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. @@ -1237,15 +1263,18 @@ type internal FsiDynamicCompiler tcGlobals: TcGlobals, fsiOptions : FsiCommandLineOptions, fsiConsoleOutput : FsiConsoleOutput, - _fsiCollectible: bool, + fsiCollectible: bool, niceNameGen, resolveAssemblyRef) = let ilGlobals = tcGlobals.ilg let outfile = "TMPFSCI.exe" + let assemblyName = "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 @@ -1258,9 +1287,15 @@ type internal FsiDynamicCompiler 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.fsiSingleDynamicAsembly then + let assemBuilder, moduleBuilder = mkDynamicAssemblyAndModule (assemblyName, tcConfigB.optSettings.LocalOptimizationsEnabled, generateDebugInfo, fsiCollectible) + dynamicAssemblies.Add(assemBuilder) + Some (assemBuilder, moduleBuilder) + else + None let rangeStdin = rangeN stdinMockFilename 0 @@ -1270,66 +1305,58 @@ type internal FsiDynamicCompiler /// Add attributes let CreateModuleFragment (tcConfigB: TcConfigBuilder, assemblyName, codegenResults) = - if progress then fprintfn fsiConsoleOutput.Out "Creating main module..."; + 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 []) "" { 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) = - let emEnv = istate.emEnv - - // Each input is like a small separately compiled extension to a single source file. - // The incremental extension to the environment is dictated by the "signature" of the values as they come out - // of the type checker. Hence we add the declaredImpls (unoptimized) to the environment, rather than the - // optimizedImpls. - ilxGenerator.AddIncrementalLocalAssemblyFragment (isIncrementalFragment, fragName, declaredImpls) - - ReportTime tcConfig "TAST -> ILX"; - errorLogger.AbortOnError(fsiConsoleOutput); + /// Generate one assembly using multi-assembly emit + let EmitInMemoryAssembly (tcConfig: TcConfig, emEnv: ILMultiInMemoryAssemblyEmitEnv, ilxMainModule: ILModuleDef) = + + // The name of the assembly is "FSI-ASSEMBLY1" etc + let assemblyName = ilxMainModule.ManifestOfAssembly.Name + string fragmentId - ReportTime tcConfig "Linking"; - let ilxMainModule = CreateModuleFragment (tcConfigB, assemblyName, codegenResults) + // 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 (fragmentId + i) + tcGlobals.MakeInternalsVisibleToAttribute(fwdAssemblyName) + yield! manifest.CustomAttrs.AsList() ] + { manifest with + Name = assemblyName + CustomAttrsStored = storeILCustomAttrs (mkILCustomAttrs attrs) + } - errorLogger.AbortOnError(fsiConsoleOutput); + let ilxMainModule = { ilxMainModule with Manifest = Some manifest } - 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 ilxMainModule; - fsiConsoleOutput.uprintnfn "--------------------" -#else - ignore(fsiOptions) -#endif + // Check access of internals across fragments and give warning + let refs = computeILRefs ilGlobals ilxMainModule - ReportTime tcConfig "Reflection.Emit" + for tref in refs.TypeReferences do + if tref.Scope.IsLocalRef && emEnv.InternalTypes.Contains(tref) then + warning(Error((FSIstrings.SR.fsiInternalAccess(tref.Name)), rangeStdin)) -#if SINGLE_ASSEMBLY - let emEnv,execs = emitModuleFragment(ilGlobals, tcConfig.emitTailcalls, emEnv, assemblyBuilder, moduleBuilder, ilxMainModule, generateDebugInfo, resolveAssemblyRef, tcGlobals.TryFindSysILTypeRef) -#else - // Generate assemblies into multiple fragments - let assemblyName = ilxMainModule.ManifestOfAssembly.Name + string fragmentId + for mref in refs.MethodReferences do + if mref.DeclaringTypeRef.Scope.IsLocalRef && emEnv.InternalMethods.Contains(mref) then + warning(Error((FSIstrings.SR.fsiInternalAccess(mref.Name)), rangeStdin)) - // Adjust the assembly name of this fragment - let ilxMainModule = { ilxMainModule with Manifest = Some { ilxMainModule.Manifest.Value with Name = assemblyName } } + for fref in refs.FieldReferences do + if fref.DeclaringTypeRef.Scope.IsLocalRef && emEnv.InternalFields.Contains(fref) then + warning(Error((FSIstrings.SR.fsiInternalAccess(fref.Name)), rangeStdin)) - // Rewrite references to target types to their respective dynamic assemblies + // Rewrite references to local types to their respective dynamic assemblies let ilxMainModule = ilxMainModule |> Morphs.morphILTypeRefsInILModuleMemoized (fun tref -> if tref.Scope.IsLocalRef then - let nm = tref.BasicQualifiedName - if emEnv.TypeMap.ContainsKey(nm) then - let _, tgt = emEnv.TypeMap.[nm] - //printfn $"rewriting {tref.QualifiedName} to {tgt.QualifiedName}" - tgt - else - //printfn $"no rewrite found for {nm}, assuming in this fragment" - tref + //let nm = tref.BasicQualifiedName + match emEnv.TypeMap.TryGetValue(tref) with + | true, (_, tgt) -> tgt + | _ -> tref else tref) @@ -1374,46 +1401,99 @@ type internal FsiDynamicCompiler 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 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 -> - (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) ] - - let emEnv = emEnv.AddTypeDefs asm ilScopeRef [] ilxMainModule.TypeDefs.AsList -#endif + (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.AddTypeDefs asm ilScopeRef [] (ilxMainModule.TypeDefs.AsArray()) + + 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) = + let emEnv = istate.emEnv + + // Each input is like a small separately compiled extension to a single source file. + // The incremental extension to the environment is dictated by the "signature" of the values as they come out + // of the type checker. Hence we add the declaredImpls (unoptimized) to the environment, rather than the + // optimizedImpls. + ilxGenerator.AddIncrementalLocalAssemblyFragment (isIncrementalFragment, fragName, declaredImpls) + ReportTime tcConfig "TAST -> ILX" 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 -#if SINGLE_ASSEMBLY - 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); + ReportTime tcConfig "Linking" + let ilxMainModule = CreateModuleFragment (tcConfigB, assemblyName, codegenResults) + + 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 ilxMainModule + fsiConsoleOutput.uprintnfn "--------------------" #else - for referencedTypeDefs, bytes in codegenResults.quotationResourceInfo do - let referencedTypes = - [| for tref in referencedTypeDefs do - yield emEnv.LookupTypeRef tref |] - Microsoft.FSharp.Quotations.Expr.RegisterReflectedDefinitions (asm, fragName, bytes, referencedTypes); + ignore(fsiOptions) #endif - ReportTime tcConfig "Run Bindings"; + ReportTime tcConfig "Reflection.Emit" + + let emEnv, execs = + match emEnv with + | SingleDynamicAssembly (cenv, emEnv) -> + + let assemblyBuilder, moduleBuilder = builders.Value + + let emEnv, execs = EmitDynamicAssemblyFragment (ilGlobals, tcConfig.emitTailcalls, emEnv, assemblyBuilder, moduleBuilder, ilxMainModule, generateDebugInfo, cenv.resolveAssemblyRef, tcGlobals.TryFindSysILTypeRef) + + SingleDynamicAssembly (cenv, emEnv), execs + + | MultipleInMemoryAssemblies emEnv -> + + let execs = EmitInMemoryAssembly (tcConfig, emEnv, ilxMainModule) + + MultipleInMemoryAssemblies emEnv, execs + + errorLogger.AbortOnError(fsiConsoleOutput) + + // Explicitly register the resources with the QuotationPickler module + match emEnv with + | SingleDynamicAssembly (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" timeReporter.TimeOpIf istate.timing (fun () -> execs |> List.iter (fun exec -> match exec() with @@ -1426,9 +1506,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. @@ -1454,9 +1534,9 @@ type internal FsiDynamicCompiler colorPrintL outWriter opts responseL // Build the new incremental state. - let istate = {istate with optEnv = optEnv; - emEnv = emEnv; - ilxGenerator = ilxGenerator; + 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. @@ -1471,17 +1551,17 @@ 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); + 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) = @@ -1615,15 +1695,12 @@ type internal FsiDynamicCompiler let nextState, addedType = addTypeToEnvironment state ilTy nextState, addedTypes @ [addedType]) (istate, []) -#if SINGLE_ASSEMBLY member _.DynamicAssemblyName = assemblyName - member _.DynamicAssembly = (assemblyBuilder :> Assembly) -#else + member _.DynamicAssemblies = dynamicAssemblies.ToArray() + member _.FindDynamicAssembly(simpleAssemName) = - //printfn $"searching for {simpleAssemName}" dynamicAssemblies |> ResizeArray.tryFind (fun asm -> asm.GetName().Name = simpleAssemName) -#endif member _.EvalParsedSourceFiles (ctok, errorLogger, istate, inputs) = let i = nextFragmentId() @@ -1671,7 +1748,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 @@ -1683,20 +1760,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] - [defA (* ; defB *) ] - - // 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 @@ -1879,7 +1949,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" @@ -1930,14 +2000,27 @@ 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 emEnv0 = { ilg = tcGlobals.ilg; resolveAssemblyRef = resolveAssemblyRef; TypeMap = Zmap.empty ComparisonIdentity.Structural } + let emEnv0 = + if tcConfigB.fsiSingleDynamicAsembly then + let cenv = { ilg = ilGlobals; emitTailcalls = tcConfig.emitTailcalls; generatePdb = generateDebugInfo; resolveAssemblyRef=resolveAssemblyRef; tryFindSysILTypeRef=tcGlobals.TryFindSysILTypeRef } + let emEnv = ILDynamicAssemblyWriter.emEnv0 + SingleDynamicAssembly (cenv, emEnv) + else + let emEnv = + { ilg = tcGlobals.ilg + resolveAssemblyRef = resolveAssemblyRef + TypeMap = Dictionary(HashIdentity.Structural) + InternalTypes = HashSet(HashIdentity.Structural) + InternalMethods = HashSet(HashIdentity.Structural) + InternalFields = HashSet(HashIdentity.Structural) } + MultipleInMemoryAssemblies emEnv + let tcEnv, openDecls0 = GetInitialTcEnv (assemblyName, rangeStdin, tcConfig, tcImports, tcGlobals) let ccuName = assemblyName @@ -2057,7 +2140,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 @@ -2140,17 +2223,10 @@ module internal MagicAssemblyResolution = simpleAssemName.EndsWith(".XmlSerializers", StringComparison.OrdinalIgnoreCase) || (runningOnMono && simpleAssemName = "UIAutomationWinforms") then null else -#if SINGLE_ASSEMBLY - // 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 -#else match fsiDynamicCompiler.FindDynamicAssembly(simpleAssemName) with | Some asm -> asm | None -> -#endif - // Otherwise continue let assemblyReferenceTextDll = (simpleAssemName + ".dll") let assemblyReferenceTextExe = (simpleAssemName + ".exe") @@ -2241,7 +2317,7 @@ module internal MagicAssemblyResolution = AppDomain.CurrentDomain.add_AssemblyResolve(resolveAssembly) { new IDisposable with - member x.Dispose() = + member _.Dispose() = AppDomain.CurrentDomain.remove_AssemblyResolve(resolveAssembly) } @@ -3189,45 +3265,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 -#if SINGLE_ASSEMBLY - member x.DynamicAssembly = - fsiDynamicCompiler.DynamicAssembly -#endif + 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()) @@ -3289,13 +3364,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 @@ -3305,7 +3380,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. @@ -3316,7 +3391,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. @@ -3326,7 +3401,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. @@ -3338,7 +3413,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. @@ -3348,7 +3423,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. @@ -3515,17 +3590,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() @@ -3618,7 +3693,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 () -> @@ -3626,8 +3701,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() = @@ -3653,7 +3726,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 e22b60e9c4a..40b263e2ef3 100644 --- a/src/fsharp/fsi/fsi.fsi +++ b/src/fsharp/fsi/fsi.fsi @@ -241,10 +241,8 @@ type FsiEvaluationSession = /// Get a handle to the resolved view of the current signature of the incrementally generated assembly. member CurrentPartialAssemblySignature: FSharpAssemblySignature -#if SINGLE_ASSEMBLY - /// Get a handle to the dynamically generated assembly - member DynamicAssembly: System.Reflection.Assembly -#endif + /// 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 e7c41ab141d..b1069bae343 100644 --- a/src/fsharp/fsi/xlf/FSIstrings.txt.cs.xlf +++ b/src/fsharp/fsi/xlf/FSIstrings.txt.cs.xlf @@ -2,6 +2,11 @@ + + Accessing the internal type, method or field '{0}' from a previous evaluation in F# Interactive is deprecated and may cause subsequent access errors + Accessing the internal type, method or field '{0}' from a previous evaluation in F# Interactive is deprecated and may cause subsequent access errors + + Include package source uri when searching for packages Při vyhledávání balíčků zahrnout identifikátor zdroje balíčku @@ -17,6 +22,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. + + Use a single dynamic assembly + Use a single dynamic assembly + + 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 e75d448790d..bed17369e2a 100644 --- a/src/fsharp/fsi/xlf/FSIstrings.txt.de.xlf +++ b/src/fsharp/fsi/xlf/FSIstrings.txt.de.xlf @@ -2,6 +2,11 @@ + + Accessing the internal type, method or field '{0}' from a previous evaluation in F# Interactive is deprecated and may cause subsequent access errors + Accessing the internal type, method or field '{0}' from a previous evaluation in F# Interactive is deprecated and may cause subsequent access errors + + Include package source uri when searching for packages URI der Paketquelle bei Suche nach Paketen einschließen @@ -17,6 +22,11 @@ Fehler beim Vorgang. Der Fehlertext wurde im Fehlerstream ausgegeben. Verwenden Sie "EvalInteractionNonThrowing", "EvalScriptNonThrowing" oder "EvalExpressionNonThrowing", um die entsprechende FSharpDiagnostic zurückzugeben. + + Use a single dynamic assembly + Use a single dynamic assembly + + 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 21655a4e010..7ecce359393 100644 --- a/src/fsharp/fsi/xlf/FSIstrings.txt.es.xlf +++ b/src/fsharp/fsi/xlf/FSIstrings.txt.es.xlf @@ -2,6 +2,11 @@ + + Accessing the internal type, method or field '{0}' from a previous evaluation in F# Interactive is deprecated and may cause subsequent access errors + Accessing the internal type, method or field '{0}' from a previous evaluation in F# Interactive is deprecated and may cause subsequent access errors + + Include package source uri when searching for packages Incluir el URI de origen del paquete al buscar paquetes @@ -17,6 +22,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 + + Use a single dynamic assembly + Use a single dynamic assembly + + 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 fc42cf0b812..231ec51e40a 100644 --- a/src/fsharp/fsi/xlf/FSIstrings.txt.fr.xlf +++ b/src/fsharp/fsi/xlf/FSIstrings.txt.fr.xlf @@ -2,6 +2,11 @@ + + Accessing the internal type, method or field '{0}' from a previous evaluation in F# Interactive is deprecated and may cause subsequent access errors + Accessing the internal type, method or field '{0}' from a previous evaluation in F# Interactive is deprecated and may cause subsequent access errors + + Include package source uri when searching for packages Inclure l'URI de source de package au moment de la recherche des packages @@ -17,6 +22,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 + + Use a single dynamic assembly + Use a single dynamic assembly + + 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 de4f016ad9a..471c319218e 100644 --- a/src/fsharp/fsi/xlf/FSIstrings.txt.it.xlf +++ b/src/fsharp/fsi/xlf/FSIstrings.txt.it.xlf @@ -2,6 +2,11 @@ + + Accessing the internal type, method or field '{0}' from a previous evaluation in F# Interactive is deprecated and may cause subsequent access errors + Accessing the internal type, method or field '{0}' from a previous evaluation in F# Interactive is deprecated and may cause subsequent access errors + + Include package source uri when searching for packages Includi l'URI di origine pacchetti durante la ricerca di pacchetti @@ -17,6 +22,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 + + Use a single dynamic assembly + Use a single dynamic assembly + + 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 614ddf284ac..569c4ff49d7 100644 --- a/src/fsharp/fsi/xlf/FSIstrings.txt.ja.xlf +++ b/src/fsharp/fsi/xlf/FSIstrings.txt.ja.xlf @@ -2,6 +2,11 @@ + + Accessing the internal type, method or field '{0}' from a previous evaluation in F# Interactive is deprecated and may cause subsequent access errors + Accessing the internal type, method or field '{0}' from a previous evaluation in F# Interactive is deprecated and may cause subsequent access errors + + Include package source uri when searching for packages パッケージの検索時にパッケージ ソースの URI を含める @@ -17,6 +22,11 @@ 操作に失敗しました。エラー テキストがエラー ストリームに出力されました。対応する FSharpDiagnostic を戻すには、EvalInteractionNonThrowing、EvalScriptNonThrowing、または EvalExpressionNonThrowing を使用します + + Use a single dynamic assembly + Use a single dynamic assembly + + 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 4f132496c00..8f7d924973a 100644 --- a/src/fsharp/fsi/xlf/FSIstrings.txt.ko.xlf +++ b/src/fsharp/fsi/xlf/FSIstrings.txt.ko.xlf @@ -2,6 +2,11 @@ + + Accessing the internal type, method or field '{0}' from a previous evaluation in F# Interactive is deprecated and may cause subsequent access errors + Accessing the internal type, method or field '{0}' from a previous evaluation in F# Interactive is deprecated and may cause subsequent access errors + + Include package source uri when searching for packages 패키지를 검색할 때 패키지 원본 URI 포함 @@ -17,6 +22,11 @@ 작업이 실패했습니다. 오류 텍스트가 오류 스트림에 출력되었습니다. 해당 FSharpDiagnostic을 반환하려면 EvalInteractionNonThrowing, EvalScriptNonThrowing 또는 EvalExpressionNonThrowing을 사용하세요. + + Use a single dynamic assembly + Use a single dynamic assembly + + 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 8806c4ace6e..04df6ba2993 100644 --- a/src/fsharp/fsi/xlf/FSIstrings.txt.pl.xlf +++ b/src/fsharp/fsi/xlf/FSIstrings.txt.pl.xlf @@ -2,6 +2,11 @@ + + Accessing the internal type, method or field '{0}' from a previous evaluation in F# Interactive is deprecated and may cause subsequent access errors + Accessing the internal type, method or field '{0}' from a previous evaluation in F# Interactive is deprecated and may cause subsequent access errors + + Include package source uri when searching for packages Uwzględnij identyfikator URI źródła pakietów podczas wyszukiwania pakietów @@ -17,6 +22,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 + + Use a single dynamic assembly + Use a single dynamic assembly + + 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 c67ed4a0e70..9ecec7fe299 100644 --- a/src/fsharp/fsi/xlf/FSIstrings.txt.pt-BR.xlf +++ b/src/fsharp/fsi/xlf/FSIstrings.txt.pt-BR.xlf @@ -2,6 +2,11 @@ + + Accessing the internal type, method or field '{0}' from a previous evaluation in F# Interactive is deprecated and may cause subsequent access errors + Accessing the internal type, method or field '{0}' from a previous evaluation in F# Interactive is deprecated and may cause subsequent access errors + + Include package source uri when searching for packages Incluir o URI de origem do pacote ao pesquisar pacotes @@ -17,6 +22,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 + + Use a single dynamic assembly + Use a single dynamic assembly + + 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 efd1f831714..10cb92e1b94 100644 --- a/src/fsharp/fsi/xlf/FSIstrings.txt.ru.xlf +++ b/src/fsharp/fsi/xlf/FSIstrings.txt.ru.xlf @@ -2,6 +2,11 @@ + + Accessing the internal type, method or field '{0}' from a previous evaluation in F# Interactive is deprecated and may cause subsequent access errors + Accessing the internal type, method or field '{0}' from a previous evaluation in F# Interactive is deprecated and may cause subsequent access errors + + Include package source uri when searching for packages Включать исходный URI пакета при поиске пакетов @@ -17,6 +22,11 @@ Не удалось выполнить операцию. Текст ошибки был выведен в потоке ошибок. Чтобы вернуть соответствующие сведения FSharpDiagnostic, используйте EvalInteractionNonThrowing, EvalScriptNonThrowing или EvalExpressionNonThrowing + + Use a single dynamic assembly + Use a single dynamic assembly + + 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 0aa1916e2de..f6b5004102d 100644 --- a/src/fsharp/fsi/xlf/FSIstrings.txt.tr.xlf +++ b/src/fsharp/fsi/xlf/FSIstrings.txt.tr.xlf @@ -2,6 +2,11 @@ + + Accessing the internal type, method or field '{0}' from a previous evaluation in F# Interactive is deprecated and may cause subsequent access errors + Accessing the internal type, method or field '{0}' from a previous evaluation in F# Interactive is deprecated and may cause subsequent access errors + + Include package source uri when searching for packages Paketler aranırken paket kaynağı URI'si ekleyin @@ -17,6 +22,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 + + Use a single dynamic assembly + Use a single dynamic assembly + + 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 d183e5f2349..b2390eb197a 100644 --- a/src/fsharp/fsi/xlf/FSIstrings.txt.zh-Hans.xlf +++ b/src/fsharp/fsi/xlf/FSIstrings.txt.zh-Hans.xlf @@ -2,6 +2,11 @@ + + Accessing the internal type, method or field '{0}' from a previous evaluation in F# Interactive is deprecated and may cause subsequent access errors + Accessing the internal type, method or field '{0}' from a previous evaluation in F# Interactive is deprecated and may cause subsequent access errors + + Include package source uri when searching for packages 搜索包时包含包源 uri @@ -17,6 +22,11 @@ 操作失败。错误文本已在错误流中打印。若要返回相应的 FSharpDiagnostic,请使用 EvalInteractionNonThrowing、EvalScriptNonThrowing 或 EvalExpressionNonThrowing + + Use a single dynamic assembly + Use a single dynamic assembly + + 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 ccb733230cb..9c2b8c85563 100644 --- a/src/fsharp/fsi/xlf/FSIstrings.txt.zh-Hant.xlf +++ b/src/fsharp/fsi/xlf/FSIstrings.txt.zh-Hant.xlf @@ -2,6 +2,11 @@ + + Accessing the internal type, method or field '{0}' from a previous evaluation in F# Interactive is deprecated and may cause subsequent access errors + Accessing the internal type, method or field '{0}' from a previous evaluation in F# Interactive is deprecated and may cause subsequent access errors + + Include package source uri when searching for packages 搜尋套件時包含套件來源 URI @@ -17,6 +22,11 @@ 作業失敗。錯誤文字已列印在錯誤串流中。若要傳回相對應的 FSharpDiagnostic,請使用 EvalInteractionNonThrowing、EvalScriptNonThrowing 或 EvalExpressionNonThrowing + + Use a single dynamic assembly + Use a single dynamic assembly + + Stopped due to error\n 已因錯誤而停止\n diff --git a/src/fsharp/ilx/EraseClosures.fs b/src/fsharp/ilx/EraseClosures.fs index 8a73f9c860f..70c57e5e928 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 cloTag = ilCloCode.DebugPoint let cloImports = ilCloCode.DebugImports @@ -496,7 +496,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, @@ -592,7 +592,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, @@ -641,7 +641,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 b03c89d3172..580461805cd 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 cc3cb3bd641..810d5093c2a 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/service.fs b/src/fsharp/service/service.fs index 557c94acb5f..91537a49e3f 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 ed1b773140b..446935b2064 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 c8f2a418edf..2f1042c08be 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 ea4301ce3a7..7ceb2c52aa6 100644 --- a/tests/FSharp.Compiler.Service.Tests/FSharp.CompilerService.SurfaceArea.netstandard.expected +++ b/tests/FSharp.Compiler.Service.Tests/FSharp.CompilerService.SurfaceArea.netstandard.expected @@ -4184,8 +4184,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/fsharpqa/Source/CompilerOptions/fsi/exename/help40.437.1033.bsl b/tests/fsharpqa/Source/CompilerOptions/fsi/exename/help40.437.1033.bsl index b4c1b490400..a601b4f8965 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,4 @@ Usage: fsharpi [script.fsx []] --quotations-debug[+|-] Emit debug information in quotations --shadowcopyreferences[+|-] Prevents references from being locked by the F# Interactive process +--dynamicassembly[+|-] Use a single dynamic assembly 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 d95678648c7..d9190df7445 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,4 @@ Usage: fsiAnyCpu [script.fsx []] --quotations-debug[+|-] Emit debug information in quotations --shadowcopyreferences[+|-] Prevents references from being locked by the F# Interactive process +--dynamicassembly[+|-] Use a single dynamic assembly 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 cbedecea482..73300ebb3db 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,4 @@ Usage: fsiAnyCpu [script.fsx []] --quotations-debug[+|-] Emit debug information in quotations --shadowcopyreferences[+|-] Prevents references from being locked by the F# Interactive process +--dynamicassembly[+|-] Use a single dynamic assembly diff --git a/tests/service/data/TestTP/ProvidedTypes.fsi b/tests/service/data/TestTP/ProvidedTypes.fsi index c3adbe82831..935f1cd5634 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/tests/MockTypeProviders/DummyProviderForLanguageServiceTesting/ProvidedTypes.fsi b/vsintegration/tests/MockTypeProviders/DummyProviderForLanguageServiceTesting/ProvidedTypes.fsi index 65784ae9e7d..877a06435f0 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 From ee1adcbcddd088ab45890346811395fd10f30e57 Mon Sep 17 00:00:00 2001 From: Don Syme Date: Sun, 13 Feb 2022 17:53:11 +0000 Subject: [PATCH 05/17] fix tests --- src/fsharp/fsi/fsi.fs | 2 +- ...erService.SurfaceArea.netstandard.expected | 63 ++++++++++++------- 2 files changed, 41 insertions(+), 24 deletions(-) diff --git a/src/fsharp/fsi/fsi.fs b/src/fsharp/fsi/fsi.fs index 48165824272..09a109d2be4 100644 --- a/src/fsharp/fsi/fsi.fs +++ b/src/fsharp/fsi/fsi.fs @@ -912,7 +912,7 @@ type internal FsiCommandLineOptions(fsi: FsiEvaluationSessionHostConfig, 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("dynamicassembly", tagNone, OptionSwitch(fun flag -> tcConfigB.fsiSingleDynamicAsembly <- flag <> OptionSwitch.On), None, Some(FSIstrings.SR.fsiUseSingleDynamicAssembly())) + CompilerOption("dynamicassembly", tagNone, OptionSwitch(fun flag -> tcConfigB.fsiSingleDynamicAsembly <- flag = OptionSwitch.On), None, Some(FSIstrings.SR.fsiUseSingleDynamicAssembly())) ]); ] 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 7ceb2c52aa6..9b5f09a2dd9 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 @@ -9136,6 +9153,21 @@ FSharp.Compiler.SyntaxTrivia.SynMatchClauseTrivia: Microsoft.FSharp.Core.FSharpO FSharp.Compiler.SyntaxTrivia.SynMatchClauseTrivia: Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Range] get_BarRange() FSharp.Compiler.SyntaxTrivia.SynMatchClauseTrivia: System.String ToString() FSharp.Compiler.SyntaxTrivia.SynMatchClauseTrivia: Void .ctor(Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Range], Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Range]) +FSharp.Compiler.SyntaxTrivia.SynMemberFlagsTrivia +FSharp.Compiler.SyntaxTrivia.SynMemberFlagsTrivia: FSharp.Compiler.SyntaxTrivia.SynMemberFlagsTrivia Zero +FSharp.Compiler.SyntaxTrivia.SynMemberFlagsTrivia: FSharp.Compiler.SyntaxTrivia.SynMemberFlagsTrivia get_Zero() +FSharp.Compiler.SyntaxTrivia.SynMemberFlagsTrivia: Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Range] AbstractRange +FSharp.Compiler.SyntaxTrivia.SynMemberFlagsTrivia: Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Range] DefaultRange +FSharp.Compiler.SyntaxTrivia.SynMemberFlagsTrivia: Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Range] MemberRange +FSharp.Compiler.SyntaxTrivia.SynMemberFlagsTrivia: Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Range] OverrideRange +FSharp.Compiler.SyntaxTrivia.SynMemberFlagsTrivia: Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Range] StaticRange +FSharp.Compiler.SyntaxTrivia.SynMemberFlagsTrivia: Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Range] get_AbstractRange() +FSharp.Compiler.SyntaxTrivia.SynMemberFlagsTrivia: Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Range] get_DefaultRange() +FSharp.Compiler.SyntaxTrivia.SynMemberFlagsTrivia: Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Range] get_MemberRange() +FSharp.Compiler.SyntaxTrivia.SynMemberFlagsTrivia: Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Range] get_OverrideRange() +FSharp.Compiler.SyntaxTrivia.SynMemberFlagsTrivia: Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Range] get_StaticRange() +FSharp.Compiler.SyntaxTrivia.SynMemberFlagsTrivia: System.String ToString() +FSharp.Compiler.SyntaxTrivia.SynMemberFlagsTrivia: Void .ctor(Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Range], Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Range], Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Range], Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Range], Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Range]) FSharp.Compiler.SyntaxTrivia.SynPatOrTrivia FSharp.Compiler.SyntaxTrivia.SynPatOrTrivia: FSharp.Compiler.Text.Range BarRange FSharp.Compiler.SyntaxTrivia.SynPatOrTrivia: FSharp.Compiler.Text.Range get_BarRange() @@ -9152,21 +9184,6 @@ FSharp.Compiler.SyntaxTrivia.SynTypeDefnTrivia: Microsoft.FSharp.Core.FSharpOpti FSharp.Compiler.SyntaxTrivia.SynTypeDefnTrivia: Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Range] get_WithKeyword() FSharp.Compiler.SyntaxTrivia.SynTypeDefnTrivia: System.String ToString() FSharp.Compiler.SyntaxTrivia.SynTypeDefnTrivia: Void .ctor(Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Range], Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Range], Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Range]) -FSharp.Compiler.SyntaxTrivia.SynMemberFlagsTrivia -FSharp.Compiler.SyntaxTrivia.SynMemberFlagsTrivia: FSharp.Compiler.SyntaxTrivia.SynMemberFlagsTrivia Zero -FSharp.Compiler.SyntaxTrivia.SynMemberFlagsTrivia: FSharp.Compiler.SyntaxTrivia.SynMemberFlagsTrivia get_Zero() -FSharp.Compiler.SyntaxTrivia.SynMemberFlagsTrivia: Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Range] AbstractRange -FSharp.Compiler.SyntaxTrivia.SynMemberFlagsTrivia: Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Range] DefaultRange -FSharp.Compiler.SyntaxTrivia.SynMemberFlagsTrivia: Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Range] MemberRange -FSharp.Compiler.SyntaxTrivia.SynMemberFlagsTrivia: Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Range] OverrideRange -FSharp.Compiler.SyntaxTrivia.SynMemberFlagsTrivia: Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Range] StaticRange -FSharp.Compiler.SyntaxTrivia.SynMemberFlagsTrivia: Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Range] get_AbstractRange() -FSharp.Compiler.SyntaxTrivia.SynMemberFlagsTrivia: Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Range] get_DefaultRange() -FSharp.Compiler.SyntaxTrivia.SynMemberFlagsTrivia: Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Range] get_MemberRange() -FSharp.Compiler.SyntaxTrivia.SynMemberFlagsTrivia: Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Range] get_OverrideRange() -FSharp.Compiler.SyntaxTrivia.SynMemberFlagsTrivia: Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Range] get_StaticRange() -FSharp.Compiler.SyntaxTrivia.SynMemberFlagsTrivia: System.String ToString() -FSharp.Compiler.SyntaxTrivia.SynMemberFlagsTrivia: Void .ctor(Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Range], Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Range], Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Range], Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Range], Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Range]) FSharp.Compiler.SyntaxTrivia.SynUnionCaseTrivia FSharp.Compiler.SyntaxTrivia.SynUnionCaseTrivia: Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Range] BarRange FSharp.Compiler.SyntaxTrivia.SynUnionCaseTrivia: Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Range] get_BarRange() From aa631efae2d46339e07e6b749c448cbd6e20e3ee Mon Sep 17 00:00:00 2001 From: Don Syme Date: Sun, 13 Feb 2022 18:13:19 +0000 Subject: [PATCH 06/17] cleanup code --- src/fsharp/fsi/fsi.fs | 100 ++++++++++++----------- tests/fsharpqa/Source/EntryPoint/env.lst | 4 +- 2 files changed, 54 insertions(+), 50 deletions(-) diff --git a/src/fsharp/fsi/fsi.fs b/src/fsharp/fsi/fsi.fs index 09a109d2be4..268f4032b3b 100644 --- a/src/fsharp/fsi/fsi.fs +++ b/src/fsharp/fsi/fsi.fs @@ -225,15 +225,14 @@ type internal FsiTimeReporter(outWriter: TextWriter) = member tr.TimeOpIf flag f = if flag then tr.TimeOp f else f () -type ILMultiInMemoryAssemblyEmitEnv = - { ilg: ILGlobals - resolveAssemblyRef: ILAssemblyRef -> Choice option - TypeMap: Dictionary - InternalTypes: HashSet - InternalMethods: HashSet - InternalFields: HashSet } - - member _.convAssemblyRef (aref: ILAssemblyRef) = +/// Manages the emit of one logical assembly into multiple assemblies +type ILMultiInMemoryAssemblyEmitEnv(ilg: ILGlobals, resolveAssemblyRef: ILAssemblyRef -> Choice option) = + let TypeMap = Dictionary(HashIdentity.Structural) + let internalTypes = HashSet(HashIdentity.Structural) + let InternalMethods = HashSet(HashIdentity.Structural) + let InternalFields = HashSet(HashIdentity.Structural) + + let convAssemblyRef (aref: ILAssemblyRef) = let asmName = AssemblyName() asmName.Name <- aref.Name (match aref.PublicKey with @@ -246,9 +245,9 @@ type ILMultiInMemoryAssemblyEmitEnv = asmName.CultureInfo <- System.Globalization.CultureInfo.InvariantCulture asmName - member emEnv.convResolveAssemblyRef (asmref: ILAssemblyRef) qualifiedName = + let convResolveAssemblyRef (asmref: ILAssemblyRef) qualifiedName = let assembly = - match emEnv.resolveAssemblyRef asmref with + 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) @@ -257,7 +256,7 @@ type ILMultiInMemoryAssemblyEmitEnv = | Some (Choice2Of2 assembly) -> assembly | None -> - let asmName = emEnv.convAssemblyRef asmref + let asmName = convAssemblyRef asmref FileSystem.AssemblyLoader.AssemblyLoad asmName let typT = assembly.GetType qualifiedName match typT with @@ -271,11 +270,11 @@ type ILMultiInMemoryAssemblyEmitEnv = // [] , name -> name // [ns] , name -> ns+name // [ns;typeA;typeB], name -> ns+typeA+typeB+name - member emEnv.convTypeRefAux (tref: ILTypeRef) = + let convTypeRefAux (tref: ILTypeRef) = let qualifiedName = (String.concat "+" (tref.Enclosing @ [ tref.Name ])).Replace(",", @"\,") match tref.Scope with | ILScopeRef.Assembly asmref -> - emEnv.convResolveAssemblyRef asmref qualifiedName + convResolveAssemblyRef asmref qualifiedName | ILScopeRef.Module _ | ILScopeRef.Local _ -> let typT = Type.GetType qualifiedName @@ -283,26 +282,34 @@ type ILMultiInMemoryAssemblyEmitEnv = | null -> error(Error(FSComp.SR.itemNotFoundDuringDynamicCodeGen ("type", qualifiedName, ""), range0)) | res -> res | ILScopeRef.PrimaryAssembly -> - emEnv.convResolveAssemblyRef emEnv.ilg.primaryAssemblyRef qualifiedName + convResolveAssemblyRef ilg.primaryAssemblyRef qualifiedName + + member _.MapTypeRef (tref: ILTypeRef) = + if tref.Scope.IsLocalRef then + //let key = tref.BasicQualifiedName + //printfn $"lookup {tref.BasicQualifiedName}" + //if not (emEnv.TypeMap.ContainsKey(key)) then + //printfn $"keys = %A{[ for (KeyValue(k,_)) in emEnv.TypeMap -> k ]}" + + let _, tref = TypeMap.[tref] + tref + else + tref - member emEnv.LookupTypeRef (tref: ILTypeRef) = + member _.LookupTypeRef (tref: ILTypeRef) = assert tref.Scope.IsLocalRef - //let key = tref.BasicQualifiedName - //printfn $"lookup {tref.BasicQualifiedName}" - //if not (emEnv.TypeMap.ContainsKey(key)) then - //printfn $"keys = %A{[ for (KeyValue(k,_)) in emEnv.TypeMap -> k ]}" - - let typ, _ = emEnv.TypeMap.[tref] + let typ, _ = TypeMap.[tref] typ - member emEnv.LookupType (ty: ILType) = + member _.LookupType (ty: ILType) = let rec convTypeSpec (tspec: ILTypeSpec) = let tref = tspec.TypeRef let typT = if tref.Scope.IsLocalRef then - emEnv.LookupTypeRef tref + let typ, _ = TypeMap.[tref] + typ else - emEnv.convTypeRefAux tref + convTypeRefAux tref let tyargs = List.map convTypeAux tspec.GenericArgs let res = match isNil tyargs, typT.IsGenericType with @@ -341,7 +348,7 @@ type ILMultiInMemoryAssemblyEmitEnv = let typ = asm.GetType(key) //printfn "Adding %s --> %s" key typ.FullName let tref = ILTypeRef.Create(ilScopeRef, [ for e in enc -> e.Name ], typ.Name) - emEnv.TypeMap.Add(ltref, (typ, tref)) + TypeMap.Add(ltref, (typ, tref)) emEnv.AddTypeDefs asm ilScopeRef (enc@[tdef]) (tdef.NestedTypes.AsArray()) // Record the internal things to give warnings for internal access across fragment boundaries @@ -350,24 +357,34 @@ type ILMultiInMemoryAssemblyEmitEnv = | ILMemberAccess.Public -> () | _ -> let lfref = mkRefForILField ILScopeRef.Local (enc, tdef) fdef - emEnv.InternalFields.Add(lfref) |> ignore + 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 - emEnv.InternalMethods.Add(lmref) |> ignore + InternalMethods.Add(lmref) |> ignore + match tdef.Access with | ILTypeDefAccess.Public | ILTypeDefAccess.Nested ILMemberAccess.Public -> () | _ -> - emEnv.InternalTypes.Add(ltref) |> ignore - + internalTypes.Add(ltref) |> ignore member emEnv.AddTypeDefs asm ilScopeRef enc (tdefs: ILTypeDef[]) = for tdef in tdefs do emEnv.AddTypeDef asm ilScopeRef enc tdef + member _.IsLocalInternalType (tref: ILTypeRef) = + tref.Scope.IsLocalRef && internalTypes.Contains(tref) + + member _.IsLocalInternalMethod (mref: ILMethodRef) = + mref.DeclaringTypeRef.Scope.IsLocalRef && InternalMethods.Contains(mref) + + member _.IsLocalInternalField (fref: ILFieldRef) = + fref.DeclaringTypeRef.Scope.IsLocalRef && InternalFields.Contains(fref) + type ILAssemblyEmitEnv = | SingleDynamicAssembly of ILDynamicAssemblyWriter.cenv * ILDynamicAssemblyEmitEnv | MultipleInMemoryAssemblies of ILMultiInMemoryAssemblyEmitEnv @@ -1338,27 +1355,20 @@ type internal FsiDynamicCompiler let refs = computeILRefs ilGlobals ilxMainModule for tref in refs.TypeReferences do - if tref.Scope.IsLocalRef && emEnv.InternalTypes.Contains(tref) then + if emEnv.IsLocalInternalType(tref) then warning(Error((FSIstrings.SR.fsiInternalAccess(tref.Name)), rangeStdin)) for mref in refs.MethodReferences do - if mref.DeclaringTypeRef.Scope.IsLocalRef && emEnv.InternalMethods.Contains(mref) then + if emEnv.IsLocalInternalMethod(mref) then warning(Error((FSIstrings.SR.fsiInternalAccess(mref.Name)), rangeStdin)) for fref in refs.FieldReferences do - if fref.DeclaringTypeRef.Scope.IsLocalRef && emEnv.InternalFields.Contains(fref) then + if emEnv.IsLocalInternalField(fref) then warning(Error((FSIstrings.SR.fsiInternalAccess(fref.Name)), rangeStdin)) // Rewrite references to local types to their respective dynamic assemblies let ilxMainModule = - ilxMainModule |> Morphs.morphILTypeRefsInILModuleMemoized (fun tref -> - if tref.Scope.IsLocalRef then - //let nm = tref.BasicQualifiedName - match emEnv.TypeMap.TryGetValue(tref) with - | true, (_, tgt) -> tgt - | _ -> tref - else - tref) + ilxMainModule |> Morphs.morphILTypeRefsInILModuleMemoized emEnv.MapTypeRef let opts = { ilg = tcGlobals.ilg @@ -2012,13 +2022,7 @@ type internal FsiDynamicCompiler let emEnv = ILDynamicAssemblyWriter.emEnv0 SingleDynamicAssembly (cenv, emEnv) else - let emEnv = - { ilg = tcGlobals.ilg - resolveAssemblyRef = resolveAssemblyRef - TypeMap = Dictionary(HashIdentity.Structural) - InternalTypes = HashSet(HashIdentity.Structural) - InternalMethods = HashSet(HashIdentity.Structural) - InternalFields = HashSet(HashIdentity.Structural) } + let emEnv = ILMultiInMemoryAssemblyEmitEnv(ilGlobals, resolveAssemblyRef) MultipleInMemoryAssemblies emEnv let tcEnv, openDecls0 = GetInitialTcEnv (assemblyName, rangeStdin, tcConfig, tcImports, tcGlobals) diff --git a/tests/fsharpqa/Source/EntryPoint/env.lst b/tests/fsharpqa/Source/EntryPoint/env.lst index 7d37209c97e..82f1d126cfa 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="--dynamicassembly" FSIMODE=PIPE COMPILE_ONLY=1 # entrypointandFSI.fs +NoMT SOURCE=entrypointandFSI02.fsx SCFLAGS="--dynamicassembly" FSIMODE=EXEC COMPILE_ONLY=1 # entrypointandFSI02.fsx SOURCE=E_CompilingToALibrary01.fs SCFLAGS="--test:ErrorRanges --target:library" # E_CompilingToALibrary01.fs From d7a889ebbd1ec331c09fb708c4fe78f71bd144dc Mon Sep 17 00:00:00 2001 From: Don Syme Date: Sun, 13 Feb 2022 18:24:43 +0000 Subject: [PATCH 07/17] cleanup code --- src/fsharp/fsi/fsi.fs | 159 +++++++++++++++++++++--------------------- 1 file changed, 81 insertions(+), 78 deletions(-) diff --git a/src/fsharp/fsi/fsi.fs b/src/fsharp/fsi/fsi.fs index 268f4032b3b..4963c47ecc0 100644 --- a/src/fsharp/fsi/fsi.fs +++ b/src/fsharp/fsi/fsi.fs @@ -201,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() @@ -225,26 +222,30 @@ 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 +/// 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) = - let TypeMap = Dictionary(HashIdentity.Structural) + let typeMap = Dictionary(HashIdentity.Structural) let internalTypes = HashSet(HashIdentity.Structural) - let InternalMethods = HashSet(HashIdentity.Structural) - let InternalFields = HashSet(HashIdentity.Structural) + let internalMethods = HashSet(HashIdentity.Structural) + let internalFields = HashSet(HashIdentity.Structural) + /// 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) - let setVersion (version: ILVersionInfo) = - asmName.Version <- Version (int32 version.Major, int32 version.Minor, int32 version.Build, int32 version.Revision) - Option.iter setVersion aref.Version + 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 @@ -263,13 +264,7 @@ type ILMultiInMemoryAssemblyEmitEnv(ilg: ILGlobals, resolveAssemblyRef: ILAssemb | null -> error(Error(FSComp.SR.itemNotFoundDuringDynamicCodeGen ("type", qualifiedName, asmref.QualifiedName), range0)) | res -> res - /// Convert an Abstract IL type reference to Reflection.Emit System.Type value. - // This ought to be an adequate substitute for this whole function, but it needs - // to be thoroughly tested. - // Type.GetType(tref.QualifiedName) - // [] , name -> name - // [ns] , name -> ns+name - // [ns;typeA;typeB], name -> ns+typeA+typeB+name + /// 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 @@ -284,63 +279,66 @@ type ILMultiInMemoryAssemblyEmitEnv(ilg: ILGlobals, resolveAssemblyRef: ILAssemb | 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 then - //let key = tref.BasicQualifiedName - //printfn $"lookup {tref.BasicQualifiedName}" - //if not (emEnv.TypeMap.ContainsKey(key)) then - //printfn $"keys = %A{[ for (KeyValue(k,_)) in emEnv.TypeMap -> k ]}" - - let _, tref = TypeMap.[tref] + let _, tref = typeMap.[tref] tref else tref + /// Convert an ILTypeRef to a dynamic System.Type given the dynamic emit context member _.LookupTypeRef (tref: ILTypeRef) = - assert tref.Scope.IsLocalRef - let typ, _ = TypeMap.[tref] - typ + convTypeRef tref + /// Convert an ILType to a dynamic System.Type given the dynamic emit context member _.LookupType (ty: ILType) = - let rec convTypeSpec (tspec: ILTypeSpec) = - let tref = tspec.TypeRef - let typT = - if tref.Scope.IsLocalRef then - let typ, _ = TypeMap.[tref] - typ - else - convTypeRefAux 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" 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) @@ -348,8 +346,9 @@ type ILMultiInMemoryAssemblyEmitEnv(ilg: ILGlobals, resolveAssemblyRef: ILAssemb let typ = asm.GetType(key) //printfn "Adding %s --> %s" key typ.FullName let tref = ILTypeRef.Create(ilScopeRef, [ for e in enc -> e.Name ], typ.Name) - TypeMap.Add(ltref, (typ, tref)) - emEnv.AddTypeDefs asm ilScopeRef (enc@[tdef]) (tdef.NestedTypes.AsArray()) + typeMap.Add(ltref, (typ, tref)) + 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 @@ -357,14 +356,14 @@ type ILMultiInMemoryAssemblyEmitEnv(ilg: ILGlobals, resolveAssemblyRef: ILAssemb | ILMemberAccess.Public -> () | _ -> let lfref = mkRefForILField ILScopeRef.Local (enc, tdef) fdef - InternalFields.Add(lfref) |> ignore + 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 + internalMethods.Add(lmref) |> ignore match tdef.Access with | ILTypeDefAccess.Public @@ -372,18 +371,22 @@ type ILMultiInMemoryAssemblyEmitEnv(ilg: ILGlobals, resolveAssemblyRef: ILAssemb | _ -> internalTypes.Add(ltref) |> ignore - member emEnv.AddTypeDefs asm ilScopeRef enc (tdefs: ILTypeDef[]) = - for tdef in tdefs do - emEnv.AddTypeDef asm ilScopeRef enc tdef + /// 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) + 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) + fref.DeclaringTypeRef.Scope.IsLocalRef && internalFields.Contains(fref) type ILAssemblyEmitEnv = | SingleDynamicAssembly of ILDynamicAssemblyWriter.cenv * ILDynamicAssemblyEmitEnv @@ -1427,7 +1430,7 @@ type internal FsiDynamicCompiler with :? TargetInvocationException as e -> Some e.InnerException) ] - emEnv.AddTypeDefs asm ilScopeRef [] (ilxMainModule.TypeDefs.AsArray()) + emEnv.AddModuleDef asm ilScopeRef ilxMainModule execs From 458d5ffd45b315bcd99a71b4d34c39d18176a964 Mon Sep 17 00:00:00 2001 From: Don Syme Date: Sun, 13 Feb 2022 20:15:53 +0000 Subject: [PATCH 08/17] fix build --- src/fsharp/fsi/fsi.fs | 2 +- .../CompilerServiceBenchmarks/Benchmarks.fs | 103 +++++------------- 2 files changed, 31 insertions(+), 74 deletions(-) diff --git a/src/fsharp/fsi/fsi.fs b/src/fsharp/fsi/fsi.fs index 4963c47ecc0..8902d32b894 100644 --- a/src/fsharp/fsi/fsi.fs +++ b/src/fsharp/fsi/fsi.fs @@ -324,7 +324,7 @@ type ILMultiInMemoryAssemblyEmitEnv(ilg: ILGlobals, resolveAssemblyRef: ILAssemb /// Map the given ILTypeRef to the appropriate assembly fragment member _.MapTypeRef (tref: ILTypeRef) = - if tref.Scope.IsLocalRef then + if tref.Scope.IsLocalRef && typeMap.ContainsKey(tref) then let _, tref = typeMap.[tref] tref else diff --git a/tests/benchmarks/CompilerServiceBenchmarks/Benchmarks.fs b/tests/benchmarks/CompilerServiceBenchmarks/Benchmarks.fs index 434d6870bd3..2a8ff70a862 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 From ed7cb26214fff8b127c98354a32c8cbc3ba065eb Mon Sep 17 00:00:00 2001 From: Don Syme Date: Mon, 14 Feb 2022 20:42:42 +0000 Subject: [PATCH 09/17] debug of FSI .NET Core in VS --- src/fsharp/absil/ilmorph.fs | 19 +-- src/fsharp/absil/ilmorph.fsi | 3 + src/fsharp/absil/ilwrite.fs | 34 ++--- src/fsharp/fsi/fsi.fs | 96 ++++++++----- tests/FSharp.Compiler.UnitTests/FsiTests.fs | 124 +++++++++-------- .../src/FSharp.VS.FSI/fsiSessionToolWindow.fs | 70 +++++----- vsintegration/src/FSharp.VS.FSI/sessions.fs | 126 +++++++++++------- 7 files changed, 279 insertions(+), 193 deletions(-) diff --git a/src/fsharp/absil/ilmorph.fs b/src/fsharp/absil/ilmorph.fs index a9b5aaa5b62..b457a14e300 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 @@ -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) @@ -316,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 70cb7808f2e..aacdc34a5d1 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/ilwrite.fs b/src/fsharp/absil/ilwrite.fs index a3180cb3be3..c2a150ccd16 100644 --- a/src/fsharp/absil/ilwrite.fs +++ b/src/fsharp/absil/ilwrite.fs @@ -3555,7 +3555,7 @@ let writePdb ( deterministic, pathMap, pdbData, - pdbOpt, + pdbInfoOpt, debugDirectoryChunk, debugDataChunk, debugChecksumPdbChunk, @@ -3577,7 +3577,7 @@ let writePdb ( #endif | Some pdbfile -> let idd = - match pdbOpt with + 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 @@ -3701,7 +3701,7 @@ let writeBinaryAux ( dprintn "Warning: The output assembly is being signed or delay-signed with a strong name that is different to the original." { modul with Manifest = match modul.Manifest with None -> None | Some m -> Some {m with PublicKey = pubkey} } - let pdbData, pdbOpt, debugDirectoryChunk, debugDataChunk, debugChecksumPdbChunk, debugEmbeddedPdbChunk, debugDeterministicPdbChunk, textV2P, mappings = + let pdbData, pdbInfoOpt, debugDirectoryChunk, debugDataChunk, debugChecksumPdbChunk, debugEmbeddedPdbChunk, debugDeterministicPdbChunk, textV2P, mappings = let os = new BinaryWriter(stream, System.Text.Encoding.UTF8) @@ -3804,16 +3804,18 @@ let writeBinaryAux ( 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, algorithmName, checkSum) = pdbInfo let compressedStream = compressPortablePdbStream stream Some (uncompressedLength, contentId, compressedStream, algorithmName, checkSum) - else Some pdbStream + else + Some pdbInfo | _ -> None @@ -3839,7 +3841,7 @@ let writeBinaryAux ( + 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 @@ -3849,7 +3851,7 @@ let writeBinaryAux ( 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 @@ -4321,10 +4323,10 @@ let writeBinaryAux ( b0 reloc2; b1 reloc2; |] writePadding os "end of .reloc" (imageEndSectionPhysLoc - relocSectionPhysLoc - relocSectionSize) - pdbData, pdbOpt, debugDirectoryChunk, debugDataChunk, debugChecksumPdbChunk, debugEmbeddedPdbChunk, debugDeterministicPdbChunk, textV2P, mappings + 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, @@ -4352,7 +4354,7 @@ let writeBinaryFiles (outfile, with _ -> failwith ("Could not open file for writing (binary mode): " + outfile) - let pdbData, pdbOpt, debugDirectoryChunk, debugDataChunk, debugChecksumPdbChunk, debugEmbeddedPdbChunk, debugDeterministicPdbChunk, textV2P, mappings = + let pdbData, pdbInfoOpt, debugDirectoryChunk, debugDataChunk, debugChecksumPdbChunk, debugEmbeddedPdbChunk, debugDeterministicPdbChunk, textV2P, mappings = try try writeBinaryAux( @@ -4380,7 +4382,7 @@ let writeBinaryFiles (outfile, showTimes, portablePDB, embeddedPDB, pdbfile, outfile, reopenOutput, false, signer, deterministic, pathMap, - pdbData, pdbOpt, debugDirectoryChunk, + pdbData, pdbInfoOpt, debugDirectoryChunk, debugDataChunk, debugChecksumPdbChunk, debugEmbeddedPdbChunk, debugDeterministicPdbChunk, textV2P) |> ignore @@ -4405,7 +4407,7 @@ let writeBinaryInMemory ( normalizeAssemblyRefs) = let stream = new MemoryStream() - let pdbData, pdbOpt, debugDirectoryChunk, debugDataChunk, debugChecksumPdbChunk, debugEmbeddedPdbChunk, debugDeterministicPdbChunk, textV2P, _mappings = + let pdbData, pdbInfoOpt, debugDirectoryChunk, debugDataChunk, debugChecksumPdbChunk, debugEmbeddedPdbChunk, debugDeterministicPdbChunk, textV2P, _mappings = writeBinaryAux(stream, ilg, pdbfile, signer, portablePDB, embeddedPDB, embedAllSource, @@ -4420,7 +4422,7 @@ let writeBinaryInMemory ( showTimes, portablePDB, embeddedPDB, pdbfile, outfile, reopenOutput, true, signer, deterministic, pathMap, - pdbData, pdbOpt, debugDirectoryChunk, debugDataChunk, + pdbData, pdbInfoOpt, debugDirectoryChunk, debugDataChunk, debugChecksumPdbChunk, debugEmbeddedPdbChunk, debugDeterministicPdbChunk, textV2P) diff --git a/src/fsharp/fsi/fsi.fs b/src/fsharp/fsi/fsi.fs index 8902d32b894..d43f4b6b7ab 100644 --- a/src/fsharp/fsi/fsi.fs +++ b/src/fsharp/fsi/fsi.fs @@ -224,11 +224,18 @@ type internal FsiTimeReporter(outWriter: TextWriter) = /// 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) = +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) = @@ -325,8 +332,15 @@ type ILMultiInMemoryAssemblyEmitEnv(ilg: ILGlobals, resolveAssemblyRef: ILAssemb /// Map the given ILTypeRef to the appropriate assembly fragment member _.MapTypeRef (tref: ILTypeRef) = if tref.Scope.IsLocalRef && typeMap.ContainsKey(tref) then - let _, tref = typeMap.[tref] + 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 @@ -346,7 +360,9 @@ type ILMultiInMemoryAssemblyEmitEnv(ilg: ILGlobals, resolveAssemblyRef: ILAssemb let typ = asm.GetType(key) //printfn "Adding %s --> %s" key typ.FullName let tref = ILTypeRef.Create(ilScopeRef, [ for e in enc -> e.Name ], typ.Name) + let rtref = ILTypeRef.Create(dynamicCcuScopeRef, [ for e in enc -> e.Name ], typ.Name) typeMap.Add(ltref, (typ, tref)) + reverseTypeMap.Add(tref, rtref) for ntdef in tdef.NestedTypes.AsArray() do emEnv.AddTypeDef asm ilScopeRef (enc@[tdef]) ntdef @@ -721,15 +737,15 @@ type internal FsiConsoleOutput(tcConfigB, outWriter:TextWriter, errorWriter:Text 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 @@ -1291,7 +1307,7 @@ type internal FsiDynamicCompiler 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 @@ -1299,6 +1315,8 @@ type internal FsiDynamicCompiler let mutable fragmentId = 0 + static let mutable dynamicAssemblyId = 0 + let mutable prevIt : ValRef option = None let dynamicAssemblies = ResizeArray() @@ -1311,7 +1329,7 @@ type internal FsiDynamicCompiler let builders = if tcConfigB.fsiSingleDynamicAsembly then - let assemBuilder, moduleBuilder = mkDynamicAssemblyAndModule (assemblyName, tcConfigB.optSettings.LocalOptimizationsEnabled, generateDebugInfo, fsiCollectible) + let assemBuilder, moduleBuilder = mkDynamicAssemblyAndModule (dynamicCcuName, tcConfigB.optSettings.LocalOptimizationsEnabled, generateDebugInfo, fsiCollectible) dynamicAssemblies.Add(assemBuilder) Some (assemBuilder, moduleBuilder) else @@ -1324,9 +1342,9 @@ type internal FsiDynamicCompiler let infoReader = InfoReader(tcGlobals,tcImports.GetImportMap()) /// Add attributes - let CreateModuleFragment (tcConfigB: TcConfigBuilder, assemblyName, codegenResults) = + let CreateModuleFragment (tcConfigB: TcConfigBuilder, dynamicCcuName, 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 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 @@ -1336,7 +1354,9 @@ type internal FsiDynamicCompiler let EmitInMemoryAssembly (tcConfig: TcConfig, emEnv: ILMultiInMemoryAssemblyEmitEnv, ilxMainModule: ILModuleDef) = // The name of the assembly is "FSI-ASSEMBLY1" etc - let assemblyName = ilxMainModule.ManifestOfAssembly.Name + string fragmentId + 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 @@ -1344,11 +1364,11 @@ type internal FsiDynamicCompiler let manifest = ilxMainModule.Manifest.Value let attrs = [ for i in 1..maxInternalsVisibleTo do - let fwdAssemblyName = ilxMainModule.ManifestOfAssembly.Name + string (fragmentId + i) + let fwdAssemblyName = ilxMainModule.ManifestOfAssembly.Name + string (dynamicAssemblyId + i) tcGlobals.MakeInternalsVisibleToAttribute(fwdAssemblyName) yield! manifest.CustomAttrs.AsList() ] { manifest with - Name = assemblyName + Name = multiAssemblyName CustomAttrsStored = storeILCustomAttrs (mkILCustomAttrs attrs) } @@ -1377,10 +1397,10 @@ type internal FsiDynamicCompiler { 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 = assemblyName + ".dll" + 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 (assemblyName + ".pdb") else None) + pdbfile = (if tcConfig.debuginfo then Some (multiAssemblyName + ".pdb") else None) emitTailcalls = tcConfig.emitTailcalls deterministic = tcConfig.deterministic showTimes = tcConfig.showTimes @@ -1402,8 +1422,8 @@ type internal FsiDynamicCompiler let asm = match pdbBytes with - | None -> System.Reflection.Assembly.Load(assemblyBytes) - | Some pdbBytes -> System.Reflection.Assembly.Load(assemblyBytes, pdbBytes) + | None -> Assembly.Load(assemblyBytes) + | Some pdbBytes -> Assembly.Load(assemblyBytes, pdbBytes) dynamicAssemblies.Add(asm) @@ -1448,7 +1468,7 @@ type internal FsiDynamicCompiler errorLogger.AbortOnError(fsiConsoleOutput) ReportTime tcConfig "Linking" - let ilxMainModule = CreateModuleFragment (tcConfigB, assemblyName, codegenResults) + let ilxMainModule = CreateModuleFragment (tcConfigB, dynamicCcuName, codegenResults) errorLogger.AbortOnError(fsiConsoleOutput) @@ -1599,7 +1619,9 @@ type internal FsiDynamicCompiler | _ -> None - let nextFragmentId() = fragmentId <- fragmentId + 1; fragmentId + let nextFragmentId() = + fragmentId <- fragmentId + 1 + fragmentId let mkFragmentPath i = // NOTE: this text shows in exn traces and type names. Make it clear and fixed width @@ -1682,7 +1704,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 | _ -> @@ -1702,13 +1725,18 @@ type internal FsiDynamicCompiler addCcusToIncrementalEnv state ccuinfos, ty let ilTys = convertReflectionTypeToILType reflectionTy - - ilTys - |> List.fold (fun (state, addedTypes) ilTy -> + + // Rewrite references to dynamic assemblies 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, []) - - member _.DynamicAssemblyName = assemblyName + nextState, addedTypes @ [addedType]) member _.DynamicAssemblies = dynamicAssemblies.ToArray() @@ -1797,8 +1825,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, @@ -2025,11 +2053,11 @@ type internal FsiDynamicCompiler let emEnv = ILDynamicAssemblyWriter.emEnv0 SingleDynamicAssembly (cenv, emEnv) else - let emEnv = ILMultiInMemoryAssemblyEmitEnv(ilGlobals, resolveAssemblyRef) + let emEnv = ILMultiInMemoryAssemblyEmitEnv(ilGlobals, resolveAssemblyRef, dynamicCcuName) MultipleInMemoryAssemblies emEnv - let tcEnv, openDecls0 = GetInitialTcEnv (assemblyName, rangeStdin, tcConfig, tcImports, tcGlobals) - let ccuName = assemblyName + let tcEnv, openDecls0 = GetInitialTcEnv (dynamicCcuName, rangeStdin, tcConfig, tcImports, tcGlobals) + let ccuName = dynamicCcuName let tcState = GetInitialTcState (rangeStdin, ccuName, tcConfig, tcGlobals, tcImports, niceNameGen, tcEnv, openDecls0) @@ -3128,6 +3156,10 @@ type FsiEvaluationSession (fsi: FsiEvaluationSessionHostConfig, argv:string[], i do if isRunningOnCoreClr then SetTargetProfile tcConfigB "netcore" // always assume System.Runtime codegen #endif + // Preset: --dynamicassembly+ on .NET Framework + do if not isRunningOnCoreClr then + tcConfigB.fsiSingleDynamicAsembly <- true + // Preset: --optimize+ -g --tailcalls+ (see 4505) do SetOptimizeSwitch tcConfigB OptionSwitch.On do SetDebugSwitch tcConfigB (Some "pdbonly") OptionSwitch.On diff --git a/tests/FSharp.Compiler.UnitTests/FsiTests.fs b/tests/FSharp.Compiler.UnitTests/FsiTests.fs index 78a018b19c4..66e38e1dba1 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 "--dynamicassembly" |] 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 refemit`` () = + 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/vsintegration/src/FSharp.VS.FSI/fsiSessionToolWindow.fs b/vsintegration/src/FSharp.VS.FSI/fsiSessionToolWindow.fs index 61ff177fd3b..927690ce79f 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 8758f3b062d..460d97233e0 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 From 27692857f96fcbf9088824bb536bc278ba98b51b Mon Sep 17 00:00:00 2001 From: Don Syme Date: Tue, 15 Feb 2022 01:06:08 +0000 Subject: [PATCH 10/17] deal with case where optimization information was leaking internals --- src/fsharp/CompilerConfig.fs | 5 +- src/fsharp/CompilerConfig.fsi | 5 +- src/fsharp/OptimizeInputs.fs | 6 +- src/fsharp/OptimizeInputs.fsi | 12 +- src/fsharp/Optimizer.fs | 43 +- src/fsharp/Optimizer.fsi | 1 + src/fsharp/TypedTreeOps.fs | 29 +- src/fsharp/TypedTreeOps.fsi | 5 +- src/fsharp/fsc.fs | 2 +- src/fsharp/fsi/FSIstrings.txt | 2 +- src/fsharp/fsi/fsi.fs | 69 +- src/fsharp/fsi/xlf/FSIstrings.txt.cs.xlf | 4 +- src/fsharp/fsi/xlf/FSIstrings.txt.de.xlf | 4 +- src/fsharp/fsi/xlf/FSIstrings.txt.es.xlf | 4 +- src/fsharp/fsi/xlf/FSIstrings.txt.fr.xlf | 4 +- src/fsharp/fsi/xlf/FSIstrings.txt.it.xlf | 4 +- src/fsharp/fsi/xlf/FSIstrings.txt.ja.xlf | 4 +- src/fsharp/fsi/xlf/FSIstrings.txt.ko.xlf | 4 +- src/fsharp/fsi/xlf/FSIstrings.txt.pl.xlf | 4 +- src/fsharp/fsi/xlf/FSIstrings.txt.pt-BR.xlf | 4 +- src/fsharp/fsi/xlf/FSIstrings.txt.ru.xlf | 4 +- src/fsharp/fsi/xlf/FSIstrings.txt.tr.xlf | 4 +- src/fsharp/fsi/xlf/FSIstrings.txt.zh-Hans.xlf | 4 +- src/fsharp/fsi/xlf/FSIstrings.txt.zh-Hant.xlf | 4 +- src/fsharp/service/FSharpCheckerResults.fs | 3 +- tests/FSharp.Compiler.UnitTests/FsiTests.fs | 2 +- tests/fsharp/core/printing/test.fsx | 2 +- .../printing/z.output.test.1000.stdout.47.bsl | 4 + .../printing/z.output.test.1000.stdout.50.bsl | 4 + .../printing/z.output.test.200.stdout.47.bsl | 4 + .../printing/z.output.test.200.stdout.50.bsl | 4 + .../z.output.test.default.stderr.refemit.bsl | 336 + ....output.test.default.stderr.refemitoff.bsl | 340 + .../z.output.test.default.stdout.47.bsl | 4 + ...output.test.default.stdout.50.refemit.bsl} | 4 + ...tput.test.default.stdout.50.refemitoff.bsl | 6269 +++++++++++++++++ .../printing/z.output.test.off.stdout.47.bsl | 4 + .../printing/z.output.test.off.stdout.50.bsl | 1737 +++++ .../printing/z.output.test.quiet.stderr.bsl | 348 + .../printing/z.output.test.quiet.stdout.bsl | 13 + tests/fsharp/tests.fs | 15 +- 41 files changed, 9239 insertions(+), 85 deletions(-) create mode 100644 tests/fsharp/core/printing/z.output.test.default.stderr.refemit.bsl create mode 100644 tests/fsharp/core/printing/z.output.test.default.stderr.refemitoff.bsl rename tests/fsharp/core/printing/{z.output.test.default.stdout.50.bsl => z.output.test.default.stdout.50.refemit.bsl} (99%) create mode 100644 tests/fsharp/core/printing/z.output.test.default.stdout.50.refemitoff.bsl create mode 100644 tests/fsharp/core/printing/z.output.test.off.stdout.50.bsl create mode 100644 tests/fsharp/core/printing/z.output.test.quiet.stderr.bsl create mode 100644 tests/fsharp/core/printing/z.output.test.quiet.stdout.bsl diff --git a/src/fsharp/CompilerConfig.fs b/src/fsharp/CompilerConfig.fs index 70c7718b62c..77701b70341 100644 --- a/src/fsharp/CompilerConfig.fs +++ b/src/fsharp/CompilerConfig.fs @@ -481,7 +481,7 @@ type TcConfigBuilder = mutable fxResolver: FxResolver option // Is F# Interactive using multi-assembly emit? - mutable fsiSingleDynamicAsembly: bool + mutable fsiSingleAssemblyRefEmit: bool /// specify the error range for FxResolver rangeForErrors: range @@ -663,7 +663,7 @@ type TcConfigBuilder = shadowCopyReferences = false useSdkRefs = true fxResolver = None - fsiSingleDynamicAsembly = false + fsiSingleAssemblyRefEmit = false internalTestSpanStackReferring = false noConditionalErasure = false pathMap = PathMap.empty @@ -925,6 +925,7 @@ type TcConfig private (data: TcConfigBuilder, validate: bool) = #endif None, data.legacyReferenceResolver.Impl.HighestInstalledNetFrameworkVersion() + member _.fsiSingleAssemblyRefEmit = data.fsiSingleAssemblyRefEmit 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 3158627443e..b5873647ef2 100644 --- a/src/fsharp/CompilerConfig.fsi +++ b/src/fsharp/CompilerConfig.fsi @@ -272,7 +272,7 @@ type TcConfigBuilder = mutable shadowCopyReferences: bool mutable useSdkRefs: bool mutable fxResolver: FxResolver option - mutable fsiSingleDynamicAsembly: bool + mutable fsiSingleAssemblyRefEmit: bool rangeForErrors: range sdkDirOverride: string option @@ -459,6 +459,9 @@ type TcConfig = member isInteractive: bool member isInvalidationSupported: bool + /// Indicates if F# Interactive is using single-assembly emit where internals are available. + member fsiSingleAssemblyRefEmit: bool + member xmlDocInfoLoader: IXmlDocumentationInfoLoader option member FxResolver: FxResolver diff --git a/src/fsharp/OptimizeInputs.fs b/src/fsharp/OptimizeInputs.fs index 3cccaeef042..051432f854f 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.fsiSingleAssemblyRefEmit, 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.fsiSingleAssemblyRefEmit, 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.fsiSingleAssemblyRefEmit, 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 2c64a648ffd..5a41c3f9bd4 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 0b88e9c2c3b..a393e676873 100644 --- a/src/fsharp/Optimizer.fs +++ b/src/fsharp/Optimizer.fs @@ -3872,7 +3872,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 @@ -3891,29 +3892,37 @@ and OptimizeModuleDefs cenv (env, bindInfosColl) defs = let defs, minfos = List.unzip defs (defs, UnionOptimizationInfos minfos), (env, bindInfosColl) -and OptimizeImplFileInternal cenv env isIncrementalFragment hidden (TImplFile (qname, pragmas, mexpr, hasExplicitEntryPoint, isScript, anonRecdTypes)) = - let env, mexprR, minfo = +and OptimizeImplFileInternal cenv env isIncrementalFragment fsiSingleAssemblyRefEmit hidden (TImplFile (qname, pragmas, mexpr, hasExplicitEntryPoint, isScript, anonRecdTypes)) = + let env, mexprR, minfo = 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 everything 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. + // + // In incremental, multi-assembly mode no internals are accessible | 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 + let (def, minfo), (_env, _bindInfosColl) = OptimizeModuleDef cenv (env, []) def + let minfo = minfo |> AbstractLazyModulInfoByHiding false hidden + let hidden = if fsiSingleAssemblyRefEmit then ComputeImplementationHidingInfoAtAssemblyBoundary def hidden else hidden + let minfo = AbstractLazyModulInfoByHiding true 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, def, m), minfo + | _ -> + let env, mexprR, minfo = + let mexprR, minfo = OptimizeModuleExpr cenv env mexpr + 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 - let hidden = ComputeHidingInfoAtAssemblyBoundary mexpr.Type hidden + let hidden = ComputeSignatureHidingInfoAtAssemblyBoundary mexpr.Type hidden + + let minfo = AbstractLazyModulInfoByHiding true hidden minfo + env, mexprR, minfo - let minfo = AbstractLazyModulInfoByHiding true hidden minfo env, TImplFile (qname, pragmas, mexprR, hasExplicitEntryPoint, isScript, anonRecdTypes), 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, fsiSingleAssemblyRefEmit, emitTailcalls, hidden, mimpls) = let cenv = { settings=settings scope=ccu @@ -3927,7 +3936,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 fsiSingleAssemblyRefEmit 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 2f58475338a..2f1e32e9673 100644 --- a/src/fsharp/Optimizer.fsi +++ b/src/fsharp/Optimizer.fsi @@ -74,6 +74,7 @@ val internal OptimizeImplFile: Import.ImportMap * IncrementalOptimizationEnv * isIncrementalFragment: bool * + fsiSingleAssemblyRefEmit: bool * emitTailcalls: bool * SignatureHidingInfo * TypedImplFile diff --git a/src/fsharp/TypedTreeOps.fs b/src/fsharp/TypedTreeOps.fs index fb40b624f7c..36dd0ee27c1 100644 --- a/src/fsharp/TypedTreeOps.fs +++ b/src/fsharp/TypedTreeOps.fs @@ -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 097d46bed7f..8b6af51e062 100755 --- a/src/fsharp/TypedTreeOps.fsi +++ b/src/fsharp/TypedTreeOps.fsi @@ -1210,7 +1210,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/fsc.fs b/src/fsharp/fsc.fs index 2c5d58c62a3..1e43209dcc6 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) diff --git a/src/fsharp/fsi/FSIstrings.txt b/src/fsharp/fsi/FSIstrings.txt index 20b84226645..9a6fc6de200 100644 --- a/src/fsharp/fsi/FSIstrings.txt +++ b/src/fsharp/fsi/FSIstrings.txt @@ -55,4 +55,4 @@ shadowCopyReferences,"Prevents references from being locked by the F# Interactiv 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" fsiUseSingleDynamicAssembly,"Use a single dynamic assembly" -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" \ No newline at end of file +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 '--refemit' option." \ No newline at end of file diff --git a/src/fsharp/fsi/fsi.fs b/src/fsharp/fsi/fsi.fs index d43f4b6b7ab..ce04aab5dad 100644 --- a/src/fsharp/fsi/fsi.fs +++ b/src/fsharp/fsi/fsi.fs @@ -948,7 +948,7 @@ type internal FsiCommandLineOptions(fsi: FsiEvaluationSessionHostConfig, 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("dynamicassembly", tagNone, OptionSwitch(fun flag -> tcConfigB.fsiSingleDynamicAsembly <- flag = OptionSwitch.On), None, Some(FSIstrings.SR.fsiUseSingleDynamicAssembly())) + CompilerOption("refemit", tagNone, OptionSwitch(fun flag -> tcConfigB.fsiSingleAssemblyRefEmit <- flag = OptionSwitch.On), None, Some(FSIstrings.SR.fsiUseSingleDynamicAssembly())) ]); ] @@ -1328,7 +1328,7 @@ type internal FsiDynamicCompiler let valuePrinter = FsiValuePrinter(fsi, outWriter) let builders = - if tcConfigB.fsiSingleDynamicAsembly then + if tcConfigB.fsiSingleAssemblyRefEmit then let assemBuilder, moduleBuilder = mkDynamicAssemblyAndModule (dynamicCcuName, tcConfigB.optSettings.LocalOptimizationsEnabled, generateDebugInfo, fsiCollectible) dynamicAssemblies.Add(assemBuilder) Some (assemBuilder, moduleBuilder) @@ -1351,7 +1351,7 @@ type internal FsiDynamicCompiler Some { man with CustomAttrsStored = storeILCustomAttrs (mkILCustomAttrs codegenResults.ilAssemAttrs) }) } /// Generate one assembly using multi-assembly emit - let EmitInMemoryAssembly (tcConfig: TcConfig, emEnv: ILMultiInMemoryAssemblyEmitEnv, ilxMainModule: ILModuleDef) = + let EmitInMemoryAssembly (tcConfig: TcConfig, emEnv: ILMultiInMemoryAssemblyEmitEnv, ilxMainModule: ILModuleDef, m) = // The name of the assembly is "FSI-ASSEMBLY1" etc dynamicAssemblyId <- dynamicAssemblyId + 1 @@ -1379,15 +1379,15 @@ type internal FsiDynamicCompiler for tref in refs.TypeReferences do if emEnv.IsLocalInternalType(tref) then - warning(Error((FSIstrings.SR.fsiInternalAccess(tref.Name)), rangeStdin)) + warning(Error((FSIstrings.SR.fsiInternalAccess(tref.Name)), m)) for mref in refs.MethodReferences do if emEnv.IsLocalInternalMethod(mref) then - warning(Error((FSIstrings.SR.fsiInternalAccess(mref.Name)), rangeStdin)) + 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)), rangeStdin)) + warning(Error((FSIstrings.SR.fsiInternalAccess(fref.Name)), m)) // Rewrite references to local types to their respective dynamic assemblies let ilxMainModule = @@ -1441,8 +1441,10 @@ type internal FsiDynamicCompiler // Make the 'exec' functions for the entry point initializations let execs = - [ for edef in entries -> - (fun () -> + [ 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)) @@ -1455,7 +1457,7 @@ type internal FsiDynamicCompiler 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) = + 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. @@ -1499,7 +1501,7 @@ type internal FsiDynamicCompiler | MultipleInMemoryAssemblies emEnv -> - let execs = EmitInMemoryAssembly (tcConfig, emEnv, ilxMainModule) + let execs = EmitInMemoryAssembly (tcConfig, emEnv, ilxMainModule, m) MultipleInMemoryAssemblies emEnv, execs @@ -1508,7 +1510,9 @@ type internal FsiDynamicCompiler // Explicitly register the resources with the QuotationPickler module match emEnv with | SingleDynamicAssembly (cenv, emEnv) -> + let assemblyBuilder, _moduleBuilder = builders.Value + for referencedTypeDefs, bytes in codegenResults.quotationResourceInfo do let referencedTypes = [| for tref in referencedTypeDefs do @@ -1527,6 +1531,7 @@ type internal FsiDynamicCompiler Quotations.Expr.RegisterReflectedDefinitions (assembly, fragName, bytes, referencedTypes) ReportTime tcConfig "Run Bindings" + timeReporter.TimeOpIf istate.timing (fun () -> execs |> List.iter (fun exec -> match exec() with @@ -1561,7 +1566,7 @@ type internal FsiDynamicCompiler let denv = denv.AddOpenPath (pathOfLid prefixPath) for TImplFile (_qname,_,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 @@ -1589,7 +1594,7 @@ type internal FsiDynamicCompiler 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) + let optimizedImpls, _optData, optEnv = ApplyAllOptimizations (tcConfig, tcGlobals, LightweightTcValForUsingInBuildMethodCall tcGlobals, outfile, importMap, isIncrementalFragment, optEnv, tcState.Ccu, declaredImpls) errorLogger.AbortOnError(fsiConsoleOutput) let fragName = textOfLid prefixPath @@ -1603,13 +1608,17 @@ type internal FsiDynamicCompiler let ilxGenerator = istate.ilxGenerator let tcConfig = TcConfig.Create(tcConfigB,validate=false) + let m = inputs |> List.tryLast |> function None -> rangeStdin | Some i -> i.Range + // 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 = @@ -1748,7 +1757,8 @@ type internal FsiDynamicCompiler let prefix = mkFragmentPath 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) istate /// Evaluate the given definitions and produce a new interactive state. @@ -1758,8 +1768,11 @@ type internal FsiDynamicCompiler let prefix = mkFragmentPath 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 isLastCompiland = true + let isExe = false + let input = ParsedInput.ImplFile (ParsedImplFileInput (filename,true, ComputeQualifiedNameOfFileFromUniquePath (rangeStdin,prefixPath),[],[],[impl],(isLastCompiland, isExe) )) + let isIncrementalFragment = true + let istate,tcEnvAtEndOfLastInput,declaredImpls = ProcessInputs (ctok, errorLogger, istate, [input], showTypes, isIncrementalFragment, isInteractiveItExpr, prefix) let tcState = istate.tcState let newState = { istate with tcState = tcState.NextStateAfterIncrementalFragment(tcEnvAtEndOfLastInput) } processContents newState declaredImpls @@ -2032,8 +2045,9 @@ type internal FsiDynamicCompiler let isIncrementalFragment = true let showTypes = false let declaredImpls = [impl] + let m = rangeStdin 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. @@ -2047,8 +2061,9 @@ type internal FsiDynamicCompiler member _.GetInitialInteractiveState () = let tcConfig = TcConfig.Create(tcConfigB,validate=false) let optEnv0 = GetInitialOptimizationEnv (tcImports, tcGlobals) + let emEnv0 = - if tcConfigB.fsiSingleDynamicAsembly then + if tcConfigB.fsiSingleAssemblyRefEmit then let cenv = { ilg = ilGlobals; emitTailcalls = tcConfig.emitTailcalls; generatePdb = generateDebugInfo; resolveAssemblyRef=resolveAssemblyRef; tryFindSysILTypeRef=tcGlobals.TryFindSysILTypeRef } let emEnv = ILDynamicAssemblyWriter.emEnv0 SingleDynamicAssembly (cenv, emEnv) @@ -2062,6 +2077,7 @@ type internal FsiDynamicCompiler let tcState = GetInitialTcState (rangeStdin, ccuName, tcConfig, tcGlobals, tcImports, niceNameGen, tcEnv, openDecls0) let ilxGenerator = CreateIlxAssemblyGenerator (tcConfig, tcImports, tcGlobals, (LightweightTcValForUsingInBuildMethodCall tcGlobals), tcState.Ccu) + {optEnv = optEnv0 emEnv = emEnv0 tcGlobals = tcGlobals @@ -2671,13 +2687,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 @@ -3156,9 +3175,9 @@ type FsiEvaluationSession (fsi: FsiEvaluationSessionHostConfig, argv:string[], i do if isRunningOnCoreClr then SetTargetProfile tcConfigB "netcore" // always assume System.Runtime codegen #endif - // Preset: --dynamicassembly+ on .NET Framework + // Preset: --refemit+ on .NET Framework do if not isRunningOnCoreClr then - tcConfigB.fsiSingleDynamicAsembly <- true + tcConfigB.fsiSingleAssemblyRefEmit <- true // Preset: --optimize+ -g --tailcalls+ (see 4505) do SetOptimizeSwitch tcConfigB OptionSwitch.On diff --git a/src/fsharp/fsi/xlf/FSIstrings.txt.cs.xlf b/src/fsharp/fsi/xlf/FSIstrings.txt.cs.xlf index b1069bae343..f06f5428e03 100644 --- a/src/fsharp/fsi/xlf/FSIstrings.txt.cs.xlf +++ b/src/fsharp/fsi/xlf/FSIstrings.txt.cs.xlf @@ -3,8 +3,8 @@ - Accessing the internal type, method or field '{0}' from a previous evaluation in F# Interactive is deprecated and may cause subsequent access errors - Accessing the internal type, method or field '{0}' from a previous evaluation in F# Interactive is deprecated and may cause subsequent access errors + 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 '--refemit' 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 '--refemit' option. diff --git a/src/fsharp/fsi/xlf/FSIstrings.txt.de.xlf b/src/fsharp/fsi/xlf/FSIstrings.txt.de.xlf index bed17369e2a..eb0afa58a10 100644 --- a/src/fsharp/fsi/xlf/FSIstrings.txt.de.xlf +++ b/src/fsharp/fsi/xlf/FSIstrings.txt.de.xlf @@ -3,8 +3,8 @@ - Accessing the internal type, method or field '{0}' from a previous evaluation in F# Interactive is deprecated and may cause subsequent access errors - Accessing the internal type, method or field '{0}' from a previous evaluation in F# Interactive is deprecated and may cause subsequent access errors + 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 '--refemit' 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 '--refemit' option. diff --git a/src/fsharp/fsi/xlf/FSIstrings.txt.es.xlf b/src/fsharp/fsi/xlf/FSIstrings.txt.es.xlf index 7ecce359393..6a74ea5376b 100644 --- a/src/fsharp/fsi/xlf/FSIstrings.txt.es.xlf +++ b/src/fsharp/fsi/xlf/FSIstrings.txt.es.xlf @@ -3,8 +3,8 @@ - Accessing the internal type, method or field '{0}' from a previous evaluation in F# Interactive is deprecated and may cause subsequent access errors - Accessing the internal type, method or field '{0}' from a previous evaluation in F# Interactive is deprecated and may cause subsequent access errors + 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 '--refemit' 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 '--refemit' option. diff --git a/src/fsharp/fsi/xlf/FSIstrings.txt.fr.xlf b/src/fsharp/fsi/xlf/FSIstrings.txt.fr.xlf index 231ec51e40a..97d1c683673 100644 --- a/src/fsharp/fsi/xlf/FSIstrings.txt.fr.xlf +++ b/src/fsharp/fsi/xlf/FSIstrings.txt.fr.xlf @@ -3,8 +3,8 @@ - Accessing the internal type, method or field '{0}' from a previous evaluation in F# Interactive is deprecated and may cause subsequent access errors - Accessing the internal type, method or field '{0}' from a previous evaluation in F# Interactive is deprecated and may cause subsequent access errors + 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 '--refemit' 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 '--refemit' option. diff --git a/src/fsharp/fsi/xlf/FSIstrings.txt.it.xlf b/src/fsharp/fsi/xlf/FSIstrings.txt.it.xlf index 471c319218e..2adf812e28f 100644 --- a/src/fsharp/fsi/xlf/FSIstrings.txt.it.xlf +++ b/src/fsharp/fsi/xlf/FSIstrings.txt.it.xlf @@ -3,8 +3,8 @@ - Accessing the internal type, method or field '{0}' from a previous evaluation in F# Interactive is deprecated and may cause subsequent access errors - Accessing the internal type, method or field '{0}' from a previous evaluation in F# Interactive is deprecated and may cause subsequent access errors + 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 '--refemit' 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 '--refemit' option. diff --git a/src/fsharp/fsi/xlf/FSIstrings.txt.ja.xlf b/src/fsharp/fsi/xlf/FSIstrings.txt.ja.xlf index 569c4ff49d7..eb7db609b89 100644 --- a/src/fsharp/fsi/xlf/FSIstrings.txt.ja.xlf +++ b/src/fsharp/fsi/xlf/FSIstrings.txt.ja.xlf @@ -3,8 +3,8 @@ - Accessing the internal type, method or field '{0}' from a previous evaluation in F# Interactive is deprecated and may cause subsequent access errors - Accessing the internal type, method or field '{0}' from a previous evaluation in F# Interactive is deprecated and may cause subsequent access errors + 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 '--refemit' 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 '--refemit' option. diff --git a/src/fsharp/fsi/xlf/FSIstrings.txt.ko.xlf b/src/fsharp/fsi/xlf/FSIstrings.txt.ko.xlf index 8f7d924973a..84e78be078c 100644 --- a/src/fsharp/fsi/xlf/FSIstrings.txt.ko.xlf +++ b/src/fsharp/fsi/xlf/FSIstrings.txt.ko.xlf @@ -3,8 +3,8 @@ - Accessing the internal type, method or field '{0}' from a previous evaluation in F# Interactive is deprecated and may cause subsequent access errors - Accessing the internal type, method or field '{0}' from a previous evaluation in F# Interactive is deprecated and may cause subsequent access errors + 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 '--refemit' 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 '--refemit' option. diff --git a/src/fsharp/fsi/xlf/FSIstrings.txt.pl.xlf b/src/fsharp/fsi/xlf/FSIstrings.txt.pl.xlf index 04df6ba2993..6203f8545d3 100644 --- a/src/fsharp/fsi/xlf/FSIstrings.txt.pl.xlf +++ b/src/fsharp/fsi/xlf/FSIstrings.txt.pl.xlf @@ -3,8 +3,8 @@ - Accessing the internal type, method or field '{0}' from a previous evaluation in F# Interactive is deprecated and may cause subsequent access errors - Accessing the internal type, method or field '{0}' from a previous evaluation in F# Interactive is deprecated and may cause subsequent access errors + 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 '--refemit' 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 '--refemit' option. diff --git a/src/fsharp/fsi/xlf/FSIstrings.txt.pt-BR.xlf b/src/fsharp/fsi/xlf/FSIstrings.txt.pt-BR.xlf index 9ecec7fe299..60420093264 100644 --- a/src/fsharp/fsi/xlf/FSIstrings.txt.pt-BR.xlf +++ b/src/fsharp/fsi/xlf/FSIstrings.txt.pt-BR.xlf @@ -3,8 +3,8 @@ - Accessing the internal type, method or field '{0}' from a previous evaluation in F# Interactive is deprecated and may cause subsequent access errors - Accessing the internal type, method or field '{0}' from a previous evaluation in F# Interactive is deprecated and may cause subsequent access errors + 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 '--refemit' 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 '--refemit' option. diff --git a/src/fsharp/fsi/xlf/FSIstrings.txt.ru.xlf b/src/fsharp/fsi/xlf/FSIstrings.txt.ru.xlf index 10cb92e1b94..ffeeb0f5345 100644 --- a/src/fsharp/fsi/xlf/FSIstrings.txt.ru.xlf +++ b/src/fsharp/fsi/xlf/FSIstrings.txt.ru.xlf @@ -3,8 +3,8 @@ - Accessing the internal type, method or field '{0}' from a previous evaluation in F# Interactive is deprecated and may cause subsequent access errors - Accessing the internal type, method or field '{0}' from a previous evaluation in F# Interactive is deprecated and may cause subsequent access errors + 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 '--refemit' 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 '--refemit' option. diff --git a/src/fsharp/fsi/xlf/FSIstrings.txt.tr.xlf b/src/fsharp/fsi/xlf/FSIstrings.txt.tr.xlf index f6b5004102d..155be6376d8 100644 --- a/src/fsharp/fsi/xlf/FSIstrings.txt.tr.xlf +++ b/src/fsharp/fsi/xlf/FSIstrings.txt.tr.xlf @@ -3,8 +3,8 @@ - Accessing the internal type, method or field '{0}' from a previous evaluation in F# Interactive is deprecated and may cause subsequent access errors - Accessing the internal type, method or field '{0}' from a previous evaluation in F# Interactive is deprecated and may cause subsequent access errors + 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 '--refemit' 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 '--refemit' option. diff --git a/src/fsharp/fsi/xlf/FSIstrings.txt.zh-Hans.xlf b/src/fsharp/fsi/xlf/FSIstrings.txt.zh-Hans.xlf index b2390eb197a..7347bc978bc 100644 --- a/src/fsharp/fsi/xlf/FSIstrings.txt.zh-Hans.xlf +++ b/src/fsharp/fsi/xlf/FSIstrings.txt.zh-Hans.xlf @@ -3,8 +3,8 @@ - Accessing the internal type, method or field '{0}' from a previous evaluation in F# Interactive is deprecated and may cause subsequent access errors - Accessing the internal type, method or field '{0}' from a previous evaluation in F# Interactive is deprecated and may cause subsequent access errors + 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 '--refemit' 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 '--refemit' option. diff --git a/src/fsharp/fsi/xlf/FSIstrings.txt.zh-Hant.xlf b/src/fsharp/fsi/xlf/FSIstrings.txt.zh-Hant.xlf index 9c2b8c85563..9699f07f9d4 100644 --- a/src/fsharp/fsi/xlf/FSIstrings.txt.zh-Hant.xlf +++ b/src/fsharp/fsi/xlf/FSIstrings.txt.zh-Hant.xlf @@ -3,8 +3,8 @@ - Accessing the internal type, method or field '{0}' from a previous evaluation in F# Interactive is deprecated and may cause subsequent access errors - Accessing the internal type, method or field '{0}' from a previous evaluation in F# Interactive is deprecated and may cause subsequent access errors + 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 '--refemit' 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 '--refemit' option. diff --git a/src/fsharp/service/FSharpCheckerResults.fs b/src/fsharp/service/FSharpCheckerResults.fs index 7ce8f5d7e62..baccf6fd46f 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/tests/FSharp.Compiler.UnitTests/FsiTests.fs b/tests/FSharp.Compiler.UnitTests/FsiTests.fs index 66e38e1dba1..92f53db7844 100644 --- a/tests/FSharp.Compiler.UnitTests/FsiTests.fs +++ b/tests/FSharp.Compiler.UnitTests/FsiTests.fs @@ -18,7 +18,7 @@ module FsiTests = // Build command line arguments & start FSI session let argv = [| "C:\\fsi.exe" |] - let allArgs = Array.append argv [|"--noninteractive"; if useOneDynamicAssembly then "--dynamicassembly" |] + let allArgs = Array.append argv [|"--noninteractive"; if useOneDynamicAssembly then "--refemit" else "--refemit-" |] let fsiConfig = FsiEvaluationSession.GetDefaultConfiguration() FsiEvaluationSession.Create(fsiConfig, allArgs, inStream, new StreamWriter(outStream), new StreamWriter(errStream), collectible = true) diff --git a/tests/fsharp/core/printing/test.fsx b/tests/fsharp/core/printing/test.fsx index f0002eeba0d..93b5426a8cc 100644 --- a/tests/fsharp/core/printing/test.fsx +++ b/tests/fsharp/core/printing/test.fsx @@ -1086,7 +1086,7 @@ let ShortName = "hi" System.DayOfWeek.Tuesday ;; - +let internal f() = 1;; f();; // should give a warning in multi-assembly interactive emit ;; (* ;; needed, to isolate error regressions *) ;;exit 0;; (* piped in to enable error regressions *) \ 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 index fd1ea3b8178..d8832102a59 100644 --- a/tests/fsharp/core/printing/z.output.test.1000.stdout.47.bsl +++ b/tests/fsharp/core/printing/z.output.test.1000.stdout.47.bsl @@ -2713,4 +2713,8 @@ val ShortName: string = "hi" > val it: System.DayOfWeek = Tuesday +> val internal f: unit -> int + +> val it: int = 1 + > > > diff --git a/tests/fsharp/core/printing/z.output.test.1000.stdout.50.bsl b/tests/fsharp/core/printing/z.output.test.1000.stdout.50.bsl index 54aafd90501..20c1ee372c8 100644 --- a/tests/fsharp/core/printing/z.output.test.1000.stdout.50.bsl +++ b/tests/fsharp/core/printing/z.output.test.1000.stdout.50.bsl @@ -2715,4 +2715,8 @@ val ShortName: string = "hi" > val it: System.DayOfWeek = Tuesday +> val internal f: unit -> int + +> val it: int = 1 + > > > 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 index 7937acddb64..1ca38cbc5c8 100644 --- a/tests/fsharp/core/printing/z.output.test.200.stdout.47.bsl +++ b/tests/fsharp/core/printing/z.output.test.200.stdout.47.bsl @@ -1958,4 +1958,8 @@ val ShortName: string = "hi" > val it: System.DayOfWeek = Tuesday +> val internal f: unit -> int + +> val it: int = 1 + > > > diff --git a/tests/fsharp/core/printing/z.output.test.200.stdout.50.bsl b/tests/fsharp/core/printing/z.output.test.200.stdout.50.bsl index b12999c2876..fa757c6a1c6 100644 --- a/tests/fsharp/core/printing/z.output.test.200.stdout.50.bsl +++ b/tests/fsharp/core/printing/z.output.test.200.stdout.50.bsl @@ -1960,4 +1960,8 @@ val ShortName: string = "hi" > val it: System.DayOfWeek = Tuesday +> val internal f: unit -> int + +> val it: int = 1 + > > > diff --git a/tests/fsharp/core/printing/z.output.test.default.stderr.refemit.bsl b/tests/fsharp/core/printing/z.output.test.default.stderr.refemit.bsl new file mode 100644 index 00000000000..4d3209ca246 --- /dev/null +++ b/tests/fsharp/core/printing/z.output.test.default.stderr.refemit.bsl @@ -0,0 +1,336 @@ + + #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. + + + 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/z.output.test.default.stderr.refemitoff.bsl b/tests/fsharp/core/printing/z.output.test.default.stderr.refemitoff.bsl new file mode 100644 index 00000000000..547f45b2909 --- /dev/null +++ b/tests/fsharp/core/printing/z.output.test.default.stderr.refemitoff.bsl @@ -0,0 +1,340 @@ + + #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. + + + 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 + + + +stdin(0,1): 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 '--refemit' option. + diff --git a/tests/fsharp/core/printing/z.output.test.default.stdout.47.bsl b/tests/fsharp/core/printing/z.output.test.default.stdout.47.bsl index 882c02cdecb..50765491972 100644 --- a/tests/fsharp/core/printing/z.output.test.default.stdout.47.bsl +++ b/tests/fsharp/core/printing/z.output.test.default.stdout.47.bsl @@ -6260,4 +6260,8 @@ val ShortName: string = "hi" > val it: System.DayOfWeek = Tuesday +> val internal f: unit -> int + +> val it: int = 1 + > > > diff --git a/tests/fsharp/core/printing/z.output.test.default.stdout.50.bsl b/tests/fsharp/core/printing/z.output.test.default.stdout.50.refemit.bsl similarity index 99% rename from tests/fsharp/core/printing/z.output.test.default.stdout.50.bsl rename to tests/fsharp/core/printing/z.output.test.default.stdout.50.refemit.bsl index 08090a81e27..d06d2ff7ff9 100644 --- a/tests/fsharp/core/printing/z.output.test.default.stdout.50.bsl +++ b/tests/fsharp/core/printing/z.output.test.default.stdout.50.refemit.bsl @@ -6262,4 +6262,8 @@ val ShortName: string = "hi" > val it: System.DayOfWeek = Tuesday +> val internal f: unit -> int + +> val it: int = 1 + > > > diff --git a/tests/fsharp/core/printing/z.output.test.default.stdout.50.refemitoff.bsl b/tests/fsharp/core/printing/z.output.test.default.stdout.50.refemitoff.bsl new file mode 100644 index 00000000000..d06d2ff7ff9 --- /dev/null +++ b/tests/fsharp/core/printing/z.output.test.default.stdout.50.refemitoff.bsl @@ -0,0 +1,6269 @@ + +> 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 + +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_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 + +> 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 + +> > > diff --git a/tests/fsharp/core/printing/z.output.test.off.stdout.47.bsl b/tests/fsharp/core/printing/z.output.test.off.stdout.47.bsl index f5f4220db92..c144476e3d9 100644 --- a/tests/fsharp/core/printing/z.output.test.off.stdout.47.bsl +++ b/tests/fsharp/core/printing/z.output.test.off.stdout.47.bsl @@ -1728,4 +1728,8 @@ val ShortName: string = "hi" > val it: System.DayOfWeek = Tuesday +> val internal f: unit -> int + +> val it: int = 1 + > > > diff --git a/tests/fsharp/core/printing/z.output.test.off.stdout.50.bsl b/tests/fsharp/core/printing/z.output.test.off.stdout.50.bsl new file mode 100644 index 00000000000..642362d2f82 --- /dev/null +++ b/tests/fsharp/core/printing/z.output.test.off.stdout.50.bsl @@ -0,0 +1,1737 @@ + +> val it: unit = () + +> val repeatId: string + +> val repeatId: string + +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 +val fs: System.Windows.Forms.Form[] +val xs: string list +val xa: string[] +val xa2: string[,] +val sxs0: Set + +> val sxs1: Set + +> val sxs2: Set + +> val sxs3: Set + +> val sxs4: Set + +> val sxs200: Set + +> val msxs0: Map + +> val msxs1: Map + +> val msxs2: Map + +> val msxs3: Map + +> val msxs4: Map + +> val msxs200: Map + +> module M = + val a: string + val b: + (seq * seq * seq * System.Windows.Forms.Form) option * + (string list * string list * string[,]) option +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 +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 +val opt4: 'a option option option option +val opt4b: int option option option option +val opt5: int list option option option option option list +val mkStr: n: int -> string +val strs: string[] +val str7s: string[] +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 + +> [Building 2 6...done] +val tree_2_6: tree + +> [Building 2 8...done] +val tree_2_8: tree + +> [Building 2 10...done] +val tree_2_10: tree + +> [Building 2 12...done] +val tree_2_12: tree + +> [Building 2 14...done] +val tree_2_14: tree + +> [Building 3 8...done] +val tree_3_8: tree + +> [Building 4 8...done] +val tree_4_8: tree + +> [Building 5 8...done] +val tree_5_8: tree + +> [Building 6 8...done] +val tree_6_8: tree + +> [Building 5 3...done] +val tree_5_3: tree + +> > type X = + | Var of int + | Bop of int * X * X +val generate: x: int -> X + +> val exps: X list + +> module Exprs = + val x1: X + val x2: X + val x3: X + val x4: X + val x5: X + val x6: X + val x7: X + val x8: X + val x9: X + val x10: X + val x11: X + +> 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 +val exA2: exn +val exA3: exn +val exA4: exn +val exA5: exn +exception Ex0 +exception ExUnit of unit +exception ExUnits of unit * unit +exception ExUnitOption of unit option +val ex0: exn +val exU: exn +val exUs: exn +val exUSome: exn +val exUNone: exn +type 'a T4063 = | AT4063 of 'a + +> val valAT3063_12: int T4063 + +> val valAT3063_True: bool T4063 + +> val valAT3063_text: string T4063 + +> val valAT3063_null: System.Object T4063 + +> 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[] + +> module RepeatedModule = + val repeatedByteLiteral: byte[] + +> 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 +val r10s: r[] +val r10s': string * r[] + +> val x1564_A1: int + + +--> Added '\' to library include path + +val x1564_A2: int + + +--> Added '\' to library include path + +val x1564_A3: int + +> 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 + 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 + 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 + val x90: string + val x80: string + val x75: string + val x74: string + val x73: string + val x72: string + val x71: string + val x70: string +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 + val xArray: int[] + val xString: string + val xOption: int option + val xArray2: (int * int)[,] + val xSeq: seq +module Test4343e = + type C = + new: x: int -> C + val cA: C + val cB: C + val cAB: C * C * C list + type D = + new: x: int -> D + override ToString: unit -> string + val dA: D + val dB: D + val dAB: D * D * D list + module Generic = + type CGeneric<'a> = + new: x: 'a -> CGeneric<'a> + val cA: C + val cB: C + val cAB: C * C * C list + type D<'a> = + new: x: 'a -> D<'a> + override ToString: unit -> string + val dA: D + val dB: D + val dAB: D * D * D list + val dC: D + val boxed_dABC: obj list +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 +val seqFindFailure: Either +val seqPickFailure: Either +module Regression5218 = + val t1: int + val t2: int * int + val t3: int * int * int + val t4: int * int * int * int + val t5: int * int * int * int * int + val t6: int * int * int * int * int * int + val t7: int * int * int * int * int * int * int + val t8: int * int * int * int * int * int * int * int + val t9: int * int * int * int * int * int * int * int * int + val t10: int * int * int * int * int * int * int * int * int * int + val t11: int * int * int * int * int * int * int * int * int * int * int + val t12: + int * int * int * int * int * int * int * int * int * int * int * int + val t13: + int * int * int * int * int * int * int * int * int * int * int * int * + int + val t14: + int * int * int * int * int * int * int * int * int * int * int * int * + int * int + val t15: + int * int * int * int * int * int * int * int * int * int * int * int * + int * int * 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 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 +val it: unit + +> Expect ABC = ABC +val it: unit = () + +> module Regression1019_short = + val double_nan: float + val double_infinity: float + val single_nan: float32 + val single_infinity: float32 +module Regression1019_long = + val double_nan: float + val double_infinity: float + val single_nan: float32 + val single_infinity: float32 + +> val it: int ref = { contents = 1 } + +> val x: int ref +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 + +> > val note_ExpectDupProperty: string + +> > > 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 +val namedFieldVar2: MyDU + +> 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 +val namedEx2: exn + +> type optionRecord = + { x: int option } +val x: optionRecord + +> type optionRecord = + { x: obj } +val x: optionRecord + +> 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 + +> 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 + +> module op_Addition = + val x: int + +> module ``land`` = + val x: int + +> val ``+`` : x: 'a -> y: 'b -> int + +> val (+) : x: int -> y: int -> int + +> val ``base`` : int + +> val (mod) : int + +> val ``or`` : int + +> val ``land`` : int + +> val ``.ctor`` : int + +> val ``.cctor`` : int + +> [] +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 + +> > > diff --git a/tests/fsharp/core/printing/z.output.test.quiet.stderr.bsl b/tests/fsharp/core/printing/z.output.test.quiet.stderr.bsl new file mode 100644 index 00000000000..6926dcc9f34 --- /dev/null +++ b/tests/fsharp/core/printing/z.output.test.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/z.output.test.quiet.stdout.bsl b/tests/fsharp/core/printing/z.output.test.quiet.stdout.bsl new file mode 100644 index 00000000000..26683b52103 --- /dev/null +++ b/tests/fsharp/core/printing/z.output.test.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/tests.fs b/tests/fsharp/tests.fs index a849aa0d571..9c7ac166aba 100644 --- a/tests/fsharp/tests.fs +++ b/tests/fsharp/tests.fs @@ -1074,9 +1074,14 @@ module CoreTests = 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" + // For this, check both with and without refemit [] - 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-default-stdout-50 --langversion:5_0 --refemit+`` () = + printing "--langversion:5.0 --refemit+ --debug+ --optimize-" "z.output.test.default.stdout.50.refemit.txt" "z.output.test.default.stdout.50.refemit.bsl" "z.output.test.default.stderr.refemit.txt" "z.output.test.default.stderr.refemit.bsl" + + [] + let ``printing-default-stdout-50 --langversion:5_0 --refemit-`` () = + printing "--langversion:5.0 --refemit- --debug+ --optimize-" "z.output.test.default.stdout.50.refemitoff.txt" "z.output.test.default.stdout.50.refemitoff.bsl" "z.output.test.default.stderr.refemitoff.txt" "z.output.test.default.stderr.refemitoff.bsl" [] let ``printing-1000-stdout-47 --langversion:4_7`` () = @@ -1103,9 +1108,13 @@ module CoreTests = 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-quiet-stdout`` () = + let ``printing-quiet-stdout --refemit+`` () = 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-stdout --refemit-`` () = + printing "--quiet --refemit-" "z.output.test.quiet.stdout.txt" "z.output.test.quiet.stdout.bsl" "z.output.test.quiet.stderr.txt" "z.output.test.quiet.stderr.bsl" + type SigningType = | DelaySigned | PublicSigned From 98826eeec655a766872997d09d2341c8842fc1ef Mon Sep 17 00:00:00 2001 From: Don Syme Date: Tue, 15 Feb 2022 01:25:12 +0000 Subject: [PATCH 11/17] cleanup --- src/fsharp/CompilerConfig.fs | 6 +++--- src/fsharp/CompilerConfig.fsi | 6 +++--- src/fsharp/OptimizeInputs.fs | 6 +++--- src/fsharp/Optimizer.fs | 8 ++++---- src/fsharp/Optimizer.fsi | 2 +- src/fsharp/fsi/FSIstrings.txt | 2 +- src/fsharp/fsi/fsi.fs | 8 ++++---- src/fsharp/fsi/xlf/FSIstrings.txt.cs.xlf | 6 +++--- src/fsharp/fsi/xlf/FSIstrings.txt.de.xlf | 6 +++--- src/fsharp/fsi/xlf/FSIstrings.txt.es.xlf | 6 +++--- src/fsharp/fsi/xlf/FSIstrings.txt.fr.xlf | 6 +++--- src/fsharp/fsi/xlf/FSIstrings.txt.it.xlf | 6 +++--- src/fsharp/fsi/xlf/FSIstrings.txt.ja.xlf | 6 +++--- src/fsharp/fsi/xlf/FSIstrings.txt.ko.xlf | 6 +++--- src/fsharp/fsi/xlf/FSIstrings.txt.pl.xlf | 6 +++--- src/fsharp/fsi/xlf/FSIstrings.txt.pt-BR.xlf | 6 +++--- src/fsharp/fsi/xlf/FSIstrings.txt.ru.xlf | 6 +++--- src/fsharp/fsi/xlf/FSIstrings.txt.tr.xlf | 6 +++--- src/fsharp/fsi/xlf/FSIstrings.txt.zh-Hans.xlf | 6 +++--- src/fsharp/fsi/xlf/FSIstrings.txt.zh-Hant.xlf | 6 +++--- .../CompilerOptions/fsi/exename/help40.437.1033.bsl | 3 ++- .../CompilerOptions/fsi/help/help40-nologo.437.1033.bsl | 3 ++- .../Source/CompilerOptions/fsi/help/help40.437.1033.bsl | 3 ++- tests/fsharpqa/Source/EntryPoint/env.lst | 4 ++-- 24 files changed, 66 insertions(+), 63 deletions(-) diff --git a/src/fsharp/CompilerConfig.fs b/src/fsharp/CompilerConfig.fs index 77701b70341..d94e6464cf0 100644 --- a/src/fsharp/CompilerConfig.fs +++ b/src/fsharp/CompilerConfig.fs @@ -481,7 +481,7 @@ type TcConfigBuilder = mutable fxResolver: FxResolver option // Is F# Interactive using multi-assembly emit? - mutable fsiSingleAssemblyRefEmit: bool + mutable fsiSingleRefEmitAssembly: bool /// specify the error range for FxResolver rangeForErrors: range @@ -663,7 +663,7 @@ type TcConfigBuilder = shadowCopyReferences = false useSdkRefs = true fxResolver = None - fsiSingleAssemblyRefEmit = false + fsiSingleRefEmitAssembly = false internalTestSpanStackReferring = false noConditionalErasure = false pathMap = PathMap.empty @@ -925,7 +925,7 @@ type TcConfig private (data: TcConfigBuilder, validate: bool) = #endif None, data.legacyReferenceResolver.Impl.HighestInstalledNetFrameworkVersion() - member _.fsiSingleAssemblyRefEmit = data.fsiSingleAssemblyRefEmit + member _.fsiSingleRefEmitAssembly = data.fsiSingleRefEmitAssembly 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 b5873647ef2..09db749761a 100644 --- a/src/fsharp/CompilerConfig.fsi +++ b/src/fsharp/CompilerConfig.fsi @@ -272,7 +272,7 @@ type TcConfigBuilder = mutable shadowCopyReferences: bool mutable useSdkRefs: bool mutable fxResolver: FxResolver option - mutable fsiSingleAssemblyRefEmit: bool + mutable fsiSingleRefEmitAssembly: bool rangeForErrors: range sdkDirOverride: string option @@ -459,8 +459,8 @@ type TcConfig = member isInteractive: bool member isInvalidationSupported: bool - /// Indicates if F# Interactive is using single-assembly emit where internals are available. - member fsiSingleAssemblyRefEmit: bool + /// Indicates if F# Interactive is using single-assembly emit via Reflection.Emit, where internals are available. + member fsiSingleRefEmitAssembly: bool member xmlDocInfoLoader: IXmlDocumentationInfoLoader option diff --git a/src/fsharp/OptimizeInputs.fs b/src/fsharp/OptimizeInputs.fs index 051432f854f..9db75230375 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, tcConfig.fsiSingleAssemblyRefEmit, + optEnvFirstLoop, isIncrementalFragment, tcConfig.fsiSingleRefEmitAssembly, 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, tcConfig.fsiSingleAssemblyRefEmit, + optEnvExtraLoop, isIncrementalFragment, tcConfig.fsiSingleRefEmitAssembly, 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.fsiSingleAssemblyRefEmit, tcConfig.emitTailcalls, hidden, implFile) + isIncrementalFragment, tcConfig.fsiSingleRefEmitAssembly, tcConfig.emitTailcalls, hidden, implFile) //PrintWholeAssemblyImplementation tcConfig outfile "post-rec-opt" implFile implFile, optEnvFinalSimplify diff --git a/src/fsharp/Optimizer.fs b/src/fsharp/Optimizer.fs index a393e676873..e18d99e3472 100644 --- a/src/fsharp/Optimizer.fs +++ b/src/fsharp/Optimizer.fs @@ -3892,7 +3892,7 @@ and OptimizeModuleDefs cenv (env, bindInfosColl) defs = let defs, minfos = List.unzip defs (defs, UnionOptimizationInfos minfos), (env, bindInfosColl) -and OptimizeImplFileInternal cenv env isIncrementalFragment fsiSingleAssemblyRefEmit hidden (TImplFile (qname, pragmas, mexpr, hasExplicitEntryPoint, isScript, anonRecdTypes)) = +and OptimizeImplFileInternal cenv env isIncrementalFragment fsiSingleRefEmitAssembly hidden (TImplFile (qname, pragmas, mexpr, hasExplicitEntryPoint, isScript, anonRecdTypes)) = let env, mexprR, minfo = match mexpr with // FSI compiles everything as if you're typing incrementally into one module. @@ -3903,7 +3903,7 @@ and OptimizeImplFileInternal cenv env isIncrementalFragment fsiSingleAssemblyRef | ModuleOrNamespaceExprWithSig(mty, def, m) when isIncrementalFragment -> let (def, minfo), (_env, _bindInfosColl) = OptimizeModuleDef cenv (env, []) def let minfo = minfo |> AbstractLazyModulInfoByHiding false hidden - let hidden = if fsiSingleAssemblyRefEmit then ComputeImplementationHidingInfoAtAssemblyBoundary def hidden else hidden + let hidden = if fsiSingleRefEmitAssembly then ComputeImplementationHidingInfoAtAssemblyBoundary def hidden else hidden let minfo = AbstractLazyModulInfoByHiding true hidden minfo let env = BindValsInModuleOrNamespace cenv minfo env env, ModuleOrNamespaceExprWithSig(mty, def, m), minfo @@ -3922,7 +3922,7 @@ and OptimizeImplFileInternal cenv env isIncrementalFragment fsiSingleAssemblyRef env, TImplFile (qname, pragmas, mexprR, hasExplicitEntryPoint, isScript, anonRecdTypes), minfo, hidden /// Entry point -let OptimizeImplFile (settings, ccu, tcGlobals, tcVal, importMap, optEnv, isIncrementalFragment, fsiSingleAssemblyRefEmit, emitTailcalls, hidden, mimpls) = +let OptimizeImplFile (settings, ccu, tcGlobals, tcVal, importMap, optEnv, isIncrementalFragment, fsiSingleRefEmitAssembly, emitTailcalls, hidden, mimpls) = let cenv = { settings=settings scope=ccu @@ -3936,7 +3936,7 @@ let OptimizeImplFile (settings, ccu, tcGlobals, tcVal, importMap, optEnv, isIncr stackGuard = StackGuard(OptimizerStackGuardDepth) } - let env, _, _, _ as results = OptimizeImplFileInternal cenv optEnv isIncrementalFragment fsiSingleAssemblyRefEmit hidden mimpls + let env, _, _, _ as results = OptimizeImplFileInternal cenv optEnv isIncrementalFragment fsiSingleRefEmitAssembly 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 2f1e32e9673..cf93c1d4f5e 100644 --- a/src/fsharp/Optimizer.fsi +++ b/src/fsharp/Optimizer.fsi @@ -74,7 +74,7 @@ val internal OptimizeImplFile: Import.ImportMap * IncrementalOptimizationEnv * isIncrementalFragment: bool * - fsiSingleAssemblyRefEmit: bool * + fsiSingleRefEmitAssembly: bool * emitTailcalls: bool * SignatureHidingInfo * TypedImplFile diff --git a/src/fsharp/fsi/FSIstrings.txt b/src/fsharp/fsi/FSIstrings.txt index 9a6fc6de200..7373329983c 100644 --- a/src/fsharp/fsi/FSIstrings.txt +++ b/src/fsharp/fsi/FSIstrings.txt @@ -54,5 +54,5 @@ 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" -fsiUseSingleDynamicAssembly,"Use a single dynamic assembly" +fsiUseSingleRefEmitAssembly,"Use a single dynamic assembly via reflection emit" 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 '--refemit' option." \ No newline at end of file diff --git a/src/fsharp/fsi/fsi.fs b/src/fsharp/fsi/fsi.fs index ce04aab5dad..aa7cd8c8e39 100644 --- a/src/fsharp/fsi/fsi.fs +++ b/src/fsharp/fsi/fsi.fs @@ -948,7 +948,7 @@ type internal FsiCommandLineOptions(fsi: FsiEvaluationSessionHostConfig, 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("refemit", tagNone, OptionSwitch(fun flag -> tcConfigB.fsiSingleAssemblyRefEmit <- flag = OptionSwitch.On), None, Some(FSIstrings.SR.fsiUseSingleDynamicAssembly())) + CompilerOption("refemit", tagNone, OptionSwitch(fun flag -> tcConfigB.fsiSingleRefEmitAssembly <- flag = OptionSwitch.On), None, Some(FSIstrings.SR.fsiUseSingleRefEmitAssembly())) ]); ] @@ -1328,7 +1328,7 @@ type internal FsiDynamicCompiler let valuePrinter = FsiValuePrinter(fsi, outWriter) let builders = - if tcConfigB.fsiSingleAssemblyRefEmit then + if tcConfigB.fsiSingleRefEmitAssembly then let assemBuilder, moduleBuilder = mkDynamicAssemblyAndModule (dynamicCcuName, tcConfigB.optSettings.LocalOptimizationsEnabled, generateDebugInfo, fsiCollectible) dynamicAssemblies.Add(assemBuilder) Some (assemBuilder, moduleBuilder) @@ -2063,7 +2063,7 @@ type internal FsiDynamicCompiler let optEnv0 = GetInitialOptimizationEnv (tcImports, tcGlobals) let emEnv0 = - if tcConfigB.fsiSingleAssemblyRefEmit then + if tcConfigB.fsiSingleRefEmitAssembly then let cenv = { ilg = ilGlobals; emitTailcalls = tcConfig.emitTailcalls; generatePdb = generateDebugInfo; resolveAssemblyRef=resolveAssemblyRef; tryFindSysILTypeRef=tcGlobals.TryFindSysILTypeRef } let emEnv = ILDynamicAssemblyWriter.emEnv0 SingleDynamicAssembly (cenv, emEnv) @@ -3177,7 +3177,7 @@ type FsiEvaluationSession (fsi: FsiEvaluationSessionHostConfig, argv:string[], i // Preset: --refemit+ on .NET Framework do if not isRunningOnCoreClr then - tcConfigB.fsiSingleAssemblyRefEmit <- true + tcConfigB.fsiSingleRefEmitAssembly <- true // Preset: --optimize+ -g --tailcalls+ (see 4505) do SetOptimizeSwitch tcConfigB OptionSwitch.On diff --git a/src/fsharp/fsi/xlf/FSIstrings.txt.cs.xlf b/src/fsharp/fsi/xlf/FSIstrings.txt.cs.xlf index f06f5428e03..9e15902cd6e 100644 --- a/src/fsharp/fsi/xlf/FSIstrings.txt.cs.xlf +++ b/src/fsharp/fsi/xlf/FSIstrings.txt.cs.xlf @@ -22,9 +22,9 @@ 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. - - Use a single dynamic assembly - Use a single dynamic assembly + + Use a single dynamic assembly via reflection emit + Use a single dynamic assembly via reflection emit diff --git a/src/fsharp/fsi/xlf/FSIstrings.txt.de.xlf b/src/fsharp/fsi/xlf/FSIstrings.txt.de.xlf index eb0afa58a10..76e5708bd43 100644 --- a/src/fsharp/fsi/xlf/FSIstrings.txt.de.xlf +++ b/src/fsharp/fsi/xlf/FSIstrings.txt.de.xlf @@ -22,9 +22,9 @@ Fehler beim Vorgang. Der Fehlertext wurde im Fehlerstream ausgegeben. Verwenden Sie "EvalInteractionNonThrowing", "EvalScriptNonThrowing" oder "EvalExpressionNonThrowing", um die entsprechende FSharpDiagnostic zurückzugeben. - - Use a single dynamic assembly - Use a single dynamic assembly + + Use a single dynamic assembly via reflection emit + Use a single dynamic assembly via reflection emit diff --git a/src/fsharp/fsi/xlf/FSIstrings.txt.es.xlf b/src/fsharp/fsi/xlf/FSIstrings.txt.es.xlf index 6a74ea5376b..02157fb6572 100644 --- a/src/fsharp/fsi/xlf/FSIstrings.txt.es.xlf +++ b/src/fsharp/fsi/xlf/FSIstrings.txt.es.xlf @@ -22,9 +22,9 @@ 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 - - Use a single dynamic assembly - Use a single dynamic assembly + + Use a single dynamic assembly via reflection emit + Use a single dynamic assembly via reflection emit diff --git a/src/fsharp/fsi/xlf/FSIstrings.txt.fr.xlf b/src/fsharp/fsi/xlf/FSIstrings.txt.fr.xlf index 97d1c683673..50b01b1cf6a 100644 --- a/src/fsharp/fsi/xlf/FSIstrings.txt.fr.xlf +++ b/src/fsharp/fsi/xlf/FSIstrings.txt.fr.xlf @@ -22,9 +22,9 @@ É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 - - Use a single dynamic assembly - Use a single dynamic assembly + + Use a single dynamic assembly via reflection emit + Use a single dynamic assembly via reflection emit diff --git a/src/fsharp/fsi/xlf/FSIstrings.txt.it.xlf b/src/fsharp/fsi/xlf/FSIstrings.txt.it.xlf index 2adf812e28f..ea20e2a7175 100644 --- a/src/fsharp/fsi/xlf/FSIstrings.txt.it.xlf +++ b/src/fsharp/fsi/xlf/FSIstrings.txt.it.xlf @@ -22,9 +22,9 @@ 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 - - Use a single dynamic assembly - Use a single dynamic assembly + + Use a single dynamic assembly via reflection emit + Use a single dynamic assembly via reflection emit diff --git a/src/fsharp/fsi/xlf/FSIstrings.txt.ja.xlf b/src/fsharp/fsi/xlf/FSIstrings.txt.ja.xlf index eb7db609b89..3c588d19e36 100644 --- a/src/fsharp/fsi/xlf/FSIstrings.txt.ja.xlf +++ b/src/fsharp/fsi/xlf/FSIstrings.txt.ja.xlf @@ -22,9 +22,9 @@ 操作に失敗しました。エラー テキストがエラー ストリームに出力されました。対応する FSharpDiagnostic を戻すには、EvalInteractionNonThrowing、EvalScriptNonThrowing、または EvalExpressionNonThrowing を使用します - - Use a single dynamic assembly - Use a single dynamic assembly + + Use a single dynamic assembly via reflection emit + Use a single dynamic assembly via reflection emit diff --git a/src/fsharp/fsi/xlf/FSIstrings.txt.ko.xlf b/src/fsharp/fsi/xlf/FSIstrings.txt.ko.xlf index 84e78be078c..ef736bb6d15 100644 --- a/src/fsharp/fsi/xlf/FSIstrings.txt.ko.xlf +++ b/src/fsharp/fsi/xlf/FSIstrings.txt.ko.xlf @@ -22,9 +22,9 @@ 작업이 실패했습니다. 오류 텍스트가 오류 스트림에 출력되었습니다. 해당 FSharpDiagnostic을 반환하려면 EvalInteractionNonThrowing, EvalScriptNonThrowing 또는 EvalExpressionNonThrowing을 사용하세요. - - Use a single dynamic assembly - Use a single dynamic assembly + + Use a single dynamic assembly via reflection emit + Use a single dynamic assembly via reflection emit diff --git a/src/fsharp/fsi/xlf/FSIstrings.txt.pl.xlf b/src/fsharp/fsi/xlf/FSIstrings.txt.pl.xlf index 6203f8545d3..c049827a9ce 100644 --- a/src/fsharp/fsi/xlf/FSIstrings.txt.pl.xlf +++ b/src/fsharp/fsi/xlf/FSIstrings.txt.pl.xlf @@ -22,9 +22,9 @@ 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 - - Use a single dynamic assembly - Use a single dynamic assembly + + Use a single dynamic assembly via reflection emit + Use a single dynamic assembly via reflection emit diff --git a/src/fsharp/fsi/xlf/FSIstrings.txt.pt-BR.xlf b/src/fsharp/fsi/xlf/FSIstrings.txt.pt-BR.xlf index 60420093264..d43a3330148 100644 --- a/src/fsharp/fsi/xlf/FSIstrings.txt.pt-BR.xlf +++ b/src/fsharp/fsi/xlf/FSIstrings.txt.pt-BR.xlf @@ -22,9 +22,9 @@ Falha na operação. O texto do erro foi impresso no fluxo de erros. Para retornar o FSharpDiagnostic correspondente, use EvalInteractionNonThrowing, EvalScriptNonThrowing ou EvalExpressionNonThrowing - - Use a single dynamic assembly - Use a single dynamic assembly + + Use a single dynamic assembly via reflection emit + Use a single dynamic assembly via reflection emit diff --git a/src/fsharp/fsi/xlf/FSIstrings.txt.ru.xlf b/src/fsharp/fsi/xlf/FSIstrings.txt.ru.xlf index ffeeb0f5345..dd66da8cc0c 100644 --- a/src/fsharp/fsi/xlf/FSIstrings.txt.ru.xlf +++ b/src/fsharp/fsi/xlf/FSIstrings.txt.ru.xlf @@ -22,9 +22,9 @@ Не удалось выполнить операцию. Текст ошибки был выведен в потоке ошибок. Чтобы вернуть соответствующие сведения FSharpDiagnostic, используйте EvalInteractionNonThrowing, EvalScriptNonThrowing или EvalExpressionNonThrowing - - Use a single dynamic assembly - Use a single dynamic assembly + + Use a single dynamic assembly via reflection emit + Use a single dynamic assembly via reflection emit diff --git a/src/fsharp/fsi/xlf/FSIstrings.txt.tr.xlf b/src/fsharp/fsi/xlf/FSIstrings.txt.tr.xlf index 155be6376d8..63052ed97e1 100644 --- a/src/fsharp/fsi/xlf/FSIstrings.txt.tr.xlf +++ b/src/fsharp/fsi/xlf/FSIstrings.txt.tr.xlf @@ -22,9 +22,9 @@ İş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 - - Use a single dynamic assembly - Use a single dynamic assembly + + Use a single dynamic assembly via reflection emit + Use a single dynamic assembly via reflection emit diff --git a/src/fsharp/fsi/xlf/FSIstrings.txt.zh-Hans.xlf b/src/fsharp/fsi/xlf/FSIstrings.txt.zh-Hans.xlf index 7347bc978bc..42dd33727c4 100644 --- a/src/fsharp/fsi/xlf/FSIstrings.txt.zh-Hans.xlf +++ b/src/fsharp/fsi/xlf/FSIstrings.txt.zh-Hans.xlf @@ -22,9 +22,9 @@ 操作失败。错误文本已在错误流中打印。若要返回相应的 FSharpDiagnostic,请使用 EvalInteractionNonThrowing、EvalScriptNonThrowing 或 EvalExpressionNonThrowing - - Use a single dynamic assembly - Use a single dynamic assembly + + Use a single dynamic assembly via reflection emit + Use a single dynamic assembly via reflection emit diff --git a/src/fsharp/fsi/xlf/FSIstrings.txt.zh-Hant.xlf b/src/fsharp/fsi/xlf/FSIstrings.txt.zh-Hant.xlf index 9699f07f9d4..661e08d980e 100644 --- a/src/fsharp/fsi/xlf/FSIstrings.txt.zh-Hant.xlf +++ b/src/fsharp/fsi/xlf/FSIstrings.txt.zh-Hant.xlf @@ -22,9 +22,9 @@ 作業失敗。錯誤文字已列印在錯誤串流中。若要傳回相對應的 FSharpDiagnostic,請使用 EvalInteractionNonThrowing、EvalScriptNonThrowing 或 EvalExpressionNonThrowing - - Use a single dynamic assembly - Use a single dynamic assembly + + Use a single dynamic assembly via reflection emit + Use a single dynamic assembly via reflection emit 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 a601b4f8965..5f2d3eb7f5f 100644 --- a/tests/fsharpqa/Source/CompilerOptions/fsi/exename/help40.437.1033.bsl +++ b/tests/fsharpqa/Source/CompilerOptions/fsi/exename/help40.437.1033.bsl @@ -103,4 +103,5 @@ Usage: fsharpi [script.fsx []] --quotations-debug[+|-] Emit debug information in quotations --shadowcopyreferences[+|-] Prevents references from being locked by the F# Interactive process ---dynamicassembly[+|-] Use a single dynamic assembly +--refemit[+|-] Use a single dynamic assembly via + reflection emit \ 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 d9190df7445..3ca9af8c08b 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,4 +103,5 @@ Usage: fsiAnyCpu [script.fsx []] --quotations-debug[+|-] Emit debug information in quotations --shadowcopyreferences[+|-] Prevents references from being locked by the F# Interactive process ---dynamicassembly[+|-] Use a single dynamic assembly +--refemit[+|-] Use a single dynamic assembly via + reflection emit \ 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 73300ebb3db..9fc0193a199 100644 --- a/tests/fsharpqa/Source/CompilerOptions/fsi/help/help40.437.1033.bsl +++ b/tests/fsharpqa/Source/CompilerOptions/fsi/help/help40.437.1033.bsl @@ -105,4 +105,5 @@ Usage: fsiAnyCpu [script.fsx []] --quotations-debug[+|-] Emit debug information in quotations --shadowcopyreferences[+|-] Prevents references from being locked by the F# Interactive process ---dynamicassembly[+|-] Use a single dynamic assembly +--refemit[+|-] Use a single dynamic assembly via + reflection emit \ No newline at end of file diff --git a/tests/fsharpqa/Source/EntryPoint/env.lst b/tests/fsharpqa/Source/EntryPoint/env.lst index 82f1d126cfa..bf20c429a7d 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 SCFLAGS="--dynamicassembly" FSIMODE=PIPE COMPILE_ONLY=1 # entrypointandFSI.fs -NoMT SOURCE=entrypointandFSI02.fsx SCFLAGS="--dynamicassembly" FSIMODE=EXEC COMPILE_ONLY=1 # entrypointandFSI02.fsx +NoMT SOURCE=entrypointandFSI.fs SCFLAGS="--refemit" FSIMODE=PIPE COMPILE_ONLY=1 # entrypointandFSI.fs +NoMT SOURCE=entrypointandFSI02.fsx SCFLAGS="--refemit" FSIMODE=EXEC COMPILE_ONLY=1 # entrypointandFSI02.fsx SOURCE=E_CompilingToALibrary01.fs SCFLAGS="--test:ErrorRanges --target:library" # E_CompilingToALibrary01.fs From 5b53c14158a1c25d11e218cb64af3784eea6cc63 Mon Sep 17 00:00:00 2001 From: Don Syme Date: Tue, 15 Feb 2022 01:51:24 +0000 Subject: [PATCH 12/17] improve line number for warning --- src/fsharp/fsi/fsi.fs | 75 ++++++++++--------- ....output.test.default.stderr.refemitoff.bsl | 4 +- 2 files changed, 41 insertions(+), 38 deletions(-) diff --git a/src/fsharp/fsi/fsi.fs b/src/fsharp/fsi/fsi.fs index aa7cd8c8e39..0ed2ddad038 100644 --- a/src/fsharp/fsi/fsi.fs +++ b/src/fsharp/fsi/fsi.fs @@ -405,7 +405,7 @@ type ILMultiInMemoryAssemblyEmitEnv( fref.DeclaringTypeRef.Scope.IsLocalRef && internalFields.Contains(fref) type ILAssemblyEmitEnv = - | SingleDynamicAssembly of ILDynamicAssemblyWriter.cenv * ILDynamicAssemblyEmitEnv + | SingleRefEmitAssembly of ILDynamicAssemblyWriter.cenv * ILDynamicAssemblyEmitEnv | MultipleInMemoryAssemblies of ILMultiInMemoryAssemblyEmitEnv type internal FsiValuePrinterMode = @@ -580,7 +580,7 @@ type internal FsiValuePrinter(fsi: FsiEvaluationSessionHostConfig, outWriter: Te /// Get the evaluation context used when inverting the storage mapping of the ILDynamicAssemblyWriter. member _.GetEvaluationContext (emEnv: ILAssemblyEmitEnv) = match emEnv with - | SingleDynamicAssembly (cenv, emEnv) -> + | SingleRefEmitAssembly (cenv, emEnv) -> { LookupTypeRef = LookupTypeRef cenv emEnv LookupType = LookupType cenv emEnv } | MultipleInMemoryAssemblies emEnv -> @@ -1335,7 +1335,7 @@ type internal FsiDynamicCompiler else None - let rangeStdin = rangeN stdinMockFilename 0 + let rangeStdin0 = rangeN stdinMockFilename 0 //let _writer = moduleBuilder.GetSymWriter() @@ -1491,13 +1491,13 @@ type internal FsiDynamicCompiler let emEnv, execs = match emEnv with - | SingleDynamicAssembly (cenv, emEnv) -> + | SingleRefEmitAssembly (cenv, emEnv) -> let assemblyBuilder, moduleBuilder = builders.Value let emEnv, execs = EmitDynamicAssemblyFragment (ilGlobals, tcConfig.emitTailcalls, emEnv, assemblyBuilder, moduleBuilder, ilxMainModule, generateDebugInfo, cenv.resolveAssemblyRef, tcGlobals.TryFindSysILTypeRef) - SingleDynamicAssembly (cenv, emEnv), execs + SingleRefEmitAssembly (cenv, emEnv), execs | MultipleInMemoryAssemblies emEnv -> @@ -1509,7 +1509,7 @@ type internal FsiDynamicCompiler // Explicitly register the resources with the QuotationPickler module match emEnv with - | SingleDynamicAssembly (cenv, emEnv) -> + | SingleRefEmitAssembly (cenv, emEnv) -> let assemblyBuilder, _moduleBuilder = builders.Value @@ -1572,10 +1572,12 @@ type internal FsiDynamicCompiler 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) @@ -1602,14 +1604,12 @@ type internal FsiDynamicCompiler 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 let tcConfig = TcConfig.Create(tcConfigB,validate=false) - let m = inputs |> List.tryLast |> function None -> rangeStdin | Some i -> i.Range - // 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, topCustomAttrs, declaredImpls, tcEnvAtEndOfLastInput = @@ -1632,9 +1632,9 @@ type internal FsiDynamicCompiler 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 @@ -1735,7 +1735,7 @@ type internal FsiDynamicCompiler let ilTys = convertReflectionTypeToILType reflectionTy - // Rewrite references to dynamic assemblies to dynamicCcuName + // Rewrite references to dynamic .NET assemblies back to dynamicCcuName let ilTys = ilTys |> List.map (fun ilTy -> match istate.emEnv with @@ -1752,27 +1752,28 @@ type internal FsiDynamicCompiler 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 isIncrementalFragment = false - let istate,_,_ = ProcessInputs (ctok, errorLogger, istate, inputs, true, isIncrementalFragment, false, prefix) + 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 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 (rangeStdin,prefixPath),[],[],[impl],(isLastCompiland, isExe) )) + 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) + 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 @@ -1978,7 +1979,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) @@ -2028,9 +2029,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) @@ -2045,7 +2047,6 @@ type internal FsiDynamicCompiler let isIncrementalFragment = true let showTypes = false let declaredImpls = [impl] - let m = rangeStdin 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, m) let newState = { istate with tcState = istate.tcState.NextStateAfterIncrementalFragment tcEnvAtEndOfLastInput } @@ -2066,15 +2067,15 @@ type internal FsiDynamicCompiler if tcConfigB.fsiSingleRefEmitAssembly then let cenv = { ilg = ilGlobals; emitTailcalls = tcConfig.emitTailcalls; generatePdb = generateDebugInfo; resolveAssemblyRef=resolveAssemblyRef; tryFindSysILTypeRef=tcGlobals.TryFindSysILTypeRef } let emEnv = ILDynamicAssemblyWriter.emEnv0 - SingleDynamicAssembly (cenv, emEnv) + SingleRefEmitAssembly (cenv, emEnv) else let emEnv = ILMultiInMemoryAssemblyEmitEnv(ilGlobals, resolveAssemblyRef, dynamicCcuName) MultipleInMemoryAssemblies emEnv - let tcEnv, openDecls0 = GetInitialTcEnv (dynamicCcuName, rangeStdin, tcConfig, tcImports, tcGlobals) + let tcEnv, openDecls0 = GetInitialTcEnv (dynamicCcuName, rangeStdin0, tcConfig, tcImports, tcGlobals) let ccuName = dynamicCcuName - let tcState = GetInitialTcState (rangeStdin, ccuName, tcConfig, tcGlobals, tcImports, niceNameGen, tcEnv, openDecls0) + let tcState = GetInitialTcState (rangeStdin0, ccuName, tcConfig, tcGlobals, tcImports, niceNameGen, tcEnv, openDecls0) let ilxGenerator = CreateIlxAssemblyGenerator (tcConfig, tcImports, tcGlobals, (LightweightTcValForUsingInBuildMethodCall tcGlobals), tcState.Ccu) @@ -2357,13 +2358,13 @@ 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) @@ -2507,7 +2508,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) @@ -2881,7 +2882,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 @@ -2902,7 +2903,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) @@ -3049,7 +3050,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 diff --git a/tests/fsharp/core/printing/z.output.test.default.stderr.refemitoff.bsl b/tests/fsharp/core/printing/z.output.test.default.stderr.refemitoff.bsl index 547f45b2909..495cab7fe9d 100644 --- a/tests/fsharp/core/printing/z.output.test.default.stderr.refemitoff.bsl +++ b/tests/fsharp/core/printing/z.output.test.default.stderr.refemitoff.bsl @@ -335,6 +335,8 @@ stdin(838,6): error FS1210: Active pattern '|A|B|' has a result type containing 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(0,1): 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 '--refemit' option. +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 '--refemit' option. From f0c6dbf0e5a0ef19f964521476ebf57357c79ab5 Mon Sep 17 00:00:00 2001 From: Don Syme Date: Tue, 15 Feb 2022 13:00:44 +0000 Subject: [PATCH 13/17] update names and add doc --- docs/debug-emit.md | 4 - docs/fsi-emit.md | 84 +++++++++++++++++++ src/fsharp/fsi/FSIstrings.txt | 5 +- src/fsharp/fsi/fsi.fs | 9 +- src/fsharp/fsi/xlf/FSIstrings.txt.cs.xlf | 11 ++- src/fsharp/fsi/xlf/FSIstrings.txt.de.xlf | 11 ++- src/fsharp/fsi/xlf/FSIstrings.txt.es.xlf | 11 ++- src/fsharp/fsi/xlf/FSIstrings.txt.fr.xlf | 11 ++- src/fsharp/fsi/xlf/FSIstrings.txt.it.xlf | 11 ++- src/fsharp/fsi/xlf/FSIstrings.txt.ja.xlf | 11 ++- src/fsharp/fsi/xlf/FSIstrings.txt.ko.xlf | 11 ++- src/fsharp/fsi/xlf/FSIstrings.txt.pl.xlf | 11 ++- src/fsharp/fsi/xlf/FSIstrings.txt.pt-BR.xlf | 11 ++- src/fsharp/fsi/xlf/FSIstrings.txt.ru.xlf | 11 ++- src/fsharp/fsi/xlf/FSIstrings.txt.tr.xlf | 11 ++- src/fsharp/fsi/xlf/FSIstrings.txt.zh-Hans.xlf | 11 ++- src/fsharp/fsi/xlf/FSIstrings.txt.zh-Hant.xlf | 11 ++- tests/FSharp.Compiler.UnitTests/FsiTests.fs | 4 +- tests/fsharp/core/pinvoke/test.fsx | 2 +- ....output.test.default.stderr.refemitoff.bsl | 2 +- tests/fsharp/tests.fs | 16 ++-- .../fsi/exename/help40.437.1033.bsl | 2 +- .../fsi/help/help40-nologo.437.1033.bsl | 2 +- .../fsi/help/help40.437.1033.bsl | 2 +- tests/fsharpqa/Source/EntryPoint/env.lst | 4 +- 25 files changed, 215 insertions(+), 64 deletions(-) create mode 100644 docs/fsi-emit.md diff --git a/docs/debug-emit.md b/docs/debug-emit.md index 70477ded0b0..efb8a4aa5ca 100644 --- a/docs/debug-emit.md +++ b/docs/debug-emit.md @@ -480,7 +480,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 00000000000..ef434f6c3d3 --- /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 --legacyemit` that turns on or off the use of Reflection Emit into a single-dynamic-assembly generation. THis is on by default for .NET Framework for compat reasons, and also there is no problem with generating debug information for refemit there. + +## 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 `--legacyemit` is enabled, 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/fsi/FSIstrings.txt b/src/fsharp/fsi/FSIstrings.txt index 7373329983c..bf88ff6dbdd 100644 --- a/src/fsharp/fsi/FSIstrings.txt +++ b/src/fsharp/fsi/FSIstrings.txt @@ -54,5 +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" -fsiUseSingleRefEmitAssembly,"Use a single dynamic assembly via reflection emit" -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 '--refemit' option." \ No newline at end of file +fsiLegacyEmit,"Use a single dynamic assembly via reflection emit" +fsiLegacyEmitOnByDefault,"Use a single dynamic assembly via reflection emit (on 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 '--legacyemit' option." \ No newline at end of file diff --git a/src/fsharp/fsi/fsi.fs b/src/fsharp/fsi/fsi.fs index 0ed2ddad038..106fba01b26 100644 --- a/src/fsharp/fsi/fsi.fs +++ b/src/fsharp/fsi/fsi.fs @@ -948,7 +948,12 @@ type internal FsiCommandLineOptions(fsi: FsiEvaluationSessionHostConfig, 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("refemit", tagNone, OptionSwitch(fun flag -> tcConfigB.fsiSingleRefEmitAssembly <- flag = OptionSwitch.On), None, Some(FSIstrings.SR.fsiUseSingleRefEmitAssembly())) +#if NETSTANDARD + CompilerOption("legacyemit", tagNone, OptionSwitch(fun flag -> tcConfigB.fsiSingleRefEmitAssembly <- flag = OptionSwitch.On), None, Some(FSIstrings.SR.fsiLegacyEmit())) +#endif +#if NETFX + CompilerOption("legacyemit", tagNone, OptionSwitch(fun flag -> tcConfigB.fsiSingleRefEmitAssembly <- flag = OptionSwitch.On), None, Some(FSIstrings.SR.fsiLegacyEmitOnByDefault())) +#endif ]); ] @@ -3176,7 +3181,7 @@ type FsiEvaluationSession (fsi: FsiEvaluationSessionHostConfig, argv:string[], i do if isRunningOnCoreClr then SetTargetProfile tcConfigB "netcore" // always assume System.Runtime codegen #endif - // Preset: --refemit+ on .NET Framework + // Preset: --legacyemit+ on .NET Framework do if not isRunningOnCoreClr then tcConfigB.fsiSingleRefEmitAssembly <- true diff --git a/src/fsharp/fsi/xlf/FSIstrings.txt.cs.xlf b/src/fsharp/fsi/xlf/FSIstrings.txt.cs.xlf index 9e15902cd6e..bd220e39da7 100644 --- a/src/fsharp/fsi/xlf/FSIstrings.txt.cs.xlf +++ b/src/fsharp/fsi/xlf/FSIstrings.txt.cs.xlf @@ -3,8 +3,8 @@ - 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 '--refemit' 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 '--refemit' 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 '--legacyemit' 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 '--legacyemit' option. @@ -12,6 +12,11 @@ Při vyhledávání balíčků zahrnout identifikátor zdroje balíčku + + Use a single dynamic assembly via reflection emit (on by default for .NET Framework) + Use a single dynamic assembly via reflection emit (on 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. @@ -22,7 +27,7 @@ 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. - + Use a single dynamic assembly via reflection emit Use a single dynamic assembly via reflection emit diff --git a/src/fsharp/fsi/xlf/FSIstrings.txt.de.xlf b/src/fsharp/fsi/xlf/FSIstrings.txt.de.xlf index 76e5708bd43..07da2217405 100644 --- a/src/fsharp/fsi/xlf/FSIstrings.txt.de.xlf +++ b/src/fsharp/fsi/xlf/FSIstrings.txt.de.xlf @@ -3,8 +3,8 @@ - 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 '--refemit' 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 '--refemit' 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 '--legacyemit' 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 '--legacyemit' option. @@ -12,6 +12,11 @@ URI der Paketquelle bei Suche nach Paketen einschließen + + Use a single dynamic assembly via reflection emit (on by default for .NET Framework) + Use a single dynamic assembly via reflection emit (on by default for .NET Framework) + + Operation could not be completed due to earlier error Der Vorgang konnte aufgrund eines vorherigen Fehlers nicht abgeschlossen werden. @@ -22,7 +27,7 @@ Fehler beim Vorgang. Der Fehlertext wurde im Fehlerstream ausgegeben. Verwenden Sie "EvalInteractionNonThrowing", "EvalScriptNonThrowing" oder "EvalExpressionNonThrowing", um die entsprechende FSharpDiagnostic zurückzugeben. - + Use a single dynamic assembly via reflection emit Use a single dynamic assembly via reflection emit diff --git a/src/fsharp/fsi/xlf/FSIstrings.txt.es.xlf b/src/fsharp/fsi/xlf/FSIstrings.txt.es.xlf index 02157fb6572..4c6c7bde1d2 100644 --- a/src/fsharp/fsi/xlf/FSIstrings.txt.es.xlf +++ b/src/fsharp/fsi/xlf/FSIstrings.txt.es.xlf @@ -3,8 +3,8 @@ - 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 '--refemit' 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 '--refemit' 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 '--legacyemit' 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 '--legacyemit' option. @@ -12,6 +12,11 @@ Incluir el URI de origen del paquete al buscar paquetes + + Use a single dynamic assembly via reflection emit (on by default for .NET Framework) + Use a single dynamic assembly via reflection emit (on 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 @@ -22,7 +27,7 @@ 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 - + Use a single dynamic assembly via reflection emit Use a single dynamic assembly via reflection emit diff --git a/src/fsharp/fsi/xlf/FSIstrings.txt.fr.xlf b/src/fsharp/fsi/xlf/FSIstrings.txt.fr.xlf index 50b01b1cf6a..3ba9b1e081d 100644 --- a/src/fsharp/fsi/xlf/FSIstrings.txt.fr.xlf +++ b/src/fsharp/fsi/xlf/FSIstrings.txt.fr.xlf @@ -3,8 +3,8 @@ - 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 '--refemit' 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 '--refemit' 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 '--legacyemit' 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 '--legacyemit' option. @@ -12,6 +12,11 @@ Inclure l'URI de source de package au moment de la recherche des packages + + Use a single dynamic assembly via reflection emit (on by default for .NET Framework) + Use a single dynamic assembly via reflection emit (on 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 @@ -22,7 +27,7 @@ É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 - + Use a single dynamic assembly via reflection emit Use a single dynamic assembly via reflection emit diff --git a/src/fsharp/fsi/xlf/FSIstrings.txt.it.xlf b/src/fsharp/fsi/xlf/FSIstrings.txt.it.xlf index ea20e2a7175..c791635eb1f 100644 --- a/src/fsharp/fsi/xlf/FSIstrings.txt.it.xlf +++ b/src/fsharp/fsi/xlf/FSIstrings.txt.it.xlf @@ -3,8 +3,8 @@ - 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 '--refemit' 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 '--refemit' 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 '--legacyemit' 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 '--legacyemit' option. @@ -12,6 +12,11 @@ Includi l'URI di origine pacchetti durante la ricerca di pacchetti + + Use a single dynamic assembly via reflection emit (on by default for .NET Framework) + Use a single dynamic assembly via reflection emit (on 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 @@ -22,7 +27,7 @@ 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 - + Use a single dynamic assembly via reflection emit Use a single dynamic assembly via reflection emit diff --git a/src/fsharp/fsi/xlf/FSIstrings.txt.ja.xlf b/src/fsharp/fsi/xlf/FSIstrings.txt.ja.xlf index 3c588d19e36..71b2b50e213 100644 --- a/src/fsharp/fsi/xlf/FSIstrings.txt.ja.xlf +++ b/src/fsharp/fsi/xlf/FSIstrings.txt.ja.xlf @@ -3,8 +3,8 @@ - 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 '--refemit' 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 '--refemit' 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 '--legacyemit' 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 '--legacyemit' option. @@ -12,6 +12,11 @@ パッケージの検索時にパッケージ ソースの URI を含める + + Use a single dynamic assembly via reflection emit (on by default for .NET Framework) + Use a single dynamic assembly via reflection emit (on by default for .NET Framework) + + Operation could not be completed due to earlier error 以前のエラーが原因で操作を完了できませんでした @@ -22,7 +27,7 @@ 操作に失敗しました。エラー テキストがエラー ストリームに出力されました。対応する FSharpDiagnostic を戻すには、EvalInteractionNonThrowing、EvalScriptNonThrowing、または EvalExpressionNonThrowing を使用します - + Use a single dynamic assembly via reflection emit Use a single dynamic assembly via reflection emit diff --git a/src/fsharp/fsi/xlf/FSIstrings.txt.ko.xlf b/src/fsharp/fsi/xlf/FSIstrings.txt.ko.xlf index ef736bb6d15..50649fde641 100644 --- a/src/fsharp/fsi/xlf/FSIstrings.txt.ko.xlf +++ b/src/fsharp/fsi/xlf/FSIstrings.txt.ko.xlf @@ -3,8 +3,8 @@ - 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 '--refemit' 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 '--refemit' 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 '--legacyemit' 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 '--legacyemit' option. @@ -12,6 +12,11 @@ 패키지를 검색할 때 패키지 원본 URI 포함 + + Use a single dynamic assembly via reflection emit (on by default for .NET Framework) + Use a single dynamic assembly via reflection emit (on by default for .NET Framework) + + Operation could not be completed due to earlier error 이전 오류로 인해 작업을 완료할 수 없습니다. @@ -22,7 +27,7 @@ 작업이 실패했습니다. 오류 텍스트가 오류 스트림에 출력되었습니다. 해당 FSharpDiagnostic을 반환하려면 EvalInteractionNonThrowing, EvalScriptNonThrowing 또는 EvalExpressionNonThrowing을 사용하세요. - + Use a single dynamic assembly via reflection emit Use a single dynamic assembly via reflection emit diff --git a/src/fsharp/fsi/xlf/FSIstrings.txt.pl.xlf b/src/fsharp/fsi/xlf/FSIstrings.txt.pl.xlf index c049827a9ce..7d738edfdfe 100644 --- a/src/fsharp/fsi/xlf/FSIstrings.txt.pl.xlf +++ b/src/fsharp/fsi/xlf/FSIstrings.txt.pl.xlf @@ -3,8 +3,8 @@ - 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 '--refemit' 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 '--refemit' 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 '--legacyemit' 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 '--legacyemit' option. @@ -12,6 +12,11 @@ Uwzględnij identyfikator URI źródła pakietów podczas wyszukiwania pakietów + + Use a single dynamic assembly via reflection emit (on by default for .NET Framework) + Use a single dynamic assembly via reflection emit (on 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 @@ -22,7 +27,7 @@ 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 - + Use a single dynamic assembly via reflection emit Use a single dynamic assembly via reflection emit diff --git a/src/fsharp/fsi/xlf/FSIstrings.txt.pt-BR.xlf b/src/fsharp/fsi/xlf/FSIstrings.txt.pt-BR.xlf index d43a3330148..7b4148ff060 100644 --- a/src/fsharp/fsi/xlf/FSIstrings.txt.pt-BR.xlf +++ b/src/fsharp/fsi/xlf/FSIstrings.txt.pt-BR.xlf @@ -3,8 +3,8 @@ - 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 '--refemit' 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 '--refemit' 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 '--legacyemit' 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 '--legacyemit' option. @@ -12,6 +12,11 @@ Incluir o URI de origem do pacote ao pesquisar pacotes + + Use a single dynamic assembly via reflection emit (on by default for .NET Framework) + Use a single dynamic assembly via reflection emit (on 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 @@ -22,7 +27,7 @@ Falha na operação. O texto do erro foi impresso no fluxo de erros. Para retornar o FSharpDiagnostic correspondente, use EvalInteractionNonThrowing, EvalScriptNonThrowing ou EvalExpressionNonThrowing - + Use a single dynamic assembly via reflection emit Use a single dynamic assembly via reflection emit diff --git a/src/fsharp/fsi/xlf/FSIstrings.txt.ru.xlf b/src/fsharp/fsi/xlf/FSIstrings.txt.ru.xlf index dd66da8cc0c..f6d6743aa77 100644 --- a/src/fsharp/fsi/xlf/FSIstrings.txt.ru.xlf +++ b/src/fsharp/fsi/xlf/FSIstrings.txt.ru.xlf @@ -3,8 +3,8 @@ - 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 '--refemit' 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 '--refemit' 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 '--legacyemit' 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 '--legacyemit' option. @@ -12,6 +12,11 @@ Включать исходный URI пакета при поиске пакетов + + Use a single dynamic assembly via reflection emit (on by default for .NET Framework) + Use a single dynamic assembly via reflection emit (on by default for .NET Framework) + + Operation could not be completed due to earlier error Операция не может быть завершена из-за предыдущей ошибки @@ -22,7 +27,7 @@ Не удалось выполнить операцию. Текст ошибки был выведен в потоке ошибок. Чтобы вернуть соответствующие сведения FSharpDiagnostic, используйте EvalInteractionNonThrowing, EvalScriptNonThrowing или EvalExpressionNonThrowing - + Use a single dynamic assembly via reflection emit Use a single dynamic assembly via reflection emit diff --git a/src/fsharp/fsi/xlf/FSIstrings.txt.tr.xlf b/src/fsharp/fsi/xlf/FSIstrings.txt.tr.xlf index 63052ed97e1..23b3870dbd9 100644 --- a/src/fsharp/fsi/xlf/FSIstrings.txt.tr.xlf +++ b/src/fsharp/fsi/xlf/FSIstrings.txt.tr.xlf @@ -3,8 +3,8 @@ - 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 '--refemit' 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 '--refemit' 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 '--legacyemit' 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 '--legacyemit' option. @@ -12,6 +12,11 @@ Paketler aranırken paket kaynağı URI'si ekleyin + + Use a single dynamic assembly via reflection emit (on by default for .NET Framework) + Use a single dynamic assembly via reflection emit (on by default for .NET Framework) + + Operation could not be completed due to earlier error Önceki hata nedeniyle işlem tamamlanamadı @@ -22,7 +27,7 @@ İş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 - + Use a single dynamic assembly via reflection emit Use a single dynamic assembly via reflection emit diff --git a/src/fsharp/fsi/xlf/FSIstrings.txt.zh-Hans.xlf b/src/fsharp/fsi/xlf/FSIstrings.txt.zh-Hans.xlf index 42dd33727c4..ece856bc3f1 100644 --- a/src/fsharp/fsi/xlf/FSIstrings.txt.zh-Hans.xlf +++ b/src/fsharp/fsi/xlf/FSIstrings.txt.zh-Hans.xlf @@ -3,8 +3,8 @@ - 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 '--refemit' 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 '--refemit' 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 '--legacyemit' 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 '--legacyemit' option. @@ -12,6 +12,11 @@ 搜索包时包含包源 uri + + Use a single dynamic assembly via reflection emit (on by default for .NET Framework) + Use a single dynamic assembly via reflection emit (on by default for .NET Framework) + + Operation could not be completed due to earlier error 由于早期错误,无法完成操作 @@ -22,7 +27,7 @@ 操作失败。错误文本已在错误流中打印。若要返回相应的 FSharpDiagnostic,请使用 EvalInteractionNonThrowing、EvalScriptNonThrowing 或 EvalExpressionNonThrowing - + Use a single dynamic assembly via reflection emit Use a single dynamic assembly via reflection emit diff --git a/src/fsharp/fsi/xlf/FSIstrings.txt.zh-Hant.xlf b/src/fsharp/fsi/xlf/FSIstrings.txt.zh-Hant.xlf index 661e08d980e..77281b0d7dd 100644 --- a/src/fsharp/fsi/xlf/FSIstrings.txt.zh-Hant.xlf +++ b/src/fsharp/fsi/xlf/FSIstrings.txt.zh-Hant.xlf @@ -3,8 +3,8 @@ - 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 '--refemit' 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 '--refemit' 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 '--legacyemit' 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 '--legacyemit' option. @@ -12,6 +12,11 @@ 搜尋套件時包含套件來源 URI + + Use a single dynamic assembly via reflection emit (on by default for .NET Framework) + Use a single dynamic assembly via reflection emit (on by default for .NET Framework) + + Operation could not be completed due to earlier error 因為先前發生錯誤,所以無法完成作業 @@ -22,7 +27,7 @@ 作業失敗。錯誤文字已列印在錯誤串流中。若要傳回相對應的 FSharpDiagnostic,請使用 EvalInteractionNonThrowing、EvalScriptNonThrowing 或 EvalExpressionNonThrowing - + Use a single dynamic assembly via reflection emit Use a single dynamic assembly via reflection emit diff --git a/tests/FSharp.Compiler.UnitTests/FsiTests.fs b/tests/FSharp.Compiler.UnitTests/FsiTests.fs index 92f53db7844..36637fddc69 100644 --- a/tests/FSharp.Compiler.UnitTests/FsiTests.fs +++ b/tests/FSharp.Compiler.UnitTests/FsiTests.fs @@ -18,7 +18,7 @@ module FsiTests = // Build command line arguments & start FSI session let argv = [| "C:\\fsi.exe" |] - let allArgs = Array.append argv [|"--noninteractive"; if useOneDynamicAssembly then "--refemit" else "--refemit-" |] + let allArgs = Array.append argv [|"--noninteractive"; if useOneDynamicAssembly then "--legacyemit" else "--legacyemit-" |] let fsiConfig = FsiEvaluationSession.GetDefaultConfiguration() FsiEvaluationSession.Create(fsiConfig, allArgs, inStream, new StreamWriter(outStream), new StreamWriter(errStream), collectible = true) @@ -479,7 +479,7 @@ module FsiTests = Assert.shouldBe typeof boundValue.Value.ReflectionType [] - let ``Creation of a bound value fails if the value contains types from a dynamic assembly using refemit`` () = + let ``Creation of a bound value fails if the value contains types from a dynamic assembly using legacyemit`` () = use fsiSession = createFsiSession true fsiSession.AddBoundValue("fsiSession", fsiSession) diff --git a/tests/fsharp/core/pinvoke/test.fsx b/tests/fsharp/core/pinvoke/test.fsx index 28257b02025..7f83b24fd41 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.refemitoff.bsl b/tests/fsharp/core/printing/z.output.test.default.stderr.refemitoff.bsl index 495cab7fe9d..84f79233082 100644 --- a/tests/fsharp/core/printing/z.output.test.default.stderr.refemitoff.bsl +++ b/tests/fsharp/core/printing/z.output.test.default.stderr.refemitoff.bsl @@ -338,5 +338,5 @@ 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 '--refemit' option. +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 '--legacyemit' option. diff --git a/tests/fsharp/tests.fs b/tests/fsharp/tests.fs index 9c7ac166aba..2f352fe88ed 100644 --- a/tests/fsharp/tests.fs +++ b/tests/fsharp/tests.fs @@ -1074,14 +1074,14 @@ module CoreTests = 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" - // For this, check both with and without refemit + // For this, check both with and without legacyemit [] - let ``printing-default-stdout-50 --langversion:5_0 --refemit+`` () = - printing "--langversion:5.0 --refemit+ --debug+ --optimize-" "z.output.test.default.stdout.50.refemit.txt" "z.output.test.default.stdout.50.refemit.bsl" "z.output.test.default.stderr.refemit.txt" "z.output.test.default.stderr.refemit.bsl" + let ``printing-default-stdout-50 --langversion:5_0 --legacyemit+`` () = + printing "--langversion:5.0 --legacyemit+ --debug+ --optimize-" "z.output.test.default.stdout.50.legacyemit.txt" "z.output.test.default.stdout.50.legacyemit.bsl" "z.output.test.default.stderr.legacyemit.txt" "z.output.test.default.stderr.legacyemit.bsl" [] - let ``printing-default-stdout-50 --langversion:5_0 --refemit-`` () = - printing "--langversion:5.0 --refemit- --debug+ --optimize-" "z.output.test.default.stdout.50.refemitoff.txt" "z.output.test.default.stdout.50.refemitoff.bsl" "z.output.test.default.stderr.refemitoff.txt" "z.output.test.default.stderr.refemitoff.bsl" + let ``printing-default-stdout-50 --langversion:5_0 --legacyemit-`` () = + printing "--langversion:5.0 --legacyemit- --debug+ --optimize-" "z.output.test.default.stdout.50.legacyemitoff.txt" "z.output.test.default.stdout.50.legacyemitoff.bsl" "z.output.test.default.stderr.legacyemitoff.txt" "z.output.test.default.stderr.legacyemitoff.bsl" [] let ``printing-1000-stdout-47 --langversion:4_7`` () = @@ -1108,12 +1108,12 @@ module CoreTests = 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-quiet-stdout --refemit+`` () = + let ``printing-quiet-stdout --legacyemit+`` () = 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-stdout --refemit-`` () = - printing "--quiet --refemit-" "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-stdout --legacyemit-`` () = + printing "--quiet --legacyemit-" "z.output.test.quiet.stdout.txt" "z.output.test.quiet.stdout.bsl" "z.output.test.quiet.stderr.txt" "z.output.test.quiet.stderr.bsl" 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 5f2d3eb7f5f..05814fdff31 100644 --- a/tests/fsharpqa/Source/CompilerOptions/fsi/exename/help40.437.1033.bsl +++ b/tests/fsharpqa/Source/CompilerOptions/fsi/exename/help40.437.1033.bsl @@ -103,5 +103,5 @@ Usage: fsharpi [script.fsx []] --quotations-debug[+|-] Emit debug information in quotations --shadowcopyreferences[+|-] Prevents references from being locked by the F# Interactive process ---refemit[+|-] Use a single dynamic assembly via +--legacyemit[+|-] Use a single dynamic assembly via reflection emit \ 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 3ca9af8c08b..17eeabb02e1 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,5 +103,5 @@ Usage: fsiAnyCpu [script.fsx []] --quotations-debug[+|-] Emit debug information in quotations --shadowcopyreferences[+|-] Prevents references from being locked by the F# Interactive process ---refemit[+|-] Use a single dynamic assembly via +--legacyemit[+|-] Use a single dynamic assembly via reflection emit \ 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 9fc0193a199..6bb459c0e7b 100644 --- a/tests/fsharpqa/Source/CompilerOptions/fsi/help/help40.437.1033.bsl +++ b/tests/fsharpqa/Source/CompilerOptions/fsi/help/help40.437.1033.bsl @@ -105,5 +105,5 @@ Usage: fsiAnyCpu [script.fsx []] --quotations-debug[+|-] Emit debug information in quotations --shadowcopyreferences[+|-] Prevents references from being locked by the F# Interactive process ---refemit[+|-] Use a single dynamic assembly via +--legacyemit[+|-] Use a single dynamic assembly via reflection emit \ No newline at end of file diff --git a/tests/fsharpqa/Source/EntryPoint/env.lst b/tests/fsharpqa/Source/EntryPoint/env.lst index bf20c429a7d..37e8b9dfa9c 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 SCFLAGS="--refemit" FSIMODE=PIPE COMPILE_ONLY=1 # entrypointandFSI.fs -NoMT SOURCE=entrypointandFSI02.fsx SCFLAGS="--refemit" FSIMODE=EXEC COMPILE_ONLY=1 # entrypointandFSI02.fsx +NoMT SOURCE=entrypointandFSI.fs SCFLAGS="--legacyemit" FSIMODE=PIPE COMPILE_ONLY=1 # entrypointandFSI.fs +NoMT SOURCE=entrypointandFSI02.fsx SCFLAGS="--legacyemit" FSIMODE=EXEC COMPILE_ONLY=1 # entrypointandFSI02.fsx SOURCE=E_CompilingToALibrary01.fs SCFLAGS="--test:ErrorRanges --target:library" # E_CompilingToALibrary01.fs From f4bbb6597c232195d19851d0566d16b75ddbb49d Mon Sep 17 00:00:00 2001 From: Don Syme Date: Tue, 15 Feb 2022 14:48:00 +0000 Subject: [PATCH 14/17] fix flag --- src/fsharp/fsi/fsi.fs | 3 +-- .../Source/CompilerOptions/fsi/exename/help40.437.1033.bsl | 3 ++- .../Source/CompilerOptions/fsi/help/help40-nologo.437.1033.bsl | 3 ++- .../Source/CompilerOptions/fsi/help/help40.437.1033.bsl | 3 ++- 4 files changed, 7 insertions(+), 5 deletions(-) diff --git a/src/fsharp/fsi/fsi.fs b/src/fsharp/fsi/fsi.fs index 106fba01b26..e383ef77f54 100644 --- a/src/fsharp/fsi/fsi.fs +++ b/src/fsharp/fsi/fsi.fs @@ -950,8 +950,7 @@ type internal FsiCommandLineOptions(fsi: FsiEvaluationSessionHostConfig, CompilerOption("shadowcopyreferences", tagNone, OptionSwitch(fun flag -> tcConfigB.shadowCopyReferences <- flag = OptionSwitch.On), None, Some(FSIstrings.SR.shadowCopyReferences())) #if NETSTANDARD CompilerOption("legacyemit", tagNone, OptionSwitch(fun flag -> tcConfigB.fsiSingleRefEmitAssembly <- flag = OptionSwitch.On), None, Some(FSIstrings.SR.fsiLegacyEmit())) -#endif -#if NETFX +#else CompilerOption("legacyemit", tagNone, OptionSwitch(fun flag -> tcConfigB.fsiSingleRefEmitAssembly <- flag = OptionSwitch.On), None, Some(FSIstrings.SR.fsiLegacyEmitOnByDefault())) #endif ]); 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 05814fdff31..a5375860c64 100644 --- a/tests/fsharpqa/Source/CompilerOptions/fsi/exename/help40.437.1033.bsl +++ b/tests/fsharpqa/Source/CompilerOptions/fsi/exename/help40.437.1033.bsl @@ -104,4 +104,5 @@ Usage: fsharpi [script.fsx []] --shadowcopyreferences[+|-] Prevents references from being locked by the F# Interactive process --legacyemit[+|-] Use a single dynamic assembly via - reflection emit \ No newline at end of file + reflection emit (on 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 17eeabb02e1..13b3be578d3 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 @@ -104,4 +104,5 @@ Usage: fsiAnyCpu [script.fsx []] --shadowcopyreferences[+|-] Prevents references from being locked by the F# Interactive process --legacyemit[+|-] Use a single dynamic assembly via - reflection emit \ No newline at end of file + reflection emit (on 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 6bb459c0e7b..5b0af66d924 100644 --- a/tests/fsharpqa/Source/CompilerOptions/fsi/help/help40.437.1033.bsl +++ b/tests/fsharpqa/Source/CompilerOptions/fsi/help/help40.437.1033.bsl @@ -106,4 +106,5 @@ Usage: fsiAnyCpu [script.fsx []] --shadowcopyreferences[+|-] Prevents references from being locked by the F# Interactive process --legacyemit[+|-] Use a single dynamic assembly via - reflection emit \ No newline at end of file + reflection emit (on by default for + .NET Framework) \ No newline at end of file From b0c2c46fee30e50307a698d4a0ab120c3ff1a103 Mon Sep 17 00:00:00 2001 From: Don Syme Date: Wed, 16 Feb 2022 19:07:42 +0000 Subject: [PATCH 15/17] fix internals optimization problem and add testing --- src/fsharp/NameResolution.fs | 16 +- src/fsharp/Optimizer.fs | 29 +- src/fsharp/TypedTree.fs | 4 +- src/fsharp/absil/il.fsi | 14 +- src/fsharp/absil/illib.fs | 13 +- src/fsharp/absil/illib.fsi | 11 +- src/fsharp/fsi/fsi.fs | 10 +- ...uiet.stderr.bsl => output.1000.stderr.bsl} | 0 ...0.stdout.50.bsl => output.1000.stdout.bsl} | 27 + ...r.refemitoff.bsl => output.200.stderr.bsl} | 18 +- ...00.stdout.50.bsl => output.200.stdout.bsl} | 27 + ...t.1000.stderr.bsl => output.47.stderr.bsl} | 0 ...ult.stdout.47.bsl => output.47.stdout.bsl} | 27 + .../printing/output.legacyemitoff.stderr.bsl | 366 +++ ...it.bsl => output.legacyemitoff.stdout.bsl} | 27 + ...fault.stderr.bsl => output.off.stderr.bsl} | 12 + ...ff.stdout.50.bsl => output.off.stdout.bsl} | 27 + ...rr.refemit.bsl => output.quiet.stderr.bsl} | 12 + ...iet.stdout.bsl => output.quiet.stdout.bsl} | 0 ....test.200.stderr.bsl => output.stderr.bsl} | 12 + ...ut.50.refemitoff.bsl => output.stdout.bsl} | 27 + tests/fsharp/core/printing/test.fsx | 21 + tests/fsharp/core/printing/testLoadFile.fsx | 1 + tests/fsharp/core/printing/testLoadFile2.fsx | 1 + .../printing/z.output.test.1000.stdout.47.bsl | 2720 ----------------- .../printing/z.output.test.200.stdout.47.bsl | 1965 ------------ .../printing/z.output.test.off.stderr.bsl | 336 -- .../printing/z.output.test.off.stdout.47.bsl | 1735 ----------- tests/fsharp/tests.fs | 60 +- 29 files changed, 677 insertions(+), 6841 deletions(-) rename tests/fsharp/core/printing/{z.output.test.quiet.stderr.bsl => output.1000.stderr.bsl} (100%) rename tests/fsharp/core/printing/{z.output.test.1000.stdout.50.bsl => output.1000.stdout.bsl} (99%) rename tests/fsharp/core/printing/{z.output.test.default.stderr.refemitoff.bsl => output.200.stderr.bsl} (96%) rename tests/fsharp/core/printing/{z.output.test.200.stdout.50.bsl => output.200.stdout.bsl} (99%) rename tests/fsharp/core/printing/{z.output.test.1000.stderr.bsl => output.47.stderr.bsl} (100%) rename tests/fsharp/core/printing/{z.output.test.default.stdout.47.bsl => output.47.stdout.bsl} (99%) create mode 100644 tests/fsharp/core/printing/output.legacyemitoff.stderr.bsl rename tests/fsharp/core/printing/{z.output.test.default.stdout.50.refemit.bsl => output.legacyemitoff.stdout.bsl} (99%) rename tests/fsharp/core/printing/{z.output.test.default.stderr.bsl => output.off.stderr.bsl} (96%) rename tests/fsharp/core/printing/{z.output.test.off.stdout.50.bsl => output.off.stdout.bsl} (99%) rename tests/fsharp/core/printing/{z.output.test.default.stderr.refemit.bsl => output.quiet.stderr.bsl} (96%) rename tests/fsharp/core/printing/{z.output.test.quiet.stdout.bsl => output.quiet.stdout.bsl} (100%) rename tests/fsharp/core/printing/{z.output.test.200.stderr.bsl => output.stderr.bsl} (96%) rename tests/fsharp/core/printing/{z.output.test.default.stdout.50.refemitoff.bsl => output.stdout.bsl} (99%) delete mode 100644 tests/fsharp/core/printing/z.output.test.1000.stdout.47.bsl delete mode 100644 tests/fsharp/core/printing/z.output.test.200.stdout.47.bsl delete mode 100644 tests/fsharp/core/printing/z.output.test.off.stderr.bsl delete mode 100644 tests/fsharp/core/printing/z.output.test.off.stdout.47.bsl diff --git a/src/fsharp/NameResolution.fs b/src/fsharp/NameResolution.fs index d82b0655df7..a01f5254010 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/Optimizer.fs b/src/fsharp/Optimizer.fs index c7bb5aa77a6..89e1b85fa54 100644 --- a/src/fsharp/Optimizer.fs +++ b/src/fsharp/Optimizer.fs @@ -3976,28 +3976,29 @@ and OptimizeImplFileInternal cenv env isIncrementalFragment fsiSingleRefEmitAsse let (TImplFile (qname, pragmas, mexpr, hasExplicitEntryPoint, isScript, anonRecdTypes, namedDebugPointsForInlinedCode)) = implFile let env, mexprR, minfo = match mexpr with - // FSI compiles everything as if you're typing incrementally into one module. + // 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. // - // In incremental, multi-assembly mode no internals are accessible + // In F# interactive multi-assembly mode no internals are accessible across interactive fragments. | ModuleOrNamespaceExprWithSig(mty, def, m) when isIncrementalFragment -> - let (def, minfo), (_env, _bindInfosColl) = OptimizeModuleDef cenv (env, []) def - let minfo = minfo |> AbstractLazyModulInfoByHiding false hidden - let hidden = if fsiSingleRefEmitAssembly then ComputeImplementationHidingInfoAtAssemblyBoundary def hidden else hidden - let minfo = AbstractLazyModulInfoByHiding true hidden minfo + // This optimizes and builds minfo ignoring the signature + let (defR, minfo), (_env, _bindInfosColl) = OptimizeModuleDef cenv (env, []) def + let minfo = + if fsiSingleRefEmitAssembly then + AbstractLazyModulInfoByHiding false hidden minfo + else + let hidden = ComputeImplementationHidingInfoAtAssemblyBoundary defR hidden + AbstractLazyModulInfoByHiding true hidden minfo let env = BindValsInModuleOrNamespace cenv minfo env - env, ModuleOrNamespaceExprWithSig(mty, def, m), minfo + env, ModuleOrNamespaceExprWithSig(mty, defR, m), minfo | _ -> - let env, mexprR, minfo = - let mexprR, minfo = OptimizeModuleExpr cenv env mexpr - 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 - + // This optimizes and builds minfo w.r.t. the signature + let mexprR, minfo = OptimizeModuleExpr cenv env mexpr let hidden = ComputeSignatureHidingInfoAtAssemblyBoundary mexpr.Type hidden - let minfo = AbstractLazyModulInfoByHiding true hidden minfo + let env = BindValsInModuleOrNamespace cenv minfo env env, mexprR, minfo let implFileR = TImplFile (qname, pragmas, mexprR, hasExplicitEntryPoint, isScript, anonRecdTypes, namedDebugPointsForInlinedCode) diff --git a/src/fsharp/TypedTree.fs b/src/fsharp/TypedTree.fs index 4710c3aaec2..184b123cfa2 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 = diff --git a/src/fsharp/absil/il.fsi b/src/fsharp/absil/il.fsi index 8bab6238a67..5c2f093f17b 100644 --- a/src/fsharp/absil/il.fsi +++ b/src/fsharp/absil/il.fsi @@ -2015,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 diff --git a/src/fsharp/absil/illib.fs b/src/fsharp/absil/illib.fs index dcc7d133ff4..97e93e8659f 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 da8bc23da17..f6300d3f573 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/fsi/fsi.fs b/src/fsharp/fsi/fsi.fs index 3eaccb6cedc..61dea28eb2f 100644 --- a/src/fsharp/fsi/fsi.fs +++ b/src/fsharp/fsi/fsi.fs @@ -359,8 +359,7 @@ type ILMultiInMemoryAssemblyEmitEnv( let key = tref.BasicQualifiedName let typ = asm.GetType(key) //printfn "Adding %s --> %s" key typ.FullName - let tref = ILTypeRef.Create(ilScopeRef, [ for e in enc -> e.Name ], typ.Name) - let rtref = ILTypeRef.Create(dynamicCcuScopeRef, [ for e in enc -> e.Name ], typ.Name) + let rtref = rescopeILTypeRef dynamicCcuScopeRef tref typeMap.Add(ltref, (typ, tref)) reverseTypeMap.Add(tref, rtref) for ntdef in tdef.NestedTypes.AsArray() do @@ -1383,7 +1382,7 @@ type internal FsiDynamicCompiler for tref in refs.TypeReferences do if emEnv.IsLocalInternalType(tref) then - warning(Error((FSIstrings.SR.fsiInternalAccess(tref.Name)), m)) + warning(Error((FSIstrings.SR.fsiInternalAccess(tref.FullName)), m)) for mref in refs.MethodReferences do if emEnv.IsLocalInternalMethod(mref) then @@ -1430,7 +1429,10 @@ type internal FsiDynamicCompiler | 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 diff --git a/tests/fsharp/core/printing/z.output.test.quiet.stderr.bsl b/tests/fsharp/core/printing/output.1000.stderr.bsl similarity index 100% rename from tests/fsharp/core/printing/z.output.test.quiet.stderr.bsl rename to tests/fsharp/core/printing/output.1000.stderr.bsl 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 20c1ee372c8..6cebad0208a 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 @@ -2719,4 +2725,25 @@ val ShortName: string = "hi" > 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.default.stderr.refemitoff.bsl b/tests/fsharp/core/printing/output.200.stderr.bsl similarity index 96% rename from tests/fsharp/core/printing/z.output.test.default.stderr.refemitoff.bsl rename to tests/fsharp/core/printing/output.200.stderr.bsl index 84f79233082..6926dcc9f34 100644 --- a/tests/fsharp/core/printing/z.output.test.default.stderr.refemitoff.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" ----------------^ @@ -334,9 +346,3 @@ stdin(838,6): error FS1210: Active pattern '|A|B|' has a result type containing 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 '--legacyemit' option. - 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 fa757c6a1c6..352b5e2cbee 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 @@ -1964,4 +1970,25 @@ val ShortName: string = "hi" > 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 50765491972..4d9c46549c0 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 @@ -6264,4 +6270,25 @@ val ShortName: string = "hi" > 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 00000000000..2e2ec9f185d --- /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 '--legacyemit' 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 '--legacyemit' 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 '--legacyemit' option. + diff --git a/tests/fsharp/core/printing/z.output.test.default.stdout.50.refemit.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.refemit.bsl rename to tests/fsharp/core/printing/output.legacyemitoff.stdout.bsl index d06d2ff7ff9..77a168f1190 100644 --- a/tests/fsharp/core/printing/z.output.test.default.stdout.50.refemit.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 @@ -6266,4 +6272,25 @@ val ShortName: string = "hi" > 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.default.stderr.bsl b/tests/fsharp/core/printing/output.off.stderr.bsl similarity index 96% rename from tests/fsharp/core/printing/z.output.test.default.stderr.bsl rename to tests/fsharp/core/printing/output.off.stderr.bsl index 4d3209ca246..6926dcc9f34 100644 --- a/tests/fsharp/core/printing/z.output.test.default.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.50.bsl b/tests/fsharp/core/printing/output.off.stdout.bsl similarity index 99% rename from tests/fsharp/core/printing/z.output.test.off.stdout.50.bsl rename to tests/fsharp/core/printing/output.off.stdout.bsl index 642362d2f82..adf47672324 100644 --- a/tests/fsharp/core/printing/z.output.test.off.stdout.50.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 @@ -1734,4 +1740,25 @@ val ShortName: string = "hi" > 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.default.stderr.refemit.bsl b/tests/fsharp/core/printing/output.quiet.stderr.bsl similarity index 96% rename from tests/fsharp/core/printing/z.output.test.default.stderr.refemit.bsl rename to tests/fsharp/core/printing/output.quiet.stderr.bsl index 4d3209ca246..6926dcc9f34 100644 --- a/tests/fsharp/core/printing/z.output.test.default.stderr.refemit.bsl +++ b/tests/fsharp/core/printing/output.quiet.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.quiet.stdout.bsl b/tests/fsharp/core/printing/output.quiet.stdout.bsl similarity index 100% rename from tests/fsharp/core/printing/z.output.test.quiet.stdout.bsl rename to tests/fsharp/core/printing/output.quiet.stdout.bsl diff --git a/tests/fsharp/core/printing/z.output.test.200.stderr.bsl b/tests/fsharp/core/printing/output.stderr.bsl similarity index 96% rename from tests/fsharp/core/printing/z.output.test.200.stderr.bsl rename to tests/fsharp/core/printing/output.stderr.bsl index 4d3209ca246..6926dcc9f34 100644 --- a/tests/fsharp/core/printing/z.output.test.200.stderr.bsl +++ b/tests/fsharp/core/printing/output.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.default.stdout.50.refemitoff.bsl b/tests/fsharp/core/printing/output.stdout.bsl similarity index 99% rename from tests/fsharp/core/printing/z.output.test.default.stdout.50.refemitoff.bsl rename to tests/fsharp/core/printing/output.stdout.bsl index d06d2ff7ff9..77a168f1190 100644 --- a/tests/fsharp/core/printing/z.output.test.default.stdout.50.refemitoff.bsl +++ b/tests/fsharp/core/printing/output.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 @@ -6266,4 +6272,25 @@ val ShortName: string = "hi" > 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 93b5426a8cc..aeb00fc5bb1 100644 --- a/tests/fsharp/core/printing/test.fsx +++ b/tests/fsharp/core/printing/test.fsx @@ -1087,6 +1087,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 *) ;;exit 0;; (* piped in to enable error regressions *) \ No newline at end of file diff --git a/tests/fsharp/core/printing/testLoadFile.fsx b/tests/fsharp/core/printing/testLoadFile.fsx index 85347b365b0..1874fb8c6a4 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 ab00483c814..0135662d80b 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 d8832102a59..00000000000 --- a/tests/fsharp/core/printing/z.output.test.1000.stdout.47.bsl +++ /dev/null @@ -1,2720 +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 - -> val internal f: unit -> int - -> val it: int = 1 - -> > > 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 1ca38cbc5c8..00000000000 --- a/tests/fsharp/core/printing/z.output.test.200.stdout.47.bsl +++ /dev/null @@ -1,1965 +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 - -> val internal f: unit -> int - -> val it: int = 1 - -> > > diff --git a/tests/fsharp/core/printing/z.output.test.off.stderr.bsl b/tests/fsharp/core/printing/z.output.test.off.stderr.bsl deleted file mode 100644 index 4d3209ca246..00000000000 --- a/tests/fsharp/core/printing/z.output.test.off.stderr.bsl +++ /dev/null @@ -1,336 +0,0 @@ - - #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. - - - 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/z.output.test.off.stdout.47.bsl b/tests/fsharp/core/printing/z.output.test.off.stdout.47.bsl deleted file mode 100644 index c144476e3d9..00000000000 --- a/tests/fsharp/core/printing/z.output.test.off.stdout.47.bsl +++ /dev/null @@ -1,1735 +0,0 @@ - -> val it: unit = () - -> val repeatId: string - -> val repeatId: string - -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 -val fs: System.Windows.Forms.Form[] -val xs: string list -val xa: string[] -val xa2: string[,] -val sxs0: Set - -> val sxs1: Set - -> val sxs2: Set - -> val sxs3: Set - -> val sxs4: Set - -> val sxs200: Set - -> val msxs0: Map - -> val msxs1: Map - -> val msxs2: Map - -> val msxs3: Map - -> val msxs4: Map - -> val msxs200: Map - -> module M = - val a: string - val b: - (seq * seq * seq * System.Windows.Forms.Form) option * - (string list * string list * string[,]) option -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 -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 -val opt4: 'a option option option option -val opt4b: int option option option option -val opt5: int list option option option option option list -val mkStr: n: int -> string -val strs: string[] -val str7s: string[] -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 - -> [Building 2 6...done] -val tree_2_6: tree - -> [Building 2 8...done] -val tree_2_8: tree - -> [Building 2 10...done] -val tree_2_10: tree - -> [Building 2 12...done] -val tree_2_12: tree - -> [Building 2 14...done] -val tree_2_14: tree - -> [Building 3 8...done] -val tree_3_8: tree - -> [Building 4 8...done] -val tree_4_8: tree - -> [Building 5 8...done] -val tree_5_8: tree - -> [Building 6 8...done] -val tree_6_8: tree - -> [Building 5 3...done] -val tree_5_3: tree - -> > type X = - | Var of int - | Bop of int * X * X -val generate: x: int -> X - -> val exps: X list - -> module Exprs = - val x1: X - val x2: X - val x3: X - val x4: X - val x5: X - val x6: X - val x7: X - val x8: X - val x9: X - val x10: X - val x11: X - -> 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 -val exA2: exn -val exA3: exn -val exA4: exn -val exA5: exn -exception Ex0 -exception ExUnit of unit -exception ExUnits of unit * unit -exception ExUnitOption of unit option -val ex0: exn -val exU: exn -val exUs: exn -val exUSome: exn -val exUNone: exn -type 'a T4063 = | AT4063 of 'a - -> val valAT3063_12: int T4063 - -> val valAT3063_True: bool T4063 - -> val valAT3063_text: string T4063 - -> val valAT3063_null: System.Object T4063 - -> 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[] - -> module RepeatedModule = - val repeatedByteLiteral: byte[] - -> 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 -val r10s: r[] -val r10s': string * r[] - -> val x1564_A1: int - - ---> Added '\' to library include path - -val x1564_A2: int - - ---> Added '\' to library include path - -val x1564_A3: int - -> 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 - 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 - 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 - val x90: string - val x80: string - val x75: string - val x74: string - val x73: string - val x72: string - val x71: string - val x70: string -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 - val xArray: int[] - val xString: string - val xOption: int option - val xArray2: (int * int)[,] - val xSeq: seq -module Test4343e = - type C = - new: x: int -> C - val cA: C - val cB: C - val cAB: C * C * C list - type D = - new: x: int -> D - override ToString: unit -> string - val dA: D - val dB: D - val dAB: D * D * D list - module Generic = - type CGeneric<'a> = - new: x: 'a -> CGeneric<'a> - val cA: C - val cB: C - val cAB: C * C * C list - type D<'a> = - new: x: 'a -> D<'a> - override ToString: unit -> string - val dA: D - val dB: D - val dAB: D * D * D list - val dC: D - val boxed_dABC: obj list -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 -val seqFindFailure: Either -val seqPickFailure: Either -module Regression5218 = - val t1: int - val t2: int * int - val t3: int * int * int - val t4: int * int * int * int - val t5: int * int * int * int * int - val t6: int * int * int * int * int * int - val t7: int * int * int * int * int * int * int - val t8: int * int * int * int * int * int * int * int - val t9: int * int * int * int * int * int * int * int * int - val t10: int * int * int * int * int * int * int * int * int * int - val t11: int * int * int * int * int * int * int * int * int * int * int - val t12: - int * int * int * int * int * int * int * int * int * int * int * int - val t13: - int * int * int * int * int * int * int * int * int * int * int * int * - int - val t14: - int * int * int * int * int * int * int * int * int * int * int * int * - int * int - val t15: - int * int * int * int * int * int * int * int * int * int * int * int * - int * int * 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 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 -val it: unit - -> Expect ABC = ABC -val it: unit = () - -> module Regression1019_short = - val double_nan: float - val double_infinity: float - val single_nan: float32 - val single_infinity: float32 -module Regression1019_long = - val double_nan: float - val double_infinity: float - val single_nan: float32 - val single_infinity: float32 - -> val it: int ref = { contents = 1 } - -> val x: int ref -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 - -> > val note_ExpectDupProperty: string - -> > > 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 -val namedFieldVar2: MyDU - -> 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 -val namedEx2: exn - -> type optionRecord = - { x: int option } -val x: optionRecord - -> type optionRecord = - { x: obj } -val x: optionRecord - -> 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 - -> 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 - -> module op_Addition = - val x: int - -> module ``land`` = - val x: int - -> val ``+`` : x: 'a -> y: 'b -> int - -> val (+) : x: int -> y: int -> int - -> val ``base`` : int - -> val (mod) : int - -> val ``or`` : int - -> val ``land`` : int - -> val ``.ctor`` : int - -> val ``.cctor`` : int - -> [] -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 - -> > > diff --git a/tests/fsharp/tests.fs b/tests/fsharp/tests.fs index 2f352fe88ed..3fc758a4598 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,49 +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 "--legacyemit+ --debug+" "output" - // For this, check both with and without legacyemit + // F# 5.0 changed some things printing output [] - let ``printing-default-stdout-50 --langversion:5_0 --legacyemit+`` () = - printing "--langversion:5.0 --legacyemit+ --debug+ --optimize-" "z.output.test.default.stdout.50.legacyemit.txt" "z.output.test.default.stdout.50.legacyemit.bsl" "z.output.test.default.stderr.legacyemit.txt" "z.output.test.default.stderr.legacyemit.bsl" + let ``printing-langversion47`` () = + runPrintingTest "--langversion:4.7" "output.47" + // Output should not change with optimization off [] - let ``printing-default-stdout-50 --langversion:5_0 --legacyemit-`` () = - printing "--langversion:5.0 --legacyemit- --debug+ --optimize-" "z.output.test.default.stdout.50.legacyemitoff.txt" "z.output.test.default.stdout.50.legacyemitoff.bsl" "z.output.test.default.stderr.legacyemitoff.txt" "z.output.test.default.stderr.legacyemitoff.bsl" + let ``printing-optimizeoff`` () = + runPrintingTest "--legacyemit+ --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-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-legacyemitoff`` () = + runPrintingTest "--legacyemit- --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-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-optimizeoff`` () = + runPrintingTest "--legacyemit- --debug+ --optimize-" "output.legacyemitoff" [] - 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-width-1000`` () = + runPrintingTest "--use:preludePrintSize1000.fsx" "output.1000" [] - 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-200`` () = + runPrintingTest "--use:preludePrintSize200.fsx" "output.200" [] - 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-off`` () = + runPrintingTest "--use:preludeShowDeclarationValuesFalse.fsx" "output.off" [] - 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-quiet-stdout --legacyemit+`` () = - 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-stdout --legacyemit-`` () = - printing "--quiet --legacyemit-" "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 From 92cfed78950a089fe71e2f631ad5b1a89d2c3ee5 Mon Sep 17 00:00:00 2001 From: Don Syme Date: Fri, 18 Feb 2022 13:19:47 +0000 Subject: [PATCH 16/17] fix build --- src/fsharp/CompilerConfig.fs | 6 +++--- src/fsharp/CompilerConfig.fsi | 4 ++-- src/fsharp/OptimizeInputs.fs | 6 +++--- src/fsharp/Optimizer.fs | 26 ++++++++++++++++---------- src/fsharp/Optimizer.fsi | 2 +- src/fsharp/fsi/fsi.fs | 22 +++++++++++----------- 6 files changed, 36 insertions(+), 30 deletions(-) diff --git a/src/fsharp/CompilerConfig.fs b/src/fsharp/CompilerConfig.fs index f2c0a16603b..8a13eceb6ee 100644 --- a/src/fsharp/CompilerConfig.fs +++ b/src/fsharp/CompilerConfig.fs @@ -481,7 +481,7 @@ type TcConfigBuilder = mutable fxResolver: FxResolver option // Is F# Interactive using multi-assembly emit? - mutable fsiSingleRefEmitAssembly: bool + mutable fsiMultiAssemblyEmit: bool /// specify the error range for FxResolver rangeForErrors: range @@ -663,7 +663,7 @@ type TcConfigBuilder = shadowCopyReferences = false useSdkRefs = true fxResolver = None - fsiSingleRefEmitAssembly = false + fsiMultiAssemblyEmit = true internalTestSpanStackReferring = false noConditionalErasure = false pathMap = PathMap.empty @@ -925,7 +925,7 @@ type TcConfig private (data: TcConfigBuilder, validate: bool) = #endif None, data.legacyReferenceResolver.Impl.HighestInstalledNetFrameworkVersion() - member _.fsiSingleRefEmitAssembly = data.fsiSingleRefEmitAssembly + 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 aaf3af168d2..b1d60f19211 100644 --- a/src/fsharp/CompilerConfig.fsi +++ b/src/fsharp/CompilerConfig.fsi @@ -272,7 +272,7 @@ type TcConfigBuilder = mutable shadowCopyReferences: bool mutable useSdkRefs: bool mutable fxResolver: FxResolver option - mutable fsiSingleRefEmitAssembly: bool + mutable fsiMultiAssemblyEmit: bool rangeForErrors: range sdkDirOverride: string option @@ -460,7 +460,7 @@ type TcConfig = member isInvalidationSupported: bool /// Indicates if F# Interactive is using single-assembly emit via Reflection.Emit, where internals are available. - member fsiSingleRefEmitAssembly: bool + member fsiMultiAssemblyEmit: bool member xmlDocInfoLoader: IXmlDocumentationInfoLoader option diff --git a/src/fsharp/OptimizeInputs.fs b/src/fsharp/OptimizeInputs.fs index 9db75230375..150d7fb448e 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, tcConfig.fsiSingleRefEmitAssembly, + 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, tcConfig.fsiSingleRefEmitAssembly, + 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.fsiSingleRefEmitAssembly, 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/Optimizer.fs b/src/fsharp/Optimizer.fs index 89e1b85fa54..6e97c08fe94 100644 --- a/src/fsharp/Optimizer.fs +++ b/src/fsharp/Optimizer.fs @@ -3972,7 +3972,7 @@ and OptimizeModuleDefs cenv (env, bindInfosColl) defs = let defs, minfos = List.unzip defs (defs, UnionOptimizationInfos minfos), (env, bindInfosColl) -and OptimizeImplFileInternal cenv env isIncrementalFragment fsiSingleRefEmitAssembly hidden implFile = +and OptimizeImplFileInternal cenv env isIncrementalFragment fsiMultiAssemblyEmit hidden implFile = let (TImplFile (qname, pragmas, mexpr, hasExplicitEntryPoint, isScript, anonRecdTypes, namedDebugPointsForInlinedCode)) = implFile let env, mexprR, minfo = match mexpr with @@ -3986,27 +3986,33 @@ and OptimizeImplFileInternal cenv env isIncrementalFragment fsiSingleRefEmitAsse // This optimizes and builds minfo ignoring the signature let (defR, minfo), (_env, _bindInfosColl) = OptimizeModuleDef cenv (env, []) def let minfo = - if fsiSingleRefEmitAssembly then - AbstractLazyModulInfoByHiding false hidden minfo - else + if fsiMultiAssemblyEmit then let hidden = ComputeImplementationHidingInfoAtAssemblyBoundary defR hidden AbstractLazyModulInfoByHiding true hidden minfo + else + AbstractLazyModulInfoByHiding false hidden minfo let env = BindValsInModuleOrNamespace cenv minfo env env, ModuleOrNamespaceExprWithSig(mty, defR, m), minfo | _ -> // This optimizes and builds minfo w.r.t. the signature + // In F# interactive multi-assembly mode no internals are accessible even within the 'env' used from module to module. let mexprR, minfo = OptimizeModuleExpr cenv env mexpr - let hidden = ComputeSignatureHidingInfoAtAssemblyBoundary mexpr.Type hidden - let minfo = AbstractLazyModulInfoByHiding true hidden minfo - let env = BindValsInModuleOrNamespace cenv minfo env - env, mexprR, minfo + let hiddenExternal = ComputeSignatureHidingInfoAtAssemblyBoundary mexpr.Type hidden + let minfoInternal = AbstractLazyModulInfoByHiding false hidden minfo + let minfoExternal = AbstractLazyModulInfoByHiding true hiddenExternal minfoInternal + let env = + if fsiMultiAssemblyEmit then + BindValsInModuleOrNamespace cenv minfoExternal env + else + BindValsInModuleOrNamespace cenv minfoInternal env + env, mexprR, minfoExternal let implFileR = TImplFile (qname, pragmas, mexprR, hasExplicitEntryPoint, isScript, anonRecdTypes, namedDebugPointsForInlinedCode) env, implFileR, minfo, hidden /// Entry point -let OptimizeImplFile (settings, ccu, tcGlobals, tcVal, importMap, optEnv, isIncrementalFragment, fsiSingleRefEmitAssembly, emitTailcalls, hidden, mimpls) = +let OptimizeImplFile (settings, ccu, tcGlobals, tcVal, importMap, optEnv, isIncrementalFragment, fsiMultiAssemblyEmit, emitTailcalls, hidden, mimpls) = let cenv = { settings=settings scope=ccu @@ -4020,7 +4026,7 @@ let OptimizeImplFile (settings, ccu, tcGlobals, tcVal, importMap, optEnv, isIncr stackGuard = StackGuard(OptimizerStackGuardDepth) } - let env, _, _, _ as results = OptimizeImplFileInternal cenv optEnv isIncrementalFragment fsiSingleRefEmitAssembly 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 cf93c1d4f5e..11af2e43331 100644 --- a/src/fsharp/Optimizer.fsi +++ b/src/fsharp/Optimizer.fsi @@ -74,7 +74,7 @@ val internal OptimizeImplFile: Import.ImportMap * IncrementalOptimizationEnv * isIncrementalFragment: bool * - fsiSingleRefEmitAssembly: bool * + fsiMultiAssemblyEmit: bool * emitTailcalls: bool * SignatureHidingInfo * TypedImplFile diff --git a/src/fsharp/fsi/fsi.fs b/src/fsharp/fsi/fsi.fs index 61dea28eb2f..7aee4d9528e 100644 --- a/src/fsharp/fsi/fsi.fs +++ b/src/fsharp/fsi/fsi.fs @@ -948,9 +948,9 @@ type internal FsiCommandLineOptions(fsi: FsiEvaluationSessionHostConfig, 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("legacyemit", tagNone, OptionSwitch(fun flag -> tcConfigB.fsiSingleRefEmitAssembly <- flag = OptionSwitch.On), None, Some(FSIstrings.SR.fsiLegacyEmit())) + CompilerOption("legacyemit", tagNone, OptionSwitch(fun flag -> tcConfigB.fsiMultiAssemblyEmit <- flag = OptionSwitch.Off), None, Some(FSIstrings.SR.fsiLegacyEmit())) #else - CompilerOption("legacyemit", tagNone, OptionSwitch(fun flag -> tcConfigB.fsiSingleRefEmitAssembly <- flag = OptionSwitch.On), None, Some(FSIstrings.SR.fsiLegacyEmitOnByDefault())) + CompilerOption("legacyemit", tagNone, OptionSwitch(fun flag -> tcConfigB.fsiMultiAssemblyEmit <- flag = OptionSwitch.Off), None, Some(FSIstrings.SR.fsiLegacyEmitOnByDefault())) #endif ]); ] @@ -1331,12 +1331,12 @@ type internal FsiDynamicCompiler let valuePrinter = FsiValuePrinter(fsi, outWriter) let builders = - if tcConfigB.fsiSingleRefEmitAssembly then + if tcConfigB.fsiMultiAssemblyEmit then + None + else let assemBuilder, moduleBuilder = mkDynamicAssemblyAndModule (dynamicCcuName, tcConfigB.optSettings.LocalOptimizationsEnabled, generateDebugInfo, fsiCollectible) dynamicAssemblies.Add(assemBuilder) Some (assemBuilder, moduleBuilder) - else - None let rangeStdin0 = rangeN stdinMockFilename 0 @@ -2070,13 +2070,13 @@ type internal FsiDynamicCompiler let optEnv0 = GetInitialOptimizationEnv (tcImports, tcGlobals) let emEnv0 = - if tcConfigB.fsiSingleRefEmitAssembly then + 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) - else - let emEnv = ILMultiInMemoryAssemblyEmitEnv(ilGlobals, resolveAssemblyRef, dynamicCcuName) - MultipleInMemoryAssemblies emEnv let tcEnv, openDecls0 = GetInitialTcEnv (dynamicCcuName, rangeStdin0, tcConfig, tcImports, tcGlobals) let ccuName = dynamicCcuName @@ -3182,9 +3182,9 @@ type FsiEvaluationSession (fsi: FsiEvaluationSessionHostConfig, argv:string[], i do if isRunningOnCoreClr then SetTargetProfile tcConfigB "netcore" // always assume System.Runtime codegen #endif - // Preset: --legacyemit+ on .NET Framework + // Preset: --legacyemit+ on .NET Framework and Mono do if not isRunningOnCoreClr then - tcConfigB.fsiSingleRefEmitAssembly <- true + tcConfigB.fsiMultiAssemblyEmit <- false // Preset: --optimize+ -g --tailcalls+ (see 4505) do SetOptimizeSwitch tcConfigB OptionSwitch.On From feb68e63417974517100814fa1c0cbbb92ff88b3 Mon Sep 17 00:00:00 2001 From: Don Syme Date: Fri, 18 Feb 2022 14:39:01 +0000 Subject: [PATCH 17/17] fix build --- docs/fsi-emit.md | 4 ++-- src/fsharp/CompilerConfig.fs | 18 ++++++++------- src/fsharp/Optimizer.fs | 23 ++++++++++--------- src/fsharp/fsi/FSIstrings.txt | 6 ++--- src/fsharp/fsi/fsi.fs | 6 ++--- src/fsharp/fsi/xlf/FSIstrings.txt.cs.xlf | 16 ++++++------- src/fsharp/fsi/xlf/FSIstrings.txt.de.xlf | 16 ++++++------- src/fsharp/fsi/xlf/FSIstrings.txt.es.xlf | 16 ++++++------- src/fsharp/fsi/xlf/FSIstrings.txt.fr.xlf | 16 ++++++------- src/fsharp/fsi/xlf/FSIstrings.txt.it.xlf | 16 ++++++------- src/fsharp/fsi/xlf/FSIstrings.txt.ja.xlf | 16 ++++++------- src/fsharp/fsi/xlf/FSIstrings.txt.ko.xlf | 16 ++++++------- src/fsharp/fsi/xlf/FSIstrings.txt.pl.xlf | 16 ++++++------- src/fsharp/fsi/xlf/FSIstrings.txt.pt-BR.xlf | 16 ++++++------- src/fsharp/fsi/xlf/FSIstrings.txt.ru.xlf | 16 ++++++------- src/fsharp/fsi/xlf/FSIstrings.txt.tr.xlf | 16 ++++++------- src/fsharp/fsi/xlf/FSIstrings.txt.zh-Hans.xlf | 16 ++++++------- src/fsharp/fsi/xlf/FSIstrings.txt.zh-Hant.xlf | 16 ++++++------- tests/FSharp.Compiler.UnitTests/FsiTests.fs | 4 ++-- .../printing/output.legacyemitoff.stderr.bsl | 6 ++--- tests/fsharp/tests.fs | 8 +++---- .../fsi/exename/help40.437.1033.bsl | 5 ++-- .../fsi/help/help40-nologo.437.1033.bsl | 5 ++-- .../fsi/help/help40.437.1033.bsl | 5 ++-- tests/fsharpqa/Source/EntryPoint/env.lst | 4 ++-- 25 files changed, 151 insertions(+), 151 deletions(-) diff --git a/docs/fsi-emit.md b/docs/fsi-emit.md index ef434f6c3d3..2a16e183b95 100644 --- a/docs/fsi-emit.md +++ b/docs/fsi-emit.md @@ -19,7 +19,7 @@ etc. ## Compat switch -There is a switch `fsi --legacyemit` that turns on or off the use of Reflection Emit into a single-dynamic-assembly generation. THis is on by default for .NET Framework for compat reasons, and also there is no problem with generating debug information for refemit there. +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? @@ -27,7 +27,7 @@ There is general assumption in this that on modern dev machines (where users exe 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 `--legacyemit` is enabled, so they've always been the approximate costs of F# Interactive fragment generation. +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 diff --git a/src/fsharp/CompilerConfig.fs b/src/fsharp/CompilerConfig.fs index 8a13eceb6ee..bb4137d8aaa 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,7 +477,9 @@ 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? diff --git a/src/fsharp/Optimizer.fs b/src/fsharp/Optimizer.fs index 6e97c08fe94..0129e841089 100644 --- a/src/fsharp/Optimizer.fs +++ b/src/fsharp/Optimizer.fs @@ -3974,38 +3974,39 @@ and OptimizeModuleDefs cenv (env, bindInfosColl) defs = 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 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. // - // In F# interactive multi-assembly mode no internals are accessible across interactive fragments. | ModuleOrNamespaceExprWithSig(mty, def, m) when isIncrementalFragment -> // 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 - let hidden = ComputeImplementationHidingInfoAtAssemblyBoundary defR hidden AbstractLazyModulInfoByHiding true hidden minfo else AbstractLazyModulInfoByHiding false hidden minfo let env = BindValsInModuleOrNamespace cenv minfo env - env, ModuleOrNamespaceExprWithSig(mty, defR, m), minfo + env, ModuleOrNamespaceExprWithSig(mty, defR, m), minfo, hidden | _ -> // This optimizes and builds minfo w.r.t. the signature - // In F# interactive multi-assembly mode no internals are accessible even within the 'env' used from module to module. let mexprR, minfo = OptimizeModuleExpr cenv env mexpr - let hiddenExternal = ComputeSignatureHidingInfoAtAssemblyBoundary mexpr.Type hidden - let minfoInternal = AbstractLazyModulInfoByHiding false hidden minfo - let minfoExternal = AbstractLazyModulInfoByHiding true hiddenExternal minfoInternal + let hidden = ComputeSignatureHidingInfoAtAssemblyBoundary mexpr.Type hidden + let minfoExternal = AbstractLazyModulInfoByHiding true hidden minfo let env = - if fsiMultiAssemblyEmit then + // 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 minfoInternal env - env, mexprR, minfoExternal + BindValsInModuleOrNamespace cenv minfo env + env, mexprR, minfoExternal, hidden let implFileR = TImplFile (qname, pragmas, mexprR, hasExplicitEntryPoint, isScript, anonRecdTypes, namedDebugPointsForInlinedCode) diff --git a/src/fsharp/fsi/FSIstrings.txt b/src/fsharp/fsi/FSIstrings.txt index bf88ff6dbdd..91a4593f858 100644 --- a/src/fsharp/fsi/FSIstrings.txt +++ b/src/fsharp/fsi/FSIstrings.txt @@ -54,6 +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" -fsiLegacyEmit,"Use a single dynamic assembly via reflection emit" -fsiLegacyEmitOnByDefault,"Use a single dynamic assembly via reflection emit (on 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 '--legacyemit' option." \ No newline at end of file +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 7aee4d9528e..52b0262bdfa 100644 --- a/src/fsharp/fsi/fsi.fs +++ b/src/fsharp/fsi/fsi.fs @@ -948,9 +948,9 @@ type internal FsiCommandLineOptions(fsi: FsiEvaluationSessionHostConfig, 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("legacyemit", tagNone, OptionSwitch(fun flag -> tcConfigB.fsiMultiAssemblyEmit <- flag = OptionSwitch.Off), None, Some(FSIstrings.SR.fsiLegacyEmit())) + CompilerOption("multiemit", tagNone, OptionSwitch(fun flag -> tcConfigB.fsiMultiAssemblyEmit <- flag = OptionSwitch.On), None, Some(FSIstrings.SR.fsiMultiAssemblyEmitOption())) #else - CompilerOption("legacyemit", tagNone, OptionSwitch(fun flag -> tcConfigB.fsiMultiAssemblyEmit <- flag = OptionSwitch.Off), None, Some(FSIstrings.SR.fsiLegacyEmitOnByDefault())) + CompilerOption("multiemit", tagNone, OptionSwitch(fun flag -> tcConfigB.fsiMultiAssemblyEmit <- flag = OptionSwitch.On), None, Some(FSIstrings.SR.fsiMultiAssemblyEmitOptionOffByDefault())) #endif ]); ] @@ -3182,7 +3182,7 @@ type FsiEvaluationSession (fsi: FsiEvaluationSessionHostConfig, argv:string[], i do if isRunningOnCoreClr then SetTargetProfile tcConfigB "netcore" // always assume System.Runtime codegen #endif - // Preset: --legacyemit+ on .NET Framework and Mono + // Preset: --multiemit- on .NET Framework and Mono do if not isRunningOnCoreClr then tcConfigB.fsiMultiAssemblyEmit <- false diff --git a/src/fsharp/fsi/xlf/FSIstrings.txt.cs.xlf b/src/fsharp/fsi/xlf/FSIstrings.txt.cs.xlf index bd220e39da7..10658db3e66 100644 --- a/src/fsharp/fsi/xlf/FSIstrings.txt.cs.xlf +++ b/src/fsharp/fsi/xlf/FSIstrings.txt.cs.xlf @@ -3,8 +3,8 @@ - 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 '--legacyemit' 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 '--legacyemit' 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. + 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. @@ -12,9 +12,9 @@ Při vyhledávání balíčků zahrnout identifikátor zdroje balíčku - - Use a single dynamic assembly via reflection emit (on by default for .NET Framework) - Use a single dynamic assembly via reflection emit (on by default for .NET Framework) + + Emit multiple assemblies (off by default for .NET Framework) + Emit multiple assemblies (off by default for .NET Framework) @@ -27,9 +27,9 @@ 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. - - Use a single dynamic assembly via reflection emit - Use a single dynamic assembly via reflection emit + + Emit multiple assemblies (on by default) + Emit multiple assemblies (on by default) diff --git a/src/fsharp/fsi/xlf/FSIstrings.txt.de.xlf b/src/fsharp/fsi/xlf/FSIstrings.txt.de.xlf index 07da2217405..2c9cda0941e 100644 --- a/src/fsharp/fsi/xlf/FSIstrings.txt.de.xlf +++ b/src/fsharp/fsi/xlf/FSIstrings.txt.de.xlf @@ -3,8 +3,8 @@ - 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 '--legacyemit' 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 '--legacyemit' 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. + 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. @@ -12,9 +12,9 @@ URI der Paketquelle bei Suche nach Paketen einschließen - - Use a single dynamic assembly via reflection emit (on by default for .NET Framework) - Use a single dynamic assembly via reflection emit (on by default for .NET Framework) + + Emit multiple assemblies (off by default for .NET Framework) + Emit multiple assemblies (off by default for .NET Framework) @@ -27,9 +27,9 @@ Fehler beim Vorgang. Der Fehlertext wurde im Fehlerstream ausgegeben. Verwenden Sie "EvalInteractionNonThrowing", "EvalScriptNonThrowing" oder "EvalExpressionNonThrowing", um die entsprechende FSharpDiagnostic zurückzugeben. - - Use a single dynamic assembly via reflection emit - Use a single dynamic assembly via reflection emit + + Emit multiple assemblies (on by default) + Emit multiple assemblies (on by default) diff --git a/src/fsharp/fsi/xlf/FSIstrings.txt.es.xlf b/src/fsharp/fsi/xlf/FSIstrings.txt.es.xlf index 4c6c7bde1d2..401eb926dcc 100644 --- a/src/fsharp/fsi/xlf/FSIstrings.txt.es.xlf +++ b/src/fsharp/fsi/xlf/FSIstrings.txt.es.xlf @@ -3,8 +3,8 @@ - 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 '--legacyemit' 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 '--legacyemit' 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. + 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. @@ -12,9 +12,9 @@ Incluir el URI de origen del paquete al buscar paquetes - - Use a single dynamic assembly via reflection emit (on by default for .NET Framework) - Use a single dynamic assembly via reflection emit (on by default for .NET Framework) + + Emit multiple assemblies (off by default for .NET Framework) + Emit multiple assemblies (off by default for .NET Framework) @@ -27,9 +27,9 @@ 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 - - Use a single dynamic assembly via reflection emit - Use a single dynamic assembly via reflection emit + + Emit multiple assemblies (on by default) + Emit multiple assemblies (on by default) diff --git a/src/fsharp/fsi/xlf/FSIstrings.txt.fr.xlf b/src/fsharp/fsi/xlf/FSIstrings.txt.fr.xlf index 3ba9b1e081d..e9885ba0438 100644 --- a/src/fsharp/fsi/xlf/FSIstrings.txt.fr.xlf +++ b/src/fsharp/fsi/xlf/FSIstrings.txt.fr.xlf @@ -3,8 +3,8 @@ - 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 '--legacyemit' 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 '--legacyemit' 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. + 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. @@ -12,9 +12,9 @@ Inclure l'URI de source de package au moment de la recherche des packages - - Use a single dynamic assembly via reflection emit (on by default for .NET Framework) - Use a single dynamic assembly via reflection emit (on by default for .NET Framework) + + Emit multiple assemblies (off by default for .NET Framework) + Emit multiple assemblies (off by default for .NET Framework) @@ -27,9 +27,9 @@ É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 - - Use a single dynamic assembly via reflection emit - Use a single dynamic assembly via reflection emit + + Emit multiple assemblies (on by default) + Emit multiple assemblies (on by default) diff --git a/src/fsharp/fsi/xlf/FSIstrings.txt.it.xlf b/src/fsharp/fsi/xlf/FSIstrings.txt.it.xlf index c791635eb1f..787a769184f 100644 --- a/src/fsharp/fsi/xlf/FSIstrings.txt.it.xlf +++ b/src/fsharp/fsi/xlf/FSIstrings.txt.it.xlf @@ -3,8 +3,8 @@ - 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 '--legacyemit' 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 '--legacyemit' 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. + 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. @@ -12,9 +12,9 @@ Includi l'URI di origine pacchetti durante la ricerca di pacchetti - - Use a single dynamic assembly via reflection emit (on by default for .NET Framework) - Use a single dynamic assembly via reflection emit (on by default for .NET Framework) + + Emit multiple assemblies (off by default for .NET Framework) + Emit multiple assemblies (off by default for .NET Framework) @@ -27,9 +27,9 @@ 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 - - Use a single dynamic assembly via reflection emit - Use a single dynamic assembly via reflection emit + + Emit multiple assemblies (on by default) + Emit multiple assemblies (on by default) diff --git a/src/fsharp/fsi/xlf/FSIstrings.txt.ja.xlf b/src/fsharp/fsi/xlf/FSIstrings.txt.ja.xlf index 71b2b50e213..6cbdd64e128 100644 --- a/src/fsharp/fsi/xlf/FSIstrings.txt.ja.xlf +++ b/src/fsharp/fsi/xlf/FSIstrings.txt.ja.xlf @@ -3,8 +3,8 @@ - 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 '--legacyemit' 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 '--legacyemit' 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. + 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. @@ -12,9 +12,9 @@ パッケージの検索時にパッケージ ソースの URI を含める - - Use a single dynamic assembly via reflection emit (on by default for .NET Framework) - Use a single dynamic assembly via reflection emit (on by default for .NET Framework) + + Emit multiple assemblies (off by default for .NET Framework) + Emit multiple assemblies (off by default for .NET Framework) @@ -27,9 +27,9 @@ 操作に失敗しました。エラー テキストがエラー ストリームに出力されました。対応する FSharpDiagnostic を戻すには、EvalInteractionNonThrowing、EvalScriptNonThrowing、または EvalExpressionNonThrowing を使用します - - Use a single dynamic assembly via reflection emit - Use a single dynamic assembly via reflection emit + + Emit multiple assemblies (on by default) + Emit multiple assemblies (on by default) diff --git a/src/fsharp/fsi/xlf/FSIstrings.txt.ko.xlf b/src/fsharp/fsi/xlf/FSIstrings.txt.ko.xlf index 50649fde641..97bd1c7b08a 100644 --- a/src/fsharp/fsi/xlf/FSIstrings.txt.ko.xlf +++ b/src/fsharp/fsi/xlf/FSIstrings.txt.ko.xlf @@ -3,8 +3,8 @@ - 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 '--legacyemit' 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 '--legacyemit' 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. + 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. @@ -12,9 +12,9 @@ 패키지를 검색할 때 패키지 원본 URI 포함 - - Use a single dynamic assembly via reflection emit (on by default for .NET Framework) - Use a single dynamic assembly via reflection emit (on by default for .NET Framework) + + Emit multiple assemblies (off by default for .NET Framework) + Emit multiple assemblies (off by default for .NET Framework) @@ -27,9 +27,9 @@ 작업이 실패했습니다. 오류 텍스트가 오류 스트림에 출력되었습니다. 해당 FSharpDiagnostic을 반환하려면 EvalInteractionNonThrowing, EvalScriptNonThrowing 또는 EvalExpressionNonThrowing을 사용하세요. - - Use a single dynamic assembly via reflection emit - Use a single dynamic assembly via reflection emit + + Emit multiple assemblies (on by default) + Emit multiple assemblies (on by default) diff --git a/src/fsharp/fsi/xlf/FSIstrings.txt.pl.xlf b/src/fsharp/fsi/xlf/FSIstrings.txt.pl.xlf index 7d738edfdfe..93b4014656c 100644 --- a/src/fsharp/fsi/xlf/FSIstrings.txt.pl.xlf +++ b/src/fsharp/fsi/xlf/FSIstrings.txt.pl.xlf @@ -3,8 +3,8 @@ - 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 '--legacyemit' 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 '--legacyemit' 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. + 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. @@ -12,9 +12,9 @@ Uwzględnij identyfikator URI źródła pakietów podczas wyszukiwania pakietów - - Use a single dynamic assembly via reflection emit (on by default for .NET Framework) - Use a single dynamic assembly via reflection emit (on by default for .NET Framework) + + Emit multiple assemblies (off by default for .NET Framework) + Emit multiple assemblies (off by default for .NET Framework) @@ -27,9 +27,9 @@ 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 - - Use a single dynamic assembly via reflection emit - Use a single dynamic assembly via reflection emit + + Emit multiple assemblies (on by default) + Emit multiple assemblies (on by default) diff --git a/src/fsharp/fsi/xlf/FSIstrings.txt.pt-BR.xlf b/src/fsharp/fsi/xlf/FSIstrings.txt.pt-BR.xlf index 7b4148ff060..7c264f5a2c6 100644 --- a/src/fsharp/fsi/xlf/FSIstrings.txt.pt-BR.xlf +++ b/src/fsharp/fsi/xlf/FSIstrings.txt.pt-BR.xlf @@ -3,8 +3,8 @@ - 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 '--legacyemit' 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 '--legacyemit' 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. + 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. @@ -12,9 +12,9 @@ Incluir o URI de origem do pacote ao pesquisar pacotes - - Use a single dynamic assembly via reflection emit (on by default for .NET Framework) - Use a single dynamic assembly via reflection emit (on by default for .NET Framework) + + Emit multiple assemblies (off by default for .NET Framework) + Emit multiple assemblies (off by default for .NET Framework) @@ -27,9 +27,9 @@ Falha na operação. O texto do erro foi impresso no fluxo de erros. Para retornar o FSharpDiagnostic correspondente, use EvalInteractionNonThrowing, EvalScriptNonThrowing ou EvalExpressionNonThrowing - - Use a single dynamic assembly via reflection emit - Use a single dynamic assembly via reflection emit + + Emit multiple assemblies (on by default) + Emit multiple assemblies (on by default) diff --git a/src/fsharp/fsi/xlf/FSIstrings.txt.ru.xlf b/src/fsharp/fsi/xlf/FSIstrings.txt.ru.xlf index f6d6743aa77..66b83f1f90e 100644 --- a/src/fsharp/fsi/xlf/FSIstrings.txt.ru.xlf +++ b/src/fsharp/fsi/xlf/FSIstrings.txt.ru.xlf @@ -3,8 +3,8 @@ - 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 '--legacyemit' 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 '--legacyemit' 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. + 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. @@ -12,9 +12,9 @@ Включать исходный URI пакета при поиске пакетов - - Use a single dynamic assembly via reflection emit (on by default for .NET Framework) - Use a single dynamic assembly via reflection emit (on by default for .NET Framework) + + Emit multiple assemblies (off by default for .NET Framework) + Emit multiple assemblies (off by default for .NET Framework) @@ -27,9 +27,9 @@ Не удалось выполнить операцию. Текст ошибки был выведен в потоке ошибок. Чтобы вернуть соответствующие сведения FSharpDiagnostic, используйте EvalInteractionNonThrowing, EvalScriptNonThrowing или EvalExpressionNonThrowing - - Use a single dynamic assembly via reflection emit - Use a single dynamic assembly via reflection emit + + Emit multiple assemblies (on by default) + Emit multiple assemblies (on by default) diff --git a/src/fsharp/fsi/xlf/FSIstrings.txt.tr.xlf b/src/fsharp/fsi/xlf/FSIstrings.txt.tr.xlf index 23b3870dbd9..4e29bfcbf4b 100644 --- a/src/fsharp/fsi/xlf/FSIstrings.txt.tr.xlf +++ b/src/fsharp/fsi/xlf/FSIstrings.txt.tr.xlf @@ -3,8 +3,8 @@ - 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 '--legacyemit' 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 '--legacyemit' 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. + 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. @@ -12,9 +12,9 @@ Paketler aranırken paket kaynağı URI'si ekleyin - - Use a single dynamic assembly via reflection emit (on by default for .NET Framework) - Use a single dynamic assembly via reflection emit (on by default for .NET Framework) + + Emit multiple assemblies (off by default for .NET Framework) + Emit multiple assemblies (off by default for .NET Framework) @@ -27,9 +27,9 @@ İş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 - - Use a single dynamic assembly via reflection emit - Use a single dynamic assembly via reflection emit + + Emit multiple assemblies (on by default) + Emit multiple assemblies (on by default) diff --git a/src/fsharp/fsi/xlf/FSIstrings.txt.zh-Hans.xlf b/src/fsharp/fsi/xlf/FSIstrings.txt.zh-Hans.xlf index ece856bc3f1..551291410e9 100644 --- a/src/fsharp/fsi/xlf/FSIstrings.txt.zh-Hans.xlf +++ b/src/fsharp/fsi/xlf/FSIstrings.txt.zh-Hans.xlf @@ -3,8 +3,8 @@ - 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 '--legacyemit' 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 '--legacyemit' 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. + 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. @@ -12,9 +12,9 @@ 搜索包时包含包源 uri - - Use a single dynamic assembly via reflection emit (on by default for .NET Framework) - Use a single dynamic assembly via reflection emit (on by default for .NET Framework) + + Emit multiple assemblies (off by default for .NET Framework) + Emit multiple assemblies (off by default for .NET Framework) @@ -27,9 +27,9 @@ 操作失败。错误文本已在错误流中打印。若要返回相应的 FSharpDiagnostic,请使用 EvalInteractionNonThrowing、EvalScriptNonThrowing 或 EvalExpressionNonThrowing - - Use a single dynamic assembly via reflection emit - Use a single dynamic assembly via reflection emit + + Emit multiple assemblies (on by default) + Emit multiple assemblies (on by default) diff --git a/src/fsharp/fsi/xlf/FSIstrings.txt.zh-Hant.xlf b/src/fsharp/fsi/xlf/FSIstrings.txt.zh-Hant.xlf index 77281b0d7dd..f47ef4a242f 100644 --- a/src/fsharp/fsi/xlf/FSIstrings.txt.zh-Hant.xlf +++ b/src/fsharp/fsi/xlf/FSIstrings.txt.zh-Hant.xlf @@ -3,8 +3,8 @@ - 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 '--legacyemit' 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 '--legacyemit' 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. + 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. @@ -12,9 +12,9 @@ 搜尋套件時包含套件來源 URI - - Use a single dynamic assembly via reflection emit (on by default for .NET Framework) - Use a single dynamic assembly via reflection emit (on by default for .NET Framework) + + Emit multiple assemblies (off by default for .NET Framework) + Emit multiple assemblies (off by default for .NET Framework) @@ -27,9 +27,9 @@ 作業失敗。錯誤文字已列印在錯誤串流中。若要傳回相對應的 FSharpDiagnostic,請使用 EvalInteractionNonThrowing、EvalScriptNonThrowing 或 EvalExpressionNonThrowing - - Use a single dynamic assembly via reflection emit - Use a single dynamic assembly via reflection emit + + Emit multiple assemblies (on by default) + Emit multiple assemblies (on by default) diff --git a/tests/FSharp.Compiler.UnitTests/FsiTests.fs b/tests/FSharp.Compiler.UnitTests/FsiTests.fs index 36637fddc69..0419ee4c159 100644 --- a/tests/FSharp.Compiler.UnitTests/FsiTests.fs +++ b/tests/FSharp.Compiler.UnitTests/FsiTests.fs @@ -18,7 +18,7 @@ module FsiTests = // Build command line arguments & start FSI session let argv = [| "C:\\fsi.exe" |] - let allArgs = Array.append argv [|"--noninteractive"; if useOneDynamicAssembly then "--legacyemit" else "--legacyemit-" |] + 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) @@ -479,7 +479,7 @@ module FsiTests = Assert.shouldBe typeof boundValue.Value.ReflectionType [] - let ``Creation of a bound value fails if the value contains types from a dynamic assembly using legacyemit`` () = + 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) diff --git a/tests/fsharp/core/printing/output.legacyemitoff.stderr.bsl b/tests/fsharp/core/printing/output.legacyemitoff.stderr.bsl index 2e2ec9f185d..68785a152df 100644 --- a/tests/fsharp/core/printing/output.legacyemitoff.stderr.bsl +++ b/tests/fsharp/core/printing/output.legacyemitoff.stderr.bsl @@ -350,17 +350,17 @@ 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 '--legacyemit' option. +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 '--legacyemit' option. +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 '--legacyemit' option. +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/tests.fs b/tests/fsharp/tests.fs index 3fc758a4598..62314c39687 100644 --- a/tests/fsharp/tests.fs +++ b/tests/fsharp/tests.fs @@ -1076,7 +1076,7 @@ module CoreTests = [] let ``printing`` () = - runPrintingTest "--legacyemit+ --debug+" "output" + runPrintingTest "--multiemit- --debug+" "output" // F# 5.0 changed some things printing output [] @@ -1086,20 +1086,20 @@ module CoreTests = // Output should not change with optimization off [] let ``printing-optimizeoff`` () = - runPrintingTest "--legacyemit+ --debug+ --optimize-" "output" + 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-legacyemitoff`` () = - runPrintingTest "--legacyemit- --debug+" "output.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-legacyemitoff-optimizeoff`` () = - runPrintingTest "--legacyemit- --debug+ --optimize-" "output.legacyemitoff" + runPrintingTest "--multiemit+ --debug+ --optimize-" "output.legacyemitoff" [] let ``printing-width-1000`` () = 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 a5375860c64..845f9443070 100644 --- a/tests/fsharpqa/Source/CompilerOptions/fsi/exename/help40.437.1033.bsl +++ b/tests/fsharpqa/Source/CompilerOptions/fsi/exename/help40.437.1033.bsl @@ -103,6 +103,5 @@ Usage: fsharpi [script.fsx []] --quotations-debug[+|-] Emit debug information in quotations --shadowcopyreferences[+|-] Prevents references from being locked by the F# Interactive process ---legacyemit[+|-] Use a single dynamic assembly via - reflection emit (on by default for - .NET Framework) \ No newline at end of file +--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 13b3be578d3..f0af4efa4b2 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,6 +103,5 @@ Usage: fsiAnyCpu [script.fsx []] --quotations-debug[+|-] Emit debug information in quotations --shadowcopyreferences[+|-] Prevents references from being locked by the F# Interactive process ---legacyemit[+|-] Use a single dynamic assembly via - reflection emit (on by default for - .NET Framework) \ No newline at end of file +--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 5b0af66d924..34c66f728ed 100644 --- a/tests/fsharpqa/Source/CompilerOptions/fsi/help/help40.437.1033.bsl +++ b/tests/fsharpqa/Source/CompilerOptions/fsi/help/help40.437.1033.bsl @@ -105,6 +105,5 @@ Usage: fsiAnyCpu [script.fsx []] --quotations-debug[+|-] Emit debug information in quotations --shadowcopyreferences[+|-] Prevents references from being locked by the F# Interactive process ---legacyemit[+|-] Use a single dynamic assembly via - reflection emit (on by default for - .NET Framework) \ No newline at end of file +--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 37e8b9dfa9c..c21c93e5d2a 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 SCFLAGS="--legacyemit" FSIMODE=PIPE COMPILE_ONLY=1 # entrypointandFSI.fs -NoMT SOURCE=entrypointandFSI02.fsx SCFLAGS="--legacyemit" 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