Patch title: Release 85 bulk changes
Abstract:
File: /pliant/language/basic/part.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"

type PartProperty
  field Str label
  field CBool restart


meta part e
  if e:size<2 or e:size>3 or e:0:ident=""
    return
  if e:size=3 and not (e:1 cast Str)
    return
  var Str label := e:0:ident
  var Link:Expression body :> e e:size-1
  if body:ident<>"{}"
    return
  if e:size=3
    var Link:Argument ar :> argument local ActionRecord
    e suckup e:1
    e add (instruction (the_function mt_action_push_record ActionRecord Str) ar e:1:result)
  var Link:Instruction begin :> instruction (the_function 'do nothing')
  e add begin
  var Link:Void v :> new Void
  e:module define "pliant part "+label addressof:v
  body compile
  e:module undefine "pliant part "+label addressof:v
  e suckup body
  var Link:Instruction end :> instruction (the_function 'do nothing')
  e add end
  if e:size=3
    e add (instruction (the_function mt_action_pull_record ActionRecord) ar)
  var Pointer:Arrow c :> e:instructions first
  while c<>null
    var Pointer:Instruction i :> c map Instruction
    if (addressof i:jump)=(cast -1 Address)
      var Pointer:PartProperty p :> (i:properties first "pliant part") map PartProperty
      if addressof:p<>null and (entry_type addressof:p)=PartProperty and p:label=label
        if p:restart
          i jump :> begin
        else
          i jump :> end
    c :> e:instructions next c
  e set_void_result 


function leave_restart e restart
  arg_rw Expression e ; arg CBool restart
  if e:size<>1 or e:0:ident=""
    return
  var Pointer:Arrow c :> e:module first "pliant part "+e:0:ident
  if c=null
    return
  var Link:Instruction jump :> instruction (the_function 'jump anyway')
  jump jump :> (cast -1 Address) map Instruction
  var Link:PartProperty p :> new PartProperty
  p label := e:0 ident
  p restart := restart
  jump:properties insert "pliant part" true addressof:p
  e add jump
  e set_void_result  

meta leave e
  leave_restart e false

meta restart e
  leave_restart e true


export part leave restart