From mdowle at mdowle.plus.com  Wed Mar 14 00:08:22 2012
From: mdowle at mdowle.plus.com (Matthew Dowle)
Date: Tue, 13 Mar 2012 23:08:22 +0000
Subject: [Rd] 111 FIXMEs in main/src
Message-ID: <1331680102.9039.115.camel@netbook>

Hi,

We sometimes see offers to contribute, asking what needs to be done. If
they know C, how about the 111 FIXMEs? But which ones would be most
useful to fix? Which are difficult and which are easy? Does R-core have
a process to list and prioritise the FIXMEs?

~/R/Rtrunk/src/main$ grep "[^/]FIXME" * | wc -l
111
~/R/Rtrunk/src/main$ grep -A 1 "[^/]FIXME" *
arithmetic.c:/* FIXME: consider using
arithmetic.c-    tmp = (long double)x1 - floor(q) * (long double)x2;
--
arithmetic.c:/* FIXME: with the y == 2.0 test now at the top that case
isn't
arithmetic.c-   reached here, but i have left it for someone who
understands the
--
arithmetic.c:    /* FIXME: Danger Will Robinson.
arithmetic.c-     * -----  We might be trashing arguments here.
--
array.c:	/* FIXME: the following is desirable, but pointless as long as
array.c-	   subset.c & others have a contrary version that leaves the
--
attrib.c:    /* FIXME:  1.e-5 should rather be == option('ts.eps') !! */
attrib.c-    if (fabs(end - start - (n - 1)/frequency) > 1.e-5)
--
attrib.c:	    /* FIXME : The whole "classgets" may as well die. */
attrib.c-
--
attrib.c:    /* FIXME */
attrib.c-    if (nvalues <= 0)
--
attrib.c:    /* FIXME */
attrib.c-    PROTECT(namesattr);
--
attrib.c:    /* FIXME: the code below treats pair-based structures */
attrib.c-    /* in a special way.  This can probably be dropped down */
--
base.c:/* FIXME: Make this a macro to avoid function call overhead?
base.c-   Inline it if you really think it matters.
--
bind.c:/* FIXME : is there another possibility? */
bind.c-
--
bind.c:		    /* FIXME: I'm not sure what the author intended when the
sequence was
bind.c-		       defined as raw < logical -- it is possible to represent
logical as
--
builtin.c:		/* FIXME -- Rstrlen allows for double-width chars */
builtin.c-		width += Rstrlen(STRING_ELT(labs, nlines % lablen), 0) + 1;
--
builtin.c:	      /* FIXME:	 call EncodeElement() for every element of
s.
builtin.c-
--
builtin.c:	    /* FIXME : cat(...) should handle ANYTHING */
builtin.c-	    w = strlen(p);
--
character.c:	    slen = strlen(ss); /* FIXME -- should handle embedded
nuls */
character.c-	    buf = R_AllocStringBuffer(slen+1, &cbuff);
--
character.c:		   FIXME: could prefer UTF-8 here
character.c-		 */
--
character.c:	    /* FIXME: could use R_Realloc instead */
character.c-	    cbuf = CallocCharBuf(strlen(tmp) + 1);
--
character.c:		    /* FIXME use this buffer for new string as well */
character.c-		    wc = (wchar_t *)
--
coerce.c:/* FIXME: Use
coerce.c-   =====
--
complex.c:/* FIXME: maybe add full IEC60559 support */
complex.c-static double complex clog(double complex x)
--
complex.c:/* FIXME: check/add full IEC60559 support */
complex.c-static double complex cexp(double complex x)
--
connections.c:    /* FIXME: is this correct for consoles? */
connections.c-    checkArity(op, args);
--
connections.c:/* FIXME: could do any MBCS locale, but would need
pushback */
connections.c-static SEXP
--
connections.c:	outlen = 1.01 * inlen + 600; /* FIXME, copied from bzip2
*/
connections.c-	buf = (unsigned char *) R_alloc(outlen, sizeof(unsigned
char));
--
datetime.c:		    /* FIXME some of this should be outside the loop */
datetime.c-		    int ns, nused = 4;
--
dcf.c:			/* FIXME:
dcf.c-			   Why are we doing this?
--
debug.c:	    /* FIXME: previous will have <0x....> whereas other values
are
debug.c-	       without the < > */
--
deriv.c:	/* FIXME: simplify exp(lgamma( E )) = gamma( E ) */
deriv.c-	ans = lang2(ExpSymbol, arg1);
--
deriv.c:	/* FIXME: simplify log(gamma( E )) = lgamma( E ) */
deriv.c-	ans = lang2(LogSymbol, arg1);
--
deriv.c:    /* FIXME */
deriv.c-#ifdef NOTYET
--
devices.c:    /* <FIXME> Disable this for now */
devices.c-    /*
--
devices.c:    /* FIXME: There should really be a formal graphics
finaliser
devices.c-     * but this is a good proxy for now.
--
devices.c:    /* FIXME:  there should be a way for a device to declare
its own
devices.c-               events, and return information on how to set
them */
--
dounzip.c:	   filename is in UTF-8, so FIXME */
dounzip.c-	SET_STRING_ELT(names, i, mkChar(filename_inzip));
--
duplicate.c:   <FIXME>: surely memcpy would be faster here?
duplicate.c-*/
--
engine.c:    /* FIXME: what about clipping? (if the device can't) 
engine.c-    */
--
engine.c:    /* FIXME: what about clipping? (if the device can't) 
engine.c-     * Maybe not too bad because it is just a matter of shaving
off
--
engine.c:					/* FIXME: This assumes that wchar_t is UCS-2/4,
engine.c-					   since that is what GEMetricInfo expects */
--
engine.c:/* FIXME: should we warn on more than one character here? */
engine.c-int GEstring_to_pch(SEXP pch)
--
envir.c:  FIXME ? should this also unbind the symbol value slot when rho
is
envir.c-  R_BaseEnv.
--
envir.c:	/* FIXME: This does not behave as described */
envir.c-	R_ObjectTable *table;
--
envir.c:    /* FIXME: should we install them all?) */
envir.c-
--
envir.c:		/* FIXME: duplicate the hash table and assign here */
envir.c-	    } else {
--
envir.c:	/* FIXME: A little inefficient */
envir.c-	while (R_HashSizeCheck(HASHTAB(s)))
--
errors.c:    /**** FIXME: should probably pre-allocate this */
errors.c-    SEXP cond, klass;
--
eval.c:    /*  Use the default code for unbound formals.  FIXME: It
looks like
eval.c-	this code should preceed the building of the environment so that
--
eval.c:    /* The default return value is NULL.  FIXME: Is this really
needed
eval.c-       or do we always get a sensible value returned?  */
--
eval.c:/* **** FIXME: This code is factored out of applyClosure.  If we
keep
eval.c-   **** it we should change applyClosure to run through this
routine
--
eval.c:    /* The default return value is NULL.  FIXME: Is this really
needed
eval.c-       or do we always get a sensible value returned?  */
--
eval.c:/* **** FIXME: Temporary code to execute S4 methods in a way that
eval.c-   **** preserves lexical scope. */
--
eval.c:    /*  FIXME: We need to ensure that this works for hashed
eval.c-	environments.  This code only works for unhashed ones.  the
--
eval.c:    /*  FIXME: This strategy will not work when we are working in
the
eval.c-	data frame defined by the system hash table.  The structure
there
--
format.c:	/* FIXME: we should really test for floorl, also C99.
format.c-	   But FreeBSD 7.x does have it, but not nearbyintl */
--
gram.c:    f = R_atof(s); /* FIXME: make certain the value is
legitimate. */
gram.c-
--
gramLatex.c:    /* FIXME:  check that begin and end match */
gramLatex.c-    setAttrib(ans, R_SrcrefSymbol, makeSrcref(lloc,
SrcFile));
--
gramLatex.y:    /* FIXME:  check that begin and end match */
gramLatex.y-    setAttrib(ans, R_SrcrefSymbol, makeSrcref(lloc,
SrcFile));
--
gram.y:    f = R_atof(s); /* FIXME: make certain the value is
legitimate. */
gram.y-
--
graphics.c:    case 's':/* FIXME --- implement  's' and 'e' axis
styles ! */
graphics.c-    case 'e':
--
graphics.c:/* FIXME: reorganize this as a memcpy */
graphics.c-
--
grep.c:/* FIXME: make more robust, and public */
grep.c-static SEXP mkCharWLen(const wchar_t *wc, int nc)
--
grep.c:		       strings, but <MBCS-FIXME> it would be more
grep.c-		       efficient to skip along by chars.
--
grep.c:	if (ptag.rm_eo == 0) { /* empty string matched => trouble;
FIXME: we may want to consider just advancing anyway */
grep.c-	    int infinite_match = 1;
--
grep.c:/* FIXME: use UCP for upper/lower conversion */
grep.c-static 
--
grep.c:	/* FIXME perhaps we ought to check validity here */
grep.c-	len = strlen(string);
--
inspect.c:/* FIXME: envir.c keeps this private - it should probably go
to Defn.h */
inspect.c-#define FRAME_LOCK_MASK (1<<14)
--
main.c:/* FIXME: this should be re-written to use Rf_ReplIteration
main.c-   since it gets out of sync with it over time */
--
main.c:    /* <FIXME> may need to reinstall this if we do recover. */
main.c-    struct sigaction sa;
--
memory.c:/* FIXME: consider inlining here */
memory.c-/* this has NA_STRING = NA_STRING */
--
model.c:    /* FIXME: this includes specials in the model */
model.c-    /* There perhaps needs to be a an extra pass */
--
model.c:    /* FIXME: this is also the point where nesting */
model.c-    /* needs to be taken care of. */
--
model.c:    /* FIXME: We need to allow a third argument to this function
*/
model.c-    /* which allows us to specify contrasts directly.  That
argument */
--
model.c:    /* FIXME : The body within these two loops should be
embedded */
model.c-    /* in its own function. */
--
objects.c:	// FIXME: fails if 'methods' is not attached.
objects.c-	PROTECT(clEnvCall = lang2(meth_classEnv, cl));
--
par.c:/* <FIXME>  do not need separate macros for a = b = c and b = a =
c */
par.c-#define R_DEV__(_P_) dpptr(dd)->_P_ = gpptr(dd)->_P_
--
platform.c:	/* FIXME convert to UTF-8 on Windows */
platform.c-	for (i = 0; i < n; i++) {
--
platform.c:	    /* FIXME: there are higher-resolution ways to do this on
Windows */
platform.c-	    REAL(mtime)[i] = (double) sb.st_mtime;
--
platform.c:	if (over || !R_WFileExists(dest)) { /* FIXME */
platform.c-	    if ((fp1 = _wfopen(this, L"rb")) == NULL ||
--
platform.c:	/* FIXME: perhaps manipulate mode as we do in Sys.chmod? */
platform.c-	if(perms) _wchmod(dest, sb.st_mode & 0777);
--
plot3d.c:/* FIXME - This could pretty easily be adapted to handle NA */
plot3d.c-/* values on the grid.  Just search the diagonals for cutpoints
*/
--
plot3d.c:/* FIXME: [Code consistency] Use macro for the parallel parts
of
plot3d.c-	  do_contour, do_filledcontour & do_image ...
--
plot.c:       FIXME: bg needs similar change, but that requires changes
to
plot.c-       the specific drivers. */
--
plot.c:		    /* FIXME: should this skip 0-sized symbols? */
plot.c-		    thiscol = INTEGER(col)[i % ncol];
--
plot.c:	/* FIXME?
plot.c-	 * Seems like the logic here is just draw from xmin to xmax
--
plot.c:		/* FIXME: should this skip 0-sized symbols? */
plot.c-		GRect(xx - rx, yy - rx, xx + rx, yy + rx, DEVICE,
--
plot.c:		/* FIXME: should this skip 0-sized symbols? */
plot.c-		GRect(xx - rx, yy - ry, xx + rx, yy + ry, DEVICE,
--
plot.c:		/* FIXME: should this skip 0-sized symbols? */
plot.c-		for(j = 0; j < nc; j++) {
--
printarray.c:/* FIXME: sort out encodings */
printarray.c-/* We need display width of a string */
--
printarray.c:    if(r_pr < r) /* FIXME? use _P() and "Defn.h" ? */
printarray.c-	Rprintf(ngettext(" [ reached getOption(\"max.print\") --
omitted last row ]]\n",
--
printarray.c:    if(r_pr < r) /* FIXME? use _P() and "Defn.h" ? */
printarray.c-	Rprintf(" [ reached getOption(\"max.print\") -- omitted %d
rows ]]\n",
--
print.c: *  <FIXME> These routines are not re-entrant: they reset the
print.c- *  global R_print.
--
print.c:/* FIXME : We need a general mechanism for "rendering" symbols.
*/
print.c-/* It should make sure that it quotes when there are special */
--
print.c:	/* FIXME: check (ns <= R_print.max +1) ? ns : R_print.max; */
print.c-	for (i = 0; i < ns; i++) {
--
printutils.c:/* <FIXME>
printutils.c-   encodeString and Rstrwid assume that the wchar_t
representation
--
saveload.c:    /* FIXME: rather than use strlen, use actual length of
string when
saveload.c-     * sized strings get implemented in R's save/load code.
*/
--
saveload.c:    /* FIXME : Ultimately we need to replace */
saveload.c-    /* this with a real string allocation. */
--
scan.c:			goto inquote; /* FIXME: Ick! Clean up logic */
scan.c-		    }
--
seq.c:	/* FIXME: possibly UTF-8 version */
seq.c-	for (i = 0; i < nls; i++) {
--
serialize.c:	stream->OutBytes(stream, (void *)s, length); /* FIXME: is
this case right? */
serialize.c-}
--
subassign.c:    /* FIXME : this should be a shallow copy for list */
subassign.c-    /* objects.  A full duplication is wasteful. */
--
subassign.c:    /* FIXME : this should be a shallow copy for list */
subassign.c-    /* objects.  A full duplication is wasteful. */
--
subassign.c:    /* FIXME : this should be a shallow copy for list */
subassign.c-    /* objects.  A full duplication is wasteful. */
--
subassign.c:	    /* FIXME: add name */
subassign.c-	    UNPROTECT(1);
--
subset.c:	/* FIXME:  this is wrong, because the slots are gone, so
result is an invalid object of the S4 class! JMC 3/3/09 */
subset.c-#ifdef _S4_subsettable
--
subset.c:    /* FIXME: replace the test by isNull ... ? */
subset.c-
--
summary.c:	/* FIXME : Need to be careful with the use of isVector() */
summary.c-	/* since this includes lists and expressions. */
--
summary.c:    /* FIXME : there is a lot of shared code here for vectors.
*/
summary.c-    /* It should be abstracted out and optimized. */
--
summary.c:	    /* FIXME : using mod like this causes */
summary.c-	    /* a potential performance hit. */
--
sysutils.c:	/* FIXME, is Cocoa's interface not const char*? */
sysutils.c-	cmdcpy = acopy_string(command);
--
unique.c:   <FIXME>  Integer keys are wasteful for logical and raw
vectors,
unique.c-   but the tables are small in that case.
--
unique.c:	    /* <FIXME>
unique.c-	       Currently no hashing when using bytes.
$



[Rd] 111 FIXMEs in main/src
Matthew Dowle