diff --git a/ext/opcache/zend_file_cache.c b/ext/opcache/zend_file_cache.c index 9e99dd62215..2d5ebe6865f 100644 --- a/ext/opcache/zend_file_cache.c +++ b/ext/opcache/zend_file_cache.c @@ -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 (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))))); - if (!IS_UNSERIALIZED(type_name)) { - zend_bool allow_null = ZEND_TYPE_ALLOW_NULL(p->type); - - 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++; }