| OLD | NEW |
| 1 /* Implementation of the COUNT intrinsic | 1 /* Implementation of the COUNT intrinsic |
| 2 Copyright 2002, 2007, 2009 Free Software Foundation, Inc. | 2 Copyright 2002, 2007, 2009 Free Software Foundation, Inc. |
| 3 Contributed by Paul Brook <paul@nowt.org> | 3 Contributed by Paul Brook <paul@nowt.org> |
| 4 | 4 |
| 5 This file is part of the GNU Fortran 95 runtime library (libgfortran). | 5 This file is part of the GNU Fortran 95 runtime library (libgfortran). |
| 6 | 6 |
| 7 Libgfortran is free software; you can redistribute it and/or | 7 Libgfortran is free software; you can redistribute it and/or |
| 8 modify it under the terms of the GNU General Public | 8 modify it under the terms of the GNU General Public |
| 9 License as published by the Free Software Foundation; either | 9 License as published by the Free Software Foundation; either |
| 10 version 3 of the License, or (at your option) any later version. | 10 version 3 of the License, or (at your option) any later version. |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 53 index_type dim; | 53 index_type dim; |
| 54 int src_kind; | 54 int src_kind; |
| 55 int continue_loop; | 55 int continue_loop; |
| 56 | 56 |
| 57 /* Make dim zero based to avoid confusion. */ | 57 /* Make dim zero based to avoid confusion. */ |
| 58 dim = (*pdim) - 1; | 58 dim = (*pdim) - 1; |
| 59 rank = GFC_DESCRIPTOR_RANK (array) - 1; | 59 rank = GFC_DESCRIPTOR_RANK (array) - 1; |
| 60 | 60 |
| 61 src_kind = GFC_DESCRIPTOR_SIZE (array); | 61 src_kind = GFC_DESCRIPTOR_SIZE (array); |
| 62 | 62 |
| 63 len = array->dim[dim].ubound + 1 - array->dim[dim].lbound; | 63 len = GFC_DESCRIPTOR_EXTENT(array,dim); |
| 64 if (len < 0) | 64 if (len < 0) |
| 65 len = 0; | 65 len = 0; |
| 66 | 66 |
| 67 delta = array->dim[dim].stride * src_kind; | 67 delta = GFC_DESCRIPTOR_STRIDE_BYTES(array,dim); |
| 68 | 68 |
| 69 for (n = 0; n < dim; n++) | 69 for (n = 0; n < dim; n++) |
| 70 { | 70 { |
| 71 sstride[n] = array->dim[n].stride * src_kind; | 71 sstride[n] = GFC_DESCRIPTOR_STRIDE_BYTES(array,n); |
| 72 extent[n] = array->dim[n].ubound + 1 - array->dim[n].lbound; | 72 extent[n] = GFC_DESCRIPTOR_EXTENT(array,n); |
| 73 | 73 |
| 74 if (extent[n] < 0) | 74 if (extent[n] < 0) |
| 75 extent[n] = 0; | 75 extent[n] = 0; |
| 76 } | 76 } |
| 77 for (n = dim; n < rank; n++) | 77 for (n = dim; n < rank; n++) |
| 78 { | 78 { |
| 79 sstride[n] = array->dim[n + 1].stride * src_kind; | 79 sstride[n] = GFC_DESCRIPTOR_STRIDE_BYTES(array,n + 1); |
| 80 extent[n] = | 80 extent[n] = GFC_DESCRIPTOR_EXTENT(array,n + 1); |
| 81 array->dim[n + 1].ubound + 1 - array->dim[n + 1].lbound; | |
| 82 | 81 |
| 83 if (extent[n] < 0) | 82 if (extent[n] < 0) |
| 84 extent[n] = 0; | 83 extent[n] = 0; |
| 85 } | 84 } |
| 86 | 85 |
| 87 if (retarray->data == NULL) | 86 if (retarray->data == NULL) |
| 88 { | 87 { |
| 89 size_t alloc_size; | 88 size_t alloc_size, str; |
| 90 | 89 |
| 91 for (n = 0; n < rank; n++) | 90 for (n = 0; n < rank; n++) |
| 92 { | 91 { |
| 93 retarray->dim[n].lbound = 0; | |
| 94 retarray->dim[n].ubound = extent[n]-1; | |
| 95 if (n == 0) | 92 if (n == 0) |
| 96 retarray->dim[n].stride = 1; | 93 str = 1; |
| 97 else | 94 else |
| 98 retarray->dim[n].stride = retarray->dim[n-1].stride * extent[n-1]; | 95 str = GFC_DESCRIPTOR_STRIDE(retarray,n-1) * extent[n-1]; |
| 96 |
| 97 » GFC_DIMENSION_SET(retarray->dim[n], 0, extent[n] - 1, str); |
| 98 |
| 99 } | 99 } |
| 100 | 100 |
| 101 retarray->offset = 0; | 101 retarray->offset = 0; |
| 102 retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank; | 102 retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank; |
| 103 | 103 |
| 104 alloc_size = sizeof (GFC_INTEGER_16) * retarray->dim[rank-1].stride | 104 alloc_size = sizeof (GFC_INTEGER_16) * GFC_DESCRIPTOR_STRIDE(retarray,rank
-1) |
| 105 * extent[rank-1]; | 105 * extent[rank-1]; |
| 106 | 106 |
| 107 if (alloc_size == 0) | 107 if (alloc_size == 0) |
| 108 { | 108 { |
| 109 /* Make sure we have a zero-sized array. */ | 109 /* Make sure we have a zero-sized array. */ |
| 110 » retarray->dim[0].lbound = 0; | 110 » GFC_DIMENSION_SET(retarray->dim[0], 0, -1, 1); |
| 111 » retarray->dim[0].ubound = -1; | |
| 112 return; | 111 return; |
| 113 } | 112 } |
| 114 else | 113 else |
| 115 retarray->data = internal_malloc_size (alloc_size); | 114 retarray->data = internal_malloc_size (alloc_size); |
| 116 } | 115 } |
| 117 else | 116 else |
| 118 { | 117 { |
| 119 if (rank != GFC_DESCRIPTOR_RANK (retarray)) | 118 if (rank != GFC_DESCRIPTOR_RANK (retarray)) |
| 120 runtime_error ("rank of return array incorrect in" | 119 runtime_error ("rank of return array incorrect in" |
| 121 " COUNT intrinsic: is %ld, should be %ld", | 120 " COUNT intrinsic: is %ld, should be %ld", |
| 122 (long int) GFC_DESCRIPTOR_RANK (retarray), | 121 (long int) GFC_DESCRIPTOR_RANK (retarray), |
| 123 (long int) rank); | 122 (long int) rank); |
| 124 | 123 |
| 125 if (unlikely (compile_options.bounds_check)) | 124 if (unlikely (compile_options.bounds_check)) |
| 126 { | 125 { |
| 127 for (n=0; n < rank; n++) | 126 for (n=0; n < rank; n++) |
| 128 { | 127 { |
| 129 index_type ret_extent; | 128 index_type ret_extent; |
| 130 | 129 |
| 131 » ret_extent = retarray->dim[n].ubound + 1 | 130 » ret_extent = GFC_DESCRIPTOR_EXTENT(retarray,n); |
| 132 » » - retarray->dim[n].lbound; | |
| 133 if (extent[n] != ret_extent) | 131 if (extent[n] != ret_extent) |
| 134 runtime_error ("Incorrect extent in return value of" | 132 runtime_error ("Incorrect extent in return value of" |
| 135 " COUNT intrinsic in dimension %d:" | 133 " COUNT intrinsic in dimension %d:" |
| 136 " is %ld, should be %ld", (int) n + 1, | 134 " is %ld, should be %ld", (int) n + 1, |
| 137 (long int) ret_extent, (long int) extent[n]); | 135 (long int) ret_extent, (long int) extent[n]); |
| 138 } | 136 } |
| 139 } | 137 } |
| 140 } | 138 } |
| 141 | 139 |
| 142 for (n = 0; n < rank; n++) | 140 for (n = 0; n < rank; n++) |
| 143 { | 141 { |
| 144 count[n] = 0; | 142 count[n] = 0; |
| 145 dstride[n] = retarray->dim[n].stride; | 143 dstride[n] = GFC_DESCRIPTOR_STRIDE(retarray,n); |
| 146 if (extent[n] <= 0) | 144 if (extent[n] <= 0) |
| 147 len = 0; | 145 len = 0; |
| 148 } | 146 } |
| 149 | 147 |
| 150 base = array->data; | 148 base = array->data; |
| 151 | 149 |
| 152 if (src_kind == 1 || src_kind == 2 || src_kind == 4 || src_kind == 8 | 150 if (src_kind == 1 || src_kind == 2 || src_kind == 4 || src_kind == 8 |
| 153 #ifdef HAVE_GFC_LOGICAL_16 | 151 #ifdef HAVE_GFC_LOGICAL_16 |
| 154 || src_kind == 16 | 152 || src_kind == 16 |
| 155 #endif | 153 #endif |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 210 { | 208 { |
| 211 count[n]++; | 209 count[n]++; |
| 212 base += sstride[n]; | 210 base += sstride[n]; |
| 213 dest += dstride[n]; | 211 dest += dstride[n]; |
| 214 } | 212 } |
| 215 } | 213 } |
| 216 } | 214 } |
| 217 } | 215 } |
| 218 | 216 |
| 219 #endif | 217 #endif |
| OLD | NEW |