# In the following, the columns are to be interpreted as:
# idem - The command is idempotent in the sense that invoking it multiple
# times with the same args in the same interp will always return the
# same result
# kill - The command is killable in that nothing depends on its side effects,
# so if its result is not used, the call may be eliminated entirely.
# This is 0, 1, or 'objc<=N'
#
# reads - What variables does the command read from the callframe? For
# the builtins in this table, the result is either 'all' or
# empty.
#
# writes - What variables does the command write to the callframe?
# This is empty, a list of numbers N (indicating that objv[N]
# contains the name of an output variable, or N+ (indicating that
# objv[N] and all following args contain the names of output
# variables).
#GLOBAL NAMESPACE
#name idem kill reads writes notes
after 0 0
cd 0 0
clock SPECIAL <4>
close 0 0
encoding SPECIAL <4>
eof 0 1
exit 0 0
fblocked 0 1
fconfigure 0 objc<=3
fcopy 0 0
fileevent 0 0
flush 0 0
gets 0 0 objv[2]
glob 0 1
interp SPECIAL <?>
join 1 1
lrepeat 1 1
lreverse 1 1
lsearch 1 1
lsort SPECIAL <1>
open 0 0
pid 1 1
puts 0 0
pwd 0 1
read 0 0
regexp SPECIAL <2>
regsub SPECIAL <3>
scan 0 0 objv[3+]
seek 0 0
socket 0 0
split 1 1
tell 0 1
#<1> lsort needs the callframe if -command is used, and needs whatever
# variable access that the command needs. It's unkillable if the
# command is unkillable. Without -command (the common case!) it doesn't
# touch the callframe. Even most of the -commands will wind up being
# killable and not need the callframe, but it's probably best to
# ignore the case initially and simply announce that [lsort
# -command] is not compilable.
#
#<2> 'regexp' needs to parse out the switches in order to decide what
# position on the command line is the 'exp'. The following position
# is the 'string', and after that are the match variables. 'regexp'
# reads nothing from the callframe and writes the match variables.
# For nonconstant args, it's safe to assume it writes everything.
# If there are no match variables (or if no match variables are
# live), 'regexp' is killable.
#
#<3> 'regsub' needs to parse out the switches in order to decide
# whether a 'varName' arg is present. It reads nothing from the
# callframe and writes only the 'varName'. For nonconstant args,
# it's safe to assume that it writes everything. If there is no
# match variable (or if the match variable is not live), 'regsub' is
# killable.
#
#<4> 'clock' and 'encoding' are not yet compilable ensembles. They
# probably ought to get made into such before attempting to analyze
# them in the quadcode compiler.
#THE [platform] NAMESPACE
# name idem kill reads writes notes
platform::generic 1 1
platform::identify 1 1
platform::patterns 1 1
#THE [binary] ENSEMBLE
# name idem kill reads writes notes
tcl::binary::decode::* 1 1
tcl::binary::encode::* 1 1
tcl::binary::format 1 1
tcl::binary::scan 0 0 objv[3+]
#THE [chan] ENSEMBLE
# name idem kill reads writes notes
tcl::chan::blocked 0 1
tcl::chan::close 0 0
tcl::chan::copy 0 0
tcl::chan::create 0 0
tcl::chan::eof 0 1
tcl::chan::event 0 0
tcl::chan::flush 0 0
tcl::chan::gets 0 0 objv[2]
tcl::chan::names 0 1
tcl::chan::pending 0 1
tcl::chan::pipe 0 0
tcl::chan::pop 0 0
tcl::chan::postevent 0 0
tcl::chan::push 0 0
tcl::chan::read 0 0
tcl::chan::puts 0 0
tcl::chan::seek 0 0
tcl::chan::tell 0 1
tcl::chan::truncate 0 0
# THE [dict] ENSEMBLE
# Not all the subcommands of [dict] are compiled in all circumstances
#name idem kill reads writes
tcl::dict::keys 1 1
tcl::dict::values 1 1
#THE [file] ENSEMBLE
#name idem kill reads writes notes
tcl::file::atime 0 objc<=3
tcl::file::attributes 0 objc<=4
tcl::file::channels 0 1
tcl::file::copy 0 0
tcl::file::delete 0 0
tcl::file::dirname 1 1
tcl::file::executable 0 1
tcl::file::exists 0 1
tcl::file::extension 1 1
tcl::file::isdirectory 0 1
tcl::file::isfile 0 1
tcl::file::join 1 1
tcl::file::link 0 0
tcl::file::lstat 0 0 objv[3] <5>
tcl::file::mkdir 0 0
tcl::file::mtime 0 objc<=3
tcl::file::nativename 0 1
tcl::file::normalize 0 1
tcl::file::owned 0 1
tcl::file::pathtype 1 1
tcl::file::readable 0 1
tcl::file::readlink 0 1
tcl::file::rename 0 0
tcl::file::rootname 1 1
tcl::file::separator 1 1
tcl::file::size 0 1
tcl::file::split 1 1
tcl::file::stat 0 0 objv[3] <5>
tcl::file::system 0 1
tcl::file::tail 1 1
tcl::file::tempfile 0 0
tcl::file::type 0 1
tcl::file::volumes 0 1
tcl::file::writable 0 1
# <5> For tcl::file::lstat and tcl::file::stat, objv[3] is an array, not a
# scalar variable
#THE [info] ENSEMBLE
#name idem kill reads writes notes
tcl::info::args 0 1
tcl::info::body 0 1
tcl::info::cmdcount 0 1
tcl::info::commands 0 1
tcl::info::complete 1 1
tcl::info::default 0 0 objv[3]
tcl::info::errorstack 0 1
tcl::info::frame 0 1
tcl::info::functions 0 1
tcl::info::globals 0 1
tcl::info::hostname 1 1
tcl::info::library 1 1
tcl::info::loaded 0 1
tcl::info::locals 0 1 all
tcl::info::nameofexecutable 1 1
tcl::info::patchlevel 1 1
tcl::info::procs 0 1
tcl::info::script 0 objc<=2
tcl::info::sharedlibextension 1 1
tcl::info::tclversion 1 1
tcl::info::vars 0 1 all
# tcl::info::vars and tcl::info::locals need only the variable names to
# be correct in the callframe. The variable values can be anything.
# THE [info class] SUBENSEMBLE
#name idem kill reads writes notes
oo::InfoClass::call 0 1
oo::InfoClass::constructor 0 1
oo::InfoClass::definition 0 1
oo::InfoClass::destructor 0 1
oo::InfoClass::filters 0 1
oo::InfoClass::forward 0 1
oo::InfoClass::instances 0 1
oo::InfoClass::methods 0 1
oo::InfoClass::methodtype 0 1
oo::InfoClass::mixins 0 1
oo::InfoClass::subclasses 0 1
oo::InfoClass::superclasses 0 1
oo::InfoClass::variables 0 1
# The [info object] SUBENSEMBLE
#name idem kill reads writes notes
oo::InfoObject::call 0 1
oo::InfoObject::definition 0 1
oo::InfoObject::filters 0 1
oo::InfoObject::forward 0 1
oo::InfoObject::isa 0 1
oo::InfoObject::methods 0 1
oo::InfoObject::methodtype 0 1
oo::InfoObject::mixins 0 1
oo::InfoObject::variables 0 1
oo::InfoObject::vars 0 1
# THE MATHFUNCS
#name idem kill reads writes notes
tcl::mathfunc::abs 1 1
tcl::mathfunc::acos 1 1
tcl::mathfunc::asin 1 1
tcl::mathfunc::atan 1 1
tcl::mathfunc::atan2 1 1
tcl::mathfunc::bool 1 1
tcl::mathfunc::ceil 1 1
tcl::mathfunc::cos 1 1
tcl::mathfunc::cosh 1 1
tcl::mathfunc::double 1 1
tcl::mathfunc::entier 1 1
tcl::mathfunc::exp 1 1
tcl::mathfunc::floor 1 1
tcl::mathfunc::fmod 1 1
tcl::mathfunc::hypot 1 1
tcl::mathfunc::int 1 1
tcl::mathfunc::isqrt 1 1
tcl::mathfunc::log 1 1
tcl::mathfunc::log10 1 1
tcl::mathfunc::max 1 1
tcl::mathfunc::min 1 1
tcl::mathfunc::pow 1 1
tcl::mathfunc::rand 0 0
tcl::mathfunc::round 1 1
tcl::mathfunc::srand 0 0
tcl::mathfunc::sin 1 1
tcl::mathfunc::sinh 1 1
tcl::mathfunc::sqrt 1 1
tcl::mathfunc::tan 1 1
tcl::mathfunc::tanh 1 1
tcl::mathfunc::wide 1 1
# THE [string] ENSEMBLE
#name idem kill reads writes notes
tcl::string::equal 1 1
tcl::string::first 1 1
tcl::string::last 1 1
tcl::string::repeat 1 1
tcl::string::reverse 1 1