int64_t f_count(CVarRef var, bool recursive /* = false */) { switch (var.getType()) { case KindOfUninit: case KindOfNull: return 0; case KindOfObject: { Object obj = var.toObject(); if (obj->isCollection()) { return obj->getCollectionSize(); } if (obj.instanceof(SystemLib::s_CountableClass)) { return obj->o_invoke_few_args(s_count, 0).toInt64(); } } break; case KindOfArray: if (recursive) { CArrRef arr_var = var.toCArrRef(); return php_count_recursive(arr_var); } return var.getArrayData()->size(); default: break; } return 1; }