support IteratorAggregateClass

someone added this class but didn't really hook it up. This was breaking Symfony.
Esse commit está contido em:
Paul Tarjan
2013-05-22 01:21:49 -07:00
commit de Sara Golemon
commit 98589f6e87
3 arquivos alterados com 58 adições e 12 exclusões
+30 -12
Ver Arquivo
@@ -33,6 +33,7 @@ static StaticString s_valid("valid");
static StaticString s_next("next");
static StaticString s_current("current");
static StaticString s_key("key");
static StaticString s_getIterator("getIterator");
static const StaticString spl_classes[] = {
StaticString("AppendIterator"),
@@ -199,12 +200,34 @@ Variant f_class_uses(CVarRef obj, bool autoload /* = true */) {
return ret;
}
Object get_traversable_object_iterator(CVarRef obj) {
if (!obj.instanceof(SystemLib::s_TraversableClass)) {
raise_error("Argument must implement interface Traversable");
}
bool isIteratorAggregate;
Object itObj = obj.getObjectData()
->iterableObject(isIteratorAggregate, true);
if (!isIteratorAggregate) {
if (obj.instanceof(SystemLib::s_IteratorAggregateClass)) {
raise_error("Objects returned by getIterator() must be traversable or "
"implement interface Iterator");
} else {
raise_error(
"Class %s must implement interface Traversable as part of either "
"Iterator or IteratorAggregate",
obj.toObject()->o_getClassName()->data()
);
}
}
return itObj;
}
Variant f_iterator_apply(CVarRef obj, CVarRef func,
CArrRef params /* = null_array */) {
if (!obj.instanceof(SystemLib::s_TraversableClass)) {
return false;
}
Object pobj = obj.toObject();
Object pobj = get_traversable_object_iterator(obj);
pobj->o_invoke_few_args(s_rewind, 0);
int64_t count = 0;
while (same(pobj->o_invoke_few_args(s_valid, 0), true)) {
@@ -218,10 +241,7 @@ Variant f_iterator_apply(CVarRef obj, CVarRef func,
}
Variant f_iterator_count(CVarRef obj) {
if (!obj.instanceof(SystemLib::s_TraversableClass)) {
return false;
}
Object pobj = obj.toObject();
Object pobj = get_traversable_object_iterator(obj);
pobj->o_invoke_few_args(s_rewind, 0);
int64_t count = 0;
while (same(pobj->o_invoke_few_args(s_valid, 0), true)) {
@@ -232,11 +252,9 @@ Variant f_iterator_count(CVarRef obj) {
}
Variant f_iterator_to_array(CVarRef obj, bool use_keys /* = true */) {
if (!obj.instanceof(SystemLib::s_TraversableClass)) {
return false;
}
Object pobj = get_traversable_object_iterator(obj);
Array ret(Array::Create());
Object pobj = obj.toObject();
pobj->o_invoke_few_args(s_rewind, 0);
while (same(pobj->o_invoke_few_args(s_valid, 0), true)) {
Variant val = pobj->o_invoke_few_args(s_current, 0);
@@ -0,0 +1,11 @@
<?PHP
class A implements IteratorAggregate {
public function getIterator() {
return new ArrayIterator(array(1,2,3));
}
}
var_dump(iterator_to_array(new ArrayIterator(array(1,2,3))));
var_dump(iterator_to_array(new A));
var_dump(iterator_to_array(new stdClass));
@@ -0,0 +1,17 @@
array(3) {
[0]=>
int(1)
[1]=>
int(2)
[2]=>
int(3)
}
array(3) {
[0]=>
int(1)
[1]=>
int(2)
[2]=>
int(3)
}
HipHop Fatal error: Argument must implement interface Traversable in %s/hphp/test/slow/iterator/iterator_to_array.php on line 11