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 协议》,转载必须注明作者和本文链接