PreviousUpNext

15.4.474  src/lib/compiler/back/top/highcode/highcode-codetemp.pkg

## highcode-codetemp.pkg 
#
# Highcode variables are simply Tagged_Int integers,
# successively allocated starting at one.
#
# When desired we associate names with them by
# maintaining an Int->String hashtable.

# Compiled by:
#     src/lib/compiler/front/typer-stuff/typecheckdata.sublib

# This package is used (in particular) in:
#
#     src/lib/compiler/back/top/highcode/highcode-uniq-types.pkg

stipulate 
    package sy  =  symbol;                                      # symbol                        is from   src/lib/compiler/front/basics/map/symbol.pkg
    package iht =  int_hashtable;                               # int_hashtable                 is from   src/lib/src/int-hashtable.pkg
    package tdc =  typer_data_controls;                         # typer_data_controls           is from   src/lib/compiler/front/typer-stuff/main/typer-data-controls.pkg
herein

    package   highcode_codetemp
    : (weak)  Highcode_Codetemp                                 # Highcode_Codetemp             is from   src/lib/compiler/back/top/highcode/highcode-codetemp.api
    {
        fun issue_codetemp r ()
            =
            {   inc r;
                *r;
            }
            where
                fun inc r =     r := *r + 1;
            end;

        exception NO_CODETEMP_NAME;

        varcount =  REF 0;                                      #  XXX BUGGO FIXME: 'varcount' is yet more yucky thread-hostile mutable global state: 

        codetemp_to_name__hashtable
           =
           iht::make_hashtable  { size_hint => 32,  not_found_exception => NO_CODETEMP_NAME  }
           :
           iht::Hashtable( String );                            #  XXX BUGGO FIXME: 'codetemp_to_name__hashtable' is yet more yucky thread-hostile mutable global state: ;


        name_of =  iht::get  codetemp_to_name__hashtable;


        set_name_for_codetemp
            =
            iht::set  codetemp_to_name__hashtable;


        Codetemp =  Int;


        remember_highcode_codetemp_names
            =
            tdc::remember_highcode_codetemp_names;



        fun highcode_codetemp_has_a_name  lv
            =
            {   name_of lv;
                TRUE;
            }
            except
                NO_CODETEMP_NAME = FALSE;


        fun to_string (highcode_variable: Codetemp)
            =
            int::to_string  highcode_variable;


        fun share_name (v, w)
            =
            if *remember_highcode_codetemp_names
                #
                set_name_for_codetemp (v, name_of w)
                except
                    NO_CODETEMP_NAME
                        =
                        (   set_name_for_codetemp (w, name_of v)
                            except
                                NO_CODETEMP_NAME = ()
                        );
            fi;


        issue_highcode_codetemp
            =
            issue_codetemp  varcount;


        fun clear ()
            =
            {   varcount := 0;
                iht::clear  codetemp_to_name__hashtable;
            };


        fun clone_highcode_codetemp  var
            =
            {   fresh_codetemp =  issue_highcode_codetemp ();
            
                if *remember_highcode_codetemp_names
                    #
                    set_name_for_codetemp (fresh_codetemp,  name_of var)
                    except
                        NO_CODETEMP_NAME = ();
                fi;

                fresh_codetemp;
            };


        fun issue_named_highcode_codetemp (id: sy::Symbol)
            =
            {   fresh_codetemp =  issue_highcode_codetemp ();
                #           
                if *remember_highcode_codetemp_names
                    #
                    set_name_for_codetemp (fresh_codetemp,  sy::name id);
                fi;

                fresh_codetemp;
            };


        fun highcode_codetemp_to_value_symbol (lv:  Codetemp) : Null_Or( sy::Symbol )
            =
            THE (sy::make_value_symbol (name_of lv))
            except
                NO_CODETEMP_NAME = NULL;


        fun name_of_highcode_codetemp (lv:  Codetemp) : String
            =
            {   s =  int::to_string  lv;
                #           
                (name_of lv + s)
                except
                    NO_CODETEMP_NAME = ("v" + s);
            };
    };                                                                                          # package highcode_codetemp
end;                                                                                            # stipulate


Comments and suggestions to: bugs@mythryl.org

PreviousUpNext