## 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.pkgstipulate
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.pkgherein
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