]> granicus.if.org Git - php/commitdiff
Fixed file-cache support (serialization/deserialization of zend_type)
authorDmitry Stogov <dmitry@zend.com>
Fri, 3 Mar 2017 09:26:49 +0000 (12:26 +0300)
committerDmitry Stogov <dmitry@zend.com>
Fri, 3 Mar 2017 09:26:49 +0000 (12:26 +0300)
ext/opcache/zend_file_cache.c

index 9e99dd622156340c6f860934c0f18116c339a2e5..2d5ebe6865f78e5a2f6be20c0d78175949234fff 100644 (file)
@@ -437,14 +437,14 @@ static void zend_file_cache_serialize_op_array(zend_op_array            *op_arra
                                        SERIALIZE_STR(p->name);
                                }
                                if (ZEND_TYPE_IS_CLASS(p->type)) {
+                                       zend_bool allow_null = ZEND_TYPE_ALLOW_NULL(p->type);
                                        zend_string *type_name = ZEND_TYPE_NAME(p->type);
 
-                                       if (!IS_SERIALIZED(type_name)) {
-                                               zend_bool allow_null = ZEND_TYPE_ALLOW_NULL(p->type);
-
-                                               SERIALIZE_STR(type_name);
-                                               p->type = ZEND_TYPE_ENCODE_CLASS(type_name, allow_null);
-                                       }
+                                       SERIALIZE_STR(type_name);
+                                       p->type =
+                                               (Z_UL(1) << (sizeof(zend_type)*8-1)) | /* type is class */
+                                               (allow_null ? (Z_UL(1) << (sizeof(zend_type)*8-2)) : Z_UL(0)) | /* type allow null */
+                                               (zend_type)type_name;
                                }
                                p++;
                        }
@@ -1018,15 +1018,12 @@ static void zend_file_cache_unserialize_op_array(zend_op_array           *op_arr
                                if (!IS_UNSERIALIZED(p->name)) {
                                        UNSERIALIZE_STR(p->name);
                                }
-                               if (ZEND_TYPE_IS_CLASS(p->type)) {
-                                       zend_string *type_name = ZEND_TYPE_NAME(p->type);
-
-                                       if (!IS_UNSERIALIZED(type_name)) {
-                                               zend_bool allow_null = ZEND_TYPE_ALLOW_NULL(p->type);
+                               if (p->type & (Z_UL(1) << (sizeof(zend_type)*8-1))) { /* type is class */
+                                       zend_bool allow_null = (p->type & (Z_UL(1) << (sizeof(zend_type)*8-2))) != 0; /* type allow null */
+                                       zend_string *type_name = (zend_string*)(p->type & ~(((Z_UL(1) << (sizeof(zend_type)*8-1))) | ((Z_UL(1) << (sizeof(zend_type)*8-2)))));
 
-                                               UNSERIALIZE_STR(type_name);
-                                               p->type = ZEND_TYPE_ENCODE_CLASS(type_name, allow_null);
-                                       }
+                                       UNSERIALIZE_STR(type_name);
+                                       p->type = ZEND_TYPE_ENCODE_CLASS(type_name, allow_null);
                                }
                                p++;
                        }