@@ -22,12 +22,12 @@ bdict::bdict(const bdict *that)
2222 for (zend_hash_internal_pointer_reset (that->_data );
2323 zend_hash_has_more_elements (that->_data ) == SUCCESS;
2424 zend_hash_move_forward (that->_data )) {
25- zval * tmp = new zval () ;
26- ZVAL_OBJ (tmp, zend_container::bnode_object_clone (zend_hash_get_current_data (that->_data )));
25+ zval tmp;
26+ ZVAL_OBJ (& tmp, zend_container::bnode_object_clone (zend_hash_get_current_data (that->_data )));
2727 zend_string *_str_index;
2828 zend_ulong _num_index;
2929 zend_hash_get_current_key (that->_data , &_str_index, &_num_index);
30- zend_hash_add (_data, _str_index, tmp);
30+ zend_hash_add (_data, _str_index, & tmp);
3131 }
3232}
3333
@@ -42,12 +42,14 @@ std::string bdict::get_type() const
4242 return " bdict" ;
4343}
4444
45- zval * bdict::get (const std::string &key) const
45+ zval bdict::get (const std::string &key) const
4646{
4747 if (!zend_hash_str_exists (_data, key.c_str (), key.length ())) {
4848 return bitem::get_zval_bool (false );
4949 }
50- return zend_hash_str_find (_data, key.c_str (), key.length ());
50+ zval zv;
51+ ZVAL_COPY (&zv, zend_hash_str_find (_data, key.c_str (), key.length ()));
52+ return zv;
5153}
5254
5355bool bdict::has (const std::string &key) const
@@ -87,14 +89,16 @@ bool bdict::del(const std::string &key)
8789 }
8890}
8991
90- zval * bdict::get_path (const std::string &key, size_t &pt) const
92+ zval bdict::get_path (const std::string &key, size_t &pt) const
9193{
9294 std::string current_key = bitem::get_current_key (key, pt);
9395 if (!zend_hash_str_exists (_data, current_key.c_str (), current_key.length ())) {
9496 return bitem::get_zval_bool (false );
9597 }
9698 if (pt >= key.length ()) {
97- return zend_hash_str_find (_data, current_key.c_str (), current_key.length ());
99+ zval zv;
100+ ZVAL_COPY (&zv, zend_hash_str_find (_data, current_key.c_str (), current_key.length ()));
101+ return zv;
98102 } else {
99103 zval *subnode = zend_hash_str_find (_data, current_key.c_str (), current_key.length ());
100104 std::string class_name = zend_container::bnode_object_get_class_name (subnode);
@@ -195,14 +199,14 @@ size_t bdict::count() const
195199 return zend_array_count (_data);
196200}
197201
198- zval * bdict::parse (const std::string &ben, size_t &pt)
202+ zval bdict::parse (const std::string &ben, size_t &pt)
199203{
200204 if (ben[pt] != ' d' )
201205 return bitem::throw_general_exception (" Error parsing bdict" );
202- zval *zv = new zval () ;
206+ zval zv ;
203207 zend_object *zo = zend_container::bdict_object_new (zend_container::bdict_ce);
204- ZVAL_OBJ (zv, zo);
205- bdict_object *intern = zend_container::bdict_fetch_object (Z_OBJ_P (zv));
208+ ZVAL_OBJ (& zv, zo);
209+ bdict_object *intern = zend_container::bdict_fetch_object (Z_OBJ (zv));
206210 intern->bnode_data = new bdict ();
207211 ++pt;
208212
@@ -215,17 +219,17 @@ zval *bdict::parse(const std::string &ben, size_t &pt)
215219 std::string key = ben.substr (pt, std::stoull (key_len));
216220 pt += std::stoull (key_len);
217221 if (ben[pt] == ' d' ) {
218- zval * bnode = bdict::parse (ben, pt);
219- zend_hash_str_add (intern->bnode_data ->_data , key.c_str (), key.length (), bnode);
222+ zval bnode = bdict::parse (ben, pt);
223+ zend_hash_str_add (intern->bnode_data ->_data , key.c_str (), key.length (), & bnode);
220224 } else if (ben[pt] == ' l' ) {
221- zval * bnode = blist::parse (ben, pt);
222- zend_hash_str_add (intern->bnode_data ->_data , key.c_str (), key.length (), bnode);
225+ zval bnode = blist::parse (ben, pt);
226+ zend_hash_str_add (intern->bnode_data ->_data , key.c_str (), key.length (), & bnode);
223227 } else if (isdigit (ben[pt])) {
224- zval * bnode = bstr::parse (ben, pt);
225- zend_hash_str_add (intern->bnode_data ->_data , key.c_str (), key.length (), bnode);
228+ zval bnode = bstr::parse (ben, pt);
229+ zend_hash_str_add (intern->bnode_data ->_data , key.c_str (), key.length (), & bnode);
226230 } else if (ben[pt] == ' i' ) {
227- zval * bnode = bint::parse (ben, pt);
228- zend_hash_str_add (intern->bnode_data ->_data , key.c_str (), key.length (), bnode);
231+ zval bnode = bint::parse (ben, pt);
232+ zend_hash_str_add (intern->bnode_data ->_data , key.c_str (), key.length (), & bnode);
229233 } else {
230234 return bitem::throw_general_exception (" Error parsing bdict" );
231235 }
@@ -252,10 +256,10 @@ std::string bdict::encode() const
252256 return result + " e" ;
253257}
254258
255- zval * bdict::to_array (const bool include_meta) const
259+ zval bdict::to_array (const bool include_meta) const
256260{
257- zval *zv = new zval () ;
258- array_init (zv);
261+ zval zv ;
262+ array_init (& zv);
259263
260264 for (zend_hash_internal_pointer_reset (_data);
261265 zend_hash_has_more_elements (_data) == SUCCESS;
@@ -264,28 +268,28 @@ zval *bdict::to_array(const bool include_meta) const
264268 zend_ulong num_index;
265269 zend_hash_get_current_key (_data, &str_index, &num_index);
266270 zval *value = zend_hash_get_current_data (_data);
267- zval * subarray = zend_container::bnode_fetch_object_data (Z_OBJ_P (value))->to_array (include_meta);
268- zend_hash_add (Z_ARR_P (zv), str_index, subarray);
271+ zval subarray = zend_container::bnode_fetch_object_data (Z_OBJ_P (value))->to_array (include_meta);
272+ zend_hash_add (Z_ARR (zv), str_index, & subarray);
269273 }
270274
271275 if (include_meta) {
272- zval * zv_outer = new zval () ;
273- array_init (zv_outer);
274- add_assoc_string (zv_outer, (char *)" _type" , (char *)" bdict" );
275- add_assoc_long (zv_outer, (char *)" _length" , length ());
276- add_assoc_zval (zv_outer, (char *)" _data" , zv);
276+ zval zv_outer;
277+ array_init (& zv_outer);
278+ add_assoc_string (& zv_outer, (char *)" _type" , (char *)" bdict" );
279+ add_assoc_long (& zv_outer, (char *)" _length" , length ());
280+ add_assoc_zval (& zv_outer, (char *)" _data" , & zv);
277281 return zv_outer;
278282 }
279283 return zv;
280284}
281285
282- zval * bdict::search (const std::string &needle, const long &mode, const std::string path) const
286+ zval bdict::search (const std::string &needle, const long &mode, const std::string path) const
283287{
284288 if (mode < 0 || mode > 1 )
285289 bitem::throw_general_exception (" Illegal search mode" );
286290
287- zval *zv = new zval () ;
288- array_init (zv);
291+ zval zv ;
292+ array_init (& zv);
289293
290294 for (zend_hash_internal_pointer_reset (_data);
291295 zend_hash_has_more_elements (_data) == SUCCESS;
@@ -298,11 +302,11 @@ zval *bdict::search(const std::string &needle, const long &mode, const std::stri
298302 std::string current_path = (path == " " ? " " : path + " /" ) + bitem::escape_key (str_index);
299303
300304 if (mode == 0 && str_index.find (needle) != std::string::npos) {
301- add_next_index_stringl (zv, current_path.c_str (), current_path.length ());
305+ add_next_index_stringl (& zv, current_path.c_str (), current_path.length ());
302306 }
303307
304- zval * next_result = zend_container::bnode_fetch_object_data (Z_OBJ_P (value))->search (needle, mode, current_path);
305- zend_hash_append_strings (Z_ARRVAL_P (zv), Z_ARRVAL_P (next_result));
308+ zval next_result = zend_container::bnode_fetch_object_data (Z_OBJ_P (value))->search (needle, mode, current_path);
309+ zend_hash_append_strings (Z_ARRVAL (zv), Z_ARRVAL (next_result));
306310 }
307311
308312 return zv;
0 commit comments