/* Special implementation of the SPREAD intrinsic
- Copyright 2008, 2009 Free Software Foundation, Inc.
+ Copyright (C) 2008-2015 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
ncopies = pncopies;
- if (ret->data == NULL)
+ if (ret->base_addr == NULL)
{
size_t ub, stride;
GFC_DIMENSION_SET(ret->dim[n], 0, ub, stride);
}
ret->offset = 0;
- if (rs > 0)
- ret->data = internal_malloc_size (rs * sizeof(GFC_REAL_8));
- else
- {
- ret->data = internal_malloc_size (1);
- return;
- }
+
+ /* xmallocarray allocates a single byte for zero size. */
+ ret->base_addr = xmallocarray (rs, sizeof(GFC_REAL_8));
+ if (rs <= 0)
+ return;
}
else
{
}
sstride0 = sstride[0];
rstride0 = rstride[0];
- rptr = ret->data;
- sptr = source->data;
+ rptr = ret->base_addr;
+ sptr = source->base_addr;
while (sptr)
{
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_REAL_8));
+ ret->base_addr = xmallocarray (ncopies, sizeof (GFC_REAL_8));
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++)