+static inline void php_ion_serialize_ex(php_ion_serializer *ser, zval *zv)
+{
+ HashPosition pos;
+ HashTable *arr = NULL;
+
+ if (ser->multi_seq) {
+ if (Z_TYPE_P(zv) != IS_ARRAY || !zend_array_is_list(Z_ARRVAL_P(zv))) {
+ zend_throw_exception_ex(spl_ce_InvalidArgumentException, IERR_INVALID_ARG,
+ "Expected a packed, consecutively numerically indexed array as argument to the multi sequence serializer");
+ return;
+ }
+
+ arr = Z_ARRVAL_P(zv);
+
+ zend_hash_internal_pointer_reset_ex(arr, &pos);
+ zv = zend_hash_get_current_data_ex(arr, &pos);
+ }
+
+ while (zv) {
+ /* start off with a global PHP annotation instead of repeating it all over the place */
+ if (0 == php_ion_globals_serializer_step()) {
+ ION_STRING is;
+ ION_CHECK(ion_writer_add_annotation(ser->writer, ion_string_assign_cstr(&is, ZEND_STRL("PHP"))));
+ }
+ php_ion_serialize_zval(ser, zv);
+ php_ion_globals_serializer_exit();
+
+ if (!ser->multi_seq) {
+ break;
+ }
+ zend_hash_move_forward_ex(arr, &pos);
+ zv = zend_hash_get_current_data_ex(arr, &pos);
+ }
+}
+