Skip to content

Commit cceb60d

Browse files
committed
php: supported 5.4.x version
1 parent d41d2e8 commit cceb60d

9 files changed

Lines changed: 210 additions & 94 deletions

File tree

ChangeLog

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
msgpack extension changelog
22

3+
Version 0.5.2
4+
-------------
5+
* Support PHP 5.4.x version.
6+
37
Version 0.5.1
48
-------------
59
* Fixed include path for version check.

msgpack.c

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,9 @@ STD_PHP_INI_BOOLEAN(
4040
STD_PHP_INI_BOOLEAN(
4141
"msgpack.php_only", "1", PHP_INI_ALL, OnUpdateBool,
4242
php_only, zend_msgpack_globals, msgpack_globals)
43+
STD_PHP_INI_BOOLEAN(
44+
"msgpack.illegal_key_insert", "0", PHP_INI_ALL, OnUpdateBool,
45+
illegal_key_insert, zend_msgpack_globals, msgpack_globals)
4346
PHP_INI_END()
4447

4548
PS_SERIALIZER_FUNCS(msgpack);
@@ -66,6 +69,8 @@ static void msgpack_init_globals(zend_msgpack_globals *msgpack_globals)
6669
}
6770

6871
msgpack_globals->php_only = 1;
72+
73+
msgpack_globals->illegal_key_insert = 0;
6974
}
7075

7176
static ZEND_MINIT_FUNCTION(msgpack)
@@ -136,11 +141,15 @@ ZEND_GET_MODULE(msgpack)
136141
PS_SERIALIZER_ENCODE_FUNC(msgpack)
137142
{
138143
smart_str buf = {0};
139-
php_serialize_data_t var_hash;
144+
msgpack_serialize_data_t var_hash;
140145

141146
PHP_VAR_SERIALIZE_INIT(var_hash);
142147

148+
#if PHP_API_VERSION < 20100412
143149
msgpack_serialize_zval(&buf, PS(http_session_vars), &var_hash TSRMLS_CC);
150+
#else
151+
msgpack_serialize_zval(&buf, PS(http_session_vars), var_hash TSRMLS_CC);
152+
#endif
144153

145154
if (newlen)
146155
{
@@ -167,7 +176,7 @@ PS_SERIALIZER_DECODE_FUNC(msgpack)
167176
zval **value;
168177
size_t off = 0;
169178
msgpack_unpack_t mp;
170-
php_unserialize_data_t var_hash;
179+
msgpack_unserialize_data_t var_hash;
171180

172181
ALLOC_INIT_ZVAL(tmp);
173182

@@ -176,7 +185,7 @@ PS_SERIALIZER_DECODE_FUNC(msgpack)
176185
msgpack_unserialize_var_init(&var_hash);
177186

178187
mp.user.retval = (zval *)tmp;
179-
mp.user.var_hash = (php_unserialize_data_t *)&var_hash;
188+
mp.user.var_hash = (msgpack_unserialize_data_t *)&var_hash;
180189

181190
ret = template_execute(&mp, (char *)val, (size_t)vallen, &off);
182191

@@ -219,11 +228,15 @@ PS_SERIALIZER_DECODE_FUNC(msgpack)
219228

220229
PHP_MSGPACK_API void php_msgpack_serialize(smart_str *buf, zval *val TSRMLS_DC)
221230
{
222-
php_serialize_data_t var_hash;
231+
msgpack_serialize_data_t var_hash;
223232

224233
PHP_VAR_SERIALIZE_INIT(var_hash);
225234

235+
#if PHP_API_VERSION < 20100412
226236
msgpack_serialize_zval(buf, val, &var_hash TSRMLS_CC);
237+
#else
238+
msgpack_serialize_zval(buf, val, var_hash TSRMLS_CC);
239+
#endif
227240

228241
PHP_VAR_SERIALIZE_DESTROY(var_hash);
229242
}
@@ -234,7 +247,7 @@ PHP_MSGPACK_API void php_msgpack_unserialize(
234247
int ret;
235248
size_t off = 0;
236249
msgpack_unpack_t mp;
237-
php_unserialize_data_t var_hash;
250+
msgpack_unserialize_data_t var_hash;
238251

239252
if (str_len <= 0)
240253
{
@@ -246,7 +259,7 @@ PHP_MSGPACK_API void php_msgpack_unserialize(
246259
msgpack_unserialize_var_init(&var_hash);
247260

248261
mp.user.retval = (zval *)return_value;
249-
mp.user.var_hash = (php_unserialize_data_t *)&var_hash;
262+
mp.user.var_hash = (msgpack_unserialize_data_t *)&var_hash;
250263

251264
ret = template_execute(&mp, str, (size_t)str_len, &off);
252265

msgpack_class.c

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ typedef struct {
1919
zval *retval;
2020
long offset;
2121
msgpack_unpack_t mp;
22-
php_unserialize_data_t var_hash;
22+
msgpack_unserialize_data_t var_hash;
2323
long php_only;
2424
zend_bool finished;
2525
int error;
@@ -188,8 +188,10 @@ static void php_msgpack_base_free(php_msgpack_base_t *base TSRMLS_DC)
188188
static zend_object_value php_msgpack_base_new(zend_class_entry *ce TSRMLS_DC)
189189
{
190190
zend_object_value retval;
191-
zval *tmp;
192191
php_msgpack_base_t *base;
192+
#if PHP_API_VERSION < 20100412
193+
zval *tmp;
194+
#endif
193195

194196
base = emalloc(sizeof(php_msgpack_base_t));
195197

@@ -201,9 +203,13 @@ static zend_object_value php_msgpack_base_new(zend_class_entry *ce TSRMLS_DC)
201203
base->object.ce = ce;
202204
#endif
203205

206+
#if PHP_API_VERSION < 20100412
204207
zend_hash_copy(
205208
base->object.properties, &ce->default_properties,
206209
(copy_ctor_func_t)zval_add_ref, (void *)&tmp, sizeof(zval *));
210+
#else
211+
object_properties_init(&base->object, ce);
212+
#endif
207213

208214
retval.handle = zend_objects_store_put(
209215
base, (zend_objects_store_dtor_t)zend_objects_destroy_object,
@@ -233,8 +239,10 @@ static zend_object_value php_msgpack_unpacker_new(
233239
zend_class_entry *ce TSRMLS_DC)
234240
{
235241
zend_object_value retval;
236-
zval *tmp;
237242
php_msgpack_unpacker_t *unpacker;
243+
#if PHP_API_VERSION < 20100412
244+
zval *tmp;
245+
#endif
238246

239247
unpacker = emalloc(sizeof(php_msgpack_unpacker_t));
240248

@@ -246,9 +254,13 @@ static zend_object_value php_msgpack_unpacker_new(
246254
unpacker->object.ce = ce;
247255
#endif
248256

257+
#if PHP_API_VERSION < 20100412
249258
zend_hash_copy(
250259
unpacker->object.properties, &ce->default_properties,
251260
(copy_ctor_func_t)zval_add_ref, (void *)&tmp, sizeof(zval *));
261+
#else
262+
object_properties_init(&unpacker->object, ce);
263+
#endif
252264

253265
retval.handle = zend_objects_store_put(
254266
unpacker, (zend_objects_store_dtor_t)zend_objects_destroy_object,
@@ -410,7 +422,7 @@ static ZEND_METHOD(msgpack_unpacker, __construct)
410422
msgpack_unserialize_var_init(&unpacker->var_hash);
411423

412424
(&unpacker->mp)->user.var_hash =
413-
(php_unserialize_data_t *)&unpacker->var_hash;
425+
(msgpack_unserialize_data_t *)&unpacker->var_hash;
414426
}
415427

416428
static ZEND_METHOD(msgpack_unpacker, __destruct)
@@ -533,7 +545,7 @@ static ZEND_METHOD(msgpack_unpacker, execute)
533545
msgpack_unserialize_var_init(&unpacker->var_hash);
534546

535547
(&unpacker->mp)->user.var_hash =
536-
(php_unserialize_data_t *)&unpacker->var_hash;
548+
(msgpack_unserialize_data_t *)&unpacker->var_hash;
537549
}
538550
(&unpacker->mp)->user.retval = (zval *)unpacker->retval;
539551

@@ -649,7 +661,7 @@ static ZEND_METHOD(msgpack_unpacker, reset)
649661
msgpack_unserialize_var_init(&unpacker->var_hash);
650662

651663
(&unpacker->mp)->user.var_hash =
652-
(php_unserialize_data_t *)&unpacker->var_hash;
664+
(msgpack_unserialize_data_t *)&unpacker->var_hash;
653665
}
654666

655667
void msgpack_init_class()

msgpack_pack.c

Lines changed: 104 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -255,27 +255,34 @@ inline static void msgpack_serialize_array(
255255

256256
if (object)
257257
{
258-
if (MSGPACK_G(php_only))
258+
if (n == 0)
259259
{
260-
if (Z_ISREF_P(val))
260+
msgpack_pack_map(buf, n);
261+
}
262+
else
263+
{
264+
if (MSGPACK_G(php_only))
261265
{
262-
msgpack_pack_map(buf, n + 2);
266+
if (Z_ISREF_P(val))
267+
{
268+
msgpack_pack_map(buf, n + 2);
269+
msgpack_pack_nil(buf);
270+
msgpack_pack_long(buf, MSGPACK_SERIALIZE_TYPE_REFERENCE);
271+
}
272+
else
273+
{
274+
msgpack_pack_map(buf, n + 1);
275+
}
276+
263277
msgpack_pack_nil(buf);
264-
msgpack_pack_long(buf, MSGPACK_SERIALIZE_TYPE_REFERENCE);
278+
279+
msgpack_serialize_string(buf, class_name, name_len);
265280
}
266281
else
267282
{
268-
msgpack_pack_map(buf, n + 1);
283+
msgpack_pack_array(buf, n);
284+
hash = 0;
269285
}
270-
271-
msgpack_pack_nil(buf);
272-
273-
msgpack_serialize_string(buf, class_name, name_len);
274-
}
275-
else
276-
{
277-
msgpack_pack_array(buf, n);
278-
hash = 0;
279286
}
280287
}
281288
else if (n == 0)
@@ -301,67 +308,100 @@ inline static void msgpack_serialize_array(
301308

302309
if (n > 0)
303310
{
304-
char *key;
305-
uint key_len;
306-
int key_type;
307-
ulong key_index;
308-
zval **data;
309-
HashPosition pos;
310-
311-
zend_hash_internal_pointer_reset_ex(ht, &pos);
312-
for (;; zend_hash_move_forward_ex(ht, &pos))
311+
if (object || hash)
313312
{
314-
key_type = zend_hash_get_current_key_ex(
315-
ht, &key, &key_len, &key_index, 0, &pos);
316-
317-
if (key_type == HASH_KEY_NON_EXISTANT)
313+
char *key;
314+
uint key_len;
315+
int key_type;
316+
ulong key_index;
317+
zval **data;
318+
HashPosition pos;
319+
320+
zend_hash_internal_pointer_reset_ex(ht, &pos);
321+
for (;; zend_hash_move_forward_ex(ht, &pos))
318322
{
319-
break;
320-
}
321-
if (incomplete_class && strcmp(key, MAGIC_MEMBER) == 0)
322-
{
323-
continue;
324-
}
323+
key_type = zend_hash_get_current_key_ex(
324+
ht, &key, &key_len, &key_index, 0, &pos);
325325

326-
if (hash)
327-
{
328-
switch (key_type)
326+
if (key_type == HASH_KEY_NON_EXISTANT)
329327
{
330-
case HASH_KEY_IS_LONG:
331-
msgpack_pack_long(buf, key_index);
332-
break;
333-
case HASH_KEY_IS_STRING:
334-
msgpack_serialize_string(buf, key, key_len - 1);
335-
break;
336-
default:
337-
msgpack_serialize_string(buf, "", sizeof(""));
338-
MSGPACK_WARNING(
339-
"[msgpack] (%s) key is not string nor array",
340-
__FUNCTION__);
341-
break;
328+
break;
329+
}
330+
if (incomplete_class && strcmp(key, MAGIC_MEMBER) == 0)
331+
{
332+
continue;
342333
}
343-
}
344334

345-
if (zend_hash_get_current_data_ex(
346-
ht, (void *)&data, &pos) != SUCCESS ||
347-
!data || data == &val ||
348-
(Z_TYPE_PP(data) == IS_ARRAY &&
349-
Z_ARRVAL_PP(data)->nApplyCount > 1))
350-
{
351-
msgpack_pack_nil(buf);
335+
if (hash)
336+
{
337+
switch (key_type)
338+
{
339+
case HASH_KEY_IS_LONG:
340+
msgpack_pack_long(buf, key_index);
341+
break;
342+
case HASH_KEY_IS_STRING:
343+
msgpack_serialize_string(buf, key, key_len - 1);
344+
break;
345+
default:
346+
msgpack_serialize_string(buf, "", sizeof(""));
347+
MSGPACK_WARNING(
348+
"[msgpack] (%s) key is not string nor array",
349+
__FUNCTION__);
350+
break;
351+
}
352+
}
353+
354+
if (zend_hash_get_current_data_ex(
355+
ht, (void *)&data, &pos) != SUCCESS ||
356+
!data || data == &val ||
357+
(Z_TYPE_PP(data) == IS_ARRAY &&
358+
Z_ARRVAL_PP(data)->nApplyCount > 1))
359+
{
360+
msgpack_pack_nil(buf);
361+
}
362+
else
363+
{
364+
if (Z_TYPE_PP(data) == IS_ARRAY)
365+
{
366+
Z_ARRVAL_PP(data)->nApplyCount++;
367+
}
368+
369+
msgpack_serialize_zval(buf, *data, var_hash TSRMLS_CC);
370+
371+
if (Z_TYPE_PP(data) == IS_ARRAY)
372+
{
373+
Z_ARRVAL_PP(data)->nApplyCount--;
374+
}
375+
}
352376
}
353-
else
377+
}
378+
else
379+
{
380+
zval **data;
381+
uint i;
382+
383+
for (i = 0; i < n; i++)
354384
{
355-
if (Z_TYPE_PP(data) == IS_ARRAY)
385+
if (zend_hash_index_find(ht, i, (void *)&data) != SUCCESS ||
386+
!data || data == &val ||
387+
(Z_TYPE_PP(data) == IS_ARRAY &&
388+
Z_ARRVAL_PP(data)->nApplyCount > 1))
356389
{
357-
Z_ARRVAL_PP(data)->nApplyCount++;
390+
msgpack_pack_nil(buf);
358391
}
392+
else
393+
{
394+
if (Z_TYPE_PP(data) == IS_ARRAY)
395+
{
396+
Z_ARRVAL_PP(data)->nApplyCount++;
397+
}
359398

360-
msgpack_serialize_zval(buf, *data, var_hash TSRMLS_CC);
399+
msgpack_serialize_zval(buf, *data, var_hash TSRMLS_CC);
361400

362-
if (Z_TYPE_PP(data) == IS_ARRAY)
363-
{
364-
Z_ARRVAL_PP(data)->nApplyCount--;
401+
if (Z_TYPE_PP(data) == IS_ARRAY)
402+
{
403+
Z_ARRVAL_PP(data)->nApplyCount--;
404+
}
365405
}
366406
}
367407
}
@@ -399,7 +439,7 @@ inline static void msgpack_serialize_object(
399439
msgpack_pack_nil(buf);
400440
msgpack_pack_long(buf, MSGPACK_SERIALIZE_TYPE_CUSTOM_OBJECT);
401441

402-
msgpack_serialize_string(buf, ce->name, ce->name_length);
442+
msgpack_serialize_string(buf, (char *)ce->name, ce->name_length);
403443
msgpack_pack_raw(buf, serialized_length);
404444
msgpack_pack_raw_body(buf, serialized_data, serialized_length);
405445
}

0 commit comments

Comments
 (0)