diff options
author | Marcus Boerger <helly@php.net> | 2006-07-09 22:45:11 +0000 |
---|---|---|
committer | Marcus Boerger <helly@php.net> | 2006-07-09 22:45:11 +0000 |
commit | dd5cbcd24c9c6b6ab1adc0c702e5da25d7c44886 (patch) | |
tree | 3640d245b58cd2b3cf1b427fee1bbbb04a11ca66 | |
parent | c514ee0c9b43c86beb87ae78e92692bb1f3204e1 (diff) | |
download | php-git-dd5cbcd24c9c6b6ab1adc0c702e5da25d7c44886.tar.gz |
- Fixed Bug #37811 define not using toString on objects
-rwxr-xr-x | Zend/tests/bug37811.phpt | 28 | ||||
-rw-r--r-- | Zend/zend_builtin_functions.c | 24 |
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; |