# HG changeset patch # User Max Brister # Date 1340841059 18000 # Node ID d3f9801b1f29e1e706116487429690bcfe1d2d3e # Parent 2d7c0c86e71290167c912a03bb2961fa4a6b5bf0 src/pt-jit.cc: Take into account step for matrix range subsasgn in JIT diff --git a/src/pt-jit.cc b/src/pt-jit.cc --- a/src/pt-jit.cc +++ b/src/pt-jit.cc @@ -263,13 +263,30 @@ if (*array->jit_ref_count () == 1 && index->all_elements_are_ints ()) { - octave_idx_type base = static_cast (index->base); + // this code is similar to idx_vector::fill, but we avoid allocating an + // idx_vector and its associated rep + octave_idx_type start = static_cast (index->base) - 1; + octave_idx_type step = static_cast (index->inc); octave_idx_type nelem = index->nelem; - if (base > 0 && base + nelem <= array->nelem ()) + octave_idx_type final = start + nelem * step; + if (step < 0) + { + step = -step; + std::swap (final, start); + } + + if (start >= 0 && final < mat->slice_len) { done = true; + double *data = array->jit_slice_data (); - std::fill (data + base - 1, data + base + nelem - 1, value); + if (step == 1) + std::fill (data + start, data + start + nelem, value); + else + { + for (octave_idx_type i = start; i < final; i += step) + data[i] = value; + } } }