view libinterp/parse-tree/oct-lvalue.h @ 28804:3719f5d452d4 stable

refactor implementation of END indexing in interpreter (bug #58953) * oct-lvalue.h, oct-lvalue.cc (octave_lvalue::eval_for_numel): New function. (octave_lvalue::m_nel): Delete data member. (octave_lvalue::numel (octave_idx_type)): Delete. (octave_lvalue::numel (void) const): Compute result instead of returning cached value. * pt-eval.h, pt-eval.cc (tree_evaluator::convert_to_const_vector): Simplify. (Fend): Call tree_evaluator::evaluate_end_expression to do the real work. (tree_evaluator::make_value_list): Don't check for magic_end here. (end_value, tree_evaluator::evaluate_end_expression): New functions. (tree_evaluator::m_index_list, tree_evaluator::m_index_type): New data members. (tree_evaluator::set_indexed_object, tree_evaluator::index_list, tree_evaluator::set_index_list, tree_evaluator::clear_index_list, tree_evaluator::append_index_list, tree_evaluator::index_type): New functions. * pt-idx.cc (make_value_list): Delete. (tree_index_expression::lvalue, tree_index_expression::evaluate_n): Refactor to avoid evaluating partial expressions to obtain values for the END function. Instead, cache info necessary to do that job as needed and inside the END function itself.
author John W. Eaton <jwe@octave.org> and Fernando Alvarruiz
date Mon, 21 Sep 2020 10:45:18 -0400
parents 9a3deb17b4ea
children d5efdf5cfc56 0a5b15007766
line wrap: on
line source

////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 1996-2020 The Octave Project Developers
//
// See the file COPYRIGHT.md in the top-level directory of this
// distribution or <https://octave.org/copyright/>.
//
// This file is part of Octave.
//
// Octave is free software: you can redistribute it and/or modify it
// under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Octave is distributed in the hope that it will be useful, but
// WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Octave; see the file COPYING.  If not, see
// <https://www.gnu.org/licenses/>.
//
////////////////////////////////////////////////////////////////////////

#if ! defined (octave_oct_lvalue_h)
#define octave_oct_lvalue_h 1

#include "octave-config.h"

#include <string>

#include "ovl.h"
#include "stack-frame.h"
#include "symrec.h"

namespace octave
{
  class octave_lvalue
  {
  public:

    octave_lvalue (const symbol_record& sr,
                   const std::shared_ptr<stack_frame>& frame)
      : m_sym (sr), m_frame (frame), m_black_hole (false),
        m_type (), m_idx ()
    { }

    octave_lvalue (const octave_lvalue&) = default;

    octave_lvalue& operator = (const octave_lvalue&) = delete;

    ~octave_lvalue (void) = default;

    bool is_black_hole (void) const { return m_black_hole; }

    void mark_black_hole (void) { m_black_hole = true; }

    bool is_defined (void) const;

    bool is_undefined (void) const;

    bool isstruct (void) const { return value().isstruct (); }

    void define (const octave_value& v);

    void assign (octave_value::assign_op, const octave_value&);

    octave_idx_type numel (void) const;

    void set_index (const std::string& t, const std::list<octave_value_list>& i);

    void clear_index (void) { m_type = ""; m_idx.clear (); }

    std::string index_type (void) const { return m_type; }

    bool index_is_empty (void) const;

    bool index_is_colon (void) const;

    void do_unary_op (octave_value::unary_op op);

    octave_value value (void) const;

  private:

    octave_value
    eval_for_numel (const std::string& type,
                    const std::list<octave_value_list>& idx) const;

    symbol_record m_sym;

    std::shared_ptr<stack_frame> m_frame;

    bool m_black_hole;

    std::string m_type;

    std::list<octave_value_list> m_idx;

    octave_idx_type m_nel;
  };
}

#endif