Patch title: Release 85 bulk changes
Abstract:
File: /pliant/language/debug/dbc.pli
Key:
    Removed line
    Added line
# Copyright  Hubert Tonneau  hubert.tonneau@pliant.cx
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License version 2
# as published by the Free Software Foundation.
#
# 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
# version 2 along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.

scope "/pliant/language/" "/pliant/install/"
module "/pliant/install/ring2.pli"

abstract
  [This module implements 'require' and 'ensure' DbC functions.] ; eol
doc
  [Documentation is available ] ; link "here" "debugging"


meta require e
  if e:size=1 and e:0:ident="{}"
    for (var Int i) 0 e:0:size-1
      e:0:i compile_as (expression immediat check:x substitute x e:0:i)
      e suckup e:0:i
    e set_void_result
  
function optimize_incorporate_ensure gc
  arg_rw GeneratorContext gc
  var Pointer:Arrow c :> pliant_general_dictionary first "pliant ensure"
  while c<>null and (entry_type:c<>Expression or { var Link:Expression post :> c map Expression ; post:value<>(addressof gc:function) })
    c :> pliant_general_dictionary next "pliant ensure" c
  if c<>null
    var Link:Expression post :> c map Expression
    var Pointer:Arrow a :> post:instructions first
    while a<>null
      gc insert_at_section_bottom section_terminate (a map Instruction)
      a :> post:instructions next a
    pliant_general_dictionary remove "pliant ensure" c
record_optimizer_function optimize_incorporate_ensure "pliant optimizer initialize"

meta ensure e
  var Pointer:Arrow c :> pliant_general_dictionary first "pliant function"
  if c=null or entry_type:c<>Function
    return
  if e:size=1 and e:0:ident="{}"
    var Link:Expression post :> new Expression
    post value := c
    for (var Int i) 0 e:0:size-1
      e:0:i compile_as (expression immediat check:x substitute x e:0:i)
      post suckup e:0:i
    e set_void_result
    e define "pliant ensure" addressof:post e:module

export require ensure