From: Marcus Boerger Date: Tue, 19 Apr 2005 22:04:59 +0000 (+0000) Subject: - Add ReflectionProperty::getDocComment() X-Git-Tag: php-5.0.1b1~471 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=67a226d910f4a154f48f6edccd46e5537608cbe9;p=php - Add ReflectionProperty::getDocComment() --- diff --git a/Zend/zend_API.c b/Zend/zend_API.c index 3a9f7bad3d..0e9f822e80 100644 --- a/Zend/zend_API.c +++ b/Zend/zend_API.c @@ -1890,6 +1890,11 @@ ZEND_API char *zend_get_module_version(char *module_name) ZEND_API int zend_declare_property(zend_class_entry *ce, char *name, int name_length, zval *property, int access_type TSRMLS_DC) +{ + return zend_declare_property_ex(ce, name, name_length, property, access_type, NULL, 0 TSRMLS_CC); +} + +ZEND_API int zend_declare_property_ex(zend_class_entry *ce, char *name, int name_length, zval *property, int access_type, char *doc_comment, int doc_comment_len TSRMLS_DC) { zend_property_info property_info; HashTable *target_symbol_table; @@ -1952,6 +1957,9 @@ ZEND_API int zend_declare_property(zend_class_entry *ce, char *name, int name_le property_info.flags = access_type; property_info.h = zend_get_hash_value(property_info.name, property_info.name_length+1); + property_info.doc_comment = doc_comment; + property_info.doc_comment_len = doc_comment_len; + zend_hash_update(&ce->properties_info, name, name_length + 1, &property_info, sizeof(zend_property_info), NULL); return SUCCESS; diff --git a/Zend/zend_API.h b/Zend/zend_API.h index 52e2fb95b0..131dc9826a 100644 --- a/Zend/zend_API.h +++ b/Zend/zend_API.h @@ -189,6 +189,7 @@ ZEND_API zend_bool zend_make_callable(zval *callable, char **callable_name TSRML ZEND_API char *zend_get_module_version(char *module_name); ZEND_API int zend_get_module_started(char *module_name); ZEND_API int zend_declare_property(zend_class_entry *ce, char *name, int name_length, zval *property, int access_type TSRMLS_DC); +ZEND_API int zend_declare_property_ex(zend_class_entry *ce, char *name, int name_length, zval *property, int access_type, char *doc_comment, int doc_comment_len TSRMLS_DC); ZEND_API int zend_declare_property_null(zend_class_entry *ce, char *name, int name_length, int access_type TSRMLS_DC); ZEND_API int zend_declare_property_bool(zend_class_entry *ce, char *name, int name_length, long value, int access_type TSRMLS_DC); ZEND_API int zend_declare_property_long(zend_class_entry *ce, char *name, int name_length, long value, int access_type TSRMLS_DC); diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index 39776e4a65..06ba979436 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -54,6 +54,9 @@ static void zend_duplicate_property_info_internal(zend_property_info *property_i static void zend_destroy_property_info(zend_property_info *property_info) { efree(property_info->name); + if (property_info->doc_comment) { + efree(property_info->doc_comment); + } } @@ -1818,8 +1821,11 @@ static zend_bool zend_do_perform_implementation_check(zend_function *fe, zend_fu } if (proto->common.return_reference != ZEND_RETURN_REFERENCE_AGNOSTIC - && fe->common.return_reference != proto->common.return_reference) { - return 0; + && fe->common.return_reference != proto->common.return_reference) { + /* atm we cannot let internal function return by ref */ + if (fe->type != ZEND_INTERNAL_FUNCTION && proto->type == ZEND_INTERNAL_FUNCTION) { + return 0; + } } for (i=0; i < proto->common.num_args; i++) { @@ -2687,6 +2693,8 @@ void zend_do_declare_property(znode *var_name, znode *value, zend_uint access_ty { zval *property; zend_property_info *existing_property_info; + char *comment = NULL; + int comment_len = 0; if (CG(active_class_entry)->ce_flags & ZEND_ACC_INTERFACE) { zend_error(E_COMPILE_ERROR, "Interfaces may not include member variables"); @@ -2715,7 +2723,13 @@ void zend_do_declare_property(znode *var_name, znode *value, zend_uint access_ty property->type = IS_NULL; } - zend_declare_property(CG(active_class_entry), var_name->u.constant.value.str.val, var_name->u.constant.value.str.len, property, access_type TSRMLS_CC); + if (CG(doc_comment)) { + comment = estrndup(CG(doc_comment), CG(doc_comment_len)); + comment_len = CG(doc_comment_len); + RESET_DOC_COMMENT(); + } + + zend_declare_property_ex(CG(active_class_entry), var_name->u.constant.value.str.val, var_name->u.constant.value.str.len, property, access_type, comment, comment_len TSRMLS_CC); efree(var_name->u.constant.value.str.val); } diff --git a/Zend/zend_compile.h b/Zend/zend_compile.h index a154e42c5f..ae498de04f 100644 --- a/Zend/zend_compile.h +++ b/Zend/zend_compile.h @@ -138,6 +138,8 @@ typedef struct _zend_property_info { char *name; int name_length; ulong h; + char *doc_comment; + int doc_comment_len; } zend_property_info; diff --git a/Zend/zend_reflection_api.c b/Zend/zend_reflection_api.c index bf1000ea91..75e4037470 100644 --- a/Zend/zend_reflection_api.c +++ b/Zend/zend_reflection_api.c @@ -3455,6 +3455,21 @@ ZEND_METHOD(reflection_property, getDeclaringClass) zend_reflection_class_factory(ref->ce, return_value TSRMLS_CC); } +/* {{{ proto public string ReflectionProperty::getDocComment() + Returns the doc comment for this property */ +ZEND_METHOD(reflection_property, getDocComment) +{ + reflection_object *intern; + property_reference *ref; + + METHOD_NOTSTATIC_NUMPARAMS(0); + GET_REFLECTION_OBJECT_PTR(ref); + if (ref->prop->doc_comment) { + RETURN_STRINGL(ref->prop->doc_comment, ref->prop->doc_comment_len, 1); + } + RETURN_FALSE; +} +/* }}} */ /* {{{ proto public static mixed ReflectionExtension::export(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_extension, export) @@ -3814,6 +3829,7 @@ static zend_function_entry reflection_property_functions[] = { ZEND_ME(reflection_property, isDefault, NULL, 0) ZEND_ME(reflection_property, getModifiers, NULL, 0) ZEND_ME(reflection_property, getDeclaringClass, NULL, 0) + ZEND_ME(reflection_property, getDocComment, NULL, 0) {NULL, NULL, NULL} }; diff --git a/ext/reflection/php_reflection.c b/ext/reflection/php_reflection.c index bf1000ea91..75e4037470 100644 --- a/ext/reflection/php_reflection.c +++ b/ext/reflection/php_reflection.c @@ -3455,6 +3455,21 @@ ZEND_METHOD(reflection_property, getDeclaringClass) zend_reflection_class_factory(ref->ce, return_value TSRMLS_CC); } +/* {{{ proto public string ReflectionProperty::getDocComment() + Returns the doc comment for this property */ +ZEND_METHOD(reflection_property, getDocComment) +{ + reflection_object *intern; + property_reference *ref; + + METHOD_NOTSTATIC_NUMPARAMS(0); + GET_REFLECTION_OBJECT_PTR(ref); + if (ref->prop->doc_comment) { + RETURN_STRINGL(ref->prop->doc_comment, ref->prop->doc_comment_len, 1); + } + RETURN_FALSE; +} +/* }}} */ /* {{{ proto public static mixed ReflectionExtension::export(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_extension, export) @@ -3814,6 +3829,7 @@ static zend_function_entry reflection_property_functions[] = { ZEND_ME(reflection_property, isDefault, NULL, 0) ZEND_ME(reflection_property, getModifiers, NULL, 0) ZEND_ME(reflection_property, getDeclaringClass, NULL, 0) + ZEND_ME(reflection_property, getDocComment, NULL, 0) {NULL, NULL, NULL} };