2011年10月14日金曜日

PHP5.4beta1では、php_unserialize_data構造体メンバに変更があるみたい



PHP5.4beta1でMessagePackをインストールしようとしたところ。
やはりPHP5.4.0beta1に対応できていないためかmakeでこける。
最新のgitからもってきてもダメっぽいです。


git clone https://github.com/msgpack/msgpack.git
cd msgpack/php
phpize
./configure
make
make install

とにかくいろいろ怒られるけど、 request for member 'first' in something not a structure or unionばかりみたい。
/usr/local/src/msgpack/php/msgpack_unpack.c: In function 'msgpack_var_push':
/usr/local/src/msgpack/php/msgpack_unpack.c:66: error: request for member 'first' in something not a structure or union
/usr/local/src/msgpack/php/msgpack_unpack.c:80: error: request for member 'first' in something not a structure or union
/usr/local/src/msgpack/php/msgpack_unpack.c:82: error: request for member 'first' in something not a structure or union


5.4beta1がらみと思われるエラーなので、ソースをチェックしてみたところ、
構造体(php_unserialize_data)に変更がありました。
メンバが増えてる・・・。

ext/standard/php_var.hの差分を一部抜粋




struct php_unserialize_data {
void *first;
+ void *last;
void *first_dtor;
+ void *last_dtor;
};

-typedef struct php_unserialize_data php_unserialize_data_t;
+typedef struct php_unserialize_data* php_unserialize_data_t;



php_var.hの差分




diff -uNrp ./php-5.3.8/ext/standard/php_var.h ./php-5.4.0beta1/ext/standard/php_var.h
--- ./php-5.3.8/ext/standard/php_var.h 2011-01-01 11:19:59.000000000 +0900
+++ ./php-5.4.0beta1/ext/standard/php_var.h 2011-01-01 11:17:06.000000000 +0900
@@ -16,11 +16,12 @@
+----------------------------------------------------------------------+
*/

-/* $Id: php_var.h 306939 2011-01-01 02:19:59Z felipe $ */
+/* $Id: php_var.h 306938 2011-01-01 02:17:06Z felipe $ */

#ifndef PHP_VAR_H
#define PHP_VAR_H

+#include "ext/standard/basic_functions.h"
#include "ext/standard/php_smart_str_public.h"

PHP_FUNCTION(var_dump);
@@ -37,29 +38,70 @@ PHPAPI void php_var_export_ex(zval **str

PHPAPI void php_debug_zval_dump(zval **struc, int level TSRMLS_DC);

-/* typdef HashTable php_serialize_data_t; */
-#define php_serialize_data_t HashTable
+typedef HashTable* php_serialize_data_t;

struct php_unserialize_data {
void *first;
+ void *last;
void *first_dtor;
+ void *last_dtor;
};

-typedef struct php_unserialize_data php_unserialize_data_t;
+typedef struct php_unserialize_data* php_unserialize_data_t;

PHPAPI void php_var_serialize(smart_str *buf, zval **struc, php_serialize_data_t *var_hash TSRMLS_DC);
PHPAPI int php_var_unserialize(zval **rval, const unsigned char **p, const unsigned char *max, php_unserialize_data_t *var_hash TSRMLS_DC);

-#define PHP_VAR_SERIALIZE_INIT(var_hash) \
- zend_hash_init(&(var_hash), 10, NULL, NULL, 0)
-#define PHP_VAR_SERIALIZE_DESTROY(var_hash) \
- zend_hash_destroy(&(var_hash))
-
-#define PHP_VAR_UNSERIALIZE_INIT(var_hash) \
- (var_hash).first = 0; \
- (var_hash).first_dtor = 0
-#define PHP_VAR_UNSERIALIZE_DESTROY(var_hash) \
- var_destroy(&(var_hash))
+#define PHP_VAR_SERIALIZE_INIT(var_hash_ptr) \
+do { \
+ if (BG(serialize).level) { \
+ (var_hash_ptr) = BG(serialize).var_hash; \
+ ++BG(serialize).level; \
+ } else { \
+ ALLOC_HASHTABLE(var_hash_ptr); \
+ zend_hash_init((var_hash_ptr), 10, NULL, NULL, 0); \
+ BG(serialize).var_hash = (var_hash_ptr); \
+ BG(serialize).level = 1; \
+ } \
+} while(0)
+
+#define PHP_VAR_SERIALIZE_DESTROY(var_hash_ptr) \
+do { \
+ if (BG(serialize).level) { \
+ if (!--BG(serialize).level) { \
+ zend_hash_destroy(BG(serialize).var_hash); \
+ FREE_HASHTABLE(BG(serialize).var_hash); \
+ BG(serialize).var_hash = NULL; \
+ } \
+ } else { \
+ zend_hash_destroy*1; \
+ } \
+} while (0)
+
+#define PHP_VAR_UNSERIALIZE_INIT(var_hash_ptr) \
+do { \
+ if (BG(unserialize).level) { \
+ (var_hash_ptr) = BG(unserialize).var_hash; \
+ ++BG(unserialize).level; \
+ } else { \
+ (var_hash_ptr) = ecalloc(1, sizeof(struct php_unserialize_data)); \
+ BG(unserialize).var_hash = (var_hash_ptr); \
+ BG(unserialize).level = 1; \
+ } \
+} while (0)
+
+#define PHP_VAR_UNSERIALIZE_DESTROY(var_hash_ptr) \
+do { \
+ if (BG(unserialize).level) { \
+ if (!--BG(unserialize).level) { \
+ var_destroy(&(var_hash_ptr)); \
+ efree*2; \
+ BG(unserialize).var_hash = NULL; \
+ } \
+ } else { \
+ var_destroy(&(var_hash_ptr)); \
+ } \
+} while (0)

PHPAPI void var_replace(php_unserialize_data_t *var_hash, zval *ozval, zval **nzval);
PHPAPI void var_push_dtor(php_unserialize_data_t *var_hash, zval **val);




エラーログの内容




/bin/sh /usr/local/src/msgpack/php/libtool --mode=compile cc -I. -I/usr/local/src/msgpack/php -DPHP_ATOM_INC -I/usr/local/src/msgpack/php/include -I/usr/local/src/msgpack/php/main -I/usr/local/src/msgpack/php -I/usr/local/php/include/php -I/usr/local/php/include/php/main -I/usr/local/php/include/php/TSRM -I/usr/local/php/include/php/Zend -I/usr/local/php/include/php/ext -I/usr/local/php/include/php/ext/date/lib -DHAVE_CONFIG_H -g -O2 -c /usr/local/src/msgpack/php/msgpack_unpack.c -o msgpack_unpack.lo
cc -I. -I/usr/local/src/msgpack/php -DPHP_ATOM_INC -I/usr/local/src/msgpack/php/include -I/usr/local/src/msgpack/php/main -I/usr/local/src/msgpack/php -I/usr/local/php/include/php -I/usr/local/php/include/php/main -I/usr/local/php/include/php/TSRM -I/usr/local/php/include/php/Zend -I/usr/local/php/include/php/ext -I/usr/local/php/include/php/ext/date/lib -DHAVE_CONFIG_H -g -O2 -c /usr/local/src/msgpack/php/msgpack_unpack.c -fPIC -DPIC -o .libs/msgpack_unpack.o
/usr/local/src/msgpack/php/msgpack_unpack.c: In function 'msgpack_var_push':
/usr/local/src/msgpack/php/msgpack_unpack.c:66: error: request for member 'first' in something not a structure or union
/usr/local/src/msgpack/php/msgpack_unpack.c:80: error: request for member 'first' in something not a structure or union
/usr/local/src/msgpack/php/msgpack_unpack.c:82: error: request for member 'first' in something not a structure or union
/usr/local/src/msgpack/php/msgpack_unpack.c: In function 'msgpack_var_access':
/usr/local/src/msgpack/php/msgpack_unpack.c:96: error: request for member 'first' in something not a structure or union
/usr/local/src/msgpack/php/msgpack_unpack.c: In function 'msgpack_stack_push':
/usr/local/src/msgpack/php/msgpack_unpack.c:130: error: request for member 'first_dtor' in something not a structure or union
/usr/local/src/msgpack/php/msgpack_unpack.c:144: error: request for member 'first_dtor' in something not a structure or union
/usr/local/src/msgpack/php/msgpack_unpack.c:146: error: request for member 'first_dtor' in something not a structure or union
/usr/local/src/msgpack/php/msgpack_unpack.c: In function 'msgpack_stack_pop':
/usr/local/src/msgpack/php/msgpack_unpack.c:168: error: request for member 'first_dtor' in something not a structure or union
/usr/local/src/msgpack/php/msgpack_unpack.c: In function 'msgpack_unserialize_var_init':
/usr/local/src/msgpack/php/msgpack_unpack.c:285: error: request for member 'first' in something not a structure or union
/usr/local/src/msgpack/php/msgpack_unpack.c:286: error: request for member 'first_dtor' in something not a structure or union
/usr/local/src/msgpack/php/msgpack_unpack.c: In function 'msgpack_unserialize_var_destroy':
/usr/local/src/msgpack/php/msgpack_unpack.c:294: error: request for member 'first' in something not a structure or union
/usr/local/src/msgpack/php/msgpack_unpack.c:314: error: request for member 'first_dtor' in something not a structure or union
make: *** [msgpack_unpack.lo] Error 1




*1:var_hash_ptr

*2:var_hash_ptr




0 件のコメント:

コメントを投稿