zend_objects_store_put

本文支持创建最简单的对象
实现两个大的功能:
1把新对象添加进入 EG(objects_store),并获得编号
涉及到插入到什么位置,并检测是否已经用完空间,用完则扩容;
2编号赋值给新的对象handle

struct _zend_object {
    zend_refcounted_h gc;    //引用计数
    uint32_t          handle; // TODO: may be removed 
    zend_class_entry *ce;  //所属类
    const zend_object_handlers *handlers;  //对象操作处理函数
    HashTable        *properties;
    zval              properties_table[1];  //普通属性值数组
};
typedef struct _zend_objects_store {
    zend_object **object_buckets; //对象数组
    uint32_t top;  //当前全部object数
    uint32_t size; //object_buckets大小
    int free_list_head; //第一个可用object_buckets位置
} zend_objects_store;
ZEND_API void zend_objects_store_put(zend_object *object)  
{
    int handle;

    if (EG(objects_store).free_list_head != -1) {
        //主要是gc中会将中间一些object销毁,空出一些bucket位置
        //然后free_list_head就指向了第一个可用的bucket位置
        //后面可用的保存在第一个空闲bucket的handle中
        handle = EG(objects_store).free_list_head;
        EG(objects_store).free_list_head = GET_OBJ_BUCKET_NUMBER(EG(objects_store).object_buckets[handle]);
    } else {
        if (EG(objects_store).top == EG(objects_store).size) {
            //扩容
            uint32_t new_size = 2 * EG(objects_store).size;
            EG(objects_store).object_buckets = (zend_object **) erealloc(EG(objects_store).object_buckets, new_size * sizeof(zend_object*));
            /* Assign size after realloc, in case it fails */
            EG(objects_store).size = new_size;
        }
        //递增加1
        handle = EG(objects_store).top++;
    }
    object->handle = handle; // 对象编号
    //实例化一个对象就会将其插入到object_buckets数组中 ******
    EG(objects_store).object_buckets[handle] = object;
}
本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!