]> granicus.if.org Git - php/commitdiff
- Add ReflectionProperty::getDocComment()
authorMarcus Boerger <helly@php.net>
Tue, 19 Apr 2005 22:04:59 +0000 (22:04 +0000)
committerMarcus Boerger <helly@php.net>
Tue, 19 Apr 2005 22:04:59 +0000 (22:04 +0000)
Zend/zend_API.c
Zend/zend_API.h
Zend/zend_compile.c
Zend/zend_compile.h
Zend/zend_reflection_api.c
ext/reflection/php_reflection.c

index 3a9f7bad3d74a6db94c111c5eb78c006e34ae9df..0e9f822e804985fd4d3cb43dd4589a63d93a9c39 100644 (file)
@@ -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;
index 52e2fb95b0e2f0731cc638bd48afd0f8f884c831..131dc9826aeb5676a958e63242b913525c8eed9b 100644 (file)
@@ -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);
index 39776e4a65cd0f1a68e158df07057fc9cecc0924..06ba979436cb4e8c29d984d3f54d7b66b638abf0 100644 (file)
@@ -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);
 }
 
index a154e42c5f69b304108c785a1cb3db73c79f300a..ae498de04f9fe44510917d78c12b5e476992b999 100644 (file)
@@ -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;
 
 
index bf1000ea910e47527a70253bbb12e72d0cd8389d..75e4037470131adcd1cead4469c55565a209be49 100644 (file)
@@ -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}
 };
 
index bf1000ea910e47527a70253bbb12e72d0cd8389d..75e4037470131adcd1cead4469c55565a209be49 100644 (file)
@@ -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}
 };