--TEST--
Test debug_zval_dump() function : working on objects
--SKIPIF--
<?php if (PHP_ZTS) { print "skip only for no-zts build"; }
--FILE--
<?php
/* Prototype: void debug_zval_dump ( mixed $variable );
   Description: Dumps a string representation of an internal zend value to output.
*/

/* Prototype: void zval_dump( $value );
   Description: use debug_zval_dump() to display the objects and its 
                reference count */
function zval_dump( $values ) {
  $counter = 1;
  foreach( $values as $value ) {
    echo "-- Iteration $counter --\n";
    debug_zval_dump( $value );
    $counter++;
  }
}

/* checking on objects type */
echo "*** Testing debug_zval_dump() on objects ***\n";
class object_class {
  var $value1 = 1;
  private $value2 = 10;
  protected $value3 = 20;
  public $value4 = 30;

  private function foo1() {
	echo "function foo1\n";
  }
  protected function foo2() {
	echo "function foo2\n";
  }
  public function foo3() {
	echo "function foo3\n";
  }
  public $array_var  = array( "key1" => 1, "key2 " => 3);

  function object_class () {
      $this->value1 = 5;
      $this->object_class1 = $this;
  }
}

class no_member_class{
//no members
}

/* class with member as object of other class */
class contains_object_class
{
   var       $p = 30;
   protected $p1 = 40;
   private   $p2 = 50;
   var       $class_object1;
   public    $class_object2;
   private   $class_object3;
   protected $class_object4;
   var       $no_member_class_object;

   public function func() {
     echo "func() is called \n";
   }

   function contains_object_class () {
     $this->class_object1 = new object_class();
     $this->class_object2 = new object_class();
     $this->class_object3 = $this->class_object1;
     $this->class_object4 = $this->class_object2;
     $this->no_member_class_object = new no_member_class();
     $this->class_object5 = $this;   //recursive reference
   }
}

/* creating new object $obj */
$obj = new contains_object_class(); 
$obj1 = & $obj;  //object $obj1 references object $obj
$obj2 = & $obj;
$obj3 = & $obj2;

/* object which is unset */
$unset_obj = new object_class();
unset($unset_obj);

$objects = array (
  new object_class,
  new no_member_class,
  $obj,
  $obj->class_object1,
  $obj->class_object2,
  $obj->no_member_class_object,
  @$temp_class_obj,  //undefined object
  $obj2->class_object1,
  $obj3->class_object2,
  $obj2->class_object1->value4,
  @$unset_obj
);
/* using zval_dump() to dump out the objects and its reference count */
zval_dump($objects);

$int_var = 500;
$obj = $int_var;  //$obj is lost, $obj1,$obj2,$obj3,$obj4 = 500
echo "\n-- Testing debug_zval_dump() on overwritten object variables --\n";
debug_zval_dump($obj, $obj1, $obj2, $obj3);

echo "\n-- Testing debug_zval_dump() on objects having circular reference --\n";
$recursion_obj1 = new object_class();
$recursion_obj2 = new object_class();
$recursion_obj1->obj = &$recursion_obj2;  //circular reference
$recursion_obj2->obj = &$recursion_obj1;  //circular reference
debug_zval_dump($recursion_obj2);

echo "Done\n";
?>
--EXPECTF--
*** Testing debug_zval_dump() on objects ***
-- Iteration 1 --
object(object_class)#%d (6) refcount(5){
  ["value1"]=>
  long(5) refcount(1)
  ["value2":"object_class":private]=>
  long(10) refcount(5)
  ["value3":protected]=>
  long(20) refcount(5)
  ["value4"]=>
  long(30) refcount(7)
  ["array_var"]=>
  array(2) refcount(5){
    ["key1"]=>
    long(1) refcount(1)
    ["key2 "]=>
    long(3) refcount(1)
  }
  ["object_class1"]=>
  object(object_class)#%d (6) refcount(5){
    ["value1"]=>
    long(5) refcount(1)
    ["value2":"object_class":private]=>
    long(10) refcount(5)
    ["value3":protected]=>
    long(20) refcount(5)
    ["value4"]=>
    long(30) refcount(7)
    ["array_var"]=>
    array(2) refcount(5){
      ["key1"]=>
      long(1) refcount(1)
      ["key2 "]=>
      long(3) refcount(1)
    }
    ["object_class1"]=>
    *RECURSION*
  }
}
-- Iteration 2 --
object(no_member_class)#%d (0) refcount(4){
}
-- Iteration 3 --
object(contains_object_class)#%d (9) refcount(4){
  ["p"]=>
  long(30) refcount(2)
  ["p1":protected]=>
  long(40) refcount(2)
  ["p2":"contains_object_class":private]=>
  long(50) refcount(2)
  ["class_object1"]=>
  object(object_class)#%d (6) refcount(7){
    ["value1"]=>
    long(5) refcount(1)
    ["value2":"object_class":private]=>
    long(10) refcount(5)
    ["value3":protected]=>
    long(20) refcount(5)
    ["value4"]=>
    long(30) refcount(7)
    ["array_var"]=>
    array(2) refcount(5){
      ["key1"]=>
      long(1) refcount(1)
      ["key2 "]=>
      long(3) refcount(1)
    }
    ["object_class1"]=>
    object(object_class)#%d (6) refcount(7){
      ["value1"]=>
      long(5) refcount(1)
      ["value2":"object_class":private]=>
      long(10) refcount(5)
      ["value3":protected]=>
      long(20) refcount(5)
      ["value4"]=>
      long(30) refcount(7)
      ["array_var"]=>
      array(2) refcount(5){
        ["key1"]=>
        long(1) refcount(1)
        ["key2 "]=>
        long(3) refcount(1)
      }
      ["object_class1"]=>
      *RECURSION*
    }
  }
  ["class_object2"]=>
  object(object_class)#%d (6) refcount(7){
    ["value1"]=>
    long(5) refcount(1)
    ["value2":"object_class":private]=>
    long(10) refcount(5)
    ["value3":protected]=>
    long(20) refcount(5)
    ["value4"]=>
    long(30) refcount(7)
    ["array_var"]=>
    array(2) refcount(5){
      ["key1"]=>
      long(1) refcount(1)
      ["key2 "]=>
      long(3) refcount(1)
    }
    ["object_class1"]=>
    object(object_class)#%d (6) refcount(7){
      ["value1"]=>
      long(5) refcount(1)
      ["value2":"object_class":private]=>
      long(10) refcount(5)
      ["value3":protected]=>
      long(20) refcount(5)
      ["value4"]=>
      long(30) refcount(7)
      ["array_var"]=>
      array(2) refcount(5){
        ["key1"]=>
        long(1) refcount(1)
        ["key2 "]=>
        long(3) refcount(1)
      }
      ["object_class1"]=>
      *RECURSION*
    }
  }
  ["class_object3":"contains_object_class":private]=>
  object(object_class)#%d (6) refcount(7){
    ["value1"]=>
    long(5) refcount(1)
    ["value2":"object_class":private]=>
    long(10) refcount(5)
    ["value3":protected]=>
    long(20) refcount(5)
    ["value4"]=>
    long(30) refcount(7)
    ["array_var"]=>
    array(2) refcount(5){
      ["key1"]=>
      long(1) refcount(1)
      ["key2 "]=>
      long(3) refcount(1)
    }
    ["object_class1"]=>
    object(object_class)#%d (6) refcount(7){
      ["value1"]=>
      long(5) refcount(1)
      ["value2":"object_class":private]=>
      long(10) refcount(5)
      ["value3":protected]=>
      long(20) refcount(5)
      ["value4"]=>
      long(30) refcount(7)
      ["array_var"]=>
      array(2) refcount(5){
        ["key1"]=>
        long(1) refcount(1)
        ["key2 "]=>
        long(3) refcount(1)
      }
      ["object_class1"]=>
      *RECURSION*
    }
  }
  ["class_object4":protected]=>
  object(object_class)#%d (6) refcount(7){
    ["value1"]=>
    long(5) refcount(1)
    ["value2":"object_class":private]=>
    long(10) refcount(5)
    ["value3":protected]=>
    long(20) refcount(5)
    ["value4"]=>
    long(30) refcount(7)
    ["array_var"]=>
    array(2) refcount(5){
      ["key1"]=>
      long(1) refcount(1)
      ["key2 "]=>
      long(3) refcount(1)
    }
    ["object_class1"]=>
    object(object_class)#%d (6) refcount(7){
      ["value1"]=>
      long(5) refcount(1)
      ["value2":"object_class":private]=>
      long(10) refcount(5)
      ["value3":protected]=>
      long(20) refcount(5)
      ["value4"]=>
      long(30) refcount(7)
      ["array_var"]=>
      array(2) refcount(5){
        ["key1"]=>
        long(1) refcount(1)
        ["key2 "]=>
        long(3) refcount(1)
      }
      ["object_class1"]=>
      *RECURSION*
    }
  }
  ["no_member_class_object"]=>
  object(no_member_class)#%d (0) refcount(3){
  }
  ["class_object5"]=>
  object(contains_object_class)#%d (9) refcount(1){
    ["p"]=>
    long(30) refcount(2)
    ["p1":protected]=>
    long(40) refcount(2)
    ["p2":"contains_object_class":private]=>
    long(50) refcount(2)
    ["class_object1"]=>
    object(object_class)#%d (6) refcount(7){
      ["value1"]=>
      long(5) refcount(1)
      ["value2":"object_class":private]=>
      long(10) refcount(5)
      ["value3":protected]=>
      long(20) refcount(5)
      ["value4"]=>
      long(30) refcount(7)
      ["array_var"]=>
      array(2) refcount(5){
        ["key1"]=>
        long(1) refcount(1)
        ["key2 "]=>
        long(3) refcount(1)
      }
      ["object_class1"]=>
      object(object_class)#%d (6) refcount(7){
        ["value1"]=>
        long(5) refcount(1)
        ["value2":"object_class":private]=>
        long(10) refcount(5)
        ["value3":protected]=>
        long(20) refcount(5)
        ["value4"]=>
        long(30) refcount(7)
        ["array_var"]=>
        array(2) refcount(5){
          ["key1"]=>
          long(1) refcount(1)
          ["key2 "]=>
          long(3) refcount(1)
        }
        ["object_class1"]=>
        *RECURSION*
      }
    }
    ["class_object2"]=>
    object(object_class)#%d (6) refcount(7){
      ["value1"]=>
      long(5) refcount(1)
      ["value2":"object_class":private]=>
      long(10) refcount(5)
      ["value3":protected]=>
      long(20) refcount(5)
      ["value4"]=>
      long(30) refcount(7)
      ["array_var"]=>
      array(2) refcount(5){
        ["key1"]=>
        long(1) refcount(1)
        ["key2 "]=>
        long(3) refcount(1)
      }
      ["object_class1"]=>
      object(object_class)#%d (6) refcount(7){
        ["value1"]=>
        long(5) refcount(1)
        ["value2":"object_class":private]=>
        long(10) refcount(5)
        ["value3":protected]=>
        long(20) refcount(5)
        ["value4"]=>
        long(30) refcount(7)
        ["array_var"]=>
        array(2) refcount(5){
          ["key1"]=>
          long(1) refcount(1)
          ["key2 "]=>
          long(3) refcount(1)
        }
        ["object_class1"]=>
        *RECURSION*
      }
    }
    ["class_object3":"contains_object_class":private]=>
    object(object_class)#%d (6) refcount(7){
      ["value1"]=>
      long(5) refcount(1)
      ["value2":"object_class":private]=>
      long(10) refcount(5)
      ["value3":protected]=>
      long(20) refcount(5)
      ["value4"]=>
      long(30) refcount(7)
      ["array_var"]=>
      array(2) refcount(5){
        ["key1"]=>
        long(1) refcount(1)
        ["key2 "]=>
        long(3) refcount(1)
      }
      ["object_class1"]=>
      object(object_class)#%d (6) refcount(7){
        ["value1"]=>
        long(5) refcount(1)
        ["value2":"object_class":private]=>
        long(10) refcount(5)
        ["value3":protected]=>
        long(20) refcount(5)
        ["value4"]=>
        long(30) refcount(7)
        ["array_var"]=>
        array(2) refcount(5){
          ["key1"]=>
          long(1) refcount(1)
          ["key2 "]=>
          long(3) refcount(1)
        }
        ["object_class1"]=>
        *RECURSION*
      }
    }
    ["class_object4":protected]=>
    object(object_class)#%d (6) refcount(7){
      ["value1"]=>
      long(5) refcount(1)
      ["value2":"object_class":private]=>
      long(10) refcount(5)
      ["value3":protected]=>
      long(20) refcount(5)
      ["value4"]=>
      long(30) refcount(7)
      ["array_var"]=>
      array(2) refcount(5){
        ["key1"]=>
        long(1) refcount(1)
        ["key2 "]=>
        long(3) refcount(1)
      }
      ["object_class1"]=>
      object(object_class)#%d (6) refcount(7){
        ["value1"]=>
        long(5) refcount(1)
        ["value2":"object_class":private]=>
        long(10) refcount(5)
        ["value3":protected]=>
        long(20) refcount(5)
        ["value4"]=>
        long(30) refcount(7)
        ["array_var"]=>
        array(2) refcount(5){
          ["key1"]=>
          long(1) refcount(1)
          ["key2 "]=>
          long(3) refcount(1)
        }
        ["object_class1"]=>
        *RECURSION*
      }
    }
    ["no_member_class_object"]=>
    object(no_member_class)#%d (0) refcount(3){
    }
    ["class_object5"]=>
    *RECURSION*
  }
}
-- Iteration 4 --
object(object_class)#%d (6) refcount(9){
  ["value1"]=>
  long(5) refcount(1)
  ["value2":"object_class":private]=>
  long(10) refcount(5)
  ["value3":protected]=>
  long(20) refcount(5)
  ["value4"]=>
  long(30) refcount(7)
  ["array_var"]=>
  array(2) refcount(5){
    ["key1"]=>
    long(1) refcount(1)
    ["key2 "]=>
    long(3) refcount(1)
  }
  ["object_class1"]=>
  object(object_class)#%d (6) refcount(9){
    ["value1"]=>
    long(5) refcount(1)
    ["value2":"object_class":private]=>
    long(10) refcount(5)
    ["value3":protected]=>
    long(20) refcount(5)
    ["value4"]=>
    long(30) refcount(7)
    ["array_var"]=>
    array(2) refcount(5){
      ["key1"]=>
      long(1) refcount(1)
      ["key2 "]=>
      long(3) refcount(1)
    }
    ["object_class1"]=>
    *RECURSION*
  }
}
-- Iteration 5 --
object(object_class)#%d (6) refcount(9){
  ["value1"]=>
  long(5) refcount(1)
  ["value2":"object_class":private]=>
  long(10) refcount(5)
  ["value3":protected]=>
  long(20) refcount(5)
  ["value4"]=>
  long(30) refcount(7)
  ["array_var"]=>
  array(2) refcount(5){
    ["key1"]=>
    long(1) refcount(1)
    ["key2 "]=>
    long(3) refcount(1)
  }
  ["object_class1"]=>
  object(object_class)#%d (6) refcount(9){
    ["value1"]=>
    long(5) refcount(1)
    ["value2":"object_class":private]=>
    long(10) refcount(5)
    ["value3":protected]=>
    long(20) refcount(5)
    ["value4"]=>
    long(30) refcount(7)
    ["array_var"]=>
    array(2) refcount(5){
      ["key1"]=>
      long(1) refcount(1)
      ["key2 "]=>
      long(3) refcount(1)
    }
    ["object_class1"]=>
    *RECURSION*
  }
}
-- Iteration 6 --
object(no_member_class)#%d (0) refcount(5){
}
-- Iteration 7 --
NULL refcount(1)
-- Iteration 8 --
object(object_class)#%d (6) refcount(9){
  ["value1"]=>
  long(5) refcount(1)
  ["value2":"object_class":private]=>
  long(10) refcount(5)
  ["value3":protected]=>
  long(20) refcount(5)
  ["value4"]=>
  long(30) refcount(7)
  ["array_var"]=>
  array(2) refcount(5){
    ["key1"]=>
    long(1) refcount(1)
    ["key2 "]=>
    long(3) refcount(1)
  }
  ["object_class1"]=>
  object(object_class)#%d (6) refcount(9){
    ["value1"]=>
    long(5) refcount(1)
    ["value2":"object_class":private]=>
    long(10) refcount(5)
    ["value3":protected]=>
    long(20) refcount(5)
    ["value4"]=>
    long(30) refcount(7)
    ["array_var"]=>
    array(2) refcount(5){
      ["key1"]=>
      long(1) refcount(1)
      ["key2 "]=>
      long(3) refcount(1)
    }
    ["object_class1"]=>
    *RECURSION*
  }
}
-- Iteration 9 --
object(object_class)#%d (6) refcount(9){
  ["value1"]=>
  long(5) refcount(1)
  ["value2":"object_class":private]=>
  long(10) refcount(5)
  ["value3":protected]=>
  long(20) refcount(5)
  ["value4"]=>
  long(30) refcount(7)
  ["array_var"]=>
  array(2) refcount(5){
    ["key1"]=>
    long(1) refcount(1)
    ["key2 "]=>
    long(3) refcount(1)
  }
  ["object_class1"]=>
  object(object_class)#%d (6) refcount(9){
    ["value1"]=>
    long(5) refcount(1)
    ["value2":"object_class":private]=>
    long(10) refcount(5)
    ["value3":protected]=>
    long(20) refcount(5)
    ["value4"]=>
    long(30) refcount(7)
    ["array_var"]=>
    array(2) refcount(5){
      ["key1"]=>
      long(1) refcount(1)
      ["key2 "]=>
      long(3) refcount(1)
    }
    ["object_class1"]=>
    *RECURSION*
  }
}
-- Iteration 10 --
long(30) refcount(9)
-- Iteration 11 --
NULL refcount(1)

-- Testing debug_zval_dump() on overwritten object variables --
long(500) refcount(1)
long(500) refcount(1)
long(500) refcount(1)
long(500) refcount(1)

-- Testing debug_zval_dump() on objects having circular reference --
object(object_class)#%d (7) refcount(1){
  ["value1"]=>
  long(5) refcount(1)
  ["value2":"object_class":private]=>
  long(10) refcount(7)
  ["value3":protected]=>
  long(20) refcount(7)
  ["value4"]=>
  long(30) refcount(8)
  ["array_var"]=>
  array(2) refcount(7){
    ["key1"]=>
    long(1) refcount(1)
    ["key2 "]=>
    long(3) refcount(1)
  }
  ["object_class1"]=>
  object(object_class)#%d (7) refcount(1){
    ["value1"]=>
    long(5) refcount(1)
    ["value2":"object_class":private]=>
    long(10) refcount(7)
    ["value3":protected]=>
    long(20) refcount(7)
    ["value4"]=>
    long(30) refcount(8)
    ["array_var"]=>
    array(2) refcount(7){
      ["key1"]=>
      long(1) refcount(1)
      ["key2 "]=>
      long(3) refcount(1)
    }
    ["object_class1"]=>
    *RECURSION*
    ["obj"]=>
    &object(object_class)#%d (7) refcount(2){
      ["value1"]=>
      long(5) refcount(1)
      ["value2":"object_class":private]=>
      long(10) refcount(7)
      ["value3":protected]=>
      long(20) refcount(7)
      ["value4"]=>
      long(30) refcount(8)
      ["array_var"]=>
      array(2) refcount(7){
        ["key1"]=>
        long(1) refcount(1)
        ["key2 "]=>
        long(3) refcount(1)
      }
      ["object_class1"]=>
      object(object_class)#%d (7) refcount(1){
        ["value1"]=>
        long(5) refcount(1)
        ["value2":"object_class":private]=>
        long(10) refcount(7)
        ["value3":protected]=>
        long(20) refcount(7)
        ["value4"]=>
        long(30) refcount(8)
        ["array_var"]=>
        array(2) refcount(7){
          ["key1"]=>
          long(1) refcount(1)
          ["key2 "]=>
          long(3) refcount(1)
        }
        ["object_class1"]=>
        *RECURSION*
        ["obj"]=>
        *RECURSION*
      }
      ["obj"]=>
      *RECURSION*
    }
  }
  ["obj"]=>
  &object(object_class)#%d (7) refcount(2){
    ["value1"]=>
    long(5) refcount(1)
    ["value2":"object_class":private]=>
    long(10) refcount(7)
    ["value3":protected]=>
    long(20) refcount(7)
    ["value4"]=>
    long(30) refcount(8)
    ["array_var"]=>
    array(2) refcount(7){
      ["key1"]=>
      long(1) refcount(1)
      ["key2 "]=>
      long(3) refcount(1)
    }
    ["object_class1"]=>
    object(object_class)#%d (7) refcount(1){
      ["value1"]=>
      long(5) refcount(1)
      ["value2":"object_class":private]=>
      long(10) refcount(7)
      ["value3":protected]=>
      long(20) refcount(7)
      ["value4"]=>
      long(30) refcount(8)
      ["array_var"]=>
      array(2) refcount(7){
        ["key1"]=>
        long(1) refcount(1)
        ["key2 "]=>
        long(3) refcount(1)
      }
      ["object_class1"]=>
      *RECURSION*
      ["obj"]=>
      &object(object_class)#%d (7) refcount(2){
        ["value1"]=>
        long(5) refcount(1)
        ["value2":"object_class":private]=>
        long(10) refcount(7)
        ["value3":protected]=>
        long(20) refcount(7)
        ["value4"]=>
        long(30) refcount(8)
        ["array_var"]=>
        array(2) refcount(7){
          ["key1"]=>
          long(1) refcount(1)
          ["key2 "]=>
          long(3) refcount(1)
        }
        ["object_class1"]=>
        *RECURSION*
        ["obj"]=>
        *RECURSION*
      }
    }
    ["obj"]=>
    &object(object_class)#%d (7) refcount(2){
      ["value1"]=>
      long(5) refcount(1)
      ["value2":"object_class":private]=>
      long(10) refcount(7)
      ["value3":protected]=>
      long(20) refcount(7)
      ["value4"]=>
      long(30) refcount(8)
      ["array_var"]=>
      array(2) refcount(7){
        ["key1"]=>
        long(1) refcount(1)
        ["key2 "]=>
        long(3) refcount(1)
      }
      ["object_class1"]=>
      *RECURSION*
      ["obj"]=>
      &object(object_class)#%d (7) refcount(2){
        ["value1"]=>
        long(5) refcount(1)
        ["value2":"object_class":private]=>
        long(10) refcount(7)
        ["value3":protected]=>
        long(20) refcount(7)
        ["value4"]=>
        long(30) refcount(8)
        ["array_var"]=>
        array(2) refcount(7){
          ["key1"]=>
          long(1) refcount(1)
          ["key2 "]=>
          long(3) refcount(1)
        }
        ["object_class1"]=>
        *RECURSION*
        ["obj"]=>
        *RECURSION*
      }
    }
  }
}
Done
