From de84cfd328aaebd2cfaa4ccc6a66c197fa9f14c6 Mon Sep 17 00:00:00 2001 From: ncave <777696+ncave@users.noreply.github.com> Date: Thu, 1 Feb 2018 19:28:52 -0800 Subject: [PATCH] review fixes --- src/fsharp/TastOps.fs | 1 + src/fsharp/TastOps.fsi | 1 + src/fsharp/TcGlobals.fs | 6 +- src/fsharp/symbols/Exprs.fs | 15 +++- tests/service/ExprTests.fs | 154 ++++++++++++++++++++++-------------- 5 files changed, 114 insertions(+), 63 deletions(-) diff --git a/src/fsharp/TastOps.fs b/src/fsharp/TastOps.fs index 6f92367f0f..f8140121c8 100644 --- a/src/fsharp/TastOps.fs +++ b/src/fsharp/TastOps.fs @@ -6181,6 +6181,7 @@ let mkCallArray2DSet (g:TcGlobals) m ty e1 idx1 idx2 v = mkApps g (typed let mkCallArray3DSet (g:TcGlobals) m ty e1 idx1 idx2 idx3 v = mkApps g (typedExprForIntrinsic g m g.array3D_set_info, [[ty]], [ e1 ; idx1; idx2; idx3; v ], m) let mkCallArray4DSet (g:TcGlobals) m ty e1 idx1 idx2 idx3 idx4 v = mkApps g (typedExprForIntrinsic g m g.array4D_set_info, [[ty]], [ e1 ; idx1; idx2; idx3; idx4; v ], m) +let mkCallHash (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.hash_info, [[ty]], [ e1 ], m) let mkCallBox (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.box_info, [[ty]], [ e1 ], m) let mkCallIsNull (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.isnull_info, [[ty]], [ e1 ], m) let mkCallIsNotNull (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.isnotnull_info, [[ty]], [ e1 ], m) diff --git a/src/fsharp/TastOps.fsi b/src/fsharp/TastOps.fsi index 94624a804f..fb1822f362 100755 --- a/src/fsharp/TastOps.fsi +++ b/src/fsharp/TastOps.fsi @@ -1206,6 +1206,7 @@ val mkCallArray2DSet : TcGlobals -> range -> TType -> Expr -> Expr -> Ex val mkCallArray3DSet : TcGlobals -> range -> TType -> Expr -> Expr -> Expr -> Expr -> Expr -> Expr val mkCallArray4DSet : TcGlobals -> range -> TType -> Expr -> Expr -> Expr -> Expr -> Expr -> Expr -> Expr +val mkCallHash : TcGlobals -> range -> TType -> Expr -> Expr val mkCallBox : TcGlobals -> range -> TType -> Expr -> Expr val mkCallIsNull : TcGlobals -> range -> TType -> Expr -> Expr val mkCallIsNotNull : TcGlobals -> range -> TType -> Expr -> Expr diff --git a/src/fsharp/TcGlobals.fs b/src/fsharp/TcGlobals.fs index 032f4b5311..210dc16f2c 100755 --- a/src/fsharp/TcGlobals.fs +++ b/src/fsharp/TcGlobals.fs @@ -511,7 +511,7 @@ type public TcGlobals(compilingFslib: bool, ilg:ILGlobals, fslibCcu: CcuThunk, d let v_greater_than_operator_info = makeIntrinsicValRef(fslib_MFOperators_nleref, CompileOpName ">" , None , None , [vara], mk_rel_sig varaTy) let v_greater_than_or_equals_operator_info = makeIntrinsicValRef(fslib_MFOperators_nleref, CompileOpName ">=" , None , None , [vara], mk_rel_sig varaTy) - let v_enumOfValue_info = makeIntrinsicValRef(fslib_MFLanguagePrimitives_nleref, "EnumOfValue" , None , None , [vara; varb], ([[varaTy]], varbTy)) + let v_enumOfValue_info = makeIntrinsicValRef(fslib_MFLanguagePrimitives_nleref, "EnumOfValue" , None , None , [vara; varb], ([[varaTy]], varbTy)) let v_generic_comparison_withc_outer_info = makeIntrinsicValRef(fslib_MFLanguagePrimitives_nleref, "GenericComparisonWithComparer" , None , None , [vara], mk_compare_withc_sig varaTy) let v_generic_hash_withc_tuple2_info = makeIntrinsicValRef(fslib_MFHashCompare_nleref, "FastHashTuple2" , None , None , [vara;varb], mk_hash_withc_sig (decodeTupleTy tupInfoRef [varaTy; varbTy])) @@ -605,6 +605,7 @@ type public TcGlobals(compilingFslib: bool, ilg:ILGlobals, fslibCcu: CcuThunk, d let v_nativeint_operator_info = makeIntrinsicValRef(fslib_MFOperators_nleref, "nativeint" , None , Some "ToIntPtr", [vara], ([[varaTy]], v_nativeint_ty)) let v_unativeint_operator_info = makeIntrinsicValRef(fslib_MFOperators_nleref, "unativeint" , None , Some "ToUIntPtr", [vara], ([[varaTy]], v_unativeint_ty)) + let v_hash_info = makeIntrinsicValRef(fslib_MFOperators_nleref, "hash" , None , Some "Hash" , [vara], ([[varaTy]], v_int_ty)) let v_box_info = makeIntrinsicValRef(fslib_MFOperators_nleref, "box" , None , Some "Box" , [vara], ([[varaTy]], v_obj_ty)) let v_isnull_info = makeIntrinsicValRef(fslib_MFOperators_nleref, "isNull" , None , Some "IsNull" , [vara], ([[varaTy]], v_bool_ty)) let v_isnotnull_info = makeIntrinsicValRef(fslib_MFOperators_nleref, "isNotNull" , None , Some "IsNotNull" , [vara], ([[varaTy]], v_bool_ty)) @@ -665,7 +666,7 @@ type public TcGlobals(compilingFslib: bool, ilg:ILGlobals, fslibCcu: CcuThunk, d let v_cast_quotation_info = makeIntrinsicValRef(fslib_MFQuotations_nleref, "Cast" , Some "Expr" , None , [vara], ([[mkRawQuotedExprTy]], mkQuotedExprTy varaTy)) let v_lift_value_info = makeIntrinsicValRef(fslib_MFQuotations_nleref, "Value" , Some "Expr" , None , [vara], ([[varaTy]], mkRawQuotedExprTy)) let v_lift_value_with_name_info = makeIntrinsicValRef(fslib_MFQuotations_nleref, "ValueWithName" , Some "Expr" , None , [vara], ([[varaTy; v_string_ty]], mkRawQuotedExprTy)) - let v_lift_value_with_defn_info = makeIntrinsicValRef(fslib_MFQuotations_nleref, "WithValue" , Some "Expr" , None , [vara], ([[varaTy; mkQuotedExprTy varaTy]], mkQuotedExprTy varaTy)) + let v_lift_value_with_defn_info = makeIntrinsicValRef(fslib_MFQuotations_nleref, "WithValue" , Some "Expr" , None , [vara], ([[varaTy; mkQuotedExprTy varaTy]], mkQuotedExprTy varaTy)) let v_query_value_info = makeIntrinsicValRef(fslib_MFExtraTopLevelOperators_nleref, "query" , None , None , [], ([], mkQueryBuilderTy) ) let v_query_run_value_info = makeIntrinsicValRef(fslib_MFQueryRunExtensionsLowPriority_nleref, "Run" , Some "QueryBuilder" , None , [vara], ([[mkQueryBuilderTy];[mkQuotedExprTy varaTy]], varaTy) ) let v_query_run_enumerable_info = makeIntrinsicValRef(fslib_MFQueryRunExtensionsHighPriority_nleref, "Run" , Some "QueryBuilder" , None , [vara], ([[mkQueryBuilderTy];[mkQuotedExprTy (mkQuerySourceTy varaTy (mkNonGenericTy v_tcref_System_Collections_IEnumerable)) ]], mkSeqTy varaTy) ) @@ -1219,6 +1220,7 @@ type public TcGlobals(compilingFslib: bool, ilg:ILGlobals, fslibCcu: CcuThunk, d member __.greater_than_operator = v_greater_than_operator_info member __.greater_than_or_equals_operator = v_greater_than_or_equals_operator_info + member __.hash_info = v_hash_info member __.box_info = v_box_info member __.isnull_info = v_isnull_info member __.isnotnull_info = v_isnotnull_info diff --git a/src/fsharp/symbols/Exprs.fs b/src/fsharp/symbols/Exprs.fs index b15a0603fc..9106cc3d79 100644 --- a/src/fsharp/symbols/Exprs.fs +++ b/src/fsharp/symbols/Exprs.fs @@ -616,7 +616,13 @@ module FSharpExprConvert = let op = mkCallTypeTest cenv.g m ty arg ConvExprPrim cenv env op - | TOp.ILAsm([ I_ldtoken _ ], _), [ty], _ -> + | TOp.ILAsm ([ I_call (Normalcall, mspec, None) ], _), _, [arg] + when mspec.Name = "GetHashCode" -> + let ty = tyOfExpr cenv.g arg + let op = mkCallHash cenv.g m ty arg + ConvExprPrim cenv env op + + | TOp.ILAsm([ I_ldtoken (ILToken.ILType _ilty) ], _), [ty], _ -> let op = mkCallTypeOf cenv.g m ty ConvExprPrim cenv env op @@ -656,9 +662,10 @@ module FSharpExprConvert = let op = binaryOp cenv.g m ty arg1 arg2 ConvExprPrim cenv env op - | TOp.ILAsm([ ILConvertOp convertOp1; ILConvertOp convertOp2 ], _), [ty2], [arg] -> + | TOp.ILAsm([ ILConvertOp convertOp1; ILConvertOp convertOp2 ], _), _, [arg] -> let ty1 = tyOfExpr cenv.g arg let op1 = convertOp1 cenv.g m ty1 arg + let ty2 = tyOfExpr cenv.g op1 let op2 = convertOp2 cenv.g m ty2 op1 ConvExprPrim cenv env op2 @@ -747,6 +754,10 @@ module FSharpExprConvert = else lim1 E.FastIntegerForLoop(ConvExpr cenv env lim0, ConvExpr cenv env lim1, ConvExpr cenv env body, dir <> FSharpForLoopDown) + | TOp.ILCall(_, _, _, _isNewObj, _valUseFlags, _isProp, _, ilMethRef, _enclTypeArgs, _methTypeArgs, _tys), [], [arg] + when ilMethRef.EnclosingTypeRef.Name = "System.Type" && ilMethRef.Name = "GetTypeFromHandle" -> + ConvExprPrim cenv env arg + | TOp.ILCall(_, _, _, isNewObj, valUseFlags, _isProp, _, ilMethRef, enclTypeArgs, methTypeArgs, _tys), [], callArgs -> ConvILCall cenv env (isNewObj, valUseFlags, ilMethRef, enclTypeArgs, methTypeArgs, callArgs, m) diff --git a/tests/service/ExprTests.fs b/tests/service/ExprTests.fs index 86a70e0c67..a5e5fc9115 100644 --- a/tests/service/ExprTests.fs +++ b/tests/service/ExprTests.fs @@ -96,6 +96,33 @@ module internal Utils = and printIimpls iis = String.concat ";" (List.map printImlementation iis) and printImlementation (i, ors) = "interface " + printTy i + " with " + printOverrides ors + let rec printFSharpDecls prefix decls = + seq { + let mutable i = 0 + for decl in decls do + i <- i + 1 + match decl with + | FSharpImplementationFileDeclaration.Entity (e, sub) -> + yield sprintf "%s%i) ENTITY: %s %A" prefix i e.CompiledName (attribsOfSymbol e) + if not (Seq.isEmpty e.Attributes) then + yield sprintf "%sattributes: %A" prefix (Seq.toList e.Attributes) + if not (Seq.isEmpty e.DeclaredInterfaces) then + yield sprintf "%sinterfaces: %A" prefix (Seq.toList e.DeclaredInterfaces) + yield "" + yield! printFSharpDecls (prefix + "\t") sub + | FSharpImplementationFileDeclaration.MemberOrFunctionOrValue (meth, args, body) -> + yield sprintf "%s%i) METHOD: %s %A" prefix i meth.CompiledName (attribsOfSymbol meth) + yield sprintf "%stype: %A" prefix meth.FullType + yield sprintf "%sargs: %A" prefix args + // if not meth.IsCompilerGenerated then + yield sprintf "%sbody: %A" prefix body + yield "" + | FSharpImplementationFileDeclaration.InitAction (expr) -> + yield sprintf "%s%i) ACTION" prefix i + yield sprintf "%s%A" prefix expr + yield "" + } + let rec printDeclaration (excludes:HashSet<_> option) (d: FSharpImplementationFileDeclaration) = seq { match d with @@ -283,7 +310,7 @@ let localGenericFunctionExample() = let funcEx1 (x:int) = x let genericFuncEx1 (x:'T) = x let (topPair1a, topPair1b) = (1,2) -let tyfuncEx1<'T> = typeof<'T> + let testILCall1 = new obj() let testILCall2 = System.Console.WriteLine("176") @@ -578,7 +605,10 @@ let testHashInt64 (x:int64) = hash x let testHashUInt64 (x:uint64) = hash x let testHashIntPtr (x:nativeint) = hash x let testHashUIntPtr (x:unativeint) = hash x -// let testHashString (x:string) = hash x + +let testHashString (x:string) = hash x +let testDualConv (x:byte) = float32(x) +let testTypeOf (x:'T) = typeof<'T> """ File.WriteAllText(fileName2, fileSource2) @@ -624,7 +654,6 @@ let ``Test Declarations project1`` () = "let genericFuncEx1(x) = x @ (24,29--24,30)"; "let topPair1b = M.patternInput@25 ().Item1 @ (25,4--25,26)"; "let topPair1a = M.patternInput@25 ().Item0 @ (25,4--25,26)"; - "let tyfuncEx1 = Operators.TypeOf<'T> () @ (26,20--26,26)"; "let testILCall1 = new Object() @ (27,18--27,27)"; "let testILCall2 = Console.WriteLine (\"176\") @ (28,18--28,49)"; "let recValNeverUsedAtRuntime = recValNeverUsedAtRuntime@31.Force(()) @ (31,8--31,32)"; @@ -755,7 +784,10 @@ let ``Test Declarations project1`` () = "let testHashInt64(x) = Operators.Hash (x) @ (63,30--63,36)"; "let testHashUInt64(x) = Operators.Hash (x) @ (64,32--64,38)"; "let testHashIntPtr(x) = Operators.Hash (x) @ (65,35--65,41)"; - "let testHashUIntPtr(x) = Operators.Hash (x) @ (66,37--66,43)" ] + "let testHashUIntPtr(x) = Operators.Hash (x) @ (66,37--66,43)"; + "let testHashString(x) = Operators.Hash (x) @ (68,32--68,38)"; + "let testDualConv(x) = Operators.ToSingle (x) @ (69,28--69,38)"; + "let testTypeOf(x) = Operators.TypeOf<'T> () @ (70,24--70,30)" ] printDeclarations None (List.ofSeq file1.Declarations) |> Seq.toList @@ -806,7 +838,6 @@ let ``Test Optimized Declarations Project1`` () = "let genericFuncEx1(x) = x @ (24,29--24,30)"; "let topPair1b = M.patternInput@25 ().Item1 @ (25,4--25,26)"; "let topPair1a = M.patternInput@25 ().Item0 @ (25,4--25,26)"; - "let tyfuncEx1 = Type.GetTypeFromHandle (Operators.TypeOf<'T> ()) @ (26,20--26,26)"; "let testILCall1 = new Object() @ (27,18--27,27)"; "let testILCall2 = Console.WriteLine (\"176\") @ (28,18--28,49)"; "let recValNeverUsedAtRuntime = recValNeverUsedAtRuntime@31.Force(()) @ (31,8--31,32)"; @@ -897,60 +928,65 @@ let ``Test Optimized Declarations Project1`` () = "let letLambdaRes = ListModule.Map (fun tupledArg -> let a: Microsoft.FSharp.Core.int = tupledArg.Item0 in let b: Microsoft.FSharp.Core.int = tupledArg.Item1 in (LetLambda.f () a) b,Cons((1,2),Empty())) @ (249,19--249,71)"] let expected2 = - [ "type N"; "type IntAbbrev"; "let bool2 = False @ (6,12--6,17)"; - "let testEqualsOperator(e1) (e2) = HashCompare.GenericEqualityIntrinsic<'a> (e1,e2) @ (8,46--8,54)"; - "let testNotEqualsOperator(e1) (e2) = Operators.op_Equality (HashCompare.GenericEqualityIntrinsic<'a> (e1,e2),False) @ (9,46--9,55)"; - "let testLessThanOperator(e1) (e2) = HashCompare.GenericLessThanIntrinsic<'a> (e1,e2) @ (10,46--10,54)"; - "let testLessThanOrEqualsOperator(e1) (e2) = HashCompare.GenericLessOrEqualIntrinsic<'a> (e1,e2) @ (11,46--11,55)"; - "let testGreaterThanOperator(e1) (e2) = HashCompare.GenericGreaterThanIntrinsic<'a> (e1,e2) @ (12,46--12,54)"; - "let testGreaterThanOrEqualsOperator(e1) (e2) = HashCompare.GenericGreaterOrEqualIntrinsic<'a> (e1,e2) @ (13,46--13,55)"; - "let testAdditionOperator(e1) (e2) = Operators.op_Addition (e1,e2) @ (15,38--15,46)"; - "let testSubtractionOperator(e1) (e2) = Operators.op_Subtraction (e1,e2) @ (16,38--16,46)"; - "let testMultiplyOperator(e1) (e2) = Operators.op_Multiply (e1,e2) @ (17,37--17,46)"; - "let testDivisionOperator(e1) (e2) = Operators.op_Division (e1,e2) @ (18,38--18,46)"; - "let testModulusOperator(e1) (e2) = Operators.op_Modulus (e1,e2) @ (19,38--19,46)"; - "let testBitwiseAndOperator(e1) (e2) = Operators.op_BitwiseAnd (e1,e2) @ (20,38--20,48)"; - "let testBitwiseOrOperator(e1) (e2) = Operators.op_BitwiseOr (e1,e2) @ (21,38--21,48)"; - "let testBitwiseXorOperator(e1) (e2) = Operators.op_ExclusiveOr (e1,e2) @ (22,38--22,48)"; - "let testShiftLeftOperator(e1) (e2) = Operators.op_LeftShift (e1,Operators.op_BitwiseAnd (e2,31)) @ (23,38--23,48)"; - "let testShiftRightOperator(e1) (e2) = Operators.op_RightShift (e1,Operators.op_BitwiseAnd (e2,31)) @ (24,38--24,48)"; - "let testUnaryNegOperator(e1) = Operators.op_UnaryNegation (e1) @ (26,33--26,39)"; - "let testUnaryNotOperator(e1) = Operators.op_Equality (e1,False) @ (27,32--27,35)"; - "let testAdditionChecked(e1) (e2) = Checked.op_Addition (e1,e2) @ (29,35--29,52)"; - "let testSubtractionChecked(e1) (e2) = Checked.op_Subtraction (e1,e2) @ (30,35--30,52)"; - "let testMultiplyChecked(e1) (e2) = Checked.op_Multiply (e1,e2) @ (31,35--31,52)"; - "let testUnaryNegChecked(e1) = Checked.op_Subtraction (0,e1) @ (32,32--32,47)"; - "let testToByteChecked(e1) = Checked.ToByte (e1) @ (34,31--34,46)"; - "let testToSByteChecked(e1) = Checked.ToSByte (e1) @ (35,31--35,47)"; - "let testToInt16Checked(e1) = Checked.ToInt16 (e1) @ (36,31--36,47)"; - "let testToUInt16Checked(e1) = Checked.ToUInt16 (e1) @ (37,31--37,48)"; - "let testToIntChecked(e1) = Checked.ToInt32 (e1) @ (38,31--38,45)"; - "let testToInt32Checked(e1) = Checked.ToInt32 (e1) @ (39,31--39,47)"; - "let testToUInt32Checked(e1) = Checked.ToUInt32 (e1) @ (40,31--40,48)"; - "let testToInt64Checked(e1) = Checked.ToInt64 (e1) @ (41,31--41,47)"; - "let testToUInt64Checked(e1) = Checked.ToUInt64 (e1) @ (42,31--42,48)"; - "let testToIntPtrChecked(e1) = Checked.ToIntPtr (e1) @ (43,31--43,51)"; - "let testToUIntPtrChecked(e1) = Checked.ToUIntPtr (e1) @ (44,31--44,52)"; - "let testToByteOperator(e1) = Operators.ToByte (e1) @ (46,31--46,38)"; - "let testToSByteOperator(e1) = Operators.ToSByte (e1) @ (47,31--47,39)"; - "let testToInt16Operator(e1) = Operators.ToInt16 (e1) @ (48,31--48,39)"; - "let testToUInt16Operator(e1) = Operators.ToUInt16 (e1) @ (49,31--49,40)"; - "let testToIntOperator(e1) = e1 @ (50,35--50,37)"; - "let testToInt32Operator(e1) = e1 @ (51,37--51,39)"; - "let testToUInt32Operator(e1) = e1 @ (52,31--52,40)"; - "let testToInt64Operator(e1) = Operators.ToInt64 (e1) @ (53,31--53,39)"; - "let testToUInt64Operator(e1) = Operators.ToInt64 (e1) @ (54,31--54,40)"; - "let testToSingleOperator(e1) = Operators.ToSingle (e1) @ (55,31--55,41)"; - "let testToDoubleOperator(e1) = Operators.ToDouble (e1) @ (56,31--56,39)"; - "let testToIntPtrOperator(e1) = Operators.ToIntPtr (e1) @ (57,31--57,43)"; - "let testToUIntPtrOperator(e1) = Operators.ToIntPtr (e1) @ (58,31--58,44)"; - "let testHashChar(x) = Operators.op_BitwiseOr (Operators.op_LeftShift (x,16),x) @ (60,28--60,34)"; - "let testHashSByte(x) = Operators.op_ExclusiveOr (Operators.op_LeftShift (x,8),x) @ (61,30--61,36)"; - "let testHashInt16(x) = Operators.op_BitwiseOr (Operators.ToUInt16 (x),Operators.op_LeftShift (x,16)) @ (62,30--62,36)"; - "let testHashInt64(x) = Operators.op_ExclusiveOr (Operators.ToInt32 (x),Operators.ToInt32 (Operators.op_RightShift (x,32))) @ (63,30--63,36)"; - "let testHashUInt64(x) = Operators.op_ExclusiveOr (Operators.ToInt32 (x),Operators.ToInt32 (Operators.op_RightShift (x,32))) @ (64,32--64,38)"; - "let testHashIntPtr(x) = Operators.ToInt32 (Operators.ToUInt64 (x)) @ (65,35--65,41)"; - "let testHashUIntPtr(x) = Operators.op_BitwiseAnd (Operators.ToInt32 (Operators.ToUInt64 (x)),2147483647) @ (66,37--66,43)"] + [ "type N"; "type IntAbbrev"; "let bool2 = False @ (6,12--6,17)"; + "let testEqualsOperator(e1) (e2) = HashCompare.GenericEqualityIntrinsic<'a> (e1,e2) @ (8,46--8,54)"; + "let testNotEqualsOperator(e1) (e2) = Operators.op_Equality (HashCompare.GenericEqualityIntrinsic<'a> (e1,e2),False) @ (9,46--9,55)"; + "let testLessThanOperator(e1) (e2) = HashCompare.GenericLessThanIntrinsic<'a> (e1,e2) @ (10,46--10,54)"; + "let testLessThanOrEqualsOperator(e1) (e2) = HashCompare.GenericLessOrEqualIntrinsic<'a> (e1,e2) @ (11,46--11,55)"; + "let testGreaterThanOperator(e1) (e2) = HashCompare.GenericGreaterThanIntrinsic<'a> (e1,e2) @ (12,46--12,54)"; + "let testGreaterThanOrEqualsOperator(e1) (e2) = HashCompare.GenericGreaterOrEqualIntrinsic<'a> (e1,e2) @ (13,46--13,55)"; + "let testAdditionOperator(e1) (e2) = Operators.op_Addition (e1,e2) @ (15,38--15,46)"; + "let testSubtractionOperator(e1) (e2) = Operators.op_Subtraction (e1,e2) @ (16,38--16,46)"; + "let testMultiplyOperator(e1) (e2) = Operators.op_Multiply (e1,e2) @ (17,37--17,46)"; + "let testDivisionOperator(e1) (e2) = Operators.op_Division (e1,e2) @ (18,38--18,46)"; + "let testModulusOperator(e1) (e2) = Operators.op_Modulus (e1,e2) @ (19,38--19,46)"; + "let testBitwiseAndOperator(e1) (e2) = Operators.op_BitwiseAnd (e1,e2) @ (20,38--20,48)"; + "let testBitwiseOrOperator(e1) (e2) = Operators.op_BitwiseOr (e1,e2) @ (21,38--21,48)"; + "let testBitwiseXorOperator(e1) (e2) = Operators.op_ExclusiveOr (e1,e2) @ (22,38--22,48)"; + "let testShiftLeftOperator(e1) (e2) = Operators.op_LeftShift (e1,Operators.op_BitwiseAnd (e2,31)) @ (23,38--23,48)"; + "let testShiftRightOperator(e1) (e2) = Operators.op_RightShift (e1,Operators.op_BitwiseAnd (e2,31)) @ (24,38--24,48)"; + "let testUnaryNegOperator(e1) = Operators.op_UnaryNegation (e1) @ (26,33--26,39)"; + "let testUnaryNotOperator(e1) = Operators.op_Equality (e1,False) @ (27,32--27,35)"; + "let testAdditionChecked(e1) (e2) = Checked.op_Addition (e1,e2) @ (29,35--29,52)"; + "let testSubtractionChecked(e1) (e2) = Checked.op_Subtraction (e1,e2) @ (30,35--30,52)"; + "let testMultiplyChecked(e1) (e2) = Checked.op_Multiply (e1,e2) @ (31,35--31,52)"; + "let testUnaryNegChecked(e1) = Checked.op_Subtraction (0,e1) @ (32,32--32,47)"; + "let testToByteChecked(e1) = Checked.ToByte (e1) @ (34,31--34,46)"; + "let testToSByteChecked(e1) = Checked.ToSByte (e1) @ (35,31--35,47)"; + "let testToInt16Checked(e1) = Checked.ToInt16 (e1) @ (36,31--36,47)"; + "let testToUInt16Checked(e1) = Checked.ToUInt16 (e1) @ (37,31--37,48)"; + "let testToIntChecked(e1) = Checked.ToInt32 (e1) @ (38,31--38,45)"; + "let testToInt32Checked(e1) = Checked.ToInt32 (e1) @ (39,31--39,47)"; + "let testToUInt32Checked(e1) = Checked.ToUInt32 (e1) @ (40,31--40,48)"; + "let testToInt64Checked(e1) = Checked.ToInt64 (e1) @ (41,31--41,47)"; + "let testToUInt64Checked(e1) = Checked.ToUInt64 (e1) @ (42,31--42,48)"; + "let testToIntPtrChecked(e1) = Checked.ToIntPtr (e1) @ (43,31--43,51)"; + "let testToUIntPtrChecked(e1) = Checked.ToUIntPtr (e1) @ (44,31--44,52)"; + "let testToByteOperator(e1) = Operators.ToByte (e1) @ (46,31--46,38)"; + "let testToSByteOperator(e1) = Operators.ToSByte (e1) @ (47,31--47,39)"; + "let testToInt16Operator(e1) = Operators.ToInt16 (e1) @ (48,31--48,39)"; + "let testToUInt16Operator(e1) = Operators.ToUInt16 (e1) @ (49,31--49,40)"; + "let testToIntOperator(e1) = e1 @ (50,35--50,37)"; + "let testToInt32Operator(e1) = e1 @ (51,37--51,39)"; + "let testToUInt32Operator(e1) = e1 @ (52,31--52,40)"; + "let testToInt64Operator(e1) = Operators.ToInt64 (e1) @ (53,31--53,39)"; + "let testToUInt64Operator(e1) = Operators.ToInt64 (e1) @ (54,31--54,40)"; + "let testToSingleOperator(e1) = Operators.ToSingle (e1) @ (55,31--55,41)"; + "let testToDoubleOperator(e1) = Operators.ToDouble (e1) @ (56,31--56,39)"; + "let testToIntPtrOperator(e1) = Operators.ToIntPtr (e1) @ (57,31--57,43)"; + "let testToUIntPtrOperator(e1) = Operators.ToIntPtr (e1) @ (58,31--58,44)"; + "let testHashChar(x) = Operators.op_BitwiseOr (Operators.op_LeftShift (x,16),x) @ (60,28--60,34)"; + "let testHashSByte(x) = Operators.op_ExclusiveOr (Operators.op_LeftShift (x,8),x) @ (61,30--61,36)"; + "let testHashInt16(x) = Operators.op_BitwiseOr (Operators.ToUInt16 (x),Operators.op_LeftShift (x,16)) @ (62,30--62,36)"; + "let testHashInt64(x) = Operators.op_ExclusiveOr (Operators.ToInt32 (x),Operators.ToInt32 (Operators.op_RightShift (x,32))) @ (63,30--63,36)"; + "let testHashUInt64(x) = Operators.op_ExclusiveOr (Operators.ToInt32 (x),Operators.ToInt32 (Operators.op_RightShift (x,32))) @ (64,32--64,38)"; + "let testHashIntPtr(x) = Operators.ToInt32 (Operators.ToUInt64 (x)) @ (65,35--65,41)"; + "let testHashUIntPtr(x) = Operators.op_BitwiseAnd (Operators.ToInt32 (Operators.ToUInt64 (x)),2147483647) @ (66,37--66,43)"; + "let testHashString(x) = (if Operators.op_Equality (x,dflt) then 0 else Operators.Hash (x)) @ (68,32--68,38)"; + "let testDualConv(x) = Operators.ToSingle (Operators.ToDouble (x)) @ (69,28--69,38)"; + "let testTypeOf(x) = Operators.TypeOf<'T> () @ (70,24--70,30)" ] + + // printFSharpDecls "" file2.Declarations |> Seq.iter (printfn "%s") printDeclarations None (List.ofSeq file1.Declarations) |> Seq.toList