@@ -177,7 +177,7 @@ ZEND_API zend_ast *zend_ast_list_add(zend_ast *ast, zend_ast *op) {
177
177
return (zend_ast * ) list ;
178
178
}
179
179
180
- static void zend_ast_add_array_element (zval * result , zval * offset , zval * expr )
180
+ static int zend_ast_add_array_element (zval * result , zval * offset , zval * expr )
181
181
{
182
182
switch (Z_TYPE_P (offset )) {
183
183
case IS_UNDEF :
@@ -203,68 +203,90 @@ static void zend_ast_add_array_element(zval *result, zval *offset, zval *expr)
203
203
zend_hash_index_update (Z_ARRVAL_P (result ), zend_dval_to_lval (Z_DVAL_P (offset )), expr );
204
204
break ;
205
205
default :
206
- zend_error_noreturn ( E_ERROR , "Illegal offset type" );
207
- break ;
206
+ zend_error ( E_EXCEPTION | E_ERROR , "Illegal offset type" );
207
+ return FAILURE ;
208
208
}
209
+ return SUCCESS ;
209
210
}
210
211
211
- ZEND_API void zend_ast_evaluate (zval * result , zend_ast * ast , zend_class_entry * scope )
212
+ ZEND_API int zend_ast_evaluate (zval * result , zend_ast * ast , zend_class_entry * scope )
212
213
{
213
214
zval op1 , op2 ;
215
+ int ret = SUCCESS ;
214
216
215
217
switch (ast -> kind ) {
216
218
case ZEND_AST_BINARY_OP :
217
- {
218
- binary_op_type op = get_binary_op (ast -> attr );
219
- zend_ast_evaluate (& op1 , ast -> child [0 ], scope );
220
- zend_ast_evaluate (& op2 , ast -> child [1 ], scope );
221
- op (result , & op1 , & op2 );
222
- zval_dtor (& op1 );
223
- zval_dtor (& op2 );
219
+ if (UNEXPECTED (zend_ast_evaluate (& op1 , ast -> child [0 ], scope ) != SUCCESS )) {
220
+ ret = FAILURE ;
221
+ } else if (UNEXPECTED (zend_ast_evaluate (& op2 , ast -> child [1 ], scope ) != SUCCESS )) {
222
+ zval_dtor (& op1 );
223
+ ret = FAILURE ;
224
+ } else {
225
+ binary_op_type op = get_binary_op (ast -> attr );
226
+ ret = op (result , & op1 , & op2 );
227
+ zval_dtor (& op1 );
228
+ zval_dtor (& op2 );
229
+ }
224
230
break ;
225
- }
226
231
case ZEND_AST_GREATER :
227
232
case ZEND_AST_GREATER_EQUAL :
228
- {
229
- /* op1 > op2 is the same as op2 < op1 */
230
- binary_op_type op = ast -> kind == ZEND_AST_GREATER
231
- ? is_smaller_function : is_smaller_or_equal_function ;
232
- zend_ast_evaluate (& op1 , ast -> child [0 ], scope );
233
- zend_ast_evaluate (& op2 , ast -> child [1 ], scope );
234
- op (result , & op2 , & op1 );
235
- zval_dtor (& op1 );
236
- zval_dtor (& op2 );
233
+ if (UNEXPECTED (zend_ast_evaluate (& op1 , ast -> child [0 ], scope ) != SUCCESS )) {
234
+ ret = FAILURE ;
235
+ } else if (UNEXPECTED (zend_ast_evaluate (& op2 , ast -> child [1 ], scope ) != SUCCESS )) {
236
+ zval_dtor (& op1 );
237
+ ret = FAILURE ;
238
+ } else {
239
+ /* op1 > op2 is the same as op2 < op1 */
240
+ binary_op_type op = ast -> kind == ZEND_AST_GREATER
241
+ ? is_smaller_function : is_smaller_or_equal_function ;
242
+ ret = op (result , & op2 , & op1 );
243
+ zval_dtor (& op1 );
244
+ zval_dtor (& op2 );
245
+ }
237
246
break ;
238
- }
239
247
case ZEND_AST_UNARY_OP :
240
- {
241
- unary_op_type op = get_unary_op (ast -> attr );
242
- zend_ast_evaluate (& op1 , ast -> child [0 ], scope );
243
- op (result , & op1 );
244
- zval_dtor (& op1 );
248
+ if (UNEXPECTED (zend_ast_evaluate (& op1 , ast -> child [0 ], scope ) != SUCCESS )) {
249
+ ret = FAILURE ;
250
+ } else {
251
+ unary_op_type op = get_unary_op (ast -> attr );
252
+ ret = op (result , & op1 );
253
+ zval_dtor (& op1 );
254
+ }
245
255
break ;
246
- }
247
256
case ZEND_AST_ZVAL :
248
257
{
249
258
zval * zv = zend_ast_get_zval (ast );
250
259
if (scope ) {
251
260
/* class constants may be updated in-place */
252
261
if (Z_OPT_CONSTANT_P (zv )) {
253
- zval_update_constant_ex (zv , 1 , scope );
262
+ if (UNEXPECTED (zval_update_constant_ex (zv , 1 , scope ) != SUCCESS )) {
263
+ ret = FAILURE ;
264
+ break ;
265
+ }
254
266
}
255
267
ZVAL_DUP (result , zv );
256
268
} else {
257
269
ZVAL_DUP (result , zv );
258
270
if (Z_OPT_CONSTANT_P (result )) {
259
- zval_update_constant_ex (result , 1 , scope );
271
+ if (UNEXPECTED (zval_update_constant_ex (result , 1 , scope ) != SUCCESS )) {
272
+ ret = FAILURE ;
273
+ break ;
274
+ }
260
275
}
261
276
}
262
277
break ;
263
278
}
264
279
case ZEND_AST_AND :
265
- zend_ast_evaluate (& op1 , ast -> child [0 ], scope );
280
+ if (UNEXPECTED (zend_ast_evaluate (& op1 , ast -> child [0 ], scope ) != SUCCESS )) {
281
+ ret = FAILURE ;
282
+ break ;
283
+ }
266
284
if (zend_is_true (& op1 )) {
267
- zend_ast_evaluate (& op2 , ast -> child [1 ], scope );
285
+ if (UNEXPECTED (zend_ast_evaluate (& op2 , ast -> child [1 ], scope ) != SUCCESS )) {
286
+ zval_dtor (& op1 );
287
+ ret = FAILURE ;
288
+ break ;
289
+ }
268
290
ZVAL_BOOL (result , zend_is_true (& op2 ));
269
291
zval_dtor (& op2 );
270
292
} else {
@@ -273,41 +295,65 @@ ZEND_API void zend_ast_evaluate(zval *result, zend_ast *ast, zend_class_entry *s
273
295
zval_dtor (& op1 );
274
296
break ;
275
297
case ZEND_AST_OR :
276
- zend_ast_evaluate (& op1 , ast -> child [0 ], scope );
298
+ if (UNEXPECTED (zend_ast_evaluate (& op1 , ast -> child [0 ], scope ) != SUCCESS )) {
299
+ ret = FAILURE ;
300
+ break ;
301
+ }
277
302
if (zend_is_true (& op1 )) {
278
303
ZVAL_TRUE (result );
279
304
} else {
280
- zend_ast_evaluate (& op2 , ast -> child [1 ], scope );
305
+ if (UNEXPECTED (zend_ast_evaluate (& op2 , ast -> child [1 ], scope ) != SUCCESS )) {
306
+ zval_dtor (& op1 );
307
+ ret = FAILURE ;
308
+ break ;
309
+ }
281
310
ZVAL_BOOL (result , zend_is_true (& op2 ));
282
311
zval_dtor (& op2 );
283
312
}
284
313
zval_dtor (& op1 );
285
314
break ;
286
315
case ZEND_AST_CONDITIONAL :
287
- zend_ast_evaluate (& op1 , ast -> child [0 ], scope );
316
+ if (UNEXPECTED (zend_ast_evaluate (& op1 , ast -> child [0 ], scope ) != SUCCESS )) {
317
+ ret = FAILURE ;
318
+ break ;
319
+ }
288
320
if (zend_is_true (& op1 )) {
289
321
if (!ast -> child [1 ]) {
290
322
* result = op1 ;
291
323
} else {
292
- zend_ast_evaluate (result , ast -> child [1 ], scope );
324
+ if (UNEXPECTED (zend_ast_evaluate (result , ast -> child [1 ], scope ) != SUCCESS )) {
325
+ zval_dtor (& op1 );
326
+ ret = FAILURE ;
327
+ break ;
328
+ }
293
329
zval_dtor (& op1 );
294
330
}
295
331
} else {
296
- zend_ast_evaluate (result , ast -> child [2 ], scope );
332
+ if (UNEXPECTED (zend_ast_evaluate (result , ast -> child [2 ], scope ) != SUCCESS )) {
333
+ zval_dtor (& op1 );
334
+ ret = FAILURE ;
335
+ break ;
336
+ }
297
337
zval_dtor (& op1 );
298
338
}
299
339
break ;
300
340
case ZEND_AST_UNARY_PLUS :
301
- ZVAL_LONG (& op1 , 0 );
302
- zend_ast_evaluate (& op2 , ast -> child [0 ], scope );
303
- add_function (result , & op1 , & op2 );
304
- zval_dtor (& op2 );
341
+ if (UNEXPECTED (zend_ast_evaluate (& op2 , ast -> child [0 ], scope ) != SUCCESS )) {
342
+ ret = FAILURE ;
343
+ } else {
344
+ ZVAL_LONG (& op1 , 0 );
345
+ ret = add_function (result , & op1 , & op2 );
346
+ zval_dtor (& op2 );
347
+ }
305
348
break ;
306
349
case ZEND_AST_UNARY_MINUS :
307
- ZVAL_LONG (& op1 , 0 );
308
- zend_ast_evaluate (& op2 , ast -> child [0 ], scope );
309
- sub_function (result , & op1 , & op2 );
310
- zval_dtor (& op2 );
350
+ if (UNEXPECTED (zend_ast_evaluate (& op2 , ast -> child [0 ], scope ) != SUCCESS )) {
351
+ ret = FAILURE ;
352
+ } else {
353
+ ZVAL_LONG (& op1 , 0 );
354
+ ret = sub_function (result , & op1 , & op2 );
355
+ zval_dtor (& op2 );
356
+ }
311
357
break ;
312
358
case ZEND_AST_ARRAY :
313
359
array_init (result );
@@ -317,29 +363,47 @@ ZEND_API void zend_ast_evaluate(zval *result, zend_ast *ast, zend_class_entry *s
317
363
for (i = 0 ; i < list -> children ; i ++ ) {
318
364
zend_ast * elem = list -> child [i ];
319
365
if (elem -> child [1 ]) {
320
- zend_ast_evaluate (& op1 , elem -> child [1 ], scope );
366
+ if (UNEXPECTED (zend_ast_evaluate (& op1 , elem -> child [1 ], scope ) != SUCCESS )) {
367
+ zval_dtor (result );
368
+ return FAILURE ;
369
+ }
321
370
} else {
322
371
ZVAL_UNDEF (& op1 );
323
372
}
324
- zend_ast_evaluate (& op2 , elem -> child [0 ], scope );
325
- zend_ast_add_array_element (result , & op1 , & op2 );
373
+ if (UNEXPECTED (zend_ast_evaluate (& op2 , elem -> child [0 ], scope ) != SUCCESS )) {
374
+ zval_dtor (& op1 );
375
+ zval_dtor (result );
376
+ return FAILURE ;
377
+ }
378
+ if (UNEXPECTED (zend_ast_add_array_element (result , & op1 , & op2 ) != SUCCESS )) {
379
+ zval_dtor (& op1 );
380
+ zval_dtor (& op2 );
381
+ zval_dtor (result );
382
+ return FAILURE ;
383
+ }
326
384
}
327
385
}
328
386
break ;
329
387
case ZEND_AST_DIM :
330
- zend_ast_evaluate (& op1 , ast -> child [0 ], scope );
331
- zend_ast_evaluate (& op2 , ast -> child [1 ], scope );
332
- {
388
+ if (UNEXPECTED (zend_ast_evaluate (& op1 , ast -> child [0 ], scope ) != SUCCESS )) {
389
+ ret = FAILURE ;
390
+ } else if (UNEXPECTED (zend_ast_evaluate (& op2 , ast -> child [1 ], scope ) != SUCCESS )) {
391
+ zval_dtor (& op1 );
392
+ ret = FAILURE ;
393
+ } else {
333
394
zval tmp ;
395
+
334
396
zend_fetch_dimension_by_zval (& tmp , & op1 , & op2 );
335
397
ZVAL_ZVAL (result , & tmp , 1 , 1 );
398
+ zval_dtor (& op1 );
399
+ zval_dtor (& op2 );
336
400
}
337
- zval_dtor (& op1 );
338
- zval_dtor (& op2 );
339
401
break ;
340
402
default :
341
- zend_error_noreturn (E_ERROR , "Unsupported constant expression" );
403
+ zend_error (E_EXCEPTION | E_ERROR , "Unsupported constant expression" );
404
+ ret = FAILURE ;
342
405
}
406
+ return ret ;
343
407
}
344
408
345
409
ZEND_API zend_ast * zend_ast_copy (zend_ast * ast )
0 commit comments