@@ -865,7 +865,6 @@ namespace Microsoft.FSharp.Core
865865 SetArray3D dst( src1+ i) ( src2+ j) ( src3+ k) ( GetArray3D src i j k)
866866
867867
868-
869868let inline GetArray4D ( arr : 'T [,,,]) ( n1 : int ) ( n2 : int ) ( n3 : int ) ( n4 : int ) = ( #" ldelem.multi 4 !0" type( 'T) arr n1 n2 n3 n4: 'T #)
870869let inline SetArray4D ( arr : 'T [,,,]) ( n1 : int ) ( n2 : int ) ( n3 : int ) ( n4 : int ) ( x : 'T ) = ( #" stelem.multi 4 !0" type( 'T) arr n1 n2 n3 n4 x #)
871870let inline Array4DLength1 ( arr : 'T [,,,]) = ( #" ldlen.multi 4 0" arr: int #)
@@ -5359,16 +5358,16 @@ namespace Microsoft.FSharp.Core
53595358[<CodeAnalysis.SuppressMessage( " Microsoft.Naming" , " CA1709:IdentifiersShouldBeCasedCorrectly" ); CodeAnalysis.SuppressMessage( " Microsoft.Naming" , " CA1704:IdentifiersShouldBeSpelledCorrectly" ) >]
53605359let PowGeneric ( one , mul , x : 'T , n ) = ComputePowerGenericInlined one mul x n
53615360
5362- let inline ComputeSlice start finish length =
5361+ let inline ComputeSlice bound start finish length=
53635362match start, finishwith
5364- | None, None-> 0 , length- 1
5365- | None, Some nwhen n>= 0 -> 0 , n
5366- | Some m, Nonewhen m<= length-> m, length- 1
5363+ | None, None-> bound , bound + length- 1
5364+ | None, Some nwhen n>= bound -> bound , n
5365+ | Some m, Nonewhen m<= bound + length-> m, bound + length- 1
53675366| Some m, Some n-> m, n
53685367| _ -> raise( System.IndexOutOfRangeException())
53695368
53705369let inline GetArraySlice ( arr : _ []) start finish =
5371- let start , finish = ComputeSlice start finish arr.Length
5370+ let start , finish = ComputeSlice0 start finish arr.Length
53725371 GetArraySub arr start( finish- start+ 1 )
53735372
53745373let inline SetArraySlice ( dst : _ []) start finish ( src : _ []) =
@@ -5377,91 +5376,113 @@ namespace Microsoft.FSharp.Core
53775376 SetArraySub dst start( finish- start+ 1 ) src
53785377
53795378let GetArraySlice2D ( arr : _ [,]) start1 finish1 start2 finish2 =
5380- let start1 , finish1 = ComputeSlice start1 finish1( GetArray2DLength1 arr)
5381- let start2 , finish2 = ComputeSlice start2 finish2( GetArray2DLength2 arr)
5379+ let bound1 = arr.GetLowerBound( 0 )
5380+ let bound2 = arr.GetLowerBound( 1 )
5381+ let start1 , finish1 = ComputeSlice bound1 start1 finish1( GetArray2DLength1 arr)
5382+ let start2 , finish2 = ComputeSlice bound2 start2 finish2( GetArray2DLength2 arr)
53825383let len1 = ( finish1- start1+ 1 )
53835384let len2 = ( finish2- start2+ 1 )
53845385 GetArray2DSub arr start1 start2 len1 len2
53855386
53865387let inline GetArraySlice2DFixed1 ( arr : _ [,]) fixed1 start2 finish2 =
5387- let start2 , finish2 = ComputeSlice start2 finish2( GetArray2DLength2 arr)
5388+ let bound2 = arr.GetLowerBound( 1 )
5389+ let start2 , finish2 = ComputeSlice bound2 start2 finish2( GetArray2DLength2 arr)
53885390let len2 = ( finish2- start2+ 1 )
53895391let dst = zeroCreate( if len2< 0 then 0 else len2)
53905392for j= 0 to len2- 1 do
53915393 SetArray dst j( GetArray2D arr fixed1( start2+ j))
53925394 dst
53935395
53945396let inline GetArraySlice2DFixed2 ( arr : _ [,]) start1 finish1 fixed2 =
5395- let start1 , finish1 = ComputeSlice start1 finish1( GetArray2DLength1 arr)
5397+ let bound1 = arr.GetLowerBound( 0 )
5398+ let start1 , finish1 = ComputeSlice bound1 start1 finish1( GetArray2DLength1 arr)
53965399let len1 = ( finish1- start1+ 1 )
53975400let dst = zeroCreate( if len1< 0 then 0 else len1)
53985401for i= 0 to len1- 1 do
53995402 SetArray dst i( GetArray2D arr( start1+ i) fixed2)
54005403 dst
54015404
54025405let inline SetArraySlice2DFixed1 ( dst : _ [,]) fixed1 start2 finish2 ( src : _ []) =
5403- let start2 = ( match start2with None-> 0 | Some n-> n)
5404- let finish2 = ( match finish2with None-> GetArray2DLength2 dst- 1 | Some n-> n)
5406+ let bound2 = dst.GetLowerBound( 1 )
5407+ let start2 = ( match start2with None-> bound2| Some n-> n)
5408+ let finish2 = ( match finish2with None-> bound2+ GetArray2DLength2 dst- 1 | Some n-> n)
54055409let len2 = ( finish2- start2+ 1 )
54065410for j= 0 to len2- 1 do
5407- SetArray2D dst fixed1( start2+ j) ( GetArray src j)
5411+ SetArray2D dst fixed1( bound2 + start2+ j) ( GetArray src j)
54085412
54095413let inline SetArraySlice2DFixed2 ( dst : _ [,]) start1 finish1 fixed2 ( src : _ []) =
5410- let start1 = ( match start1with None-> 0 | Some n-> n)
5411- let finish1 = ( match finish1with None-> GetArray2DLength1 dst- 1 | Some n-> n)
5414+ let bound1 = dst.GetLowerBound( 0 )
5415+ let start1 = ( match start1with None-> bound1| Some n-> n)
5416+ let finish1 = ( match finish1with None-> bound1+ GetArray2DLength1 dst- 1 | Some n-> n)
54125417let len1 = ( finish1- start1+ 1 )
54135418for i= 0 to len1- 1 do
5414- SetArray2D dst( start1+ i) fixed2( GetArray src i)
5419+ SetArray2D dst( bound1 + start1+ i) fixed2( GetArray src i)
54155420
54165421let SetArraySlice2D ( dst : _ [,]) start1 finish1 start2 finish2 ( src : _ [,]) =
5417- let start1 = ( match start1with None-> 0 | Some n-> n)
5418- let start2 = ( match start2with None-> 0 | Some n-> n)
5419- let finish1 = ( match finish1with None-> GetArray2DLength1 dst- 1 | Some n-> n)
5420- let finish2 = ( match finish2with None-> GetArray2DLength2 dst- 1 | Some n-> n)
5422+ let bound1 = dst.GetLowerBound( 0 )
5423+ let bound2 = dst.GetLowerBound( 1 )
5424+ let start1 = ( match start1with None-> bound1| Some n-> n)
5425+ let start2 = ( match start2with None-> bound2| Some n-> n)
5426+ let finish1 = ( match finish1with None-> bound1+ GetArray2DLength1 dst- 1 | Some n-> n)
5427+ let finish2 = ( match finish2with None-> bound2+ GetArray2DLength2 dst- 1 | Some n-> n)
54215428 SetArray2DSub dst start1 start2( finish1- start1+ 1 ) ( finish2- start2+ 1 ) src
54225429
54235430let GetArraySlice3D ( arr : _ [,,]) start1 finish1 start2 finish2 start3 finish3 =
5424- let start1 , finish1 = ComputeSlice start1 finish1( GetArray3DLength1 arr)
5425- let start2 , finish2 = ComputeSlice start2 finish2( GetArray3DLength2 arr)
5426- let start3 , finish3 = ComputeSlice start3 finish3( GetArray3DLength3 arr)
5431+ let bound1 = arr.GetLowerBound( 0 )
5432+ let bound2 = arr.GetLowerBound( 1 )
5433+ let bound3 = arr.GetLowerBound( 2 )
5434+ let start1 , finish1 = ComputeSlice bound1 start1 finish1( GetArray3DLength1 arr)
5435+ let start2 , finish2 = ComputeSlice bound2 start2 finish2( GetArray3DLength2 arr)
5436+ let start3 , finish3 = ComputeSlice bound3 start3 finish3( GetArray3DLength3 arr)
54275437let len1 = ( finish1- start1+ 1 )
54285438let len2 = ( finish2- start2+ 1 )
54295439let len3 = ( finish3- start3+ 1 )
54305440 GetArray3DSub arr start1 start2 start3 len1 len2 len3
54315441
54325442let SetArraySlice3D ( dst : _ [,,]) start1 finish1 start2 finish2 start3 finish3 ( src : _ [,,]) =
5433- let start1 = ( match start1with None-> 0 | Some n-> n)
5434- let start2 = ( match start2with None-> 0 | Some n-> n)
5435- let start3 = ( match start3with None-> 0 | Some n-> n)
5436- let finish1 = ( match finish1with None-> GetArray3DLength1 dst- 1 | Some n-> n)
5437- let finish2 = ( match finish2with None-> GetArray3DLength2 dst- 1 | Some n-> n)
5438- let finish3 = ( match finish3with None-> GetArray3DLength3 dst- 1 | Some n-> n)
5443+ let bound1 = dst.GetLowerBound( 0 )
5444+ let bound2 = dst.GetLowerBound( 1 )
5445+ let bound3 = dst.GetLowerBound( 2 )
5446+ let start1 = ( match start1with None-> bound1| Some n-> n)
5447+ let start2 = ( match start2with None-> bound2| Some n-> n)
5448+ let start3 = ( match start3with None-> bound3| Some n-> n)
5449+ let finish1 = ( match finish1with None-> bound1+ GetArray3DLength1 dst- 1 | Some n-> n)
5450+ let finish2 = ( match finish2with None-> bound2+ GetArray3DLength2 dst- 1 | Some n-> n)
5451+ let finish3 = ( match finish3with None-> bound3+ GetArray3DLength3 dst- 1 | Some n-> n)
54395452 SetArray3DSub dst start1 start2 start3( finish1- start1+ 1 ) ( finish2- start2+ 1 ) ( finish3- start3+ 1 ) src
54405453
54415454let GetArraySlice4D ( arr : _ [,,,]) start1 finish1 start2 finish2 start3 finish3 start4 finish4 =
5442- let start1 , finish1 = ComputeSlice start1 finish1( Array4DLength1 arr)
5443- let start2 , finish2 = ComputeSlice start2 finish2( Array4DLength2 arr)
5444- let start3 , finish3 = ComputeSlice start3 finish3( Array4DLength3 arr)
5445- let start4 , finish4 = ComputeSlice start4 finish4( Array4DLength4 arr)
5455+ let bound1 = arr.GetLowerBound( 0 )
5456+ let bound2 = arr.GetLowerBound( 1 )
5457+ let bound3 = arr.GetLowerBound( 2 )
5458+ let bound4 = arr.GetLowerBound( 3 )
5459+ let start1 , finish1 = ComputeSlice bound1 start1 finish1( Array4DLength1 arr)
5460+ let start2 , finish2 = ComputeSlice bound2 start2 finish2( Array4DLength2 arr)
5461+ let start3 , finish3 = ComputeSlice bound3 start3 finish3( Array4DLength3 arr)
5462+ let start4 , finish4 = ComputeSlice bound4 start4 finish4( Array4DLength4 arr)
54465463let len1 = ( finish1- start1+ 1 )
54475464let len2 = ( finish2- start2+ 1 )
54485465let len3 = ( finish3- start3+ 1 )
54495466let len4 = ( finish4- start4+ 1 )
54505467 GetArray4DSub arr start1 start2 start3 start4 len1 len2 len3 len4
54515468
54525469let SetArraySlice4D ( dst : _ [,,,]) start1 finish1 start2 finish2 start3 finish3 start4 finish4 ( src : _ [,,,]) =
5453- let start1 = ( match start1with None-> 0 | Some n-> n)
5454- let start2 = ( match start2with None-> 0 | Some n-> n)
5455- let start3 = ( match start3with None-> 0 | Some n-> n)
5456- let start4 = ( match start4with None-> 0 | Some n-> n)
5457- let finish1 = ( match finish1with None-> Array4DLength1 dst- 1 | Some n-> n)
5458- let finish2 = ( match finish2with None-> Array4DLength2 dst- 1 | Some n-> n)
5459- let finish3 = ( match finish3with None-> Array4DLength3 dst- 1 | Some n-> n)
5460- let finish4 = ( match finish4with None-> Array4DLength4 dst- 1 | Some n-> n)
5470+ let bound1 = dst.GetLowerBound( 0 )
5471+ let bound2 = dst.GetLowerBound( 1 )
5472+ let bound3 = dst.GetLowerBound( 2 )
5473+ let bound4 = dst.GetLowerBound( 3 )
5474+ let start1 = ( match start1with None-> bound1| Some n-> n)
5475+ let start2 = ( match start2with None-> bound2| Some n-> n)
5476+ let start3 = ( match start3with None-> bound3| Some n-> n)
5477+ let start4 = ( match start4with None-> bound4| Some n-> n)
5478+ let finish1 = ( match finish1with None-> bound1+ Array4DLength1 dst- 1 | Some n-> n)
5479+ let finish2 = ( match finish2with None-> bound2+ Array4DLength2 dst- 1 | Some n-> n)
5480+ let finish3 = ( match finish3with None-> bound3+ Array4DLength3 dst- 1 | Some n-> n)
5481+ let finish4 = ( match finish4with None-> bound4+ Array4DLength4 dst- 1 | Some n-> n)
54615482 SetArray4DSub dst start1 start2 start3 start4( finish1- start1+ 1 ) ( finish2- start2+ 1 ) ( finish3- start3+ 1 ) ( finish4- start4+ 1 ) src
54625483
54635484let inline GetStringSlice ( str : string ) start finish =
5464- let start , finish = ComputeSlice start finish str.Length
5485+ let start , finish = ComputeSlice0 start finish str.Length
54655486let len = finish- start+ 1
54665487if len<= 0 then String.Empty
54675488else str.Substring( start, len)