@Override
	public Block.ExitStatus evaluate(IdentifierMap values)
	{
		boolean normalTermination = true;
		while (true)
		{
			Value conditionValue = condition.evaluate(values);
			if (conditionValue instanceof BooleanValue)
			{
				if (conditionValue == BooleanValue.TRUE)
				{
					if (block == null)
						throw new InfiniteLoopException("Empty non-false while loop");
					Block.ExitStatus status = block.evaluate(values);
					if (status == Block.ExitStatus.BREAK)
					{
						normalTermination = false;
						break;
					}
					if (status == Block.ExitStatus.RETURN)
					{
						setReturnValue(block.getReturnValue());
						return Block.ExitStatus.RETURN;
					}
				}
				else
					break;
			}
			else
				throw new SyntaxError("Expected a boolean for while statement condition: " + condition);
		}
		if (normalTermination && thenBlock != null)
		{
			Block.ExitStatus status = thenBlock.evaluate(values);
			if (status == Block.ExitStatus.RETURN)
				setReturnValue(thenBlock.getReturnValue());
			return status;
		}
		return Block.ExitStatus.NORMAL;
	}