johannes                                 Tue, 30 Mar 2010 22:35:23 +0000

Revision: http://svn.php.net/viewvc?view=revision&revision=297206

Log:
Add ReflectionZendExtension class and --rz option to CLI

Changed paths:
    U   php/php-src/trunk/NEWS
    U   php/php-src/trunk/ext/reflection/php_reflection.c
    U   php/php-src/trunk/ext/reflection/php_reflection.h
    U   
php/php-src/trunk/ext/reflection/tests/ReflectionExtension_getClasses_basic.phpt
    U   php/php-src/trunk/sapi/cli/php.1.in
    U   php/php-src/trunk/sapi/cli/php_cli.c

Modified: php/php-src/trunk/NEWS
===================================================================
--- php/php-src/trunk/NEWS	2010-03-30 21:09:07 UTC (rev 297205)
+++ php/php-src/trunk/NEWS	2010-03-30 22:35:23 UTC (rev 297206)
@@ -9,6 +9,8 @@
 - Added FNV-1 hash support to ext/hash. (Michael Maclean)
 - Added ReflectionExtension::isTemporary() and
   ReflectionExtension::isPersistent(). (Johannes)
+- Added ReflectionZendExtension class. (Johannes)
+- Added command line option --rz to CLI. (Johannes)

 - default_charset if not specified is now UTF-8 instead of ISO-8859-1. (Rasmus)


Modified: php/php-src/trunk/ext/reflection/php_reflection.c
===================================================================
--- php/php-src/trunk/ext/reflection/php_reflection.c	2010-03-30 21:09:07 UTC (rev 297205)
+++ php/php-src/trunk/ext/reflection/php_reflection.c	2010-03-30 22:35:23 UTC (rev 297206)
@@ -39,6 +39,7 @@
 #include "zend_ini.h"
 #include "zend_interfaces.h"
 #include "zend_closures.h"
+#include "zend_extensions.h"

 /* Undefine "getParameters" macro defined in "main/php3_compat.h" */
 #ifdef getParameters
@@ -57,6 +58,7 @@
 PHPAPI zend_class_entry *reflection_method_ptr;
 PHPAPI zend_class_entry *reflection_property_ptr;
 PHPAPI zend_class_entry *reflection_extension_ptr;
+PHPAPI zend_class_entry *reflection_zend_extension_ptr;

 #if MBO_0
 ZEND_BEGIN_MODULE_GLOBALS(reflection)
@@ -330,6 +332,7 @@
 static void _property_string(string *str, zend_property_info *prop, char *prop_name, char* indent TSRMLS_DC);
 static void _class_string(string *str, zend_class_entry *ce, zval *obj, char *indent TSRMLS_DC);
 static void _extension_string(string *str, zend_module_entry *module, char *indent TSRMLS_DC);
+static void _zend_extension_string(string *str, zend_extension *extension, char *indent TSRMLS_DC);

 /* {{{ _class_string */
 static void _class_string(string *str, zend_class_entry *ce, zval *obj, char *indent TSRMLS_DC)
@@ -1112,6 +1115,26 @@
 }
 /* }}} */

+static void _zend_extension_string(string *str, zend_extension *extension, char *indent TSRMLS_DC)
+{
+	string_printf(str, "%sZend Extension [ %s ", indent, extension->name);
+
+	if (extension->version) {
+		string_printf(str, "%s ", extension->version);
+	}
+	if (extension->copyright) {
+		string_printf(str, "%s ", extension->copyright);
+	}
+	if (extension->author) {
+		string_printf(str, "by %s ", extension->author);
+	}
+	if (extension->URL) {
+		string_printf(str, "<%s> ", extension->URL);
+	}
+
+	string_printf(str, "]\n");
+}
+
 /* {{{ _function_check_flag */
 static void _function_check_flag(INTERNAL_FUNCTION_PARAMETERS, int mask)
 {
@@ -5046,6 +5069,148 @@
 }
 /* }}} */

+/* {{{ proto public static mixed ReflectionZendExtension::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_zend_extension, export)
+{
+	_reflection_export(INTERNAL_FUNCTION_PARAM_PASSTHRU, reflection_zend_extension_ptr, 1);
+}
+/* }}} */
+
+/* {{{ proto public void ReflectionZendExtension::__construct(string name)
+       Constructor. Throws an Exception in case the given Zend extension does not exist */
+ZEND_METHOD(reflection_zend_extension, __construct)
+{
+	zval *name;
+	zval *object;
+	reflection_object *intern;
+	zend_extension *extension;
+	char *name_str;
+	int name_len;
+
+	if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &name_str, &name_len) == FAILURE) {
+		return;
+	}
+
+	object = getThis();
+	intern = (reflection_object *) zend_object_store_get_object(object TSRMLS_CC);
+	if (intern == NULL) {
+		return;
+	}
+
+	extension = zend_get_extension(name_str);
+	if (!extension) {
+		zend_throw_exception_ex(reflection_exception_ptr, 0 TSRMLS_CC,
+				"Zend Extension %s does not exist", name_str);
+		return;
+	}
+	MAKE_STD_ZVAL(name);
+	ZVAL_STRING(name, extension->name, 1);
+	zend_hash_update(Z_OBJPROP_P(object), "name", sizeof("name"), (void **) &name, sizeof(zval *), NULL);
+	intern->ptr = extension;
+	intern->ref_type = REF_TYPE_OTHER;
+	intern->ce = NULL;
+}
+/* }}} */
+
+/* {{{ proto public string ReflectionZendExtension::__toString()
+       Returns a string representation */
+ZEND_METHOD(reflection_zend_extension, __toString)
+{
+	reflection_object *intern;
+	zend_extension *extension;
+	string str;
+
+	if (zend_parse_parameters_none() == FAILURE) {
+		return;
+	}
+	GET_REFLECTION_OBJECT_PTR(extension);
+	string_init(&str);
+	_zend_extension_string(&str, extension, "" TSRMLS_CC);
+	RETURN_STRINGL(str.string, str.len - 1, 0);
+}
+/* }}} */
+
+/* {{{ proto public string ReflectionZendExtension::getName()
+       Returns the name of this Zend extension */
+ZEND_METHOD(reflection_zend_extension, getName)
+{
+	reflection_object *intern;
+	zend_extension *extension;
+
+	if (zend_parse_parameters_none() == FAILURE) {
+		return;
+	}
+	GET_REFLECTION_OBJECT_PTR(extension);
+
+	RETURN_STRING(extension->name, 1);
+}
+/* }}} */
+
+/* {{{ proto public string ReflectionZendExtension::getVersion()
+       Returns the version information of this Zend extension */
+ZEND_METHOD(reflection_zend_extension, getVersion)
+{
+	reflection_object *intern;
+	zend_extension *extension;
+
+	if (zend_parse_parameters_none() == FAILURE) {
+		return;
+	}
+	GET_REFLECTION_OBJECT_PTR(extension);
+
+	RETURN_STRING(extension->version ? extension->version : "", 1);
+}
+/* }}} */
+
+/* {{{ proto public void ReflectionZendExtension::getAuthor()
+ * Returns the name of this Zend extension's author */
+ZEND_METHOD(reflection_zend_extension, getAuthor)
+{
+	reflection_object *intern;
+	zend_extension *extension;
+
+	if (zend_parse_parameters_none() == FAILURE) {
+		return;
+	}
+	GET_REFLECTION_OBJECT_PTR(extension);
+
+	RETURN_STRING(extension->author ? extension->author : "", 1);
+}
+/* }}} */
+
+/* {{{ proto public void ReflectionZendExtension::getURL()
+       Returns this Zend extension's URL*/
+ZEND_METHOD(reflection_zend_extension, getURL)
+{
+	reflection_object *intern;
+	zend_extension *extension;
+
+	if (zend_parse_parameters_none() == FAILURE) {
+		return;
+	}
+	GET_REFLECTION_OBJECT_PTR(extension);
+
+	RETURN_STRING(extension->URL ? extension->URL : "", 1);
+}
+/* }}} */
+
+/* {{{ proto public void ReflectionZendExtension::getCopyright()
+       Returns this Zend extension's copyright information */
+ZEND_METHOD(reflection_zend_extension, getCopyright)
+{
+	reflection_object *intern;
+	zend_extension *extension;
+
+	if (zend_parse_parameters_none() == FAILURE) {
+		return;
+	}
+	GET_REFLECTION_OBJECT_PTR(extension);
+
+	RETURN_STRING(extension->copyright ? extension->copyright : "", 1);
+}
+/* }}} */
+
 /* {{{ method tables */
 static const zend_function_entry reflection_exception_functions[] = {
 	{NULL, NULL, NULL}
@@ -5412,6 +5577,23 @@
 	ZEND_ME(reflection_extension, isTemporary, arginfo_reflection__void, 0)
 	{NULL, NULL, NULL}
 };
+
+ZEND_BEGIN_ARG_INFO(arginfo_reflection_zend_extension___construct, 0)
+	ZEND_ARG_INFO(0, name)
+ZEND_END_ARG_INFO()
+
+static const zend_function_entry reflection_zend_extension_functions[] = {
+	ZEND_ME(reflection, __clone, arginfo_reflection__void, ZEND_ACC_PRIVATE|ZEND_ACC_FINAL)
+	ZEND_ME(reflection_zend_extension, export, arginfo_reflection_extension_export, ZEND_ACC_STATIC|ZEND_ACC_PUBLIC)
+	ZEND_ME(reflection_zend_extension, __construct, arginfo_reflection_extension___construct, 0)
+	ZEND_ME(reflection_zend_extension, __toString, arginfo_reflection__void, 0)
+	ZEND_ME(reflection_zend_extension, getName, arginfo_reflection__void, 0)
+	ZEND_ME(reflection_zend_extension, getVersion, arginfo_reflection__void, 0)
+	ZEND_ME(reflection_zend_extension, getAuthor, arginfo_reflection__void, 0)
+	ZEND_ME(reflection_zend_extension, getURL, arginfo_reflection__void, 0)
+	ZEND_ME(reflection_zend_extension, getCopyright, arginfo_reflection__void, 0)
+	{NULL, NULL, NULL}
+};
 /* }}} */

 const zend_function_entry reflection_ext_functions[] = { /* {{{ */
@@ -5520,6 +5702,12 @@
 	reflection_register_implement(reflection_extension_ptr, reflector_ptr TSRMLS_CC);
 	zend_declare_property_string(reflection_extension_ptr, "name", sizeof("name")-1, "", ZEND_ACC_PUBLIC TSRMLS_CC);

+	INIT_CLASS_ENTRY(_reflection_entry, "ReflectionZendExtension", reflection_zend_extension_functions);
+	_reflection_entry.create_object = reflection_objects_new;
+	reflection_zend_extension_ptr = zend_register_internal_class(&_reflection_entry TSRMLS_CC);
+	reflection_register_implement(reflection_zend_extension_ptr, reflector_ptr TSRMLS_CC);
+	zend_declare_property_string(reflection_zend_extension_ptr, "name", sizeof("name")-1, "", ZEND_ACC_PUBLIC TSRMLS_CC);
+
 	return SUCCESS;
 } /* }}} */


Modified: php/php-src/trunk/ext/reflection/php_reflection.h
===================================================================
--- php/php-src/trunk/ext/reflection/php_reflection.h	2010-03-30 21:09:07 UTC (rev 297205)
+++ php/php-src/trunk/ext/reflection/php_reflection.h	2010-03-30 22:35:23 UTC (rev 297206)
@@ -40,6 +40,7 @@
 extern PHPAPI zend_class_entry *reflection_method_ptr;
 extern PHPAPI zend_class_entry *reflection_property_ptr;
 extern PHPAPI zend_class_entry *reflection_extension_ptr;
+extern PHPAPI zend_class_entry *reflection_zend_extension_ptr;

 PHPAPI void zend_reflection_class_factory(zend_class_entry *ce, zval *object TSRMLS_DC);


Modified: php/php-src/trunk/ext/reflection/tests/ReflectionExtension_getClasses_basic.phpt
===================================================================
--- php/php-src/trunk/ext/reflection/tests/ReflectionExtension_getClasses_basic.phpt	2010-03-30 21:09:07 UTC (rev 297205)
+++ php/php-src/trunk/ext/reflection/tests/ReflectionExtension_getClasses_basic.phpt	2010-03-30 22:35:23 UTC (rev 297206)
@@ -9,7 +9,7 @@
 ?>
 ==DONE==
 --EXPECT--
-array(11) {
+array(12) {
   ["ReflectionException"]=>
   &object(ReflectionClass)#2 (1) {
     ["name"]=>
@@ -65,5 +65,10 @@
     ["name"]=>
     string(19) "ReflectionExtension"
   }
+  ["ReflectionZendExtension"]=>
+  &object(ReflectionClass)#13 (1) {
+    ["name"]=>
+    string(23) "ReflectionZendExtension"
+  }
 }
 ==DONE==

Modified: php/php-src/trunk/sapi/cli/php.1.in
===================================================================
--- php/php-src/trunk/sapi/cli/php.1.in	2010-03-30 21:09:07 UTC (rev 297205)
+++ php/php-src/trunk/sapi/cli/php.1.in	2010-03-30 22:35:23 UTC (rev 297206)
@@ -295,6 +295,16 @@
 .B name
 .TP
 .PD 0
+.B \-\-rzendextension
+.IR name
+.TP
+.PD 1
+.B \-\-rz
+.IR name
+Shows information about Zend extension
+.B name
+.TP
+.PD 0
 .B \-\-rextinfo
 .IR name
 .TP

Modified: php/php-src/trunk/sapi/cli/php_cli.c
===================================================================
--- php/php-src/trunk/sapi/cli/php_cli.c	2010-03-30 21:09:07 UTC (rev 297205)
+++ php/php-src/trunk/sapi/cli/php_cli.c	2010-03-30 22:35:23 UTC (rev 297206)
@@ -117,7 +117,8 @@
 #define PHP_MODE_REFLECTION_CLASS       9
 #define PHP_MODE_REFLECTION_EXTENSION   10
 #define PHP_MODE_REFLECTION_EXT_INFO    11
-#define PHP_MODE_SHOW_INI_CONFIG        12
+#define PHP_MODE_REFLECTION_ZEND_EXTENSION 12
+#define PHP_MODE_SHOW_INI_CONFIG        13

 const char HARDCODED_INI[] =
 	"html_errors=0\n"
@@ -165,10 +166,12 @@
 	{11,  1, "rclass"},
 	{12,  1, "re"},
 	{12,  1, "rextension"},
+	{13,  1, "rz"},
+	{13,  1, "rzendextension"},
 #endif
-	{13,  1, "ri"},
-	{13,  1, "rextinfo"},
-	{14,  0, "ini"},
+	{14,  1, "ri"},
+	{14,  1, "rextinfo"},
+	{15,  0, "ini"},
 	{'-', 0, NULL} /* end of args */
 };

@@ -522,6 +525,7 @@
 				"  --rf <name>      Show information about function <name>.\n"
 				"  --rc <name>      Show information about class <name>.\n"
 				"  --re <name>      Show information about extension <name>.\n"
+				"  --rz <name>      Show information about Zend extension <name>.\n"
 #endif
 				"  --ri <name>      Show configuration for extension <name>.\n"
 				"\n"
@@ -1018,12 +1022,16 @@
 				behavior=PHP_MODE_REFLECTION_EXTENSION;
 				reflection_what = php_optarg;
 				break;
+			case 13:
+				behavior=PHP_MODE_REFLECTION_ZEND_EXTENSION;
+				reflection_what = php_optarg;
+				break;
 #endif
-			case 13:
+			case 14:
 				behavior=PHP_MODE_REFLECTION_EXT_INFO;
 				reflection_what = php_optarg;
 				break;
-			case 14:
+			case 15:
 				behavior = PHP_MODE_SHOW_INI_CONFIG;
 				break;
 			default:
@@ -1288,6 +1296,7 @@
 			case PHP_MODE_REFLECTION_FUNCTION:
 			case PHP_MODE_REFLECTION_CLASS:
 			case PHP_MODE_REFLECTION_EXTENSION:
+			case PHP_MODE_REFLECTION_ZEND_EXTENSION:
 				{
 					zend_class_entry *pce = NULL;
 					zval *arg, *ref;
@@ -1309,6 +1318,9 @@
 						case PHP_MODE_REFLECTION_EXTENSION:
 							pce = reflection_extension_ptr;
 							break;
+						case PHP_MODE_REFLECTION_ZEND_EXTENSION:
+							pce = reflection_zend_extension_ptr;
+							break;
 					}

 					MAKE_STD_ZVAL(arg);
-- 
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to