code: function _fnAddData ( oSettings, aDataIn, nTr, anTds )
  	{
  		/* Create the object for storing information about this new row */
  		var iRow = oSettings.aoData.length;
  		var oData = $.extend( true, {}, DataTable.models.oRow, {
  			src: nTr ? 'dom' : 'data'
  		} );
  	
  		oData._aData = aDataIn;
  		oSettings.aoData.push( oData );
  	
  		/* Create the cells */
  		var nTd, sThisType;
  		var columns = oSettings.aoColumns;
  		for ( var i=0, iLen=columns.length ; i<iLen ; i++ )
  		{
  			// When working with a row, the data source object must be populated. In
  			// all other cases, the data source object is already populated, so we
  			// don't overwrite it, which might break bindings etc
  			if ( nTr ) {
  				_fnSetCellData( oSettings, iRow, i, _fnGetCellData( oSettings, iRow, i ) );
  			}
  			columns[i].sType = null;
  		}
  	
  		/* Add to the display array */
  		oSettings.aiDisplayMaster.push( iRow );
  	
  		/* Create the DOM information */
  		if ( !oSettings.oFeatures.bDeferRender )
  		{
  			_fnCreateTr( oSettings, iRow, nTr, anTds );
  		}
  	
  		return iRow;
  	}
docs: Add a data array to the table, creating DOM node etc. This is the parallel to
  _fnGatherData, but for adding rows from a Javascript source, rather than a
  DOM source.
  @param {object} oSettings dataTables settings object
  @param {array} aData data array to be added
  @param {node} [nTr] TR element to add to the table - optional. If not given,
  DataTables will create a row automatically
  @param {array} [anTds] Array of TD|TH elements for the row - must be given
  if nTr is.
  @returns {int} >=0 if successful (index of new aoData entry), -1 if failed
  @memberof DataTable#oApi