最近更新: 2013-09-30

php dbus extension with ByteArray support, r101/r108 update

php dbus extension with ByteArray support」程式碼更新。更新內容詳見「rocksources r101」和「rocksources r108」。

PHP 5.4 版起,移除了 default_properties 項目。依「internals:engine:objects [PHP Wiki]」的示範,應該改用 object_properties_init() ,而這也正是 dbus.c 的巨集 INIT_OBJ_PROP 所做的事。故修改變數名稱,以便改用 INIT_OBJ_PROP 完成 ByteArray 的初始化工作。 r108 則修正了 PHP 5.4 釋放 ByteArray 時會發生記憶體存取錯誤的嚴重Bug。

#if PHP_MINOR_VERSION > 3
# define INIT_OBJ_PROP	object_properties_init(&intern->std, class_type);
#else
# define INIT_OBJ_PROP	zend_hash_copy(intern->std.properties, \
  &class_type->default_properties, (copy_ctor_func_t) zval_add_ref, \
  (void *) &tmp, sizeof(zval *));
#endif

// r108
void bytearray_free_storage(void *object TSRMLS_DC)
{
    bytearray_object *this = (bytearray_object *)object;
    efree(this->data);
    this->len = 0;

    zend_object_std_dtor(&this->std TSRMLS_CC);
    //zend_hash_destroy(this->std.properties);
    //FREE_HASHTABLE(this->std.properties);

    efree(this);
}

PHP Wiki 使用 PHP_VERSION_ID < 50399 (5.3.99) 判別。而 dbus.c 取巧地使用 PHP_MINOR_VERSION > 3 。我暫時不想更動 ByteArray 以外的部份,故保留之。(r108 已修改)

另外, PHP 5.4 也完全移除了 function_entry 項目。所有 function_entry 都應更名為 zend_function_entryByteArray 實作時用了 function_entry ,此次一併修正。

r108 修正了 PHP 5.4 釋放 ByteArray 時會發生記憶體存取錯誤的嚴重Bug ,還修改了一處 DBus API 宣告廢棄的項目(dbus_message_iter_get_array_len)。增加了 DBus service/client 的測試案例。

樂多舊網址: http://blog.roodo.com/rocksaying/archives/25736040.html