CXXR (C++ R)
Todo List
File CellHeap.cpp
Include valgrind instrumentation (conditionally compiled).
Member CXXR::ArgList::tag2Symbol (const RObject *tag)
This function probably ought to be fussier about what it accepts as input.
Class CXXR::ClosureContext
Regularize aberrant (i.e. non-Closure-related) uses of ClosureContext.
Class CXXR::Environment
For provenance-tracking, there ought to be some way of monitoring the event that the program fails to find a binding for a Symbol.
Member CXXR::Environment::findNamespace (const StringVector *spec)
Having deserialization fail entirely in the event that the namespace cannot be loaded seems insufficiently robust, but follows CR practice.
Member CXXR::ExpressionVector
Replace the encapsulated pointer type RObject* with something stricter (but is needs to embrace Symbol as well as Expression).
Class CXXR::GCNode
The (private) cleanup() method needs to address the possibility that derived classes may have destructors that release some external resource (e.g. a lock). Maybe a garbage collection without a 'mark' phase would do the trick.
Member CXXR::Promise::setValue (RObject *val)
Should be private (or removed entirely), but currently still used in saveload.cpp.
Class CXXR::RObject
Incorporate further attribute consistency checks within the class interface. Possibly make setAttribute() virtual so that these consistency checks can be tailored according to the derived class.
Class CXXR::Subscripting

At present this class does not handle the special case (described in sec. 3.4.2 of the R Language Definition) where subscripting is being applied to an array, and there is a single subscript which is a matrix with as many columns as the array has dimensions, each row of the matrix being used to pick out a single element of the array.

A matter for possible review is the fact that during subsetting and subassignment operations, CXXR sometimes makes deep copies of vectors of RHandle objects in cases where CR gets away with simple pointer copies.

Class CXXR::WeakRef
It would probably make more sense for this class to inherit directly from GCNode, and for the key, value etc. to be pointers to GCNode.
File ExpressionVector.h
Constrain the elements to be Expression objects? However, as currently used, the elements of an ExpressionVector may be Symbols rather than Expressions.
File GCManager.hpp

Reinstate garbage collection timing.

Update DEBUG_GC_SUMMARY etc.

File ListVector.cpp
Tidy up handling of names attribute, in particular to get rid of const_cast.
Member SET_PRVALUE (SEXP x, SEXP v)
Replace this with a method call to evaluate the promise.
Member SET_SYMVALUE (SEXP x, SEXP v)
No binding to R_UnboundValue ought to be created.
Member SET_SYMVALUE (SEXP x, SEXP v)
No binding to R_UnboundValue ought to be created.