@@ -241,36 +241,50 @@ ZEND_API int zend_set_hash_symbol(zval *symbol, char *name, int name_length,
241
241
242
242
#define add_method (arg ,key ,method ) add_assoc_function((arg),(key),(method))
243
243
244
+ #if ZEND_DEBUG
245
+ #define CHECK_ZVAL_STRING (z ) \
246
+ if ((z)->value.str.val[ (z)->value.str.len ] != '\0') zend_error(E_WARNING, "String is not zero-terminated (%s)",(z)->value.str.val);
247
+ #else
248
+ #define CHECK_ZVAL_STRING (z )
249
+ #endif
250
+
244
251
#define ZVAL_RESOURCE (z ,l ) { \
245
252
(z)->type = IS_RESOURCE; \
246
253
(z)->value.lval = l; \
247
254
}
255
+
248
256
#define ZVAL_BOOL (z ,b ) { \
249
257
(z)->type = IS_BOOL; \
250
258
(z)->value.lval = b; \
251
259
}
260
+
252
261
#define ZVAL_NULL (z ) { \
253
262
(z)->type = IS_NULL; \
254
263
}
264
+
255
265
#define ZVAL_LONG (z ,l ) { \
256
266
(z)->type = IS_LONG; \
257
267
(z)->value.lval = l; \
258
268
}
269
+
259
270
#define ZVAL_DOUBLE (z ,d ) { \
260
271
(z)->type = IS_DOUBLE; \
261
272
(z)->value.dval = d; \
262
273
}
274
+
263
275
#define ZVAL_STRING (z ,s ,duplicate ) { \
264
276
char *__s=(s); \
265
277
(z)->value.str.len = strlen(__s); \
266
278
(z)->value.str.val = (duplicate?estrndup(__s,(z)->value.str.len):__s); \
267
279
(z)->type = IS_STRING; \
268
280
}
281
+
269
282
#define ZVAL_STRINGL (z ,s ,l ,duplicate ) { \
270
283
char *__s=(s); int __l=l; \
271
284
(z)->value.str.len = __l; \
272
285
(z)->value.str.val = (duplicate?estrndup(__s,__l):__s); \
273
286
(z)->type = IS_STRING; \
287
+ CHECK_ZVAL_STRING(z); \
274
288
}
275
289
276
290
#define ZVAL_EMPTY_STRING (z ) { \
@@ -282,142 +296,60 @@ ZEND_API int zend_set_hash_symbol(zval *symbol, char *name, int name_length,
282
296
#define ZVAL_FALSE { (z)->value.lval = 0; (z)->type = IS_BOOL; }
283
297
#define ZVAL_TRUE { (z)->value.lval = 1; (z)->type = IS_BOOL; }
284
298
285
- #define RETVAL_RESOURCE (l ) { \
286
- return_value->type = IS_RESOURCE;\
287
- return_value->value.lval = l; \
288
- }
289
- #define RETVAL_BOOL (b ) { \
290
- return_value->type = IS_BOOL; \
291
- return_value->value.lval = b; \
292
- }
293
- #define RETVAL_NULL () { \
294
- return_value->type = IS_NULL; \
295
- }
296
- #define RETVAL_LONG (l ) { \
297
- return_value->type = IS_LONG; \
298
- return_value->value.lval = l; \
299
- }
300
- #define RETVAL_DOUBLE (d ) { \
301
- return_value->type = IS_DOUBLE; \
302
- return_value->value.dval = d; \
303
- }
304
- #define RETVAL_STRING (s ,duplicate ) { \
305
- char *__s=(s); \
306
- return_value->value.str.len = strlen(__s); \
307
- return_value->value.str.val = (duplicate?estrndup(__s,return_value->value.str.len):__s); \
308
- return_value->type = IS_STRING; \
309
- }
310
- #define RETVAL_STRINGL (s ,l ,duplicate ) { \
311
- char *__s=(s); int __l=l; \
312
- return_value->value.str.len = __l; \
313
- return_value->value.str.val = (duplicate?estrndup(__s,__l):__s); \
314
- return_value->type = IS_STRING; \
315
- }
316
-
317
- #define RETVAL_EMPTY_STRING () { \
318
- return_value->value.str.len = 0; \
319
- return_value->value.str.val = empty_string; \
320
- return_value->type = IS_STRING; \
321
- }
322
-
323
- #define RETVAL_FALSE { return_value->value.lval = 0; return_value->type = IS_BOOL; }
324
- #define RETVAL_TRUE { return_value->value.lval = 1; return_value->type = IS_BOOL; }
325
-
326
- #define RETURN_RESOURCE (l ) { \
327
- return_value->type = IS_RESOURCE;\
328
- return_value->value.lval = l; \
329
- return; \
330
- }
331
-
332
- #define RETURN_BOOL (b ) { \
333
- return_value->type = IS_BOOL; \
334
- return_value->value.lval = b; \
335
- return; \
336
- }
337
-
338
- #define RETURN_NULL () { \
339
- return_value->type = IS_NULL; \
340
- return; \
341
- }
342
-
343
- #define RETURN_LONG (l ) { \
344
- return_value->type = IS_LONG; \
345
- return_value->value.lval = l; \
346
- return; \
347
- }
348
- #define RETURN_DOUBLE (d ) { \
349
- return_value->type = IS_DOUBLE; \
350
- return_value->value.dval = d; \
351
- return; \
352
- }
353
- #define RETURN_STRING (s ,duplicate ) { \
354
- char *__s=(s); \
355
- return_value->value.str.len = strlen(__s); \
356
- return_value->value.str.val = (duplicate?estrndup(__s,return_value->value.str.len):__s); \
357
- return_value->type = IS_STRING; \
358
- return; \
359
- }
360
- #define RETURN_STRINGL (s ,l ,duplicate ) { \
361
- char *__s=(s); int __l=l; \
362
- return_value->value.str.len = __l; \
363
- return_value->value.str.val = (duplicate?estrndup(__s,__l):__s); \
364
- return_value->type = IS_STRING; \
365
- return; \
366
- }
367
-
368
- #define RETURN_EMPTY_STRING () { \
369
- return_value->value.str.len = 0; \
370
- return_value->value.str.val = empty_string; \
371
- return_value->type = IS_STRING; \
372
- return; \
373
- }
374
-
375
- #define RETURN_FALSE { RETVAL_FALSE; return; }
376
- #define RETURN_TRUE { RETVAL_TRUE; return; }
299
+ #define RETVAL_RESOURCE (l ) ZVAL_RESOURCE(return_value,l)
300
+ #define RETVAL_BOOL (b ) ZVAL_BOOL(return_value,b)
301
+ #define RETVAL_NULL () ZVAL_NULL(return_value)
302
+ #define RETVAL_LONG (l ) ZVAL_LONG(return_value,l)
303
+ #define RETVAL_DOUBLE (d ) ZVAL_DOUBLE(return_value,d)
304
+ #define RETVAL_STRING (s ,duplicate ) ZVAL_STRING(return_value,s,duplicate)
305
+ #define RETVAL_STRINGL (s ,l ,duplicate ) ZVAL_STRINGL(return_value,s,l,duplicate)
306
+ #define RETVAL_EMPTY_STRING () ZVAL_EMPTY_STRING(return_value)
307
+ #define RETVAL_FALSE ZVAL_BOOL(return_value,0)
308
+ #define RETVAL_TRUE ZVAL_BOOL(return_value,1)
309
+
310
+ #define RETURN_RESOURCE (l ) { RETVAL_RESOURCE(l); return; }
311
+ #define RETURN_BOOL (b ) { RETVAL_BOOL(b); return; }
312
+ #define RETURN_NULL () { RETVAL_NULL(); return;}
313
+ #define RETURN_LONG (l ) { RETVAL_LONG(l); return; }
314
+ #define RETURN_DOUBLE (d ) { RETVAL_DOUBLE(d); return; }
315
+ #define RETURN_STRING (s ,duplicate ) { RETVAL_STRING(s,duplicate); return; }
316
+ #define RETURN_STRINGL (s ,l ,duplicate ) { RETVAL_STRINGL(s,l,duplicate); return; }
317
+ #define RETURN_EMPTY_STRING () { RETVAL_EMPTY_STRING(); return; }
318
+ #define RETURN_FALSE { RETVAL_FALSE; return; }
319
+ #define RETURN_TRUE { RETVAL_TRUE; return; }
377
320
378
321
#define SET_VAR_STRING (n ,v ) { \
379
322
{ \
380
323
zval *var; \
381
- char *str=(v); /* prevent 'v' from being evaluated more than once */ \
382
- \
383
324
ALLOC_ZVAL(var); \
384
- var -> value .str .val = (str ); \
385
- var -> value .str .len = strlen ((str )); \
386
- var -> type = IS_STRING ; \
325
+ ZVAL_STRING(var,v,0); \
387
326
ZEND_SET_GLOBAL_VAR(n, var); \
388
327
} \
389
328
}
390
329
391
330
#define SET_VAR_STRINGL (n ,v ,l ) { \
392
331
{ \
393
332
zval *var; \
394
- \
395
333
ALLOC_ZVAL(var); \
396
- var->value.str.val = (v); \
397
- var->value.str.len = (l); \
398
- var->type = IS_STRING; \
334
+ ZVAL_STRINGL(var,v,l,0); \
399
335
ZEND_SET_GLOBAL_VAR(n, var); \
400
336
} \
401
337
}
402
338
403
339
#define SET_VAR_LONG (n ,v ) { \
404
340
{ \
405
341
zval *var; \
406
- \
407
342
ALLOC_ZVAL(var); \
408
- var->value.lval = (v); \
409
- var->type = IS_LONG; \
343
+ ZVAL_LONG(var,v); \
410
344
ZEND_SET_GLOBAL_VAR(n, var); \
411
345
} \
412
346
}
413
347
414
348
#define SET_VAR_DOUBLE (n ,v ) { \
415
349
{ \
416
350
zval *var; \
417
- \
418
351
ALLOC_ZVAL(var); \
419
- var->value.dval = (v); \
420
- var->type = IS_DOUBLE; \
352
+ ZVAL_DOUBLE(var,v); \
421
353
ZEND_SET_GLOBAL_VAR(n, var); \
422
354
} \
423
355
}
0 commit comments