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
4 changes: 3 additions & 1 deletion src/fsharp/TastOps.fs
Original file line number Diff line number Diff line change
Expand Up @@ -6187,7 +6187,6 @@ let mkCallToSByteOperator (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrin
let mkCallToInt16Operator (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.int16_operator_info, [[ty]], [e1], m)
let mkCallToUInt16Operator (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.uint16_operator_info, [[ty]], [e1], m)
let mkCallToIntOperator (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.int_operator_info, [[ty]], [e1], m)
let mkCallToEnumOperator (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.enum_operator_info, [[ty]], [e1], m)
let mkCallToInt32Operator (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.int32_operator_info, [[ty]], [e1], m)
let mkCallToUInt32Operator (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.uint32_operator_info, [[ty]], [e1], m)
let mkCallToInt64Operator (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.int64_operator_info, [[ty]], [e1], m)
Expand All @@ -6197,6 +6196,9 @@ let mkCallToDoubleOperator (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrin
let mkCallToIntPtrOperator (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.nativeint_operator_info, [[ty]], [e1], m)
let mkCallToUIntPtrOperator (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.unativeint_operator_info, [[ty]], [e1], m)

let mkCallToCharOperator (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.char_operator_info, [[ty]], [e1], m)
let mkCallToEnumOperator (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.enum_operator_info, [[ty]], [e1], m)

let mkCallArrayLength (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.array_length_info, [[ty]], [e1], m)
let mkCallArrayGet (g:TcGlobals) m ty e1 idx1 = mkApps g (typedExprForIntrinsic g m g.array_get_info, [[ty]], [ e1 ; idx1 ], m)
let mkCallArray2DGet (g:TcGlobals) m ty e1 idx1 idx2 = mkApps g (typedExprForIntrinsic g m g.array2D_get_info, [[ty]], [ e1 ; idx1; idx2 ], m)
Expand Down
4 changes: 3 additions & 1 deletion src/fsharp/TastOps.fsi
Original file line number Diff line number Diff line change
Expand Up @@ -1280,7 +1280,6 @@ val mkCallToSByteOperator : TcGlobals -> range -> TType -> Ex
val mkCallToInt16Operator : TcGlobals -> range -> TType -> Expr -> Expr
val mkCallToUInt16Operator : TcGlobals -> range -> TType -> Expr -> Expr
val mkCallToIntOperator : TcGlobals -> range -> TType -> Expr -> Expr
val mkCallToEnumOperator : TcGlobals -> range -> TType -> Expr -> Expr
val mkCallToInt32Operator : TcGlobals -> range -> TType -> Expr -> Expr
val mkCallToUInt32Operator : TcGlobals -> range -> TType -> Expr -> Expr
val mkCallToInt64Operator : TcGlobals -> range -> TType -> Expr -> Expr
Expand All @@ -1290,6 +1289,9 @@ val mkCallToDoubleOperator : TcGlobals -> range -> TType -> Ex
val mkCallToIntPtrOperator : TcGlobals -> range -> TType -> Expr -> Expr
val mkCallToUIntPtrOperator : TcGlobals -> range -> TType -> Expr -> Expr

val mkCallToCharOperator : TcGlobals -> range -> TType -> Expr -> Expr
val mkCallToEnumOperator : TcGlobals -> range -> TType -> Expr -> Expr

val mkCallDeserializeQuotationFSharp20Plus : TcGlobals -> range -> Expr -> Expr -> Expr -> Expr -> Expr
val mkCallDeserializeQuotationFSharp40Plus : TcGlobals -> range -> Expr -> Expr -> Expr -> Expr -> Expr -> Expr
val mkCallCastQuotation : TcGlobals -> range -> TType -> Expr -> Expr
Expand Down
12 changes: 9 additions & 3 deletions src/fsharp/TcGlobals.fs
Original file line number Diff line number Diff line change
Expand Up @@ -295,7 +295,6 @@ type public TcGlobals(compilingFslib: bool, ilg:ILGlobals, fslibCcu: CcuThunk, d
let v_int16_ty = mkNonGenericTy v_int16_tcr
let v_uint16_ty = mkNonGenericTy v_uint16_tcr
let v_int_ty = mkNonGenericTy v_int_tcr
let v_enum_ty = mkNonGenericTy v_int_tcr
let v_int32_ty = mkNonGenericTy v_int32_tcr
let v_uint32_ty = mkNonGenericTy v_uint32_tcr
let v_int64_ty = mkNonGenericTy v_int64_tcr
Expand All @@ -305,6 +304,7 @@ type public TcGlobals(compilingFslib: bool, ilg:ILGlobals, fslibCcu: CcuThunk, d
let v_nativeint_ty = mkNonGenericTy v_nativeint_tcr
let v_unativeint_ty = mkNonGenericTy v_unativeint_tcr

let v_enum_ty = mkNonGenericTy v_int_tcr
let v_bool_ty = mkNonGenericTy v_bool_tcr
let v_char_ty = mkNonGenericTy v_char_tcr
let v_obj_ty = mkNonGenericTy v_obj_tcr
Expand Down Expand Up @@ -607,7 +607,6 @@ type public TcGlobals(compilingFslib: bool, ilg:ILGlobals, fslibCcu: CcuThunk, d
let v_int16_operator_info = makeIntrinsicValRef(fslib_MFOperators_nleref, "int16" , None , Some "ToInt16", [vara], ([[varaTy]], v_int16_ty))
let v_uint16_operator_info = makeIntrinsicValRef(fslib_MFOperators_nleref, "uint16" , None , Some "ToUInt16", [vara], ([[varaTy]], v_uint16_ty))
let v_int_operator_info = makeIntrinsicValRef(fslib_MFOperators_nleref, "int" , None , Some "ToInt", [vara], ([[varaTy]], v_int_ty))
let v_enum_operator_info = makeIntrinsicValRef(fslib_MFOperators_nleref, "enum" , None , Some "ToEnum", [vara], ([[varaTy]], v_enum_ty))
let v_int32_operator_info = makeIntrinsicValRef(fslib_MFOperators_nleref, "int32" , None , Some "ToInt32", [vara], ([[varaTy]], v_int32_ty))
let v_uint32_operator_info = makeIntrinsicValRef(fslib_MFOperators_nleref, "uint32" , None , Some "ToUInt32", [vara], ([[varaTy]], v_uint32_ty))
let v_int64_operator_info = makeIntrinsicValRef(fslib_MFOperators_nleref, "int64" , None , Some "ToInt64", [vara], ([[varaTy]], v_int64_ty))
Expand All @@ -617,6 +616,9 @@ 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_char_operator_info = makeIntrinsicValRef(fslib_MFOperators_nleref, "char" , None , Some "ToChar", [vara], ([[varaTy]], v_char_ty))
let v_enum_operator_info = makeIntrinsicValRef(fslib_MFOperators_nleref, "enum" , None , Some "ToEnum", [vara], ([[varaTy]], v_enum_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))
Expand Down Expand Up @@ -886,6 +888,8 @@ type public TcGlobals(compilingFslib: bool, ilg:ILGlobals, fslibCcu: CcuThunk, d
member __.expr_tcr = v_expr_tcr
member __.raw_expr_tcr = v_raw_expr_tcr
member __.nativeint_tcr = v_nativeint_tcr
member __.unativeint_tcr = v_unativeint_tcr
member __.int_tcr = v_int_tcr
member __.int32_tcr = v_int32_tcr
member __.int16_tcr = v_int16_tcr
member __.int64_tcr = v_int64_tcr
Expand Down Expand Up @@ -1227,7 +1231,6 @@ type public TcGlobals(compilingFslib: bool, ilg:ILGlobals, fslibCcu: CcuThunk, d
member __.int16_operator_info = v_int16_operator_info
member __.uint16_operator_info = v_uint16_operator_info
member __.int_operator_info = v_int_operator_info
member __.enum_operator_info = v_enum_operator_info
member __.int32_operator_info = v_int32_operator_info
member __.uint32_operator_info = v_uint32_operator_info
member __.int64_operator_info = v_int64_operator_info
Expand All @@ -1237,6 +1240,9 @@ type public TcGlobals(compilingFslib: bool, ilg:ILGlobals, fslibCcu: CcuThunk, d
member __.nativeint_operator_info = v_nativeint_operator_info
member __.unativeint_operator_info = v_unativeint_operator_info

member __.char_operator_info = v_char_operator_info
member __.enum_operator_info = v_enum_operator_info

member val compare_operator_vref = ValRefForIntrinsic v_compare_operator_info
member val equals_operator_vref = ValRefForIntrinsic v_equals_operator_info
member val equals_nullable_operator_vref = ValRefForIntrinsic v_equals_nullable_operator_info
Expand Down
38 changes: 34 additions & 4 deletions src/fsharp/symbols/Exprs.fs
Original file line number Diff line number Diff line change
Expand Up @@ -268,6 +268,27 @@ module FSharpExprConvert =
| DT_REF -> None
| _ -> None

let (|TTypeConvOp|_|) (cenv:Impl.cenv) ty =
let g = cenv.g
match ty with
| TType_app (tcref,_) ->
match tcref with
| x when tyconRefEq g tcref g.sbyte_tcr -> Some mkCallToSByteOperator
| x when tyconRefEq g tcref g.byte_tcr -> Some mkCallToByteOperator
| x when tyconRefEq g tcref g.int16_tcr -> Some mkCallToInt16Operator
| x when tyconRefEq g tcref g.uint16_tcr -> Some mkCallToUInt16Operator
| x when tyconRefEq g tcref g.int_tcr -> Some mkCallToIntOperator
| x when tyconRefEq g tcref g.int32_tcr -> Some mkCallToInt32Operator
| x when tyconRefEq g tcref g.uint32_tcr -> Some mkCallToUInt32Operator
| x when tyconRefEq g tcref g.int64_tcr -> Some mkCallToInt64Operator
| x when tyconRefEq g tcref g.uint64_tcr -> Some mkCallToUInt64Operator
| x when tyconRefEq g tcref g.float32_tcr -> Some mkCallToSingleOperator
| x when tyconRefEq g tcref g.float_tcr -> Some mkCallToDoubleOperator
| x when tyconRefEq g tcref g.nativeint_tcr -> Some mkCallToIntPtrOperator
| x when tyconRefEq g tcref g.unativeint_tcr -> Some mkCallToUIntPtrOperator
| _ -> None
| _ -> None

let ConvType cenv typ = FSharpType(cenv, typ)
let ConvTypes cenv typs = List.map (ConvType cenv) typs
let ConvILTypeRefApp (cenv:Impl.cenv) m tref tyargs =
Expand Down Expand Up @@ -601,8 +622,14 @@ module FSharpExprConvert =
let argR = ConvExpr cenv env arg
E.ILFieldSet(None, typR, fspec.Name, argR)

| TOp.ILAsm([ ], _), _, [arg] ->
ConvExprPrim cenv env arg
| TOp.ILAsm([ ], [tty]), _, [arg] ->
match tty with
| TTypeConvOp cenv convOp ->
let ty = tyOfExpr cenv.g arg
let op = convOp cenv.g m ty arg
ConvExprPrim cenv env op
| _ ->
ConvExprPrim cenv env arg

| TOp.ILAsm([ I_box _ ], _), [ty], [arg] ->
let op = mkCallBox cenv.g m ty arg
Expand Down Expand Up @@ -671,9 +698,12 @@ module FSharpExprConvert =
let op2 = convertOp2 cenv.g m ty2 op1
ConvExprPrim cenv env op2

| TOp.ILAsm([ ILConvertOp convertOp ], _), _, [arg] ->
| TOp.ILAsm([ ILConvertOp convertOp ], [TType_app (tcref,_)]), _, [arg] ->
let ty = tyOfExpr cenv.g arg
let op = convertOp cenv.g m ty arg
let op =
if tyconRefEq cenv.g tcref cenv.g.char_tcr
then mkCallToCharOperator cenv.g m ty arg
else convertOp cenv.g m ty arg
ConvExprPrim cenv env op

| TOp.ILAsm([ I_throw ], _), _, [arg1] ->
Expand Down
Loading