mirror of
https://github.com/Imagick/imagick.git
synced 2026-06-19 07:35:36 +00:00
Fix PECL bug #21229
git-svn-id: http://svn.php.net/repository/pecl/imagick/trunk@307289 c90b9560-bf6c-de11-be94-00142212c4b1
This commit is contained in:
@@ -2502,39 +2502,59 @@ static void php_imagick_init_globals(zend_imagick_globals *imagick_globals)
|
||||
|
||||
static zval *php_imagick_read_property(zval *object, zval *member, int type TSRMLS_DC)
|
||||
{
|
||||
int ret;
|
||||
php_imagick_object *intern;
|
||||
zval *retval;
|
||||
MAKE_STD_ZVAL(retval);
|
||||
|
||||
intern = (php_imagick_object *)zend_object_store_get_object(object TSRMLS_CC);
|
||||
|
||||
if (Z_TYPE_P(member) != IS_STRING || MagickGetNumberImages(intern->magick_wand) == 0) {
|
||||
ZVAL_NULL(retval);
|
||||
} else {
|
||||
char *property = Z_STRVAL_P(member);
|
||||
int property_len = Z_STRLEN_P(member);
|
||||
zval *retval = NULL, tmp_member;
|
||||
zend_object_handlers *std_hnd;
|
||||
|
||||
if ((property_len == 5) && (memcmp(property, "width", 5) == 0)) {
|
||||
ZVAL_LONG(retval, MagickGetImageWidth(intern->magick_wand));
|
||||
} else if ((property_len == 6) && (memcmp(property, "height", 6) == 0)) {
|
||||
ZVAL_LONG(retval, MagickGetImageHeight(intern->magick_wand));
|
||||
} else if ((property_len == 6) && (memcmp(property, "format", 6) == 0)) {
|
||||
char *format = MagickGetImageFormat(intern->magick_wand);
|
||||
if (format) {
|
||||
ZVAL_STRING(retval, format, 1);
|
||||
IMAGICK_FREE_MEMORY(char *, format);
|
||||
} else {
|
||||
ZVAL_STRING(retval, "", 1);
|
||||
if (Z_TYPE_P(member) != IS_STRING) {
|
||||
tmp_member = *member;
|
||||
zval_copy_ctor(&tmp_member);
|
||||
convert_to_string(&tmp_member);
|
||||
member = &tmp_member;
|
||||
}
|
||||
|
||||
std_hnd = zend_get_std_object_handlers();
|
||||
ret = std_hnd->has_property(object, member, 2 TSRMLS_CC);
|
||||
|
||||
if (ret) {
|
||||
std_hnd = zend_get_std_object_handlers();
|
||||
retval = std_hnd->read_property(object, member, type TSRMLS_CC);
|
||||
} else {
|
||||
intern = (php_imagick_object *)zend_object_store_get_object(object TSRMLS_CC);
|
||||
/* Do we have any images? */
|
||||
if (MagickGetNumberImages(intern->magick_wand)) {
|
||||
/* Is this overloaded? */
|
||||
if (!strcmp(Z_STRVAL_P(member), "width") ||
|
||||
!strcmp(Z_STRVAL_P(member), "height") ||
|
||||
!strcmp(Z_STRVAL_P(member), "format")) {
|
||||
|
||||
MAKE_STD_ZVAL(retval);
|
||||
#ifdef Z_SET_REFCOUNT_P
|
||||
Z_SET_REFCOUNT_P(retval, 0);
|
||||
#else
|
||||
retval->refcount = 0;
|
||||
#endif
|
||||
if (!strcmp(Z_STRVAL_P(member), "width")) {
|
||||
ZVAL_LONG(retval, MagickGetImageWidth(intern->magick_wand));
|
||||
} else if (!strcmp(Z_STRVAL_P(member), "height")) {
|
||||
ZVAL_LONG(retval, MagickGetImageHeight(intern->magick_wand));
|
||||
} else if (!strcmp(Z_STRVAL_P(member), "format")) {
|
||||
char *format = MagickGetImageFormat(intern->magick_wand);
|
||||
|
||||
if (format) {
|
||||
ZVAL_STRING(retval, format, 1);
|
||||
IMAGICK_FREE_MEMORY(char *, format);
|
||||
} else {
|
||||
ZVAL_STRING(retval, "", 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
ZVAL_NULL(retval);
|
||||
}
|
||||
}
|
||||
#ifdef Z_SET_REFCOUNT_P
|
||||
Z_SET_REFCOUNT_P(retval, 0);
|
||||
#else
|
||||
retval->refcount = 0;
|
||||
#endif
|
||||
if (member == &tmp_member) {
|
||||
zval_dtor(member);
|
||||
}
|
||||
return retval;
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,41 @@
|
||||
--TEST--
|
||||
Test PECL bug #21229
|
||||
--SKIPIF--
|
||||
<?php require_once(dirname(__FILE__) . '/skipif.inc'); ?>
|
||||
--FILE--
|
||||
<?php
|
||||
|
||||
class ImagickTest extends Imagick {
|
||||
|
||||
/* Protected property */
|
||||
protected $test;
|
||||
|
||||
/* Override width property */
|
||||
public $width = 112233;
|
||||
|
||||
public function setTestValue($value) {
|
||||
$this->test = $value;
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function getTestValue() {
|
||||
return $this->test;
|
||||
}
|
||||
}
|
||||
|
||||
$test = new ImagickTest("magick:logo");
|
||||
$test->setTestValue("test value");
|
||||
|
||||
echo "Value: " , $test->getTestValue() , PHP_EOL;
|
||||
|
||||
var_dump($test->width, $test->height);
|
||||
|
||||
echo "OK" , PHP_EOL;
|
||||
|
||||
|
||||
?>
|
||||
--EXPECTF--
|
||||
Value: test value
|
||||
int(112233)
|
||||
int(%d)
|
||||
OK
|
||||
Reference in New Issue
Block a user