public Object eval(CallStack callstack, Interpreter interpreter) throws EvalError {
		publishLineNumber();
		int numChild = jjtGetNumChildren();

		// Order of body and condition is swapped for do / while
		final SimpleNode condExp;
		final SimpleNode body;

		if (isDoStatement) {
			condExp = (SimpleNode) jjtGetChild(1);
			body = (SimpleNode) jjtGetChild(0);
		} else {
			condExp = (SimpleNode) jjtGetChild(0);
			if (numChild > 1) {
				body = (SimpleNode) jjtGetChild(1);
			} else {
				body = null;
			}
		}

		boolean doOnceFlag = isDoStatement;

		while (doOnceFlag || BSHIfStatement.evaluateCondition(condExp, callstack, interpreter)) {
			doOnceFlag = false;
			// no body?
			if (body == null) {
				continue;
			}
			Object ret = body.eval(callstack, interpreter);
			if (ret instanceof ReturnControl) {
				switch (((ReturnControl) ret).kind) {
				case RETURN:
					return ret;

				case CONTINUE:
					break;

				case BREAK:
					return Primitive.VOID;
				}
			}
		}
		return Primitive.VOID;
	}