Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit4200e8b

Browse files
committed
After code review, rolling back more stuff not needed for basic typecheck scenario
1 parent650df34 commit4200e8b

File tree

5 files changed

+68
-62
lines changed

5 files changed

+68
-62
lines changed

‎src/fsharp/creflect.fs‎

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,7 @@ let (|SimpleArrayLoopUpperBound|_|) expr =
125125
let(|SimpleArrayLoopBody|_|)g expr=
126126
match exprwith
127127
| Expr.Lambda(_, a, b,([_]as args), Expr.Let(TBind(forVarLoop, Expr.Op(TOp.ILAsm([I_ldelem_any(ILArrayShape[(Some0, None)],_)],_),[elemTy],[arr; idx], m1), seqPoint), body, m2, freeVars), m, ty)->
128-
letbody= Expr.Let(TBind(forVarLoop, mkCallArrayGet g m11elemTy arr[idx], seqPoint), body, m2, freeVars)
128+
letbody= Expr.Let(TBind(forVarLoop, mkCallArrayGet g m1 elemTy arr idx, seqPoint), body, m2, freeVars)
129129
letexpr= Expr.Lambda(newUnique(), a, b, args, body, m, ty)
130130
Some(arr, elemTy, expr)
131131
|_-> None
@@ -628,10 +628,13 @@ and ConvLValueExprCore cenv env expr =
628628
| TOp.ValFieldGetAddr(rfref),_,_-> ConvRFieldGet cenv env m rfref tyargs args
629629
| TOp.ILAsm([ I_ldflda(fspec)],_rtys),_,_-> ConvLdfld cenv env m fspec tyargs args
630630
| TOp.ILAsm([ I_ldsflda(fspec)],_rtys),_,_-> ConvLdfld cenv env m fspec tyargs args
631-
| TOp.ILAsm(([ I_ldelema(_ro,_isNativePtr,shape,_tyarg)]),_),(arr::idxs),[elemty]
632-
when shape.Rank= List.length idxs->
633-
assert(shape.Rank>=1&& shape.Rank<=32)
634-
ConvExpr cenv env(mkCallArrayGet cenv.g m shape.Rank elemty arr idxs)
631+
| TOp.ILAsm(([ I_ldelema(_ro,_isNativePtr,shape,_tyarg)]),_),(arr::idxs),[elemty]->
632+
match shape.Rank, idxswith
633+
|1,[idx1]-> ConvExpr cenv env(mkCallArrayGet cenv.g m elemty arr idx1)
634+
|2,[idx1; idx2]-> ConvExpr cenv env(mkCallArray2DGet cenv.g m elemty arr idx1 idx2)
635+
|3,[idx1; idx2; idx3]-> ConvExpr cenv env(mkCallArray3DGet cenv.g m elemty arr idx1 idx2 idx3)
636+
|4,[idx1; idx2; idx3; idx4]-> ConvExpr cenv env(mkCallArray4DGet cenv.g m elemty arr idx1 idx2 idx3 idx4)
637+
|_-> ConvExpr cenv env expr
635638
|_-> ConvExpr cenv env expr
636639
|_-> ConvExpr cenv env expr
637640

‎src/fsharp/env.fs‎

Lines changed: 22 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -483,7 +483,10 @@ type public TcGlobals =
483483
range_op_vref:ValRef;
484484
range_int32_op_vref:ValRef;
485485
//range_step_op_vref : ValRef;
486-
array_get_vref_map:ValRef[];
486+
array_get_vref:ValRef;
487+
array2D_get_vref:ValRef;
488+
array3D_get_vref:ValRef;
489+
array4D_get_vref:ValRef;
487490
seq_collect_vref:ValRef;
488491
seq_collect_info:IntrinsicValRef;
489492
seq_using_info:IntrinsicValRef;
@@ -511,8 +514,11 @@ type public TcGlobals =
511514
lazy_force_info:IntrinsicValRef;
512515
lazy_create_info:IntrinsicValRef;
513516

517+
array_get_info:IntrinsicValRef;
514518
array_length_info:IntrinsicValRef;
515-
array_get_info_map:IntrinsicValRef[];
519+
array2D_get_info:IntrinsicValRef;
520+
array3D_get_info:IntrinsicValRef;
521+
array4D_get_info:IntrinsicValRef;
516522
unpickle_quoted_info:IntrinsicValRef;
517523
cast_quotation_info:IntrinsicValRef;
518524
lift_value_info:IntrinsicValRef;
@@ -907,18 +913,9 @@ let mkTcGlobals (compilingFslib,sysCcu,ilg,fslibCcu,directoryToResolveRelativePa
907913
letenum_info= makeIntrinsicValRef(fslib_MFOperators_nleref,"enum",None,Some"ToEnum",[vara],([[int_ty]],varaTy))
908914
letrange_op_info= makeIntrinsicValRef(fslib_MFOperators_nleref,"op_Range",None,None,[vara],([[varaTy];[varaTy]],mkSeqTy varaTy))
909915
letrange_int32_op_info= makeIntrinsicValRef(fslib_MFOperatorIntrinsics_nleref,"RangeInt32",None,None,[],([[int_ty];[int_ty];[int_ty]],mkSeqTy int_ty))
910-
911-
letarray_get_info_map=
912-
Array.init32(fun idx->
913-
letrank= idx+1
914-
letintrinsicMethodName=
915-
if rank=1then"GetArray"
916-
else sprintf"GetArray%iD" rank
917-
letargTypes=
918-
[mkArrayType rank varaTy]::(List.replicate rank[int_ty])
919-
makeIntrinsicValRef(fslib_MFIntrinsicFunctions_nleref, intrinsicMethodName,None,None,[vara],(argTypes, varaTy)))
920-
921-
letarray_length_info= makeIntrinsicValRef(fslib_MFArrayModule_nleref,"length",None,Some"Length",[vara],([[mkArrayType1 varaTy]], varaTy))
916+
letarray2D_get_info= makeIntrinsicValRef(fslib_MFIntrinsicFunctions_nleref,"GetArray2D",None,None,[vara],([[mkArrayType2 varaTy];[int_ty];[int_ty]],varaTy))
917+
letarray3D_get_info= makeIntrinsicValRef(fslib_MFIntrinsicFunctions_nleref,"GetArray3D",None,None,[vara],([[mkArrayType3 varaTy];[int_ty];[int_ty];[int_ty]],varaTy))
918+
letarray4D_get_info= makeIntrinsicValRef(fslib_MFIntrinsicFunctions_nleref,"GetArray4D",None,None,[vara],([[mkArrayType4 varaTy];[int_ty];[int_ty];[int_ty];[int_ty]],varaTy))
922919

923920
letseq_collect_info= makeIntrinsicValRef(fslib_MFSeqModule_nleref,"collect",None,Some"Collect",[vara;varb;varc],([[varaTy--> varbTy];[mkSeqTy varaTy]], mkSeqTy varcTy))
924921
letseq_delay_info= makeIntrinsicValRef(fslib_MFSeqModule_nleref,"delay",None,Some"Delay",[varb],([[unit_ty--> mkSeqTy varbTy]], mkSeqTy varbTy))
@@ -928,7 +925,7 @@ let mkTcGlobals (compilingFslib,sysCcu,ilg,fslibCcu,directoryToResolveRelativePa
928925
letseq_finally_info= makeIntrinsicValRef(fslib_MFRuntimeHelpers_nleref,"EnumerateThenFinally",None,None,[varb],([[mkSeqTy varbTy];[unit_ty--> unit_ty]], mkSeqTy varbTy))
929926
letseq_of_functions_info= makeIntrinsicValRef(fslib_MFRuntimeHelpers_nleref,"EnumerateFromFunctions",None,None,[vara;varb],([[unit_ty--> varaTy];[varaTy--> bool_ty];[varaTy--> varbTy]], mkSeqTy varbTy))
930927
letcreate_event_info= makeIntrinsicValRef(fslib_MFRuntimeHelpers_nleref,"CreateEvent",None,None,[vara;varb],([[varaTy--> unit_ty];[varaTy--> unit_ty];[(obj_ty-->(varbTy--> unit_ty))--> varaTy]], TType_app(fslib_IEvent2_tcr,[varaTy;varbTy])))
931-
letseq_to_array_info= makeIntrinsicValRef(fslib_MFSeqModule_nleref,"toArray",None,Some"ToArray",[varb],([[mkSeqTy varbTy]], mkArrayType1 varbTy))
928+
letseq_to_array_info= makeIntrinsicValRef(fslib_MFSeqModule_nleref,"toArray",None,Some"ToArray",[varb],([[mkSeqTy varbTy]], mkArrayType1 varbTy))
932929
letseq_to_list_info= makeIntrinsicValRef(fslib_MFSeqModule_nleref,"toList",None,Some"ToList",[varb],([[mkSeqTy varbTy]], mkListTy varbTy))
933930
letseq_map_info= makeIntrinsicValRef(fslib_MFSeqModule_nleref,"map",None,Some"Map",[vara;varb],([[varaTy--> varbTy];[mkSeqTy varaTy]], mkSeqTy varbTy))
934931
letseq_singleton_info= makeIntrinsicValRef(fslib_MFSeqModule_nleref,"singleton",None,Some"Singleton",[vara],([[varaTy]], mkSeqTy varaTy))
@@ -943,6 +940,8 @@ let mkTcGlobals (compilingFslib,sysCcu,ilg,fslibCcu,directoryToResolveRelativePa
943940
letsplice_expr_info= makeIntrinsicValRef(fslib_MFExtraTopLevelOperators_nleref,"op_Splice",None,None,[vara],([[mkQuotedExprTy varaTy]], varaTy))
944941
letsplice_raw_expr_info= makeIntrinsicValRef(fslib_MFExtraTopLevelOperators_nleref,"op_SpliceUntyped",None,None,[vara],([[mkRawQuotedExprTy]], varaTy))
945942
letnew_decimal_info= makeIntrinsicValRef(fslib_MFIntrinsicFunctions_nleref,"MakeDecimal",None,None,[],([[int_ty];[int_ty];[int_ty];[bool_ty];[byte_ty]], decimal_ty))
943+
letarray_get_info= makeIntrinsicValRef(fslib_MFIntrinsicFunctions_nleref,"GetArray",None,None,[vara],([[mkArrayType1 varaTy];[int_ty]], varaTy))
944+
letarray_length_info= makeIntrinsicValRef(fslib_MFArrayModule_nleref,"length",None,Some"Length",[vara],([[mkArrayType1 varaTy]], varaTy))
946945
letunpickle_quoted_info= makeIntrinsicValRef(fslib_MFQuotations_nleref,"Deserialize",Some"Expr",None,[],([[system_Type_typ;mkListTy system_Type_typ;mkListTy mkRawQuotedExprTy; mkArrayType1 byte_ty]], mkRawQuotedExprTy))
947946
letcast_quotation_info= makeIntrinsicValRef(fslib_MFQuotations_nleref,"Cast",Some"Expr",None,[vara],([[mkRawQuotedExprTy]], mkQuotedExprTy varaTy))
948947
letlift_value_info= makeIntrinsicValRef(fslib_MFQuotations_nleref,"Value",Some"Expr",None,[vara],([[varaTy]], mkRawQuotedExprTy))
@@ -1354,7 +1353,10 @@ let mkTcGlobals (compilingFslib,sysCcu,ilg,fslibCcu,directoryToResolveRelativePa
13541353
range_int32_op_vref= ValRefForIntrinsic range_int32_op_info;
13551354
//range_step_op_vref = ValRefForIntrinsic range_step_op_info;
13561355
array_length_info= array_length_info
1357-
array_get_vref_map= array_get_info_map|> Array.map ValRefForIntrinsic;
1356+
array_get_vref= ValRefForIntrinsic array_get_info;
1357+
array2D_get_vref= ValRefForIntrinsic array2D_get_info;
1358+
array3D_get_vref= ValRefForIntrinsic array3D_get_info;
1359+
array4D_get_vref= ValRefForIntrinsic array4D_get_info;
13581360
seq_singleton_vref= ValRefForIntrinsic seq_singleton_info;
13591361
seq_collect_vref= ValRefForIntrinsic seq_collect_info;
13601362
seq_collect_info= seq_collect_info;
@@ -1396,7 +1398,10 @@ let mkTcGlobals (compilingFslib,sysCcu,ilg,fslibCcu,directoryToResolveRelativePa
13961398
create_event_info= create_event_info;
13971399
seq_to_list_info= seq_to_list_info;
13981400
seq_to_array_info= seq_to_array_info;
1399-
array_get_info_map= array_get_info_map;
1401+
array_get_info= array_get_info;
1402+
array2D_get_info= array2D_get_info;
1403+
array3D_get_info= array3D_get_info;
1404+
array4D_get_info= array4D_get_info;
14001405
unpickle_quoted_info= unpickle_quoted_info;
14011406
cast_quotation_info= cast_quotation_info;
14021407
lift_value_info= lift_value_info;

‎src/fsharp/patcompile.fs‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1098,7 +1098,7 @@ let CompilePatternBasic
10981098
| TPat_array(argpats,ty,_)->
10991099
match discrimwith
11001100
| Test.ArrayLength(n,_)when List.length argpats= n->
1101-
letaccessf' j tpinst e'= mkCallArrayGet g exprm1ty(accessf tpinst e')[(mkInt g exprm j)]
1101+
letaccessf' j tpinst e'= mkCallArrayGet g exprm ty(accessf tpinst e')(mkInt g exprm j)
11021102
mkSubFrontiers path accessf' active' argpats(fun path j-> PathArray(path,ty,List.length argpats,j))
11031103
// Successful length tests refute all other lengths
11041104
| Test.ArrayLength_->

‎src/fsharp/tastops.fs‎

Lines changed: 33 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -536,7 +536,6 @@ let mkArrayTy g rank ty m =
536536
else
537537
TType_app(g.il_arr_tcr_map.[rank-1],[ty])
538538

539-
540539
//--------------------------------------------------------------------------
541540
// Tuple compilation (types)
542541
//------------------------------------------------------------------------
@@ -1431,7 +1430,7 @@ let isByrefLikeTyconRef g tcref =
14311430
isTypeConstructorEqualToOptional g g.system_RuntimeArgumentHandle_tcref tcref
14321431

14331432
letisArrayTy g ty= ty|> stripTyEqns g|>(function TType_app(tcref,_)-> isArrayTyconRef g tcref|_->false)
1434-
letisArray1DTy g ty= ty|> stripTyEqns g|>(function TType_app(tcref,_)-> tyconRefEq g tcref g.il_arr_tcr_map.[0]|_->false)
1433+
letisArray1DTy g ty= ty|> stripTyEqns g|>(function TType_app(tcref,_)-> tyconRefEq g tcref g.il_arr_tcr_map.[0]|_->false)
14351434
letisUnitTy g ty= ty|> stripTyEqns g|>(function TType_app(tcref,_)-> tyconRefEq g g.unit_tcr_canon tcref|_->false)
14361435
letisObjTy g ty= ty|> stripTyEqns g|>(function TType_app(tcref,_)-> tyconRefEq g g.system_Object_tcref tcref|_->false)
14371436
letisVoidTy g ty= ty|> stripTyEqns g|>(function TType_app(tcref,_)-> tyconRefEq g g.system_Void_tcref tcref|_->false)
@@ -5354,16 +5353,22 @@ let rec mkExprAddrOfExpr g mustTakeAddress useReadonlyForGenericArrayAddress mut
53545353
(fun x-> x), mkStaticRecdFieldGetAddr(rfref,tinst,m)
53555354

53565355
// LVALUE: "e.[n]" where e is an array of structs
5357-
// LVALUE: "e.[n1,n2]", "e.[n1,n2,n3]", "e.[n1,n2,n3,n4]", etc. where e is an array of structs
5358-
| Expr.App(Expr.Val(vf,_,_),_,[elemTy],(aexpr::args),_)
5359-
when(g.array_get_vref_map|> Array.exists(valRefEq g vf))->
5360-
5361-
// Handle single-dimensional (rank 1) arrays separately.
5362-
letshape=
5363-
if valRefEq g vf g.array_get_vref_map.[0]then
5364-
ILArrayShape.SingleDimensional
5365-
else
5366-
ILArrayShape.FromRank args.Length
5356+
| Expr.App(Expr.Val(vf,_,_),_,[elemTy],[aexpr;nexpr],_)
5357+
when(valRefEq g vf g.array_get_vref)->
5358+
5359+
letshape= ILArrayShape.SingleDimensional
5360+
letreadonly=if isTyparTy g elemTy&& useReadonlyForGenericArrayAddressthen ReadonlyAddresselse NormalAddress
5361+
letisNativePtr=
5362+
match addrExprValwith
5363+
| Some(vf)-> valRefEq g vf g.addrof2_vref
5364+
|_->false
5365+
(fun x-> x), Expr.Op(TOp.ILAsm([IL.I_ldelema(readonly,isNativePtr,shape,mkILTyvarTy0us)],[mkByrefTy g elemTy]),[elemTy],[aexpr;nexpr],m)
5366+
5367+
// LVALUE: "e.[n1,n2]", "e.[n1,n2,n3]", "e.[n1,n2,n3,n4]" where e is an array of structs
5368+
| Expr.App(Expr.Val(vf,_,_),_,[elemTy],(aexpr::args),_)
5369+
when(valRefEq g vf g.array2D_get_vref|| valRefEq g vf g.array3D_get_vref|| valRefEq g vf g.array4D_get_vref)->
5370+
5371+
letshape= ILArrayShape.FromRank args.Length
53675372
letreadonly=if isTyparTy g elemTy&& useReadonlyForGenericArrayAddressthen ReadonlyAddresselse NormalAddress
53685373
letisNativePtr=
53695374
match addrExprValwith
@@ -5849,12 +5854,10 @@ let mkCallGenericHashWithComparerOuter g m ty comp e1 = mkApps g (ty
58495854
letmkCallSubtractionOperator g m ty e1 e2= mkApps g(typedExprForIntrinsic g m g.unchecked_subtraction_info,[[ty; ty; ty]],[e1;e2], m)
58505855

58515856
letmkCallArrayLength g m ty el= mkApps g(typedExprForIntrinsic g m g.array_length_info,[[ty]],[el], m)
5852-
5853-
letmkCallArrayGet g m rank ty e1 indices=
5854-
assert(rank= List.length indices)
5855-
assert(rank>=1&& rank<=32)
5856-
mkApps g(typedExprForIntrinsic g m g.array_get_info_map.[rank-1],[[ty]], e1:: indices, m)
5857-
5857+
letmkCallArrayGet g m ty e1 e2= mkApps g(typedExprForIntrinsic g m g.array_get_info,[[ty]],[ e1; e2], m)
5858+
letmkCallArray2DGet g m ty e1 idx1 idx2= mkApps g(typedExprForIntrinsic g m g.array2D_get_info,[[ty]],[ e1; idx1; idx2], m)
5859+
letmkCallArray3DGet g m ty e1 idx1 idx2 idx3= mkApps g(typedExprForIntrinsic g m g.array3D_get_info,[[ty]],[ e1; idx1; idx2; idx3], m)
5860+
letmkCallArray4DGet g m ty e1 idx1 idx2 idx3 idx4= mkApps g(typedExprForIntrinsic g m g.array4D_get_info,[[ty]],[ e1; idx1; idx2; idx3; idx4], m)
58585861
letmkCallNewDecimal g m(e1,e2,e3,e4,e5)= mkApps g(typedExprForIntrinsic g m g.new_decimal_info,[],[ e1;e2;e3;e4;e5], m)
58595862

58605863
letmkCallNewFormat g m aty bty cty dty ety e1= mkApps g(typedExprForIntrinsic g m g.new_format_info,[[aty;bty;cty;dty;ety]],[ e1], m)
@@ -6673,33 +6676,25 @@ let typarEnc _g (gtpsType,gtpsMethod) typar =
66736676
| None-> warning(InternalError("Typar not found during XmlDoc generation",typar.Range))
66746677
"``0"// REVIEW: this should be ERROR not WARNING?
66756678

6676-
/// IL array type encodings. The array index is (rank - 1).
6677-
letprivatearrayTypeEncodings=
6678-
Array.init32(fun idx->
6679-
letrank= idx+1
6680-
if rank=1then
6681-
// The easy case
6682-
"[]"
6683-
else
6684-
// REVIEW
6685-
// In fact IL supports 3 kinds of multidimensional arrays, and each kind of array has its own xmldoc spec.
6686-
// We don't support all these, and instead always pull xmldocs for 0-based-arbitrary-length ("0:") multidimensional arrays.
6687-
// This is probably the 99% case anyway.
6688-
"["+ System.String.Join(",", Array.create rank"0:")+"]")
6689-
66906679
let rectypeEnc g(gtpsType,gtpsMethod)ty=
66916680
if verbosethen dprintf"--> typeEnc";
66926681
match(stripTyEqns g ty)with
66936682
| TType_forall_->
66946683
"Microsoft.FSharp.Core.FSharpTypeFunc"
66956684
|_when isArrayTy g ty->
66966685
lettcref,tinst= destAppTy g ty
6697-
letarraySuffix=
6698-
letarrayRank= rankOfArrayTyconRef g tcref
6699-
if arrayRank>=1&& arrayRank<=32then
6700-
arrayTypeEncodings.[arrayRank-1]
6701-
else
6702-
failwith"impossible: rankOfArrayTyconRef: unsupported array rank"
6686+
letarraySuffix=
6687+
match rankOfArrayTyconRef g tcrefwith
6688+
// The easy case
6689+
|1->"[]"
6690+
// REVIEW
6691+
// In fact IL supports 3 kinds of multidimensional arrays, and each kind of array has its own xmldoc spec.
6692+
// We don't support all these, and instead always pull xmldocs for 0-based-arbitrary-length ("0:") multidimensional arrays.
6693+
// This is probably the 99% case anyway.
6694+
|2->"[0:,0:]"
6695+
|3->"[0:,0:,0:]"
6696+
|4->"[0:,0:,0:,0:]"
6697+
|_-> failwith"impossible: rankOfArrayTyconRef: unsupported array rank"
67036698
typeEnc g(gtpsType,gtpsMethod)(List.head tinst)^ arraySuffix
67046699
| TType_ucase(UCRef(tcref,_),tinst)
67056700
| TType_app(tcref,tinst)->

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp