zval *get_var_and_separate(char *varname, int varname_len TSRMLS_DC) |
{ |
zval **varval, *varcopy; |
if (zend_hash_find(EG(active_symbol_table),varname, varname_len + 1, (void**)&varval) == FAILURE) |
{ |
/* 如果在符号表里找不到这个变量则直接return */ |
return NULL; |
} |
if ((*varval)->refcount < 2) |
{ |
//如果这个变量的zval部分的refcount小于2,代表没有别的变量在用,return |
return *varval; |
} |
|
/* 否则,复制一份zval*的值 */ |
MAKE_STD_ZVAL(varcopy); |
varcopy = *varval; |
|
/* Duplicate any allocated structures within the zval* */ |
zval_copy_ctor(varcopy); |
/* 从符号表中删除原来的变量 |
* This will decrease the refcount of varval in the process |
*/ |
zend_hash_del(EG(active_symbol_table), varname, varname_len + 1); |
/* 初始化新的zval的refcount,并在符号表中重新添加此变量信息,并将其值与我们的新zval相关联。*/ |
varcopy->refcount = 1; |
varcopy->is_ref = 0; |
zend_hash_add(EG(active_symbol_table), varname, varname_len + 1,&varcopy, sizeof(zval*), NULL); |
|
/* 返回新zval的地址 */ |
return varcopy; |
} |