cvs: ZendEngine2 / zend_reflection_api.c

From: Date: Thu, 19 Aug 2004 07:42:04 +0000
Subject: cvs: ZendEngine2 / zend_reflection_api.c
Groups: php.zend-engine.cvs 
Request: Send a blank email to php-zend-engine-cvs+get-2876@lists.php.net to get a copy of this message
helly Thu Aug 19 03:42:04 2004 EDT Modified files: /ZendEngine2 zend_reflection_api.c Log: - Implement #29728: Reflection API Feature: Default parameter value. . ReflectionParameter::isDefaultValueAvailable() . ReflectionParameter::getDefaultValue() http://cvs.php.net/diff.php/ZendEngine2/zend_reflection_api.c?r1=1.122&r2=1.123&ty=u Index: ZendEngine2/zend_reflection_api.c diff -u ZendEngine2/zend_reflection_api.c:1.122 ZendEngine2/zend_reflection_api.c:1.123 --- ZendEngine2/zend_reflection_api.c:1.122 Thu Aug 19 03:16:02 2004 +++ ZendEngine2/zend_reflection_api.c Thu Aug 19 03:42:02 2004 @@ -19,7 +19,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: zend_reflection_api.c,v 1.122 2004/08/19 07:16:02 helly Exp $ */ +/* $Id: zend_reflection_api.c,v 1.123 2004/08/19 07:42:02 helly Exp $ */ #include "zend.h" #include "zend_API.h" #include "zend_exceptions.h" @@ -1680,6 +1680,66 @@ } /* }}} */ +/* {{{ proto public bool ReflectionParameter::isDefaultValueAvailable() + Returns whether the default value of this parameter is available */ +ZEND_METHOD(reflection_parameter, isDefaultValueAvailable) +{ + reflection_object *intern; + parameter_reference *param; + zend_op *precv; + + METHOD_NOTSTATIC_NUMPARAMS(0); + GET_REFLECTION_OBJECT_PTR(param); + + if (param->fptr->type != ZEND_USER_FUNCTION) + { + RETURN_FALSE; + } + if (param->offset < param->required) { + RETURN_FALSE; + } + precv = &((zend_op_array*)param->fptr)->opcodes[param->offset*2 + 1]; + if (precv->opcode != ZEND_RECV_INIT || precv->op2.op_type == IS_UNUSED) { + RETURN_FALSE; + } + RETURN_TRUE; +} +/* }}} */ + +/* {{{ proto public bool ReflectionParameter::getDefaultValue() + Returns the default value of this parameter or throws an exception */ +ZEND_METHOD(reflection_parameter, getDefaultValue) +{ + reflection_object *intern; + parameter_reference *param; + zend_op *precv; + zval *zv, zv_copy; + + METHOD_NOTSTATIC_NUMPARAMS(0); + GET_REFLECTION_OBJECT_PTR(param); + + if (param->fptr->type != ZEND_USER_FUNCTION) + { + zend_throw_exception_ex(reflection_exception_ptr, 0 TSRMLS_CC, "Cannot determine default value for internal functions"); + return; + } + if (param->offset < param->required) { + zend_throw_exception_ex(reflection_exception_ptr, 0 TSRMLS_CC, "Parameter is not optional"); + return; + } + precv = &((zend_op_array*)param->fptr)->opcodes[param->offset*2 + 1]; + if (precv->opcode != ZEND_RECV_INIT || precv->op2.op_type == IS_UNUSED) { + zend_throw_exception_ex(reflection_exception_ptr, 0 TSRMLS_CC, "Internal error"); + return; + } + + zv_copy = precv->op2.u.constant; + zv = &zv_copy; + zval_update_constant(&zv, (void*)1 TSRMLS_CC); + RETURN_ZVAL(zv, 1, 1); +} +/* }}} */ + /* {{{ proto public static mixed ReflectionMethod::export(mixed class, string name, [, bool return]) throws ReflectionException Exports a reflection object. Returns the output if TRUE is specified for return, printing it otherwise. */ ZEND_METHOD(reflection_method, export) @@ -3419,6 +3479,8 @@ ZEND_ME(reflection_parameter, getClass, NULL, 0) ZEND_ME(reflection_parameter, allowsNull, NULL, 0) ZEND_ME(reflection_parameter, isOptional, NULL, 0) + ZEND_ME(reflection_parameter, isDefaultValueAvailable, NULL, 0) + ZEND_ME(reflection_parameter, getDefaultValue, NULL, 0) {NULL, NULL, NULL} };

« previous php.zend-engine.cvs (#2876) next »