code: public int doStartTag()
              throws JspException {
          Object source = evaluateDataSource();
  
          // report any errors that may have occured 
          if(hasErrors())
              return SKIP_BODY;
  
          _renderState = INIT;
  
          boolean empty = false;
          if(source != null) {
              _iterator = IteratorFactory.createIterator(source);
              if(_iterator == null) {
                  LOGGER.warn(Bundle.getString("Tags_Repeater_nullIterator"));
                  _iterator = Collections.EMPTY_LIST.iterator();
              }
  
              if(_iterator.hasNext()) {
                  _currentIndex = 0;
                  _currentItem = _iterator.next();
  
                  if(_ignoreNulls && _currentItem == null) {
                      /*
                        doStartTag doesn't know if the repeater is structured or unstructured
                        thus, if ignoreNulls is true, it's going to make an attempt to go
                        through the body with a non-null item.  if there are no non-null
                        items in the data structure, the doAfterBody method will handle
                        this correctly, but a data structure with a null first item
                        will render the same as a data structure with a null second item
                       */
                      advanceToNonNullItem();
  
                      /*
                         this null check needs to re-run here because the advanceToNonNullItem method
                         side-effects the _currentItem.
                       */
                      if(_currentItem == null)
                          empty = true;
                  }
              }
              /* there is no data set of there are zero items in the iterator */
              else empty = true;
          }
          /* the dataSource evaluated to null */
          else {
              _iterator = Collections.EMPTY_LIST.iterator();
              empty = true;
          }
  
          if(empty) {
              /* if the defaultText attribute is non-null, it will be evaluated as an expression and rendered to the page */
              if(_defaultText != null)
                  addContent(_defaultText.toString());
              return SKIP_BODY;
          }
          else {
              DataAccessProviderStack.addDataAccessProvider(this, pageContext);
              _containerInPageContext = true;
              return EVAL_BODY_BUFFERED;
          }
      }
docs: Start rendering the repeater.
  @return {@link #SKIP_BODY} if an error occurs; {@link #EVAL_BODY_BUFFERED} otherwise
  @throws JspException if an error occurs that can not be reported in the page