Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions eng/Versions.props
Original file line number Diff line number Diff line change
Expand Up @@ -103,6 +103,7 @@
<SystemThreadingTasksDataflow>4.11.1</SystemThreadingTasksDataflow>
<SystemThreadingThreadVersion>4.3.0</SystemThreadingThreadVersion>
<SystemThreadingThreadPoolVersion>4.3.0</SystemThreadingThreadPoolVersion>
<SystemRuntimeCompilerServicesUnsafeVersion>4.7.1</SystemRuntimeCompilerServicesUnsafeVersion>
<!-- Roslyn packages -->
<RoslynVersion>3.8.0-5.20570.14</RoslynVersion>
<MicrosoftCodeAnalysisEditorFeaturesVersion>$(RoslynVersion)</MicrosoftCodeAnalysisEditorFeaturesVersion>
Expand Down
6 changes: 4 additions & 2 deletions src/fsharp/CompilerImports.fs
Original file line number Diff line number Diff line change
Expand Up @@ -90,9 +90,11 @@ let PickleToResource inMem file (g: TcGlobals) scope rName p x =
let bytes = pickleObjWithDanglingCcus inMem file g scope p x
let byteStorage =
if inMem then
ByteStorage.FromByteArrayAndCopy(bytes, useBackingMemoryMappedFile = true)
ByteStorage.FromMemoryAndCopy(bytes.AsMemory(), useBackingMemoryMappedFile = true)
else
ByteStorage.FromByteArray(bytes)
ByteStorage.FromByteArray(bytes.AsMemory().ToArray())

(bytes :> IDisposable).Dispose()

{ Name = rName
Location = ILResourceLocation.Local(byteStorage)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,7 @@
<NuspecProperty Include="SystemThreadingTasksParallelPackageVersion=$(SystemThreadingTasksParallelVersion)" />
<NuspecProperty Include="SystemThreadingThreadPackageVersion=$(SystemThreadingThreadVersion)" />
<NuspecProperty Include="SystemThreadingThreadPoolPackageVersion=$(SystemThreadingThreadPoolVersion)" />
<NuspecProperty Include="SystemRuntimeCompilerServicesUnsafePackageVersion=$(SystemRuntimeCompilerServicesUnsafeVersion)" />
</ItemGroup>

<ItemGroup>
Expand Down Expand Up @@ -987,6 +988,7 @@
<PackageReference Include="Microsoft.Build.Framework" Version="$(MicrosoftBuildVersion)" />
<PackageReference Include="Microsoft.Build.Tasks.Core" Version="$(MicrosoftBuildVersion)" />
<PackageReference Include="Microsoft.Build.Utilities.Core" Version="$(MicrosoftBuildVersion)" />
<PackageReference Include="System.Runtime.CompilerServices.Unsafe" Version="$(SystemRuntimeCompilerServicesUnsafeVersion)" />
</ItemGroup>

</Project>
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@
<dependency id="System.Threading.Tasks.Parallel" version="$SystemThreadingTasksParallelPackageVersion$" exclude="Build,Analyzers" />
<dependency id="System.Threading.Thread" version="$SystemThreadingThreadPackageVersion$" exclude="Build,Analyzers" />
<dependency id="System.Threading.ThreadPool" version="$SystemThreadingThreadPoolPackageVersion$" exclude="Build,Analyzers" />
<dependency id="System.Runtime.CompilerServices.Unsafe" version="$SystemRuntimeCompilerServicesUnsafePackageVersion$" exclude="Build,Analyzers" />
</group>
</dependencies>
</metadata>
Expand Down
4 changes: 2 additions & 2 deletions src/fsharp/IlxGen.fs
Original file line number Diff line number Diff line change
Expand Up @@ -2027,9 +2027,9 @@ let GenString cenv cgbuf s =

let GenConstArray cenv (cgbuf: CodeGenBuffer) eenv ilElementType (data:'a[]) (write: ByteBuffer -> 'a -> unit) =
let g = cenv.g
let buf = ByteBuffer.Create data.Length
use buf = ByteBuffer.Create data.Length
data |> Array.iter (write buf)
let bytes = buf.Close()
let bytes = buf.AsMemory().ToArray()
let ilArrayType = mkILArr1DTy ilElementType
if data.Length = 0 then
CG.EmitInstrs cgbuf (pop 0) (Push [ilArrayType]) [ mkLdcInt32 0; I_newarr (ILArrayShape.SingleDimensional, ilElementType); ]
Expand Down
36 changes: 26 additions & 10 deletions src/fsharp/QuotationPickler.fs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

module internal FSharp.Compiler.QuotationPickler

open System
open System.Text
open FSharp.Compiler.IO
open Internal.Utilities
Expand Down Expand Up @@ -245,6 +246,10 @@ let SerializedReflectedDefinitionsResourceNameBase = "ReflectedDefinitions"

let freshVar (n, ty, mut) = { vText=n; vType=ty; vMutable=mut }

/// Arbitrary value
[<Literal>]
let PickleBufferCapacity = 100000

module SimplePickle =

type Table<'T> =
Expand Down Expand Up @@ -311,6 +316,11 @@ module SimplePickle =
p_int32 (len) st
st.os.EmitBytes s

let p_memory (s:ReadOnlyMemory<byte>) st =
let len = s.Length
p_int32 (len) st
st.os.EmitMemory s

let prim_pstring (s:string) st =
let bytes = Encoding.UTF8.GetBytes s
let len = bytes.Length
Expand Down Expand Up @@ -363,20 +373,26 @@ module SimplePickle =
| h :: t -> p_byte 1 st; f h st; p_list f t st

let pickle_obj p x =
let st1 =
{ os = ByteBuffer.Create(PickleBufferCapacity, useArrayPool = true)
ostrings=Table<_>.Create() }
let stringTab, phase1bytes =
let st1 =
{ os = ByteBuffer.Create 100000
ostrings=Table<_>.Create() }
p x st1
st1.ostrings.AsList, st1.os.Close()
st1.ostrings.AsList, st1.os.AsMemory()

let phase2data = (stringTab, phase1bytes)

let st2 =
{ os = ByteBuffer.Create(PickleBufferCapacity, useArrayPool = true)
ostrings=Table<_>.Create() }
let phase2bytes =
let st2 =
{ os = ByteBuffer.Create 100000
ostrings=Table<_>.Create() }
p_tup2 (p_list prim_pstring) p_bytes phase2data st2
st2.os.Close()
phase2bytes
p_tup2 (p_list prim_pstring) p_memory phase2data st2
st2.os.AsMemory()

let finalBytes = phase2bytes.ToArray()
(st1.os :> IDisposable).Dispose()
(st2.os :> IDisposable).Dispose()
finalBytes

open SimplePickle

Expand Down
2 changes: 1 addition & 1 deletion src/fsharp/TypedTree.fs
Original file line number Diff line number Diff line change
Expand Up @@ -4637,7 +4637,7 @@ type TOp =
| Array

/// Constant byte arrays (used for parser tables and other embedded data)
| Bytes of byte[]
| Bytes of byte[]

/// Constant uint16 arrays (used for parser tables)
| UInt16s of uint16[]
Expand Down
60 changes: 36 additions & 24 deletions src/fsharp/TypedTreePickle.fs
Original file line number Diff line number Diff line change
Expand Up @@ -213,6 +213,11 @@ let p_bytes (s: byte[]) st =
p_int32 len st
st.os.EmitBytes s

let p_memory (s: System.ReadOnlyMemory<byte>) st =
let len = s.Length
p_int32 len st
st.os.EmitMemory s

let p_prim_string (s: string) st =
let bytes = Encoding.UTF8.GetBytes s
let len = bytes.Length
Expand Down Expand Up @@ -775,10 +780,13 @@ let p_encoded_simpletyp x st = p_int x st
let p_encoded_anoninfo x st = p_int x st
let p_simpletyp x st = p_int (encode_simpletyp st.occus st.ostrings st.onlerefs st.osimpletys st.oscope x) st

/// Arbitrary value
[<Literal>]
let PickleBufferCapacity = 100000

let pickleObjWithDanglingCcus inMem file g scope p x =
let ccuNameTab, (ntycons, ntypars, nvals, nanoninfos), stringTab, pubpathTab, nlerefTab, simpleTyTab, phase1bytes =
let st1 =
{ os = ByteBuffer.Create 100000
let st1 =
{ os = ByteBuffer.Create(PickleBufferCapacity, useArrayPool = true)
oscope=scope
occus= Table<_>.Create "occus"
oentities=NodeOutTable<_, _>.Create((fun (tc: Tycon) -> tc.Stamp), (fun tc -> tc.LogicalName), (fun tc -> tc.Range), (fun osgn -> osgn), "otycons")
Expand All @@ -793,31 +801,32 @@ let pickleObjWithDanglingCcus inMem file g scope p x =
ofile=file
oInMem=inMem
isStructThisArgPos = false}
let ccuNameTab, (ntycons, ntypars, nvals, nanoninfos), stringTab, pubpathTab, nlerefTab, simpleTyTab, phase1bytes =
p x st1
let sizes =
st1.oentities.Size,
st1.otypars.Size,
st1.ovals.Size,
st1.oanoninfos.Size
st1.occus, sizes, st1.ostrings, st1.opubpaths, st1.onlerefs, st1.osimpletys, st1.os.Close()

st1.occus, sizes, st1.ostrings, st1.opubpaths, st1.onlerefs, st1.osimpletys, st1.os.AsMemory()

let st2 =
{ os = ByteBuffer.Create(PickleBufferCapacity, useArrayPool = true)
oscope=scope
occus= Table<_>.Create "occus (fake)"
oentities=NodeOutTable<_, _>.Create((fun (tc: Tycon) -> tc.Stamp), (fun tc -> tc.LogicalName), (fun tc -> tc.Range), (fun osgn -> osgn), "otycons")
otypars=NodeOutTable<_, _>.Create((fun (tp: Typar) -> tp.Stamp), (fun tp -> tp.DisplayName), (fun tp -> tp.Range), (fun osgn -> osgn), "otypars")
ovals=NodeOutTable<_, _>.Create((fun (v: Val) -> v.Stamp), (fun v -> v.LogicalName), (fun v -> v.Range), (fun osgn -> osgn), "ovals")
oanoninfos=NodeOutTable<_, _>.Create((fun (v: AnonRecdTypeInfo) -> v.Stamp), (fun v -> string v.Stamp), (fun _ -> range0), id, "oanoninfos")
ostrings=Table<_>.Create "ostrings (fake)"
opubpaths=Table<_>.Create "opubpaths (fake)"
onlerefs=Table<_>.Create "onlerefs (fake)"
osimpletys=Table<_>.Create "osimpletys (fake)"
oglobals=g
ofile=file
oInMem=inMem
isStructThisArgPos = false }
let phase2bytes =
let st2 =
{ os = ByteBuffer.Create 100000
oscope=scope
occus= Table<_>.Create "occus (fake)"
oentities=NodeOutTable<_, _>.Create((fun (tc: Tycon) -> tc.Stamp), (fun tc -> tc.LogicalName), (fun tc -> tc.Range), (fun osgn -> osgn), "otycons")
otypars=NodeOutTable<_, _>.Create((fun (tp: Typar) -> tp.Stamp), (fun tp -> tp.DisplayName), (fun tp -> tp.Range), (fun osgn -> osgn), "otypars")
ovals=NodeOutTable<_, _>.Create((fun (v: Val) -> v.Stamp), (fun v -> v.LogicalName), (fun v -> v.Range), (fun osgn -> osgn), "ovals")
oanoninfos=NodeOutTable<_, _>.Create((fun (v: AnonRecdTypeInfo) -> v.Stamp), (fun v -> string v.Stamp), (fun _ -> range0), id, "oanoninfos")
ostrings=Table<_>.Create "ostrings (fake)"
opubpaths=Table<_>.Create "opubpaths (fake)"
onlerefs=Table<_>.Create "onlerefs (fake)"
osimpletys=Table<_>.Create "osimpletys (fake)"
oglobals=g
ofile=file
oInMem=inMem
isStructThisArgPos = false }
p_array p_encoded_ccuref ccuNameTab.AsArray st2
// Add a 4th integer indicated by a negative 1st integer
let z1 = if nanoninfos > 0 then -ntycons-1 else ntycons
Expand All @@ -830,11 +839,14 @@ let pickleObjWithDanglingCcus inMem file g scope p x =
(p_array p_encoded_pubpath)
(p_array p_encoded_nleref)
(p_array p_encoded_simpletyp)
p_bytes
p_memory
(stringTab.AsArray, pubpathTab.AsArray, nlerefTab.AsArray, simpleTyTab.AsArray, phase1bytes)
st2
st2.os.Close()
phase2bytes
st2.os

let finalBytes = phase2bytes
(st1.os :> System.IDisposable).Dispose()
finalBytes

let check (ilscope: ILScopeRef) (inMap : NodeInTable<_, _>) =
for i = 0 to inMap.Count - 1 do
Expand Down
2 changes: 1 addition & 1 deletion src/fsharp/TypedTreePickle.fsi
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,7 @@ val internal p_ty : pickler<TType>
val internal pickleCcuInfo : pickler<PickledCcuInfo>

/// Serialize an arbitrary object using the given pickler
val pickleObjWithDanglingCcus : inMem: bool -> file: string -> TcGlobals -> scope:CcuThunk -> pickler<'T> -> 'T -> byte[]
val pickleObjWithDanglingCcus : inMem: bool -> file: string -> TcGlobals -> scope:CcuThunk -> pickler<'T> -> 'T -> ByteBuffer

/// The type of state unpicklers read from
type ReaderState
Expand Down
30 changes: 15 additions & 15 deletions src/fsharp/absil/ilsupp.fs
Original file line number Diff line number Diff line change
Expand Up @@ -91,15 +91,15 @@ type IMAGE_FILE_HEADER (m: int16, secs: int16, tds: int32, ptst: int32, nos: int
with get() = 20

member x.toBytes () =
let buf = ByteBuffer.Create IMAGE_FILE_HEADER.Width
use buf = ByteBuffer.Create IMAGE_FILE_HEADER.Width
buf.EmitUInt16 (uint16 machine)
buf.EmitUInt16 (uint16 numberOfSections)
buf.EmitInt32 timeDateStamp
buf.EmitInt32 pointerToSymbolTable
buf.EmitInt32 numberOfSymbols
buf.EmitUInt16 (uint16 sizeOfOptionalHeader)
buf.EmitUInt16 (uint16 characteristics)
buf.Close()
buf.AsMemory().ToArray()

let bytesToIFH (buffer: byte[]) (offset: int) =
if (buffer.Length - offset) < IMAGE_FILE_HEADER.Width then
Expand Down Expand Up @@ -172,7 +172,7 @@ type IMAGE_SECTION_HEADER(n: int64, ai: int32, va: int32, srd: int32, prd: int32
with get() = 40

member x.toBytes () =
let buf = ByteBuffer.Create IMAGE_SECTION_HEADER.Width
use buf = ByteBuffer.Create IMAGE_SECTION_HEADER.Width
buf.EmitInt64 name
buf.EmitInt32 addressInfo
buf.EmitInt32 virtualAddress
Expand All @@ -183,7 +183,7 @@ type IMAGE_SECTION_HEADER(n: int64, ai: int32, va: int32, srd: int32, prd: int32
buf.EmitUInt16 (uint16 numberOfRelocations)
buf.EmitUInt16 (uint16 numberOfLineNumbers)
buf.EmitInt32 characteristics
buf.Close()
buf.AsMemory().ToArray()


let bytesToISH (buffer: byte[]) (offset: int) =
Expand Down Expand Up @@ -236,14 +236,14 @@ type IMAGE_SYMBOL(n: int64, v: int32, sn: int16, t: int16, sc: byte, nas: byte)
with get() = 18

member x.toBytes() =
let buf = ByteBuffer.Create IMAGE_SYMBOL.Width
use buf = ByteBuffer.Create IMAGE_SYMBOL.Width
buf.EmitInt64 name
buf.EmitInt32 value
buf.EmitUInt16 (uint16 sectionNumber)
buf.EmitUInt16 (uint16 stype)
buf.EmitByte storageClass
buf.EmitByte numberOfAuxSymbols
buf.Close()
buf.AsMemory().ToArray()

let bytesToIS (buffer: byte[]) (offset: int) =
if (buffer.Length - offset) < IMAGE_SYMBOL.Width then
Expand Down Expand Up @@ -280,11 +280,11 @@ type IMAGE_RELOCATION(va: int32, sti: int32, t: int16) =
with get() = 10

member x.toBytes() =
let buf = ByteBuffer.Create IMAGE_RELOCATION.Width
use buf = ByteBuffer.Create IMAGE_RELOCATION.Width
buf.EmitInt32 virtualAddress
buf.EmitInt32 symbolTableIndex
buf.EmitUInt16 (uint16 ty)
buf.Close()
buf.AsMemory().ToArray()

let bytesToIR (buffer: byte[]) (offset: int) =
if (buffer.Length - offset) < IMAGE_RELOCATION.Width then
Expand Down Expand Up @@ -328,14 +328,14 @@ type IMAGE_RESOURCE_DIRECTORY(c: int32, tds: int32, mjv: int16, mnv: int16, nne:
static member Width = 16

member x.toBytes () =
let buf = ByteBuffer.Create IMAGE_RESOURCE_DIRECTORY.Width
use buf = ByteBuffer.Create IMAGE_RESOURCE_DIRECTORY.Width
buf.EmitInt32 characteristics
buf.EmitInt32 timeDateStamp
buf.EmitUInt16 (uint16 majorVersion)
buf.EmitUInt16 (uint16 minorVersion)
buf.EmitUInt16 (uint16 numberOfNamedEntries)
buf.EmitUInt16 (uint16 numberOfIdEntries)
buf.Close()
buf.AsMemory().ToArray()

let bytesToIRD (buffer: byte[]) (offset: int) =
if (buffer.Length - offset) < IMAGE_RESOURCE_DIRECTORY.Width then
Expand Down Expand Up @@ -368,10 +368,10 @@ type IMAGE_RESOURCE_DIRECTORY_ENTRY(n: int32, o: int32) =
static member Width = 8

member x.toBytes () =
let buf = ByteBuffer.Create IMAGE_RESOURCE_DIRECTORY_ENTRY.Width
use buf = ByteBuffer.Create IMAGE_RESOURCE_DIRECTORY_ENTRY.Width
buf.EmitInt32 name
buf.EmitInt32 offset
buf.Close()
buf.AsMemory().ToArray()

let bytesToIRDE (buffer: byte[]) (offset: int) =
if (buffer.Length - offset) < IMAGE_RESOURCE_DIRECTORY_ENTRY.Width then
Expand Down Expand Up @@ -401,7 +401,7 @@ type IMAGE_RESOURCE_DATA_ENTRY(o: int32, s: int32, c: int32, r: int32) =
static member Width = 16

member x.toBytes() =
let buf = ByteBuffer.Create IMAGE_RESOURCE_DATA_ENTRY.Width
use buf = ByteBuffer.Create IMAGE_RESOURCE_DATA_ENTRY.Width
buf.EmitInt32 offsetToData
buf.EmitInt32 size
buf.EmitInt32 codePage
Expand Down Expand Up @@ -466,7 +466,7 @@ type ResFormatHeader() =
static member Width = 32

member x.toBytes() =
let buf = ByteBuffer.Create ResFormatHeader.Width
use buf = ByteBuffer.Create ResFormatHeader.Width
buf.EmitInt32 dwDataSize
buf.EmitInt32 dwHeaderSize
buf.EmitInt32 dwTypeID
Expand All @@ -476,7 +476,7 @@ type ResFormatHeader() =
buf.EmitUInt16 (uint16 wLangID)
buf.EmitInt32 dwVersion
buf.EmitInt32 dwCharacteristics
buf.Close()
buf.AsMemory().ToArray()

type ResFormatNode(tid: int32, nid: int32, lid: int32, dataOffset: int32, pbLinkedResource: byte[]) =
let mutable resHdr = ResFormatHeader()
Expand Down
Loading