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


var CBool please_output_listing := false


function console a
  arg Argument a
  if a:name<>""
    console a:name+"="
  if a:where=argument_constant
    var Str t := (entry_type a:constant) name
    if t="Int" or t="Address" or t="uInt"
      console (cast (a:constant map Int) Str)
    else
      console (entry_type a:constant):name+"_constant"
  eif a:where=argument_register
    console ("eax ecx edx ebx esp ebp esi edi" 4*a:register 3)
  eif a:where=argument_indirect
    console "[lb]"
    console a:pointer
    if a:offset<>0
      console "+"+(cast a:offset Str)
    console "[rb]"
  else
    console "?"


function generate_listing gc
  arg_rw GeneratorContext gc
  if gc:function:name="_noname_"
    return
  if not please_output_listing
    return
  please_output_listing := false
  console gc:function:name
  if gc:function:flags\(2*16*256)%2=1
    console " ~"
  console "   ("+(replace gc:function:position " (internals) " " ")+")[lf]"
  var Pointer:Instruction i :> gc first_instruction 
  while addressof:i<>null
    console "  "+(cast (cast i:order Int) Str)+"   "
    var Str name := i:function:name
    if name="do nothing"
      void
    eif (name 0 5)="i386_"
      console (name 5 name:len)
    else
      console "call "+name
    for (var Int u) 0 i:arguments:size-1
      console "  "
      console (i:arguments:u map Argument)
    if (addressof i:jump)<>null
      console " => "+(cast (cast i:jump:order Int) Str)
    if i:function:flags\(2*16*256)%2=1
      console " ~"
    console "   ("+(replace i:position " (internals) " " ")+")"
    console "[lf]"
    i :> i next_instruction 


# sets the optimizer that will generate listing

var Str section := "pliant optimizer listing"
'pliant optimizer sections' insert addressof:section
the_module:"/pliant/internal/optimizer.pli" define "pliant optimizer listing" false addressof:(the_function generate_listing GeneratorContext)


public
  function listing on
    arg CBool on
    please_output_listing := on