From 1df823268d15dc56be8382102ddef6e581187387 Mon Sep 17 00:00:00 2001 From: Hadrian Tang Date: Thu, 28 May 2020 16:09:16 +0800 Subject: [PATCH 1/2] Add char to types resolvable by GenericZero (#8298) * Add char to types resolvable by GenericZero * Add char to get_Zero solving * Add char to test * Add char to test * Add char to test again * Fix naming --- src/fsharp/ConstraintSolver.fs | 2 +- src/fsharp/FSharp.Core/prim-types.fs | 6 ++- tests/fsharp/core/members/basics/test.fs | 4 +- tests/fsharp/tools/eval/test.fsx | 58 ++++++++++++------------ 4 files changed, 37 insertions(+), 33 deletions(-) diff --git a/src/fsharp/ConstraintSolver.fs b/src/fsharp/ConstraintSolver.fs index 00c54db4cf5..2c59f52bead 100644 --- a/src/fsharp/ConstraintSolver.fs +++ b/src/fsharp/ConstraintSolver.fs @@ -1316,7 +1316,7 @@ and SolveMemberConstraint (csenv: ConstraintSolverEnv) ignoreUnresolvedOverload // We pretend for uniformity that the numeric types have a static property called Zero and One // As with constants, only zero is polymorphic in its units | [], [ty], false, "get_Zero", [] - when IsNumericType g ty -> + when IsNumericType g ty || isCharTy g ty -> do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace rty ty return TTraitBuiltIn diff --git a/src/fsharp/FSharp.Core/prim-types.fs b/src/fsharp/FSharp.Core/prim-types.fs index d4838419faf..d7feda333eb 100644 --- a/src/fsharp/FSharp.Core/prim-types.fs +++ b/src/fsharp/FSharp.Core/prim-types.fs @@ -2369,6 +2369,7 @@ namespace Microsoft.FSharp.Core elif aty.Equals(typeof) then unboxPrim<'T> (box 0n) elif aty.Equals(typeof) then unboxPrim<'T> (box 0uy) elif aty.Equals(typeof) then unboxPrim<'T> (box 0us) + elif aty.Equals(typeof) then unboxPrim<'T> (box '\000') elif aty.Equals(typeof) then unboxPrim<'T> (box 0u) elif aty.Equals(typeof) then unboxPrim<'T> (box 0UL) elif aty.Equals(typeof) then unboxPrim<'T> (box 0un) @@ -2392,7 +2393,7 @@ namespace Microsoft.FSharp.Core elif aty.Equals(typeof) then unboxPrim<'T> (box 1n) elif aty.Equals(typeof) then unboxPrim<'T> (box 1uy) elif aty.Equals(typeof) then unboxPrim<'T> (box 1us) - elif aty.Equals(typeof) then unboxPrim<'T> (box (retype 1us : char)) + elif aty.Equals(typeof) then unboxPrim<'T> (box '\001') elif aty.Equals(typeof) then unboxPrim<'T> (box 1u) elif aty.Equals(typeof) then unboxPrim<'T> (box 1UL) elif aty.Equals(typeof) then unboxPrim<'T> (box 1un) @@ -2420,6 +2421,7 @@ namespace Microsoft.FSharp.Core when ^T : unativeint = 0un when ^T : int16 = 0s when ^T : uint16 = 0us + when ^T : char = '\000' when ^T : sbyte = 0y when ^T : byte = 0uy when ^T : decimal = 0M @@ -2440,7 +2442,7 @@ namespace Microsoft.FSharp.Core when ^T : unativeint = 1un when ^T : int16 = 1s when ^T : uint16 = 1us - when ^T : char = (retype 1us : char) + when ^T : char = '\001' when ^T : sbyte = 1y when ^T : byte = 1uy when ^T : decimal = 1M diff --git a/tests/fsharp/core/members/basics/test.fs b/tests/fsharp/core/members/basics/test.fs index a5da244c0a6..7847133295f 100644 --- a/tests/fsharp/core/members/basics/test.fs +++ b/tests/fsharp/core/members/basics/test.fs @@ -3038,6 +3038,7 @@ module ContraintTest = begin open System.Numerics let check s p = printf "Test %s: %s\n" s (if p then "pass" else "fail") do check "d3oc001" (LanguagePrimitives.GenericZero = 0I) + do check "d3oc002" (LanguagePrimitives.GenericZero = '\000') do check "d3oc003a" (LanguagePrimitives.GenericZero = 0) do check "d3oc003b" (LanguagePrimitives.GenericZero = 0un) do check "d3oc003c" (LanguagePrimitives.GenericZero = 0UL) @@ -3051,7 +3052,8 @@ module ContraintTest = begin do check "d3oc003k" (LanguagePrimitives.GenericZero = 0y) do check "d3oc003l" (LanguagePrimitives.GenericZero = 0M) - do check "d3oc001q" (LanguagePrimitives.GenericOne = 1I) + do check "d3oc113q" (LanguagePrimitives.GenericOne = 1I) + do check "d3oc113w" (LanguagePrimitives.GenericOne = '\001') do check "d3oc113e" (LanguagePrimitives.GenericOne = 1) do check "d3oc113r" (LanguagePrimitives.GenericOne = 1un) do check "d3oc113t" (LanguagePrimitives.GenericOne = 1UL) diff --git a/tests/fsharp/tools/eval/test.fsx b/tests/fsharp/tools/eval/test.fsx index e3545645b2e..89045014a5d 100644 --- a/tests/fsharp/tools/eval/test.fsx +++ b/tests/fsharp/tools/eval/test.fsx @@ -1193,35 +1193,35 @@ module EvaluationTests = module InlinedOperationsStillDynamicallyAvailableTests = - checkEval "vroievr093" (<@ LanguagePrimitives.GenericZero @>) 0y - checkEval "vroievr091" (<@ LanguagePrimitives.GenericZero @>) 0s - checkEval "vroievr091" (<@ LanguagePrimitives.GenericZero @>) 0 - checkEval "vroievr091" (<@ LanguagePrimitives.GenericZero @>) 0L - checkEval "vroievr091" (<@ LanguagePrimitives.GenericZero @>) 0n - checkEval "vroievr093" (<@ LanguagePrimitives.GenericZero @>) 0uy - checkEval "vroievr091" (<@ LanguagePrimitives.GenericZero @>) 0us - checkEval "vroievr091" (<@ LanguagePrimitives.GenericZero @>) 0u - checkEval "vroievr091" (<@ LanguagePrimitives.GenericZero @>) 0UL - checkEval "vroievr091" (<@ LanguagePrimitives.GenericZero @>) 0un - checkEval "vroievr091" (<@ LanguagePrimitives.GenericZero @>) 0.0 - checkEval "vroievr091" (<@ LanguagePrimitives.GenericZero @>) 0.0f - checkEval "vroievr092" (<@ LanguagePrimitives.GenericZero @>) 0M - - - - checkEval "vroievr093" (<@ LanguagePrimitives.GenericOne @>) 1y - checkEval "vroievr191" (<@ LanguagePrimitives.GenericOne @>) 1s - checkEval "vroievr191" (<@ LanguagePrimitives.GenericOne @>) 1 - checkEval "vroievr191" (<@ LanguagePrimitives.GenericOne @>) 1L - checkEval "vroievr191" (<@ LanguagePrimitives.GenericOne @>) 1n - checkEval "vroievr193" (<@ LanguagePrimitives.GenericOne @>) 1uy - checkEval "vroievr191" (<@ LanguagePrimitives.GenericOne @>) 1us - checkEval "vroievr191" (<@ LanguagePrimitives.GenericOne @>) 1u - checkEval "vroievr191" (<@ LanguagePrimitives.GenericOne @>) 1UL - checkEval "vroievr191" (<@ LanguagePrimitives.GenericOne @>) 1un - checkEval "vroievr191" (<@ LanguagePrimitives.GenericOne @>) 1.0 - checkEval "vroievr191" (<@ LanguagePrimitives.GenericOne @>) 1.0f - checkEval "vroievr192" (<@ LanguagePrimitives.GenericOne @>) 1M + checkEval "vroievr091a" (<@ LanguagePrimitives.GenericZero @>) '\000' + checkEval "vroievr091b" (<@ LanguagePrimitives.GenericZero @>) 0y + checkEval "vroievr091c" (<@ LanguagePrimitives.GenericZero @>) 0s + checkEval "vroievr091d" (<@ LanguagePrimitives.GenericZero @>) 0 + checkEval "vroievr091e" (<@ LanguagePrimitives.GenericZero @>) 0L + checkEval "vroievr091f" (<@ LanguagePrimitives.GenericZero @>) 0n + checkEval "vroievr091g" (<@ LanguagePrimitives.GenericZero @>) 0uy + checkEval "vroievr091h" (<@ LanguagePrimitives.GenericZero @>) 0us + checkEval "vroievr091i" (<@ LanguagePrimitives.GenericZero @>) 0u + checkEval "vroievr091j" (<@ LanguagePrimitives.GenericZero @>) 0UL + checkEval "vroievr091k" (<@ LanguagePrimitives.GenericZero @>) 0un + checkEval "vroievr091l" (<@ LanguagePrimitives.GenericZero @>) 0.0 + checkEval "vroievr091m" (<@ LanguagePrimitives.GenericZero @>) 0.0f + checkEval "vroievr091n" (<@ LanguagePrimitives.GenericZero @>) 0M + + checkEval "vroievr092a" (<@ LanguagePrimitives.GenericOne @>) '\001' + checkEval "vroievr092b" (<@ LanguagePrimitives.GenericOne @>) 1y + checkEval "vroievr092c" (<@ LanguagePrimitives.GenericOne @>) 1s + checkEval "vroievr092d" (<@ LanguagePrimitives.GenericOne @>) 1 + checkEval "vroievr092e" (<@ LanguagePrimitives.GenericOne @>) 1L + checkEval "vroievr092f" (<@ LanguagePrimitives.GenericOne @>) 1n + checkEval "vroievr092g" (<@ LanguagePrimitives.GenericOne @>) 1uy + checkEval "vroievr092h" (<@ LanguagePrimitives.GenericOne @>) 1us + checkEval "vroievr092i" (<@ LanguagePrimitives.GenericOne @>) 1u + checkEval "vroievr092j" (<@ LanguagePrimitives.GenericOne @>) 1UL + checkEval "vroievr092k" (<@ LanguagePrimitives.GenericOne @>) 1un + checkEval "vroievr092l" (<@ LanguagePrimitives.GenericOne @>) 1.0 + checkEval "vroievr092m" (<@ LanguagePrimitives.GenericOne @>) 1.0f + checkEval "vroievr092n" (<@ LanguagePrimitives.GenericOne @>) 1M check "vroievr0971" (LanguagePrimitives.AdditionDynamic 3y 4y) 7y check "vroievr0972" (LanguagePrimitives.AdditionDynamic 3s 4s) 7s From 8586323b8c2132469d9bad8847206f5e3c6f6473 Mon Sep 17 00:00:00 2001 From: amieres Date: Thu, 28 May 2020 03:17:07 -0500 Subject: [PATCH 2/2] Simple changes to make it compatible with WASM (#8722) * ifEmptyUse fSharpCompilerLocation In Wasm `Assembly.Location` do not have directory path since assemblies reside in memory. * Check GetEnvironmentVariable("FSHARP_COMPILER_BIN") before tryAppConfig In Wasm `tryAppConfig` throws and env var `FSHARP_COMPILER_BIN` never gets tested, so do it first * ifEmptyUse with IsNullOrWhiteSpace --- src/fsharp/DotNetFrameworkDependencies.fs | 4 +++- src/utils/CompilerLocationUtils.fs | 9 ++++----- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/src/fsharp/DotNetFrameworkDependencies.fs b/src/fsharp/DotNetFrameworkDependencies.fs index 1bba15548ab..06e23bb55e2 100644 --- a/src/fsharp/DotNetFrameworkDependencies.fs +++ b/src/fsharp/DotNetFrameworkDependencies.fs @@ -28,11 +28,13 @@ module internal FSharp.Compiler.DotNetFrameworkDependencies // Use the location of this dll location + let inline ifEmptyUse alternative filename = if String.IsNullOrWhiteSpace filename then alternative else filename + let getFSharpCoreLibraryName = "FSharp.Core" let getFsiLibraryName = "FSharp.Compiler.Interactive.Settings" let getDefaultFSharpCoreLocation = Path.Combine(fSharpCompilerLocation, getFSharpCoreLibraryName + ".dll") let getDefaultFsiLibraryLocation = Path.Combine(fSharpCompilerLocation, getFsiLibraryName + ".dll") - let implementationAssemblyDir = Path.GetDirectoryName(typeof.Assembly.Location) + let implementationAssemblyDir = Path.GetDirectoryName(typeof.Assembly.Location) |> ifEmptyUse fSharpCompilerLocation // Use the ValueTuple that is executing with the compiler if it is from System.ValueTuple // or the System.ValueTuple.dll that sits alongside the compiler. (Note we always ship one with the compiler) diff --git a/src/utils/CompilerLocationUtils.fs b/src/utils/CompilerLocationUtils.fs index 0e8934c72b1..eb581029ca8 100644 --- a/src/utils/CompilerLocationUtils.fs +++ b/src/utils/CompilerLocationUtils.fs @@ -189,6 +189,10 @@ module internal FSharpEnvironment = // Check for an app.config setting to redirect the default compiler location // Like fsharp-compiler-location try + // We let you set FSHARP_COMPILER_BIN. I've rarely seen this used and its not documented in the install instructions. + match Environment.GetEnvironmentVariable("FSHARP_COMPILER_BIN") with + | result when not (String.IsNullOrWhiteSpace result) -> Some result + |_-> // FSharp.Compiler support setting an appKey for compiler location. I've never seen this used. let result = tryAppConfig "fsharp-compiler-location" match result with @@ -201,11 +205,6 @@ module internal FSharpEnvironment = match probePoint with | Some p when safeExists (Path.Combine(p,"FSharp.Core.dll")) -> Some p | _ -> - // We let you set FSHARP_COMPILER_BIN. I've rarely seen this used and its not documented in the install instructions. - let result = Environment.GetEnvironmentVariable("FSHARP_COMPILER_BIN") - if not (String.IsNullOrEmpty(result)) then - Some result - else // For the prototype compiler, we can just use the current domain tryCurrentDomain() with e -> None