Commit:    1c8cbe4b4e8e373b37c740b7d96e4beb96414ea0
Author:    Nikita Popov <ni...@php.net>         Sun, 24 Nov 2013 00:43:12 +0100
Parents:   8860758a74ce5b2237e3b00131cbb63abd4613bb
Branches:  PHP-5.6 master

Link:       
http://git.php.net/?p=php-src.git;a=commitdiff;h=1c8cbe4b4e8e373b37c740b7d96e4beb96414ea0

Log:
Use class handlers for GMP serialization

A bit faster and less boilerplate

Changed paths:
  M  ext/gmp/gmp.c


Diff:
diff --git a/ext/gmp/gmp.c b/ext/gmp/gmp.c
index 9a49bec..d3b6189 100644
--- a/ext/gmp/gmp.c
+++ b/ext/gmp/gmp.c
@@ -27,7 +27,6 @@
 #include "ext/standard/php_var.h"
 #include "ext/standard/php_smart_str_public.h"
 #include "zend_exceptions.h"
-#include "zend_interfaces.h"
 
 #if HAVE_GMP
 
@@ -686,57 +685,51 @@ static int gmp_compare(zval *result, zval *op1, zval *op2 
TSRMLS_DC) /* {{{ */
 }
 /* }}} */
 
-PHP_METHOD(GMP, serialize) /* {{{ */
+static int gmp_serialize(zval *object, unsigned char **buffer, zend_uint 
*buf_len, zend_serialize_data *data TSRMLS_DC) /* {{{ */
 {
-       mpz_ptr gmpnum = GET_GMP_FROM_ZVAL(getThis());
+       mpz_ptr gmpnum = GET_GMP_FROM_ZVAL(object);
        smart_str buf = {0};
-       php_serialize_data_t var_hash;
        zval zv, *zv_ptr = &zv;
+       php_serialize_data_t *serialize_data = (php_serialize_data_t *) data;
 
-       if (zend_parse_parameters_none() == FAILURE) {
-               return;
-       }
-
-       PHP_VAR_SERIALIZE_INIT(var_hash);
+       PHP_VAR_SERIALIZE_INIT(*serialize_data);
 
        INIT_PZVAL(zv_ptr);
 
        gmp_strval(zv_ptr, gmpnum, 10);
-       php_var_serialize(&buf, &zv_ptr, &var_hash TSRMLS_CC);
+       php_var_serialize(&buf, &zv_ptr, serialize_data TSRMLS_CC);
        zval_dtor(zv_ptr);
 
-       Z_ARRVAL_P(zv_ptr) = zend_std_get_properties(getThis() TSRMLS_CC);
+       Z_ARRVAL_P(zv_ptr) = zend_std_get_properties(object TSRMLS_CC);
        Z_TYPE_P(zv_ptr) = IS_ARRAY;
-       php_var_serialize(&buf, &zv_ptr, &var_hash TSRMLS_CC);
+       php_var_serialize(&buf, &zv_ptr, serialize_data TSRMLS_CC);
 
-       PHP_VAR_SERIALIZE_DESTROY(var_hash);
+       PHP_VAR_SERIALIZE_DESTROY(*serialize_data);
 
-       if (buf.c) {
-               RETURN_STRINGL(buf.c, buf.len, 0);
-       }
+       *buffer = (unsigned char *) buf.c;
+       *buf_len = buf.len;
+
+       return SUCCESS;
 }
 /* }}} */
 
-PHP_METHOD(GMP, unserialize) /* {{{ */
+static int gmp_unserialize(zval **object, zend_class_entry *ce, const unsigned 
char *buf, zend_uint buf_len, zend_unserialize_data *data TSRMLS_DC) /* {{{ */
 {
-       mpz_ptr gmpnum = GET_GMP_FROM_ZVAL(getThis());
-       char *str;
-       int str_len;
-       php_unserialize_data_t var_hash;
+       mpz_ptr gmpnum;
        const unsigned char *p, *max;
        zval zv, *zv_ptr = &zv;
+       int retval = FAILURE;
+       php_unserialize_data_t *unserialize_data = (php_unserialize_data_t *) 
data;
 
-       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &str, 
&str_len) == FAILURE) {
-               return;
-       }
+       PHP_VAR_UNSERIALIZE_INIT(*unserialize_data);
 
-       PHP_VAR_UNSERIALIZE_INIT(var_hash);
+       gmp_create_ex(*object, &gmpnum TSRMLS_CC);
 
-       p = (unsigned char *) str;
-       max = (unsigned char *) str + str_len;
+       p = buf;
+       max = buf + buf_len;
 
        INIT_ZVAL(zv);
-       if (!php_var_unserialize(&zv_ptr, &p, max, &var_hash TSRMLS_CC)
+       if (!php_var_unserialize(&zv_ptr, &p, max, unserialize_data TSRMLS_CC)
                || Z_TYPE_P(zv_ptr) != IS_STRING
                || convert_to_gmp(gmpnum, zv_ptr, 10 TSRMLS_CC) == FAILURE
        ) {
@@ -746,7 +739,7 @@ PHP_METHOD(GMP, unserialize) /* {{{ */
        zval_dtor(&zv);
 
        INIT_ZVAL(zv);
-       if (!php_var_unserialize(&zv_ptr, &p, max, &var_hash TSRMLS_CC)
+       if (!php_var_unserialize(&zv_ptr, &p, max, unserialize_data TSRMLS_CC)
                || Z_TYPE_P(zv_ptr) != IS_ARRAY
        ) {
                zend_throw_exception(NULL, "Could not unserialize properties", 
0 TSRMLS_CC);
@@ -755,30 +748,19 @@ PHP_METHOD(GMP, unserialize) /* {{{ */
 
        if (zend_hash_num_elements(Z_ARRVAL_P(zv_ptr)) != 0) {
                zend_hash_copy(
-                       zend_std_get_properties(getThis() TSRMLS_CC), 
Z_ARRVAL_P(zv_ptr),
+                       zend_std_get_properties(*object TSRMLS_CC), 
Z_ARRVAL_P(zv_ptr),
                        (copy_ctor_func_t) zval_add_ref, NULL, sizeof(zval *)
                );
        }
 
+       retval = SUCCESS;
 exit:
        zval_dtor(&zv);
-       PHP_VAR_UNSERIALIZE_DESTROY(var_hash);
+       PHP_VAR_UNSERIALIZE_DESTROY(*unserialize_data);
+       return retval;
 }
 /* }}} */
 
-ZEND_BEGIN_ARG_INFO_EX(arginfo_serialize, 0, 0, 0)
-ZEND_END_ARG_INFO()
-
-ZEND_BEGIN_ARG_INFO_EX(arginfo_unserialize, 0, 0, 1)
-ZEND_ARG_INFO(0, serialized)
-ZEND_END_ARG_INFO()
-
-const zend_function_entry gmp_methods[] = {
-       PHP_ME(GMP, serialize, arginfo_serialize, ZEND_ACC_PUBLIC)
-       PHP_ME(GMP, unserialize, arginfo_unserialize, ZEND_ACC_PUBLIC)
-       PHP_FE_END
-};
-
 /* {{{ ZEND_GINIT_FUNCTION
  */
 static ZEND_GINIT_FUNCTION(gmp)
@@ -792,10 +774,11 @@ static ZEND_GINIT_FUNCTION(gmp)
 ZEND_MINIT_FUNCTION(gmp)
 {
        zend_class_entry tmp_ce;
-       INIT_CLASS_ENTRY(tmp_ce, "GMP", gmp_methods);
+       INIT_CLASS_ENTRY(tmp_ce, "GMP", NULL);
        gmp_ce = zend_register_internal_class(&tmp_ce TSRMLS_CC);
-       zend_class_implements(gmp_ce TSRMLS_CC, 1, zend_ce_serializable);
        gmp_ce->create_object = gmp_create_object;
+       gmp_ce->serialize = gmp_serialize;
+       gmp_ce->unserialize = gmp_unserialize;
 
        memcpy(&gmp_object_handlers, zend_get_std_object_handlers(), 
sizeof(zend_object_handlers));
        gmp_object_handlers.cast_object = gmp_cast_object;


--
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to