# 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