Code coverage for read.li


///////////////////////////////////////////////////////////////////////////////
//                             Lisaac Compiler                               //
//                                                                           //
//                   LSIIT - ULP - CNRS - INRIA - FRANCE                     //
//                                                                           //
//   This program 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.                                     //
//                                                                           //
//   This program 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 this program.  If not, see <http://www.gnu.org/licenses/>.   //
//                                                                           //
//                     http://isaacproject.u-strasbg.fr/                     //
///////////////////////////////////////////////////////////////////////////////
Section Header

  + name        := READ;

  - copyright   := "2003-2007 Benoit Sonntag";


  - author      := "Sonntag Benoit (bsonntag@loria.fr)";
  - comment     := "Read for local, global or slot";

Section Inherit

  + parent_expr:Expanded EXPR;

Section Public

  - is_slot:BOOLEAN <- FALSE;

  - variable:VARIABLE <-
  (
    deferred;
    NULL
  )
;

  - static_type:TYPE_FULL <-
  (
    variable.type
  )
;

  - my_copy:SELF <-
  ( + result:SELF;
    result ?= variable.read position;
    result
  )
;

  //
  // Searching.
  //

  - get_type t:TYPES_TMP <-
  (
    variable.get_type t;
  )
;

  - get_last_value:EXPR <- variable.get_last_value NULL;

  //
  // Executing pass.
  //

  - remove <-
  (
    variable.unread Self;
  )
;

  - is_require_constant:CONSTANT <-
  ( + result:CONSTANT;
    + j:INTEGER;
    + val:EXPR;
    + req_list:FAST_ARRAY(WRITE);
    //? { variable.require_first != NULL };
    /* BSBS: A REVOIR
    ((variable.require_first = NULL) && {!variable.type.is_expanded}).if {
      variable.intern_name.print; '\n'.print;
      "style [".print; variable.style.print; "]\n".print;
      warning_error (position,"READ : Compiler BUG! (require_first = NULL) ");
      //list_current.debug_display;
      //die_with_code 0;
      //crash_with_message "BUG READ : require_first = NULL";
    };
    */
    (variable.require_first != NULL).if {
      val := variable.require_first.value;
      (val.is_constant).if {
        result   ?= val;
        req_list := variable.require_list;
        (req_list != NULL).if {
          j := req_list.lower;
          {(j > req_list.upper) || {result = NULL}}.until_do {
            val := req_list.item j.value;
            ((! val.is_constant) || {result !~= val}).if {
              result := NULL;
            }
;
            j := j + 1;
          }
;
        }
;
      }
;
    }
;
    result
  )
;

  - execute_access_unlink:INSTR <-
  (
    deferred;
    NULL
  )
;

  - execute_access_link <- deferred;

  - execute_unlink:INSTR <-
  // Delete read
  (
    variable.unread Self;
    new_execute_pass;
    execute_access_unlink
  )
;

  - execute_link:EXPR <-
  ( + cst:CONSTANT;
    + rec:INSTR;
    + result:EXPR;
    + val:EXPR;
    + s:SLOT_DATA;
    + l:LOCAL;
    + wrt:WRITE;
    //+ old_loop_invariant:LOOP;

    simplify_type variable;

    //
    s ?= variable;
    (
      (s = NULL) || {
        ((s.style != '+') || {! s.id_section.is_mapping}) &&
        {(! variable.type.is_expanded) || {variable.type.is_default_expanded}}
      }

    )
.if {
      cst := is_require_constant;  // BSBS: Ce cas devrait rentrer dans get_last_value
      (cst != NULL).if {
        //
        // CONSTANT propagation.
        //
        variable.unread Self;
        rec := execute_access_unlink;
        (rec != NULL).if {
          list_current.insert_before rec;
        }
;
        result := cst.my_copy;
        new_execute_pass;
      }
.elseif {
        (val := get_last_value) != NULL
      }
 then {
        //
        // VALUE_EXPR propagation, step by step.
        //
        result := val;
        variable.unread Self;
        new_execute_pass;
      }
;
    }
;

    (result = NULL).if {
      //
      // Normal.
      //
      ((is_slot) && {loop_invariant != NULL} && {is_invariant}).if {
        //old_loop_invariant := loop_invariant;
        //loop_invariant := NULL;
        //
        l := static_type.get_temporary position;
        wrt := l.write position value Self;
        loop_list.insert_before wrt;
        result := l.read position;
        //
        //wrt.execute;
        //result := result.execute_link;
        //
        //loop_invariant := old_loop_invariant;
        count_invariant := count_invariant + 1;
      }
 else {
        variable.set_read;
        execute_access_link;
        result := Self;
      }
;
    }
;
    result
  )
;

  //
  // Display.
  //

  - display_ref buffer:STRING <-
  ( + req_list:FAST_ARRAY(WRITE);
    //is_verbose.if {
      buffer.add_last '<';
      buffer.append (object_id.to_string);
      buffer.append "/R";
      (variable.require_first != NULL).if {
        variable.require_first.object_id.append_in buffer;
        req_list := variable.require_list;
        (req_list != NULL).if {
          (req_list.lower).to (req_list.upper) do { j:INTEGER;
            buffer.add_last ',';
            req_list.item j.object_id.append_in buffer;
          }
;
        }
;
      }
 else {
        buffer.add_last '*';
      }
;
      buffer.append "/E";
      variable.ensure_count.append_in buffer;
      buffer.add_last '>';
    //};
  )
;

  - display buffer:STRING <-
  (
    buffer.append (variable.intern_name);
    buffer.add_last '[';
    variable.type.append_name_in buffer;
    buffer.add_last ']';
    display_ref buffer;
  )
;