27
27
#include "ext/standard/php_var.h"
28
28
#include "ext/standard/php_smart_str_public.h"
29
29
#include "zend_exceptions.h"
30
- #include "zend_interfaces.h"
31
30
32
31
#if HAVE_GMP
33
32
@@ -686,57 +685,51 @@ static int gmp_compare(zval *result, zval *op1, zval *op2 TSRMLS_DC) /* {{{ */
686
685
}
687
686
/* }}} */
688
687
689
- PHP_METHOD ( GMP , serialize ) /* {{{ */
688
+ static int gmp_serialize ( zval * object , unsigned char * * buffer , zend_uint * buf_len , zend_serialize_data * data TSRMLS_DC ) /* {{{ */
690
689
{
691
- mpz_ptr gmpnum = GET_GMP_FROM_ZVAL (getThis () );
690
+ mpz_ptr gmpnum = GET_GMP_FROM_ZVAL (object );
692
691
smart_str buf = {0 };
693
- php_serialize_data_t var_hash ;
694
692
zval zv , * zv_ptr = & zv ;
693
+ php_serialize_data_t * serialize_data = (php_serialize_data_t * ) data ;
695
694
696
- if (zend_parse_parameters_none () == FAILURE ) {
697
- return ;
698
- }
699
-
700
- PHP_VAR_SERIALIZE_INIT (var_hash );
695
+ PHP_VAR_SERIALIZE_INIT (* serialize_data );
701
696
702
697
INIT_PZVAL (zv_ptr );
703
698
704
699
gmp_strval (zv_ptr , gmpnum , 10 );
705
- php_var_serialize (& buf , & zv_ptr , & var_hash TSRMLS_CC );
700
+ php_var_serialize (& buf , & zv_ptr , serialize_data TSRMLS_CC );
706
701
zval_dtor (zv_ptr );
707
702
708
- Z_ARRVAL_P (zv_ptr ) = zend_std_get_properties (getThis () TSRMLS_CC );
703
+ Z_ARRVAL_P (zv_ptr ) = zend_std_get_properties (object TSRMLS_CC );
709
704
Z_TYPE_P (zv_ptr ) = IS_ARRAY ;
710
- php_var_serialize (& buf , & zv_ptr , & var_hash TSRMLS_CC );
705
+ php_var_serialize (& buf , & zv_ptr , serialize_data TSRMLS_CC );
711
706
712
- PHP_VAR_SERIALIZE_DESTROY (var_hash );
707
+ PHP_VAR_SERIALIZE_DESTROY (* serialize_data );
713
708
714
- if (buf .c ) {
715
- RETURN_STRINGL (buf .c , buf .len , 0 );
716
- }
709
+ * buffer = (unsigned char * ) buf .c ;
710
+ * buf_len = buf .len ;
711
+
712
+ return SUCCESS ;
717
713
}
718
714
/* }}} */
719
715
720
- PHP_METHOD ( GMP , unserialize ) /* {{{ */
716
+ static int gmp_unserialize ( zval * * object , zend_class_entry * ce , const unsigned char * buf , zend_uint buf_len , zend_unserialize_data * data TSRMLS_DC ) /* {{{ */
721
717
{
722
- mpz_ptr gmpnum = GET_GMP_FROM_ZVAL (getThis ());
723
- char * str ;
724
- int str_len ;
725
- php_unserialize_data_t var_hash ;
718
+ mpz_ptr gmpnum ;
726
719
const unsigned char * p , * max ;
727
720
zval zv , * zv_ptr = & zv ;
721
+ int retval = FAILURE ;
722
+ php_unserialize_data_t * unserialize_data = (php_unserialize_data_t * ) data ;
728
723
729
- if (zend_parse_parameters (ZEND_NUM_ARGS () TSRMLS_CC , "s" , & str , & str_len ) == FAILURE ) {
730
- return ;
731
- }
724
+ PHP_VAR_UNSERIALIZE_INIT (* unserialize_data );
732
725
733
- PHP_VAR_UNSERIALIZE_INIT ( var_hash );
726
+ gmp_create_ex ( * object , & gmpnum TSRMLS_CC );
734
727
735
- p = ( unsigned char * ) str ;
736
- max = ( unsigned char * ) str + str_len ;
728
+ p = buf ;
729
+ max = buf + buf_len ;
737
730
738
731
INIT_ZVAL (zv );
739
- if (!php_var_unserialize (& zv_ptr , & p , max , & var_hash TSRMLS_CC )
732
+ if (!php_var_unserialize (& zv_ptr , & p , max , unserialize_data TSRMLS_CC )
740
733
|| Z_TYPE_P (zv_ptr ) != IS_STRING
741
734
|| convert_to_gmp (gmpnum , zv_ptr , 10 TSRMLS_CC ) == FAILURE
742
735
) {
@@ -746,7 +739,7 @@ PHP_METHOD(GMP, unserialize) /* {{{ */
746
739
zval_dtor (& zv );
747
740
748
741
INIT_ZVAL (zv );
749
- if (!php_var_unserialize (& zv_ptr , & p , max , & var_hash TSRMLS_CC )
742
+ if (!php_var_unserialize (& zv_ptr , & p , max , unserialize_data TSRMLS_CC )
750
743
|| Z_TYPE_P (zv_ptr ) != IS_ARRAY
751
744
) {
752
745
zend_throw_exception (NULL , "Could not unserialize properties" , 0 TSRMLS_CC );
@@ -755,30 +748,19 @@ PHP_METHOD(GMP, unserialize) /* {{{ */
755
748
756
749
if (zend_hash_num_elements (Z_ARRVAL_P (zv_ptr )) != 0 ) {
757
750
zend_hash_copy (
758
- zend_std_get_properties (getThis () TSRMLS_CC ), Z_ARRVAL_P (zv_ptr ),
751
+ zend_std_get_properties (* object TSRMLS_CC ), Z_ARRVAL_P (zv_ptr ),
759
752
(copy_ctor_func_t ) zval_add_ref , NULL , sizeof (zval * )
760
753
);
761
754
}
762
755
756
+ retval = SUCCESS ;
763
757
exit :
764
758
zval_dtor (& zv );
765
- PHP_VAR_UNSERIALIZE_DESTROY (var_hash );
759
+ PHP_VAR_UNSERIALIZE_DESTROY (* unserialize_data );
760
+ return retval ;
766
761
}
767
762
/* }}} */
768
763
769
- ZEND_BEGIN_ARG_INFO_EX (arginfo_serialize , 0 , 0 , 0 )
770
- ZEND_END_ARG_INFO ()
771
-
772
- ZEND_BEGIN_ARG_INFO_EX (arginfo_unserialize , 0 , 0 , 1 )
773
- ZEND_ARG_INFO (0 , serialized )
774
- ZEND_END_ARG_INFO ()
775
-
776
- const zend_function_entry gmp_methods [] = {
777
- PHP_ME (GMP , serialize , arginfo_serialize , ZEND_ACC_PUBLIC )
778
- PHP_ME (GMP , unserialize , arginfo_unserialize , ZEND_ACC_PUBLIC )
779
- PHP_FE_END
780
- };
781
-
782
764
/* {{{ ZEND_GINIT_FUNCTION
783
765
*/
784
766
static ZEND_GINIT_FUNCTION (gmp )
@@ -792,10 +774,11 @@ static ZEND_GINIT_FUNCTION(gmp)
792
774
ZEND_MINIT_FUNCTION (gmp )
793
775
{
794
776
zend_class_entry tmp_ce ;
795
- INIT_CLASS_ENTRY (tmp_ce , "GMP" , gmp_methods );
777
+ INIT_CLASS_ENTRY (tmp_ce , "GMP" , NULL );
796
778
gmp_ce = zend_register_internal_class (& tmp_ce TSRMLS_CC );
797
- zend_class_implements (gmp_ce TSRMLS_CC , 1 , zend_ce_serializable );
798
779
gmp_ce -> create_object = gmp_create_object ;
780
+ gmp_ce -> serialize = gmp_serialize ;
781
+ gmp_ce -> unserialize = gmp_unserialize ;
799
782
800
783
memcpy (& gmp_object_handlers , zend_get_std_object_handlers (), sizeof (zend_object_handlers ));
801
784
gmp_object_handlers .cast_object = gmp_cast_object ;
0 commit comments