summaryrefslogtreecommitdiff
path: root/Zend/zend_builtin_functions.c
diff options
context:
space:
mode:
authorMarcus Boerger <helly@php.net>2006-07-09 22:45:11 +0000
committerMarcus Boerger <helly@php.net>2006-07-09 22:45:11 +0000
commitdd5cbcd24c9c6b6ab1adc0c702e5da25d7c44886 (patch)
tree3640d245b58cd2b3cf1b427fee1bbbb04a11ca66 /Zend/zend_builtin_functions.c
parentc514ee0c9b43c86beb87ae78e92692bb1f3204e1 (diff)
downloadphp-git-dd5cbcd24c9c6b6ab1adc0c702e5da25d7c44886.tar.gz
- Fixed Bug #37811 define not using toString on objects
Diffstat (limited to 'Zend/zend_builtin_functions.c')
-rw-r--r--Zend/zend_builtin_functions.c24
1 files changed, 22 insertions, 2 deletions
diff --git a/Zend/zend_builtin_functions.c b/Zend/zend_builtin_functions.c
index 500c3c8879..0aa81a487c 100644
--- a/Zend/zend_builtin_functions.c
+++ b/Zend/zend_builtin_functions.c
@@ -452,7 +452,7 @@ ZEND_FUNCTION(error_reporting)
Define a new constant */
ZEND_FUNCTION(define)
{
- zval **var, **val, **non_cs;
+ zval **var, **val, **non_cs, *val_free = NULL;
int case_sensitive;
zend_constant c;
@@ -479,6 +479,7 @@ ZEND_FUNCTION(define)
break;
}
+repeat:
switch (Z_TYPE_PP(val)) {
case IS_LONG:
case IS_DOUBLE:
@@ -487,15 +488,34 @@ ZEND_FUNCTION(define)
case IS_RESOURCE:
case IS_NULL:
break;
+ case IS_OBJECT:
+ if (!val_free) {
+ if (Z_OBJ_HT_PP(val)->get) {
+ val_free = *val = Z_OBJ_HT_PP(val)->get(*val TSRMLS_CC);
+ goto repeat;
+ } else if (Z_OBJ_HT_PP(val)->cast_object) {
+ ALLOC_INIT_ZVAL(val_free);
+ if (Z_OBJ_HT_PP(val)->cast_object(*val, val_free, IS_STRING TSRMLS_CC) == SUCCESS) {
+ val = &val_free;
+ break;
+ }
+ }
+ }
+ /* no break */
default:
zend_error(E_WARNING,"Constants may only evaluate to scalar values");
+ if (val_free) {
+ zval_ptr_dtor(&val_free);
+ }
RETURN_FALSE;
- break;
}
convert_to_string_ex(var);
c.value = **val;
zval_copy_ctor(&c.value);
+ if (val_free) {
+ zval_ptr_dtor(&val_free);
+ }
c.flags = case_sensitive; /* non persistent */
c.name = zend_strndup((*var)->value.str.val, (*var)->value.str.len);
c.name_len = (*var)->value.str.len+1;