/* Special implementation of the SPREAD intrinsic
- Copyright 2008, 2009 Free Software Foundation, Inc.
+ Copyright (C) 2008-2020 Free Software Foundation, Inc.
Contributed by Thomas Koenig <tkoenig@gcc.gnu.org>, based on
spread_generic.c written by Paul Brook <paul@nowt.org>
-This file is part of the GNU Fortran 95 runtime library (libgfortran).
+This file is part of the GNU Fortran runtime library (libgfortran).
Libgfortran is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public
<http://www.gnu.org/licenses/>. */
#include "libgfortran.h"
-#include <stdlib.h>
-#include <assert.h>
#include <string.h>
ncopies = pncopies;
- if (ret->data == NULL)
+ if (ret->base_addr == NULL)
{
size_t ub, stride;
/* The front end has signalled that we need to populate the
return array descriptor. */
- ret->dtype = (source->dtype & ~GFC_DTYPE_RANK_MASK) | rrank;
+ ret->dtype.rank = rrank;
+
dim = 0;
rs = 1;
for (n = 0; n < rrank; n++)
}
ret->offset = 0;
- /* internal_malloc_size allocates a single byte for zero size. */
- ret->data = internal_malloc_size (rs * sizeof(GFC_INTEGER_16));
+ /* xmallocarray allocates a single byte for zero size. */
+ ret->base_addr = xmallocarray (rs, sizeof(GFC_INTEGER_16));
if (rs <= 0)
return;
}
}
sstride0 = sstride[0];
rstride0 = rstride[0];
- rptr = ret->data;
- sptr = source->data;
+ rptr = ret->base_addr;
+ sptr = source->base_addr;
while (sptr)
{
void
spread_scalar_i16 (gfc_array_i16 *ret, const GFC_INTEGER_16 *source,
- const index_type along, const index_type pncopies)
+ const index_type along, const index_type ncopies)
{
- int n;
- int ncopies = pncopies;
GFC_INTEGER_16 * restrict dest;
index_type stride;
if (along > 1)
runtime_error ("dim outside of rank in spread()");
- if (ret->data == NULL)
+ if (ret->base_addr == NULL)
{
- ret->data = internal_malloc_size (ncopies * sizeof (GFC_INTEGER_16));
+ ret->base_addr = xmallocarray (ncopies, sizeof (GFC_INTEGER_16));
ret->offset = 0;
GFC_DIMENSION_SET(ret->dim[0], 0, ncopies - 1, 1);
}
runtime_error ("dim too large in spread()");
}
- dest = ret->data;
+ dest = ret->base_addr;
stride = GFC_DESCRIPTOR_STRIDE(ret,0);
- for (n = 0; n < ncopies; n++)
+ for (index_type n = 0; n < ncopies; n++)
{
*dest = *source;
dest += stride;