Проблема с SPL

Жигaн

Новичок
Проблема с SPL

Система winXP, php5.2.2

Проблема 1

SplFileObject::seek() попытка установить указатель за пределы файлы приводит к попаданию в бесконечный цикл.

PHP:
<?php
file_put_contents('test.txt', "a\nb\n");
$file = new SplFileObject('test.txt');

// 1 ok
$file->seek(0);
var_dump($file->current()); // "a\n"
// 2 ok
$file->seek(1);
var_dump($file->current()); // "b\n"

// 3 ok
$file->seek(2);
var_dump($file->current()); // ""

if(1) {
	// fail
	$file->seek(3);
	var_dump($file->current()); // ???
}
ext/spl/spl_directory.c:2359

Код:
/* {{{ proto void SplFileObject::seek(int line_pos)
   Seek to specified line */
SPL_METHOD(SplFileObject, seek)
{
	spl_filesystem_object *intern = (spl_filesystem_object*)zend_object_store_get_object(getThis() TSRMLS_CC);
	long line_pos;
	
	if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &line_pos) == FAILURE) {
		return;
	}
	if (line_pos < 0) {
		zend_throw_exception_ex(spl_ce_LogicException, 0 TSRMLS_CC, "Can't seek file %s to negative line %ld", intern->file_name, line_pos);
		RETURN_FALSE;		
	}
	
	spl_filesystem_file_rewind(getThis(), intern TSRMLS_CC);
	
	[b]
	while(intern->u.file.current_line_num < line_pos) {
		spl_filesystem_file_read_line(getThis(), intern, 1 TSRMLS_CC);
	}
	[/b]
} /* }}} */
имхо лучше так:
Код:
	while(intern->u.file.current_line_num < line_pos) {
		if(php_stream_eof(intern->u.file.stream)) {
			zend_throw_exception_ex(spl_ce_LogicException, 0 TSRMLS_CC, "Can't seek file %s to beyond of the end", intern->file_name);
			RETURN_FALSE;
		}

		if(SUCCESS != spl_filesystem_file_read_line(getThis(), intern, 1 TSRMLS_CC)) {
			zend_throw_exception_ex(spl_ce_LogicException, 0 TSRMLS_CC, "Can't read next line from file %s", intern->file_name);
			RETURN_FALSE;
		}
	}
Проблема 2
Попытка бросить исключение внутри кода который завязан на spl - валит php, к примеру так:
PHP:
<?php
class Foo implements IteratorAggregate {
	function getIterator() {
		throw new Exception('Boo');
		//return new ArrayIterator(array(1, 2, 3));
	}
}

$foo = new Foo();

var_dump(iterator_to_array($foo));
p.s. на bugs.php.net посмотрел, п2 отпадает
 

slach

Новичок
хороший повод оформить этот код в нормальный багрепорт с патчем в diff формате и засабмитить на bugs.php.net ?
или dev-php maillist ??
 
Сверху