Patch title: Release 93 bulk changes
Abstract:
File: /language/compiler/runtime_compile.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"


function switch_constant e id adr
  arg_rw Expression e ; arg Ident id ; arg Address adr
  if addressof:(entry_type e:value)=addressof:Ident and (e:value map Ident)=id
    e:value := adr
  for (var Int i) 0 e:size-1
    switch_constant e:i id adr

function copy_constant e id val type
  arg_rw Expression e ; arg Ident id ; arg Universal val ; arg Type type
  var Arrow adr := entry_new type
  type copy_instance addressof:val adr
  switch_constant e id adr

function map_constant e id obj
  arg_rw Expression e ; arg Ident id ; arg Universal obj
  switch_constant e id addressof:obj

method e switch_module m
  arg_rw Expression e ; arg Module m
  e module :> m
  for (var Int i) 0 e:size-1
    e:i switch_module m

function compile e modulename
  arg_rw Expression e ; arg Str modulename
  var Pointer:Module m :> (pliant_module_dictionary first modulename) map Module
  if addressof:m<>null
    e switch_module m
    e execute
  else
    error error_id_corrupted "module "+modulename+" is not available any more"


# bug: e1 will not be freed !

meta runtime_compile e
  if e:size<1 or e:size%2<>1
    return
  for (var Int i) 0 e:size-3 step 2
    if not e:i:is_pure_ident
      return
    e:(i+1) compile ?
  var Link:Expression expr :> duplicate (e e:size-1)
  expr switch_module (null map Module)
  var Link:Argument pe :> argument mapped_constant PackedExpression expr
  var Link:Argument l :> argument local Link:Expression
  var Link:Argument e2 :> argument indirect Expression (argument local Address) 0
  e add (instruction (the_function 'cast (Link Expression)' PackedExpression -> Link:Expression) pe l)
  e add (instruction (the_function 'cast Expression' Link:Expression -> Expression) l e2)
  for (var Int i) 0 e:size-3 step 2
    var Link:Argument id :> argument constant Str e:i:ident
    var Pointer:Type t :> e:(i+1):result:type real_data_type
    e:(i+1) cast t
    e suckup e:(i+1)
    if (t:flags .and. type_flag_do_not_copy)=0
      e add (instruction (the_function copy_constant Expression Ident Universal Type) e2 id e:(i+1):result (argument mapped_constant Type t))
    else
      e add (instruction (the_function map_constant Expression Ident Universal) e2 id e:(i+1):result)
  var Pointer:Module m :> e module
  if (pliant_module_dictionary first m:name)=null
    pliant_module_dictionary insert m:name true addressof:m
  e add (instruction (the_function compile Expression Str) e2 (argument constant Str m:name))
  e set_void_result

export runtime_compile