The generated code looks something like:
if (tag.doStartTag() == EVAL_BODY_INCLUDE) { do { ... } while (tag.doAfterBody() == EVAL_BODY_AGAIN); } if (tag.doEndTag() == SKIP_PAGE) return;
empty tags and tags returning SKIP_BODY do not call doAfterBody. EVAL_BODY_AGAIN to repeat the tag and SKIP_PAGE to stop.