summaryrefslogtreecommitdiff
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
parentc514ee0c9b43c86beb87ae78e92692bb1f3204e1 (diff)
downloadphp-git-dd5cbcd24c9c6b6ab1adc0c702e5da25d7c44886.tar.gz
- Fixed Bug #37811 define not using toString on objects
-rwxr-xr-xZend/tests/bug37811.phpt28
-rw-r--r--Zend/zend_builtin_functions.c24
2 files changed, 50 insertions, 2 deletions
diff --git a/Zend/tests/bug37811.phpt b/Zend/tests/bug37811.phpt
new file mode 100755
index 0000000000..dc3ef93d6f
--- /dev/null
+++ b/Zend/tests/bug37811.phpt
@@ -0,0 +1,28 @@
+--TEST--
+Bug #37811 define not using toString on objects
+--FILE--
+<?php
+
+class TestClass
+{
+ function __toString()
+ {
+ return "Foo";
+ }
+}
+
+define("Bar",new TestClass);
+var_dump(Bar);
+define("Baz",new stdClass);
+var_dump(Baz);
+
+?>
+===DONE===
+--EXPECTF--
+string(3) "Foo"
+
+Warning: Constants may only evaluate to scalar values in %sbug37811.php on line %d
+
+Notice: Use of undefined constant Baz - assumed 'Baz' in %sbug37811.php on line %d
+string(3) "Baz"
+===DONE===
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;